收藏
回答

使用微信支付公钥模式加密敏感信息一直报平台私钥解密失败错误?

String bankNum = "622208120*******";
PublicKey publicKey = CertificateTools.readWechatPayPublicKey(publicKeywechatpayPath);
bankNum = WxTools.rsaEncryptOAEP(bankNum,publicKey);

CertificateTools工具类包含readWechatPayPublicKey方法
/**
 * 获取微信支付的公钥
 * @param publicKeywechatpayPath
 * @return
 * @throws Exception
 */
public static PublicKey readWechatPayPublicKey(String publicKeywechatpayPath) throws Exception {
    // 读取公钥文件内容
    String publicKeyPem =  FileUtil.readUtf8String(publicKeywechatpayPath);
   // 移除 PEM 文件的开头和结尾标记
    publicKeyPem = publicKeyPem.replace("-----BEGIN PUBLIC KEY-----", "")
            .replace("-----END PUBLIC KEY-----", "")
           .replaceAll("\\s", ""); // 移除所有空白字符
    // 解码 Base64 编码的公钥
    byte[] decodedBytes = Base64.decode(publicKeyPem);
    // 4. 使用 X509EncodedKeySpec 生成公钥对象
    X509EncodedKeySpec keySpec = new X509EncodedKeySpec(decodedBytes);
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    return keyFactory.generatePublic(keySpec);
}

WxTools工具类包含rsaEncryptOAEP方法
/**
 * 使用微信支付公钥加密敏感字段
 * @param message
 * @param publicKey
 * @return
 * @throws IllegalBlockSizeException
 * @throws IOException
 */
public static String rsaEncryptOAEP(String message, PublicKey publicKey) throws IllegalBlockSizeException, IOException {
    try {
        // 1. 获取 Cipher 实例,并指定算法
        Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-1AndMGF1Padding");
        // 2. 初始化为加密模式,传入公钥
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        // 3. 执行加密
        byte[] data = message.getBytes("utf-8");
        byte[] cipherdata = cipher.doFinal(data);
        // 4. 将加密后的字节数组进行 Base64 编码,得到可传输的字符串
        String result = Base64.getEncoder().encodeToString(cipherdata);
        return result;
    } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
        throw new RuntimeException("当前Java环境不支持RSA v1.5/OAEP", e);
    } catch (InvalidKeyException e) {
        throw new IllegalArgumentException("无效的公钥", e);
    } catch (IllegalBlockSizeException | BadPaddingException e) {
        throw new IllegalBlockSizeException("加密原串的长度不能超过214字节");
    }
}
并检查了如下情况,还是一直报{"code":"PARAM_ERROR","message":"平台私钥解密失败"}错误
1.加密使用的公钥信息不正确,应使用微信支付提供的公钥。
2.请求头中Wechatpay-Serial传入的公钥ID不正确或与当前商户号不匹配。
3.加密方式不符合要求,应使用RSAES-OAEP加密方式。


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

2 个回答

登录 后发表内容