wechatpay-apiv3 / wechatpay-java

微信支付 APIv3 的官方 Java Library
Apache License 2.0
870 stars 195 forks source link

回调解密的时候出现错误 #226

Closed linqiu12 closed 10 months ago

linqiu12 commented 10 months ago

错误描述

com.wechat.pay.java.core.exception.ValidationException: Processing WechatPay notification,signature verification failed,signType[WECHATPAY2-SHA256-RSA2048] serial[5FF637E711A638D4746B60B2E9EDA3680255A72C] message[NLm7VxggFq24tGEwqLJJj8MSVdddawmn U0oPaSYJu1b70290vjnBvL5mZvcebk8BQAuavZ/Ak7BqC3OHcfJidNKCeARjtR9Fq9I/qXYh7zIPS3mghM884p2XljOb3X9bxmKxzffU+EiqHdrqXq1VRzTYSjm3ffV68JPAGfy5hehF6i8WhLmd+T8mXQOs4OCwiEBhBkuZ/toaqQu6CK2xkKwE90dqEnmvKu/mYLSUOJ1LKdplPuHdWE56x8l/iB9S6D7Ih01u1C7kAB/yT7FtgsjD/ULaceQ14to22eo3lZIPvUZjMogzsPl9NSmIxw9HRJTseFth9RiHOYYHwHb6JECc2gy1EB3Mduj2yDXxNttzOis0wI3h5A== {"id":"44fe300c-dd3f-599d-afdf-0d1ad8f20b24","create_time":"2023-09-05T10:56:34+08:00","resource_type":"encrypt-resource","event_type":"TRANSACTION.SUCCESS","summary":"支付成功","resource":{"original_type":"transaction","algorithm":"AEAD_AES_256_GCM","ciphertext":"PQK4jd6e1SZ5SJIVPNDMeZ8mcJxdq5+UGafRTf2qlyVvHEV2ce49vZKxp7QFR7FE8KZpmpftiWcg0JFZEOueasl22D2chVKpNdFWnlojHfwQ6Fd1LPtw3usEzKJr8L7pITdF2RRGN0L4Z0WOug9alHI5cFPSm7MD+pabXgG9fGX4/4vcHrkd15WiwRuGwPkgHG1+ll8D1d1Ja6zsV4BbVvuSgOWnVbPwLdepJoYKDIGIhcYJcFqw9rwAkWV6Tfj4+XLU3c81K/LcTM9NYmlCDP/8jmLYwu5Iz09NQmR8f9On7iOdv7y+QqCGaN38VmG6kbyp+L+1TCHxw1BSaJskB4ggp+ounnKjqek1Xb0C2Jux29yYv9Ta1I9NnYur2vA5PZhakJ/ZjXazKjsL/eelDyEnqjetaFTliYjlC2jjYdcooy1TG7/aSr2BvmNbNESRDT0SpL61vCLr82lDJ5Izgt3wkIIBvrOh8lMxezwd8s7ncr+aIrpOMxCIRcgnM9M6t8rTm3APsi+y2rxV4eLF7Lm2w9ri/K/+UnoWBMn8ijFO8gdjOsGgi5zuKfwuM2mS9EJ28in6hQKf","associated_data":"transaction","nonce":"xrvTv37dqjQS"}} ] sign[1693883440] at com.wechat.pay.java.core.notification.NotificationParser.validateRequest(NotificationParser.java:93) at com.wechat.pay.java.core.notification.NotificationParser.parse(NotificationParser.java:49)

重现bug的步骤

JSAPI V3 支付 下单成功回调验签解密的时候出了问题, 使用的是原始报文

预期行为

验签解密成功

导致错误的代码片段

public String parseOrderNotifyResult(
            @RequestHeader("Wechatpay-Serial") String wechatPaySerial,
            @RequestHeader("Wechatpay-Signature") String wechatpayNonce,
            @RequestHeader("Wechatpay-Timestamp") String wechatSignature,
            @RequestHeader("Wechatpay-Nonce") String wechatTimestamp,
            @RequestBody String requestBody
    ) throws WxPayException {
        // 构造 RequestParam
        RequestParam requestParam = new RequestParam.Builder()
                .serialNumber(wechatPaySerial)
                .nonce(wechatpayNonce)
                .signature(wechatSignature)
                .timestamp(wechatTimestamp)
//                .signType("RSA")
                .body(requestBody)
                .build();

        // 如果已经初始化了 RSAAutoCertificateConfig,可直接使用
        // 没有的话,则构造一个
        NotificationConfig config = new RSAAutoCertificateConfig.Builder()
                .merchantId(mchid)
                .privateKeyFromPath(privateKeyFilePath)
                .merchantSerialNumber(mchSerialNo)
                .apiV3Key(apiV3Key)
                .build();

        // 初始化 NotificationParser
        NotificationParser parser = new NotificationParser(config);

        try {
//             以支付通知回调为例,验签、解密并转换成 Transaction
            Transaction transaction = parser.parse(requestParam, Transaction.class);
} catch (ValidationException e) {
            // 签名验证失败,返回 401 UNAUTHORIZED 状态码
            log.error("签名验证失败", e);
            new WxPayException("签名验证失败");
        }

操作系统

Windows

Java 版本

Java8

wechatpay-java 版本

0.2.11

其他信息

No response

linqiu12 commented 10 months ago

已解决

youyou-pm10 commented 9 months ago

怎么解决的呀,我看都说原始报文,但是都试了一下好像还是不行。public Transaction validSign(HttpServletRequest request) throws ValidationException{ String wechatPaySerial = request.getHeader("Wechatpay-Serial"); String wechatpayNonce = request.getHeader("Wechatpay-Nonce"); String wechatSignature = request.getHeader("Wechatpay-Timestamp"); String wechatTimestamp = request.getHeader("Wechatpay-Signature"); String requestBody = getRequestBody(request); // 构造 RequestParam RequestParam requestParam = new RequestParam.Builder() .serialNumber(wechatPaySerial) .nonce(wechatpayNonce) .signature(wechatSignature) .timestamp(wechatTimestamp) .body(requestBody) .build();

    // 如果已经初始化了 RSAAutoCertificateConfig,可直接使用
    // 没有的话,则构造一个
    NotificationConfig config = new RSAAutoCertificateConfig.Builder()
            .merchantId(merchantId)
            .privateKeyFromPath(privateKeyPath)
            .merchantSerialNumber(merchantSerialNumber)
            .apiV3Key(apiV3Key)
            .build();
    // 初始化 NotificationParser
    NotificationParser parser = new NotificationParser(config);
    return parser.parse(requestParam, Transaction.class);
}
youyou-pm10 commented 9 months ago

2023-10-11T23:14:53.101+08:00 INFO 248827 --- [nio-8081-exec-2] c.example.demo.controller.BuyController : notice pay failed: sign verification failed! Processing WechatPay notification,signature verification failed,signType[WECHATPAY2-SHA256-RSA2048] serial[77A42067DABBAF4B76EA6575AFD598CF712D604B] message[lXPX2+KDHxZY23S02fBACOCHvhr+Mbu6JkcA/j3cjWNYSOYH8cH+FlaeKExLWxOS4WPf+PshtED3yaHn/mYMBcQ7CAYYtGe7zWQVIQXELqrTL28aIkOqKxFagRbFVgzhmjJLCCIzWQNdasl6CTsEnCwFGA9W76OCeBK10N5Hl+iZqUP81qBlx09J+WBpRtAsNIJorbqXCj+ZuIDjvqlfF16woiJG+9wgbJBQ2tV3/+FDA232XBj381dV8/npnY2ZeD0Rdfj0M/RGMjIiRbAfbctjHe7jQYVKuRxn8iejiI6DBRZRgFm3NhW9VyT3CNsc3gJRcpKJdhVeykc/odumyQ== BW99mCrQI0FFWb5GKOhEwduVhoXmAPoL {"id":"7f8fcdb2-573a-547a-901e-4c34f9761293","create_time":"2023-10-11T22:40:46+08:00","resource_type":"encrypt-resource","event_type":"TRANSACTION.SUCCESS","summary":"支付成功","resource":{"original_type":"transaction","algorithm":"AEAD_AES_256_GCM","ciphertext":"8TKBc3NQAPapdskLACAFRX2W+g5TyrEihNRIVZdJau79OJjYU/HQjRzzx8uRKM/iDuwLVWfyW028KpHcEqtNvk27v4SAwKVlMQeJJdcqa56SVdSgTzEfWE6TQsY/EzH2/z0pDuLhQ90lej3WMHpQSPMuL4tC2rdxcH5347UZlGdjzaCAg45a0RIH/RWup7hyRBG2glXZJH9Oz5yaGVSvhkXJtcz1YyTVJKyU1kPUfKuXMX/QcNQ4wTs6Zy3mcui/D4Jwu0Fv7iJ48D2EIo+S7lgilsJGl9mBtKDQdmKWMcayfv+Sd2RUN/x5Wd2B7D1rCSiP+sneG9IZ2qss6YzgekCac3ceHZ3YJeHJYACvLGdh4RciMb3/SEXxsTwQ4SeenHSmxAPCkFbf31CBOKJpDcSgeNSMKUQ0fbuue3+ccgpt65Cs4SMUiHZEGmeMnYEIozysMEhWsecbusE8UEHrEsigT4h2QtK2GEtKVtXy05tnk3cPkgFHt6PKsjMi9ii+RZ3AnBGzX12BfKlEj6xzQDWO8DYaBHU4UHCeKi1yy/I1Van5Rogn","associated_data":"transaction","nonce":"4qkJp4DV2urE"}} ] sign[1697037292]