收藏
回答

关于APIv3密钥是否还能够用于解密退款回调的req_info?

按照文档解密

解密步骤如下:

(1)对加密串A做base64解码,得到加密串B

(2)对商户key做md5,得到32位小写key* ( key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置 )

(3)用key*对加密串B做AES-256-ECB解密(PKCS7Padding)


解密过程报pad block corrupted异常

这里我用的密钥是APIv3的密钥(不确定是不是用错了),后来在文档https://pay.weixin.qq.com/docs/merchant/development/interface-rules/introduction.html发现写着:使用JSON作为数据交互的格式,不再使用XML

是不是我使用错密钥了 这里的退款密钥要用哪个密钥?

回答关注问题邀请回答
收藏

2 个回答

  • Memory (私信不回复)
    Memory (私信不回复)
    11-05

    你这个是V2。。。

    11-05
    有用
    回复
  • 👳
    👳
    11-05
    public static void main(String[] args) throws Exception {
        System.out.println(descrypt(req_info,key));
    }
    
    static String descrypt(String reqInfo,String key) {
        byte[] reqInfoB = Base64.decodeBase64(reqInfo);
        String key_ = DigestUtils.md5Hex(key).toLowerCase();
    
        if (Security.getProvider("BC") == null){
            Security.addProvider(new BouncyCastleProvider());
        }
        Cipher cipher;
        try {
            cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");
        }catch (Exception e){
            e.printStackTrace();
            throw new RuntimeException("秘密获取失败");
        }
        SecretKeySpec secretKeySpec = new SecretKeySpec(key_.getBytes(), "AES");
        try {
            cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
        }catch (InvalidKeyException ie){
            ie.printStackTrace();
            throw new RuntimeException("秘密初始化失败");
        }
        try {
            return new String(cipher.doFinal(reqInfoB));
        }catch (Exception  ie){
            ie.printStackTrace();
            throw new RuntimeException("秘密初始化失败");
        }
    }
    


    11-05
    有用
    回复 1
    • 👳
      👳
      11-05
      已解决 退款回调req_info用的是APIv2的密钥
      11-05
      回复
登录 后发表内容