安全

关于API v3

为了在保证支付安全的前提下,带给商户简单、一致且易用的开发体验,我们推出了全新的微信支付API v3。

相较于之前的微信支付API,主要区别是:

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

商户API证书

商户API证书是指由商户申请的,包含商户的商户号、公司名称、公钥信息的证书。

官方文档

商户API私钥

商户申请商户API证书时,会生成商户私钥,并保存在本地证书文件夹的文件apiclient_key.pem 中。私钥也可以通过工具从商户的p12证书中导出。请妥善保管好你的商户私钥文件。

官方文档

获取平台证书

微信支付平台证书是指由微信支付 负责申请的,包含微信支付平台标识、公钥信息的证书。商户可以使用平台证书中的公钥进行验签。

  1. rs, err := services.PaymentApp.Security.GetCertificates(c.Request.Context())
  2. if err != nil {
  3. panic(err)
  4. }
  5. c.JSON(http.StatusOK, rs)

该证书用于微信支付V3的验证,用户需要自己通过GetCertificates方法去获取证书列表,然后保存到本地,然后将公钥地址,在服务初始化时,赋给CertificateKeyPath

微信官方文档: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/wechatpay5_1.shtml

解析平台证书

  1. form := &response.ResponseGetCertificates{}
  2. if err := c.ShouldBindJSON(form); err != nil {
  3. panic(err)
  4. }
  5. config := services.PaymentApp.GetConfig()
  6. v3AESKey := config.GetString("mch_api_v3_key", "")
  7. plainTXT, err := support.DecryptAES256GCM(
  8. v3AESKey,
  9. form.Data[0].EncryptCertificate.AssociatedData,
  10. form.Data[0].EncryptCertificate.Nonce,
  11. form.Data[0].EncryptCertificate.Ciphertext,
  12. )
  13. if err != nil {
  14. panic(err)
  15. }
  16. fmt.Dump(plainTXT)
  17. c.JSON(http.StatusOK, plainTXT)

获取 RSA Public Key

  1. rs, err := services.PaymentApp.Security.GetRSAPublicKey(c.Request.Context())
  2. if err != nil {
  3. panic(err)
  4. }
  5. fmt.Dump(rs.PubKey)
  6. c.JSON(http.StatusOK, rs)

该RSA公钥用于微信支付V2的签名加密,比如付款到银行账户,账户信息需要敏感加密。

微信官方文档:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay_yhk.php?chapter=25_7&index=4