微信支付 V3 版本

    • 遵循统一的Restful的设计风格
    • 使用JSON作为数据交互的格式,不再使用XML
    • 使用基于非对称密钥的SHA256-RSA的数字签名算法,不再使用MD5或HMAC-SHA256
    • 不再要求HTTPS客户端证书
    • 使用AES-256-GCM,对回调中的关键信息进行加密保护

    更多证书和签名的详细内容请参官方文档

    API密钥设置

    API密钥的详细内容请参见:API证书及密钥微信支付 V3 版本 - 图1

    下载API证书

    需要安装 x509 依赖

    1. 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 接口请求参数

    验证签名

    1. let verifySignature: boolean = PayKit.verifySignature(signature, data, nonce, timestamp, publicKey)
    2. // 或者
    3. let verifySignature: boolean = PayKit.verifySign(headers, data, publicKey)
    4. console.log(`verifySignature:${verifySignature}`)

    获取平台证书列表为例

    证书和回调报文解密

    证书报文解密为例

    1. // 证书和回调报文解密
    2. try {
    3. // 解密
    4. let decrypt = PayKit.aes256gcmDecrypt(
    5. config.apiKey3,
    6. ctx.app.config.AEAD_AES_256_GCM.nonce,
    7. ctx.app.config.AEAD_AES_256_GCM.associated_data,
    8. )
    9. // 保存证书
    10. fs.writeFileSync(certPath, decrypt)
    11. ctx.body = decrypt
    12. } catch (error) {
    13. console.log(error)

    更多示例