收藏
回答

微信支付ApiV3回调验签失败?

openssl verify -verbose -CAfile ./CertTrustChain.pem ./wechatpay_****.pem

./wechatpay_****.pem: OK

微信公钥没问题,下面是验签java代码:

    public static boolean verify(String str, String publicKey, String sign) throws Exception {

        byte[] data = str.getBytes();

        byte[] signBytes = Base64.getDecoder().decode(sign);

        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(decryptBASE64(publicKey));

        KeyFactory keyFactory = KeyFactory.getInstance(“RSA”);

        PublicKey pubKey = keyFactory.generatePublic(x509KeySpec);

        Signature signature = Signature.getInstance(“SHA256withRSA”);

        signature.initVerify(pubKey);

        signature.update(data);

        return signature.verify(signBytes);

    }

报错:

Caused by: java.security.InvalidKeyException: IOException: DerValue.getOID, not an OID -96

at java.base/sun.security.x509.X509Key.decode(X509Key.java:375)

at java.base/sun.security.x509.X509Key.decode(X509Key.java:380)

at java.base/sun.security.rsa.RSAPublicKeyImpl.<init>(RSAPublicKeyImpl.java:146)

at java.base/sun.security.rsa.RSAPublicKeyImpl.newKey(RSAPublicKeyImpl.java:78)

at java.base/sun.security.rsa.RSAKeyFactory.generatePublic(RSAKeyFactory.java:324)

at java.base/sun.security.rsa.RSAKeyFactory.engineGeneratePublic(RSAKeyFactory.java:237)

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

2 个回答

  • 龚
    2024-12-30

    BEGIN CERTIFICATE 转成 BEGIN PUBLIC KEY

        public static String getCerToPublicKey() throws Exception {

            FileInputStream file = new FileInputStream("***.pem");

            CertificateFactory ft = CertificateFactory.getInstance("X.509");

            X509Certificate certificate = (X509Certificate) ft.generateCertificate(file);

            PublicKey publicKey = certificate.getPublicKey();

            return Base64.encodeBase64String(publicKey.getEncoded());

        }

    2024-12-30
    有用 1
    回复 1
    • 龚
      2024-12-30
      java -jar CertificateDownloader.jar -k ${apiV3key} -m ${mchId} -f ${mchPrivateKeyFilePath} -s ${mchSerialNo} -o ${outputFilePath}
      路径不能有空格,生成的pem,如果是BEGIN CERTIFICATE,需要转成 BEGIN PUBLIC KEY
      2024-12-30
      回复
  • 智能回答 智能回答 该问答由AI生成
    2024-12-30
    有用
登录 后发表内容