微信支付V3,nativePay模式支付成功后,回调解析通知密文失败

测试服整个流程都是对的

任何东西没改,放上正式服,就有问题了

支付完成后,微信回调过来的serialNo和解析出来的平台证书序列号一直不一样,导致解析加密串失败,没法判断是哪个产品支付成功。

最终找到这个https://developers.weixin.qq.com/community/develop/doc/000e4a0d5dc1486acc19c6fd15bc00?_at=1569021781371 解决了问题

调用微信统一支付V3接口 需要这几个参数

mchId  商户Id     
serialNo  商户API 证书序列号
platSerialNo  平台序列号
keyPath  apiclient_key.pem 证书路径

最容易混淆的就是商户API 证书序列号平台序列号

商户 API 证书序列号(微信支付平台上面的)

详细:https://blog.csdn.net/qq_31708763/article/details/103382529

平台序列号(这个东西需要去https://github.com/wechatpay-apiv3/CertificateDownloader/releases这里下载)

下载后是个CertificateDownloader-1.1.jar 然后直接cmd 运行这个jar包 后面拼上参数

执行:“java -jar CertificateDownloader-1.1.jar -f 商户私钥文件路径 -k 证书解密的密钥 -m 商户号 -o 证书保存路径 -s 商户证书序列号”就行了。

例:java -jar CertificateDownloader-1.1.jar -f E:\\wxzhengshu\\WXCertUtil\\cert\\1605643458_20210121_cert\\apiclient_key.pem -k xxxx -m xxxx -o E:\\wxzhengshu\\WXCertUtil\\cert\\1605643458_20210121_cert -s xxxxx
这条命令的参数搞清楚3点:“商户私钥文件路径”是账号中心->API安全->API证书中设置并下载的证书(就是其中的apiclient_key.pem,下载还会获得apiclient_cert.pem,我之前把这个当做支付证书了,其实不是,apiclient_cert.pem这用不着),“商户证书序列号”这个东西也是设置API证书那里知道;“证书解密的密钥”在账号中心->API安全->APIv3密钥中设置的(注意api密钥和apiv3密钥是2个东西)。
执行完了是个类似wechatpay_250393205B4A9CC12900B44B65E04B9751CE95.pem的文件。o 证书保存路径 指的是最后生成文件本地保存的路径

最后生成后的文件放到服务器上,用微信提供的方法

这样就能获取到平台序列号了,回调解密也没有问题了

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
微信支付v3版本回调验签和解密操作分别需要使用APIv3密钥和APIv3证书进行操作。下面是Java代码示例: 验签操作: ```java import com.tencentcloudapi.common.exception.TencentCloudSDKException; import com.tencentcloudapi.common.util.SignUtils; public class WechatPayV3SignUtil { /** * 验证签名 * * @param serialNo 商户API证书序列号 * @param timestamp 时间戳 * @param nonce 随机串 * @param body 回调体 * @param signature 微信支付签名 * @param platformCert 平台证书内容 * @return true验证通过,false验证失败 * @throws TencentCloudSDKException 抛出异常 */ public static boolean verify(String serialNo, String timestamp, String nonce, String body, String signature, String platformCert) throws TencentCloudSDKException { String message = timestamp + "\n" + nonce + "\n" + body + "\n"; return SignUtils.verify(signature, message.getBytes(), platformCert, serialNo); } } ``` 解密操作: ```java import com.tencentcloudapi.common.exception.TencentCloudSDKException; import com.tencentcloudapi.common.util.AesUtils; public class WechatPayV3DecryptUtil { /** * 解密回调通知 * * @param associatedData 附加数据 * @param nonce 随机串 * @param ciphertext 密文 * @param apiV3Key APIv3密钥 * @return 解密后的明文 * @throws TencentCloudSDKException 抛出异常 */ public static String decrypt(String associatedData, String nonce, String ciphertext, String apiV3Key) throws TencentCloudSDKException { byte[] keyBytes = apiV3Key.getBytes(); byte[] associatedDataBytes = associatedData.getBytes(); byte[] nonceBytes = nonce.getBytes(); byte[] ciphertextBytes = AesUtils.base64Decode(ciphertext); byte[] plainBytes = AesUtils.decryptToString(keyBytes, associatedDataBytes, nonceBytes, ciphertextBytes).getBytes(); return new String(plainBytes); } } ``` 以上代码仅供参考,具体实现需要根据自己的业务情况进行调整。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值