UNPKG

@jashine/unipay-poslink

Version:

银联: 扫码支付-被扫

87 lines (79 loc) 2.23 kB
"use strict"; /** * Created by luckyriko on 2022/1/14. */ const sha256 = require('crypto-js/sha256'); const hmacSHA256 = require('crypto-js/hmac-sha256'); const Base64 = require('crypto-js/enc-base64'); const dayjs = require('dayjs') const { v4: uuidv4 } = require('uuid'); const utl = module.exports = {}; /** * 浅拷贝 * @param obj * @returns {{}} */ utl.copy = function(obj) { var ret = {}; for (var k in obj) { ret[k] = obj[k]; } return ret; }; /** * 对请求参数进行组装、编码 * @param {Object} params 请求参数 * @returns {Object} */ utl.encodeParams = function(params) { const keys = []; for (const k in params) { const v = params[k]; if (v !== undefined && v !== "") keys.push(k); } keys.sort(); let unencodeStr = ""; let encodeStr = ""; const len = keys.length; for (let i = 0; i < len; ++i) { const k = keys[i]; if (i !== 0) { unencodeStr += "&"; encodeStr += "&"; } unencodeStr += k + "=" + (typeof params[k] == "object" ? JSON.stringify(params[k]) : params[k]); encodeStr += k + "=" + encodeURIComponent(params[k]); } return { unencode: unencodeStr, encode: encodeStr }; }; /** * 对字符串进行签名验证 * @param {String} str 要验证的参数的字符串 * @param {String} sign 要验证的签名 * @param {String} key 商户应用key * @param {String} [signType] 签名类型 * @returns {Boolean} */ utl.signVerify = function(str, sign, key, signType) { const _sign = utl.sign(str, key, signType); return _sign == sign.toLowerCase(); }; /** * 对字符串进行签名 * @param {String} appid 要签名的字符串 * @param {String} appkey 商户应用key * @param {String} params 请求参数 * @returns {String} */ utl.sign = function(appid, appkey, params) { let nonce = uuidv4().replace(new RegExp('-','gm'), ""); let timestamp = dayjs().format("YYYYMMDDHHmmss"); let A = JSON.stringify(params); let B = sha256(A).toString(); let C = appid+timestamp+nonce+B; let D = appkey; let E = hmacSHA256(C, D) let F = Base64.stringify(E); let authorization= `OPEN-BODY-SIG AppId="${appid}",Timestamp="${timestamp}",Nonce="${nonce}",Signature="${F}"` return authorization };