微信开发系列 -- 微信退款回调解密算法的坑

最近在做微信退款的接口,退款接口请求到微信是成功的,但是在退款回调到我们服务器时,出现了问题。

为了快速快发,使用的是 weixin-java-pay 这个工具包。

<!--微信支付-->
<dependency>
	<groupId>com.github.binarywang</groupId>
	<artifactId>weixin-java-pay</artifactId>
	<version>3.0.0</version>
</dependency>

支付接口和支付回调接口都很快开发完成。可是在微信退款回调过来的信息用框架实现的解析时,出现如下问题:

Caused by: java.security.InvalidKeyException: Illegal key size or default parameters
	at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1026)
	at javax.crypto.Cipher.implInit(Cipher.java:801)
	at javax.crypto.Cipher.chooseProvider(Cipher.java:864)
	at javax.crypto.Cipher.init(Cipher.java:1249)
	at javax.crypto.Cipher.init(Cipher.java:1186)
	at com.github.binarywang.wxpay.bean.notify.
	WxPayRefundNotifyResult.fromXML(WxPayRefundNotifyResult.java:53)

初次遇到此问题,以为是内部代码设置的解密错误,就查看了源代码:

  Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
  final MessageDigest md5 = MessageDigest.getInstance("MD5");
  md5.update(mchKey.getBytes());
  final String keyMd5String = new BigInteger(1,
  		 md5.digest()).toString(16).toLowerCase();
  		 
  SecretKeySpec key = new SecretKeySpec(keyMd5String.getBytes(), "AES");
  cipher.init(Cipher.DECRYPT_MODE, key);
  result.setReqInfo(ReqInfo.fromXML(
    	new String(cipher.doFinal(Base64.decodeBase64(reqInfoString)))));

从错误信息看,这似乎是框架源代码问题,无法解析加密信息。这一点比较无奈,只好寄托于搜索引擎,发现这是美国政策原因,对加密算法进行的限制。我们下载安装的 JDK 内部的权限文件是有缺的,只支持到 128 位。

而微信的证书加密后密钥大于 128 位的,所以当我们使用原本的 JDK 内部的 policy 文件时,就会出现上面所出现的错误。

解决办法:
解决办法是下载一个完整的 policy 文件,替换掉我们原生的 JDK 权限文件。恰好官网提供无政策限制的权限文件,我们可以去下载后进行替换。

首先是前往官网下载(再次仅提供 7 8 的网站,其他的可以在官网寻找)

下载好后,我们拿到的是一个 zip 包,包中有两个 jar 包和说明文件:
local_policy.jarUS_export_policy.jar 和一个 README.txt 文件 。

解压出需要使用的两个 jar,找到我们 JDK 的安装路径,这里笔者以 Linux 举例。
笔者 java 安装路径:

/usr/java/jdk1.8.0_121/

这时我们需要找到 jre,并找到 lib 包,直到进入 security 文件夹下

/usr/java/jdk1.8.0_121/jre/lib/security

我们会看到:
在这里插入图片描述
将我们下载的文件替换的这两个文件即可。

总结:
这就是退款回调遇到的大坑,极其的无语,有幸找到问题解决了。

如果有兴趣的同学可以关注公众号,一起学习!
在这里插入图片描述

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值