介绍
银联开放平台提供两种认证方式:
OPEN-ACCESS-TOKEN: 需要提前获取AccessToken,并将其放到请求头的Authorization中OPEN-BODY-SIG: 将请求体和appId等参数通过文档提供的算法进行计算得到签名,并将其放到请求头的Authorization中
通常来说,无论哪种认证方式,都应该在服务端做这件事。但因为某种不可抗力。需要在微信小程序端直接调用银联的下单接口,所以也需要在小程序端进行签名计算,下面是具体代码实现。
代码实现
import jsSHA from 'jssha';
/**
* 银联签名算法
* @param {object} params
* @param {string} params.appId - 银联提供的 appId
* @param {string} params.appKey - 银联提供的 appKey
* @param {string} params.timestamp - 时间戳,格式为:yyyyMMddHHmmss
* @param {string} params.nonce - 随机数字符串
* @param {object} params.messageBody - 请求体
*/
const generateSignature = ({appId, timestamp, nonce, messageBody, appKey}) => {
const messageBodyString = JSON.stringify(messageBody);
const shaObj = new jsSHA("SHA-256", "TEXT");
shaObj.update(messageBodyString);
const hash = shaObj.getHash("HEX");
const concatenatedString = appId + timestamp + nonce + hash;
const hmacObj = new jsSHA("SHA-256", "TEXT");
hmacObj.setHMACKey(appKey, "TEXT");
hmacObj.update(concatenatedString);
const signature = hmacObj.getHMAC("B64");
return signature;
}
// 生成随机字符串
function generateRandom18Digits() {
let random18Digits = '';
for (let i = 0; i < 18; i++) {
const digit = Math.floor(Math.random() * 10);
random18Digits += digit.toString();
}
return random18Digits;
}