微信支付 V3 版本
- 遵循统一的Restful的设计风格
- 使用JSON作为数据交互的格式,不再使用XML
- 使用基于非对称密钥的SHA256-RSA的数字签名算法,不再使用MD5或HMAC-SHA256
- 不再要求HTTPS客户端证书
- 使用AES-256-GCM,对回调中的关键信息进行加密保护
更多证书和签名的详细内容请参官方文档
API密钥设置
API密钥的详细内容请参见:API证书及密钥
下载API证书
需要安装 x509 依赖
console.log(`证书序列号:${cert.serial}`)
如何验证序列号
- openssl x509 -in apiclient_cert.pem -noout -serial
- 使用证书解析工具
构建 Authorization
- method 请求方法 RequestMethod
- urlSuffix 可通过 WxApiType 来获取,URL挂载参数需要自行拼接
- mchId 商户Id
- serialNo 商户 API 证书序列号
- key key.pem fs.readFileSync(config.keyPath)
- body 接口请求参数
验证签名
let verifySignature: boolean = PayKit.verifySignature(signature, data, nonce, timestamp, publicKey)
// 或者
let verifySignature: boolean = PayKit.verifySign(headers, data, publicKey)
console.log(`verifySignature:${verifySignature}`)
获取平台证书列表为例
证书和回调报文解密
证书报文解密为例
// 证书和回调报文解密
try {
// 解密
let decrypt = PayKit.aes256gcmDecrypt(
config.apiKey3,
ctx.app.config.AEAD_AES_256_GCM.nonce,
ctx.app.config.AEAD_AES_256_GCM.associated_data,
)
// 保存证书
fs.writeFileSync(certPath, decrypt)
ctx.body = decrypt
} catch (error) {
console.log(error)