微信支付-退款通知消息AES-256-ECB解密

微信支付退款通知:
退款结果对重要的数据进行了加密,商户需要用商户秘钥进行解密后才能获得结果通知的内容

拿到了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());

运行解密成功。

发布了139 篇原创文章 · 获赞 35 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/kanglovejava/article/details/96874635