微信小程序中实现银联签名算法

238 阅读1分钟

介绍

银联开放平台提供两种认证方式:

  • 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;
}

文档