NodeJS 支付宝同步验签

如题,这个是用来验证请求结果是否来自支付宝官方的。

当初一直没找到支付宝的公钥,后面发现公钥其实就在证书里面。

下面,贴代码。



const crypto = require('crypto');
const x509 = require('@fidm/x509');
const aliPubKey = getKeyFromCert(fs.readFileSync('./rsa/aliCert.crt'));
// 此处应填入支付宝的证书位置
// 原文件名是“alipayCertPublicKey_RSA2.crt”

// 参数body就是请求后返回的响应结果
function syncCheckV2(body) {
  let key = null;
  if (!('sign' in body)) return false;
  for (let k in body) {
    if (k.endsWith('_response')) {
      key = k;
      break;
    }
  }
  if (key === null) return false;
  let signStr = JSON.stringify(body[key]).replace(/\//g, '\\/');
  return crypto.createVerify('RSA-SHA256').update(signStr, 'utf8').verify(aliPubKey, body.sign, 'base64');
}
// 从证书文件中提取公钥
function getKeyFromCert(pem) {
  return '-----BEGIN PUBLIC KEY-----\r\n' + x509.Certificate.fromPEM(pem).publicKeyRaw.toString('base64') + '\r\n-----END PUBLIC KEY-----';
}
上一篇
下一篇