目前微信支付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。解决的方法有三个:
- (推荐)升级Java 8u162+,默认使用ulimited policy
- Java 8u151和8u152,可以在你的程序中直接放开策略
Security.setProperty("crypto.policy", "unlimited");
- 其他版本,下载无限强度权限策略文件补丁包,并使用其中的文件覆盖$JAVA_HOME/lib/security目录下的对应的local_policy.jar 和US_export_policy.jar
Java9及以上,均无限制。
php:
AEAD_AES_256_GCM需要PHP 7.1以上
解密的时候有具体报错信息吗?然后你这个是V3版本的退款回调吗?如果是V3版本的,看看签名值中有没有WECHATPAY/SIGNTEST/ ,有的话就是微信的探测流量了。
您好 针对:“退款结果通知API,收到不统一的加密内容” 一共两次才能正常解密,第一次收到的内容无法解密 我们这边可以稳定复现,每次refund的时候就会出现。是不是你们传的东西不是同一个啊?
请私信我发给你们具体数据,这里面没发出来