评论

回调解密失败排查指引

回调解密失败排查指引

目前微信支付API v2 版本的SDK已停止维护,为了在保证支付安全的前提下,带给商户简单、一致且易用的开发体验,微信支付官方推出了全新的微信支付API v3。并且提供了Java、php、go语言的相关业务SDK,该SDK已支持自动回调验签,接收解析回调通知,回调解密,若你有SDK需求,建议使用API v3版本,根据自己的需要选择对应的SDK使用,具体可参考:微信支付APIv3 SDK 介绍

2版接口和V3版接口规则差异说明:

  • 参数格式:V2接口为XML,V3接口为JSON
  • 签名方式:V2接口为MD5或HMAC-SHA256,V3接口为非对称密钥SHA256-RSA
  • 回调加密:V2接口无需加密,V3接口为AES-256-GCM加密

本文章主要协助开发者定位回调解密失败的问题,开发者可根据以下步骤逐步排查。

情况一、使用了错误的API v3密钥

处理回调通知中,商户要解密出明文,解密过程中用的key就是APIv3密钥,解密失败的情况下请先检查是否使用了其他商户号的密钥(A商户的回调信息使用了B商户号的APIv3密钥),或者使用了APIv2密钥。如怀疑密钥错误,又担心影响其他接口,可以尝试设置与原先设置的一样的密钥,功能介绍和设置指引可参考:什么是APIv3密钥?如何设置?

特别说明:

1、APIv3密钥的设置与修改不影响APIv2密钥

2、APIv3密钥与APIv2密钥是隔离的,设置该密钥时,不会导致APIv2密钥发生变化。

3、如果设置与原先设置的一样的密钥,则商户平台会有相关提示,此时可排除APIv3密钥使用不正确的情况


情况二、密文不正确

请检查提交解密的密文和收到的密文是否一致。注意报文中的密文经过了Base64编码。

特别说明:

使用微信支付SDK的情况下,无需对密文进行Base64解码,因为SDK会自动处理。

未使用微信支付SDK的情况下,则需要对密文进行Base64解码。


情况三、解密时接口遗漏传入参数

请检查解密时是否有传入associated_data、nonce参数,漏传参数的情况下也会导致解密失败。

解密的示例代码:


情况四、使用的编程语言库版本不适用

如果您确认解密的密文和参数都正确且使用的是APIv3密钥,那大概率就是版本有问题。

java:

受到美国法律的约束,早期Java的运行时限制了JCE支持的密钥长度,即默认不支持256位的AES。解决的方法有三个:

Security.setProperty("crypto.policy", "unlimited");

Java9及以上,均无限制。

php:

AEAD_AES_256_GCM需要PHP 7.1以上


附录


最后一次编辑于  2023-10-25  
点赞 0
收藏
评论

2 个评论

  • H、
    H、
    2023-11-28

    解密的时候有具体报错信息吗?然后你这个是V3版本的退款回调吗?如果是V3版本的,看看签名值中有没有WECHATPAY/SIGNTEST/ ,有的话就是微信的探测流量了。

    2023-11-28
    赞同
    回复
  • 马特:啊对对对
    马特:啊对对对
    2023-11-25

    您好 针对:“退款结果通知API,收到不统一的加密内容” 一共两次才能正常解密,第一次收到的内容无法解密 我们这边可以稳定复现,每次refund的时候就会出现。是不是你们传的东西不是同一个啊?

    请私信我发给你们具体数据,这里面没发出来

    2023-11-25
    赞同
    回复
登录 后发表内容