@jashine/unipay-poslink
Version:
银联: 扫码支付-被扫
87 lines (79 loc) • 2.23 kB
JavaScript
;
/**
* 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
};