微信支付退款通知:
退款结果对重要的数据进行了加密,商户需要用商户秘钥进行解密后才能获得结果通知的内容
拿到了reqInfo加密字符串,需要按照一下步骤解密。
解密步骤如下:
(1)对加密串A做base64解码,得到加密串B
(2)对商户key做md5,得到32位小写key* ( key设置路径:微信商户平台(pay.weixin.qq.com)–>账户设置–>API安全–>密钥设置 )
(3)用key*对加密串B做AES-256-ECB解密(PKCS7Padding)
代码如下:
@Test
public void refundNotifyTest(){
String reqInfo = "vkzb2qYxQwtb4k/Scpng+9wmAummpwMf8tx9Gnvqfvy6QqVgSBjZq3E6YStd+aBqIf5qUIfU9vXfwr2tPUuph9ycxMZhIOeap8HoRjvP8vEKCFMQYOH74ionvgt74OKJN5TZd9zY4dGlIRyrZf71Ug+ENz9KA+HdNrFojcSbz5ZaOcWHNacvMrr8MVTFGr6BpMUmYrhxuboxNQuqJUlr8SRJNaiOiuponCrQIoC1s+mQbyybdERnvfXu66zMmtF5t7hAV+XJZrEhU5hPnLZfcyfuQQe3b/uJjvUpxRuceFvbsHZPvFrVWaeoOFRmAHJ1HxOjM0xtuVnKOwgYJJUSsBk6ECPpDdGFFaK05vcB1dS6Nui+mOw39+LzDUovGnDOL4gvTqmyyzLTIP7VL7RVwkmuOo7WkSYfUoJ+RQbR6QBECKAxSuYTHVPlNNDFe70bP2x4tbCcWVeG6l4oJOBvp7EPVB7bKFvGOLG+Jfvvo7m1H862NUpt7l7z2MN/WP54rCO3+zYPbCLRXCyT2yZbFuZVJk7SR6fhCK8NJA/yiWTFp9YChdcEhNNQx3dsQwxixw/LngpUcsTl7je+D+g/lBwFeRh8uL3uCvnhtAixuBaJw/eV/9pEVmVJA5uL5amVW6DlGmDBtl03H7HstCAq7vh5I7QDxNk3oWwjyN9pK7vAEQ0BDd+fxH4Rb0mlf+cbq4H52mJxLqFJPg3oij9MCqumgyQ5HB+ARz4S+QcD1MYGSokQKdbunRuSmkv7gSieUkDaV7HYMUJPfjDqmWP5lbREhjM5VIMw9pxUV260ngt/armpJTnsHOXfZB4J0+u2Ja1FBdlNUk/cHVXFmPwPfAxmU6cIOVnbHAQhWaHcFd9UwdDn9LOhEHipp1FKLAAdkq6Uhmv8rQpXNDFsGG+HoYuryd7Jcn4UaVDLxHfaaMTIXNP1WuayYRJqlG8P8g1Vk2KFN2OIJSIh91rOhFBe896ieqOkVD/qF+56sCKyvaj7ECXbXY90gNeBK2JK+uZgH104jZRN+Mc9kMGFBaSxHuduxr/uEPpGmvEg2Fo3ckGrTrcpDL+iQKGTlYJfZ6Gp";
byte[] reqInfoByte = Base64Utils.decodeFromString(reqInfo);
try {
String result = decryptData(reqInfoByte);
System.out.println(result);
}catch (Exception e){
e.printStackTrace();
}
}
//密钥算法
private static final String ALGORITHM = "AES";
//加解密算法/工作模式/填充方式
private static final String ALGORITHM_MODE_PADDING = "AES/ECB/PKCS7Padding";
//生成key
private static SecretKeySpec key = new SecretKeySpec(SignUtil.md5("api密钥", "UTF-8").toLowerCase().getBytes(), ALGORITHM);
/**
* AES解密
* @param base64Data
* @return
* @throws Exception
*/
public static String decryptData(byte[] base64Data) throws Exception {
//Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
Cipher cipher = Cipher.getInstance(ALGORITHM_MODE_PADDING);
cipher.init(Cipher.DECRYPT_MODE, key);
return new String(cipher.doFinal(base64Data), "UTF-8");
}
抱错信息为:
Cannot find any provider supporting AES/ECB/PKCS7Padding
后百度找到解决方法:
添加依赖:
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-ext-jdk16</artifactId>
<version>1.46</version>
</dependency>
decryptData方法添加:
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
运行解密成功。