在微信退款申请成功后异步通知会返回一段加密串(在req_info字段里)
按照微信文档的做法是
1.对返回的加密串req_info做base64解码,得到另一个加密串
byte[] b = Base64Util.decode(map.get(“req_info”));
2.对商户key做md5,得到32位小写key* ( key设置路径:微信商户平台(pay.weixin.qq.com)–>账户设置–>API安全–>密钥设置 )
这里的key是微信商户生成的key 对生成的key进行MD5加密
SecretKeySpec key = new SecretKeySpec(MD5Util.MD5Encode(wechat_key).toLowerCase().getBytes(), “AES”);
3.用key*对加密串B做AES-256-ECB解密(PKCS7Padding)
public static String decryptData(byte[] b) throws Exception {
Cipher cipher = null;
cipher = Cipher.getInstance(“AES/ECB/PKCS5Padding”);
cipher.init(Cipher.DECRYPT_MODE,key);
return new String(cipher.doFinal(b),”utf-8″);
}
当使用PKCS7Padding 进行解密时报错: Cannot find any provider supporting AES/ECB/PKCS7Padding
其实PKCS7Padding 跟 PKCS5Padding一样 将PKCS7Padding 换成PKCS5Padding
当使用PKCS5Padding时报错:Illegal key size or default parameters.
这个错时因为 使用AES加密时,当密钥大于128时,代码会抛出java.security.InvalidKeyException: Illegal key size or default parameters
Illegal key size or default parameters是指密钥长度是受限制的,java运行时环境读到的是受限的policy文件。文件位于${java_home}/jre/lib/security下 这种限制是因为美国对软件出口的控制。
解决办法:去掉这种限制需要下载Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files.
下载解压后就是替换${java_home}/jre/lib/security/ 下面的local_policy.jar和US_export_policy.jar。