微信退款回呼解密req_info時報錯:Illegal key size or default parameters.
- 微信官方檔案地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_16&index=10#menu1
解密方式
解密步驟如下:
(1)對加密串A做base64解碼,得到加密串B
(2)對商戶key做md5,得到32位小寫key* ( key設定路徑:微信商戶平臺 (pay.weixin.qq.com)–>賬戶設定–>API安全–>密鑰設定 )
(3)用key*對加密串B做AES-256-ECB解密(PKCS7Padding)
解密時報錯的解決方案就是【重點在這里】:
- 首先在oracle官方下載jce_policy,我的是jdk8
- JDK7的下載地址:
http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
JDK8的下載地址:
http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
下載后我們把jce_policy這個zip解壓,我們可以看到兩個jar包

把剛剛下載的兩個jar包到jdk、jre中替換到這個里面
Java\jdk1.8.0_71\jre\lib\security\里面的兩個jar替換掉
Java\jre1.8.0_71\lib\security\里面的兩個jar替換掉
這里是我退款成功后的回呼代碼:
@PostMapping("/refundNotify")
public String refund(HttpServletRequest request) {
System.out.println("退款回呼的請求方式" + request.getMethod());
String xmlSuccess = "<xml>\n" +
" <return_code><![CDATA[SUCCESS]]></return_code>\n" +
" <return_msg><![CDATA[OK]]></return_msg>\n" +
"</xml>";
String xmlFail = "<xml>\n" +
" <return_code><![CDATA[FAIL]]></return_code>\n" +
" <return_msg><![CDATA[OK]]></return_msg>\n" +
"</xml>";
try {
String xmlResult = PayUtil.getPostStr(request);
Map<String, String> resultMap = null;
try {
//將結果轉成map
resultMap = PayUtil.xmlToMap(xmlResult);
} catch (Exception e1) {
e1.printStackTrace();
}
//商戶訂單號
String req_info = resultMap.get("req_info");
String return_code = resultMap.get("return_code");
if ("SUCCESS".equals(return_code)) {
//解密步驟如下:
//(1)對加密串A做base64解碼,得到加密串B
Base64.Decoder decoder = Base64.getDecoder();
byte[] base64ByteArr = decoder.decode(req_info);
//(2)對商戶key做md5,得到32位小寫key* ( key設定路徑:微信商戶平臺(pay.weixin.qq.com)-->賬戶設定-->API安全-->密鑰設定 )
String key = MD5(PayConfig.KEY).toLowerCase();
//(3)用key*對加密串B做AES-256-ECB解密(PKCS7Padding)*/
String xml = init(key,base64ByteArr);
Map<String,String> xmlMasp = PayUtil.xmlToMap(xml);
String orderId = xmlMasp.get("out_trade_no");
System.err.println("退款單號:" + orderId);
Result res = orderService.refundSuccessUpdateStatus(orderId);//根據商戶訂單號ID更新狀態
if (res.getCode() == 200) {
System.out.println("退款成功,并且訂單狀態已更新");
return xmlSuccess;
}
}
} catch (Exception e) {
System.out.println("退款失敗,發生例外,可能由于:" + e.getMessage());
return xmlFail;
}
return xmlFail;
}
/**
* 生成 MD5
* 微信SDK中的生成MD5方法
*
* @param data 待處理資料
* @return MD5結果
*/
private static String MD5(String data) throws Exception {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] array = md.digest(data.getBytes("UTF-8"));
StringBuilder sb = new StringBuilder();
for (byte item : array) {
sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
}
return sb.toString().toUpperCase();
}
private static String init(String key,byte[] str){
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(),"AES");
Security.addProvider(new BouncyCastleProvider());
try {
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding");
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
String result = new String(cipher.doFinal(str));
return result;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
}
return null;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/266773.html
標籤:其他
