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

本文介绍了如何处理微信支付退款通知中的加密数据。通过详细解密步骤,包括Base64解码、MD5处理商户秘钥、AES-256-ECB解密(PKCS7Padding),解决了解密过程中遇到的错误提示,并提供了成功解密的关键代码调整。

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

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

运行解密成功。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值