如题,这个是用来验证请求结果是否来自支付宝官方的。
当初一直没找到支付宝的公钥,后面发现公钥其实就在证书里面。
下面,贴代码。
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-----';
}