WxJava icon indicating copy to clipboard operation
WxJava copied to clipboard

最新版本支付公钥回调验证失败:非法请求,头部信息验证失败

Open yfgcq opened this issue 8 months ago • 8 comments

简要描述

最新版本支付公钥回调验证失败:非法请求,头部信息验证失败 `com.github.binarywang.wxpay.exception.WxPayException: 非法请求,头部信息验证失败 at com.github.binarywang.wxpay.service.impl.BaseWxPayServiceImpl.baseParseOrderNotifyV3Result(BaseWxPayServiceImpl.java:377) at com.github.binarywang.wxpay.service.impl.BaseWxPayServiceImpl.parseOrderNotifyV3Result(BaseWxPayServiceImpl.java:366)

` 前面都能够向微信发起订单了 this.wxPayService.createOrderV3(TradeTypeEnum.JSAPI, wxPayUnifiedOrderV3Request); 为啥这里还会验证错误勒?

模块版本情况

` <groupId>com.github.binarywang</groupId> <artifactId>weixin-java-pay</artifactId> 4.7.5-20250603.122757

`

返回的body String notifyData

{ "summary" : "支付成功", "event_type" : "TRANSACTION.SUCCESS", "create_time" : "2025-06-09T17:25:36+08:00", "resource" : { "associated_data" : "transaction", "ciphertext" : "oZCqdfDooIDgW9KFr9Hux8W5n1dIgMWlVRM5uIFeuNlnKvzTDO1fUARqU6nfdTdTbSLIW/E+FDFJZ/WRp/yvzQdti+FkhMHBd1zoL6zig4Mg48099qqIT3o8rL4svu08rAsNgZujiR26vFkFmbQgYela1ErPnPHqUeBBw4AkTBKnDFYWQidsCKgbiZf9U+/inmzuoc9sR/Lxw2DqqkI1g+7JWOkt9dJUpZz9xkk7NzWuBc2r28nhtVwb95JEgH1H7U29G9u+Tlkv1UjoGzStnK9S9AHevtS2Hb6V59nlIvxJGCMvtuaUYOBGzgKE8f7Gq4oHm0J4vgwqy8ootxgZKGUDKzhpPK/bOaYlJzEw4aR7eOBphmdWWgoaTjlYPSVQ2fl1nlYEpCNUziUFgLKq75B73PI9kMPUD4GBzi9tkn8xJR3A66MYdZASsqanq8jrpN/Wi7g4sXz8nZ8TvVludYYSAIXWp+39fOq3L+4nVmzHHs0FaeZ06vgpbcICse8YqBY2rHqesRgy0VCtDnNZdJsYH7c6P01wgWvGEgm/Qwh/4IVvHpBorJxrapTKxnJ0bxCH9kK1B0ggGhS8POzYD42GytE=", "original_type" : "transaction", "nonce" : "PGa9hbsICgFo", "algorithm" : "AEAD_AES_256_GCM" }, "resource_type" : "encrypt-resource", "id" : "0b30992d-09b5-5bd6-bd06-300e2dd13c4e" } 微信客服说返回的顺序不对,应该是下面这种

Image

yfgcq avatar Jun 06 '25 08:06 yfgcq

试一下 4.7.6.B 呢?

buaazyl avatar Jun 08 '25 01:06 buaazyl

我用的就是4.7.6.B版本,同样的问题: com.github.binarywang.wxpay.service.impl.EcommerceServiceImpl#parsePartnerNotifyResult: "com.github.binarywang.wxpay.exception.WxPayException","customErrorMsg":"非法请求,头部信息验证失败"

VikerTsang avatar Jun 11 '25 03:06 VikerTsang

请问有解决方法吗

yuanlaishixiaopang avatar Jun 16 '25 08:06 yuanlaishixiaopang

查了下文档如下: 1、回调使用公钥的比例:是微信支付控制的,会按照第一天0.1%,第二天1%,第三天 5%,第四天10%,第五天20%,第六天50%,第七天 100% 的进度,自动灰度,商户不可以操作。灰度期间会按照上述比例使用公钥签名,剩余比例用平台证书签名,因此商户需要实现根据回调请求的 wechatpay-serial头来判断当前的回调是使用公钥还是平台证书,并使用对应的公钥或者平台证书验签。 2、应答使用公钥的比例:是商户自己控制的,通过商户的http请求头的Wechatpay-Serial带微信支付公钥ID还是平台证书ID来判断。

也就是说,你订单请求如果走的是公钥,回单通知单的请求头可能还是平台证书的序列号,除非到了第七天100%的进度。 而4.7.6.B目前回单没兼容这两种情况。需要自己改。

VikerTsang avatar Jun 17 '25 01:06 VikerTsang

我是走的公钥,目前还没灰度完,回调用这个方式先用着了.. Image

yuanlaishixiaopang avatar Jun 17 '25 10:06 yuanlaishixiaopang

我这目前也是在灰度 刚开始,用4.7.6.B 测试是能看到根据请求头 是否包含公钥前缀来判断是否使用公钥验签,

Derick-L-HQ avatar Jun 19 '25 02:06 Derick-L-HQ

我在使用最新的4.7.6-20250609.143003版本遇到同样的问题: com.github.binarywang.wxpay.exception.WxPayException: 非法请求,头部信息验证失败

我看代码走的是AutoUpdateCertificatesVerifier, 根据serialNumber匹配证书, debug确实能匹配到证书, 但是verify失败.


我用[https://pay.weixin.qq.com/doc/v3/merchant/4013053249] 提供的示例报文做verify结果也失败.

        String timestamp = "1722850421";
        String nonce = "d824f2e086d3c1df967785d13fcd22ef";
        String serial = "PUB_KEY_ID_0000000000000024101100397200000006";
        String signature = "mfI1CPqvBrgcXfgXMFjdNIhBf27ACE2YyeWsWV9ZI7T7RU0vHvbQpu9Z32ogzc+k8ZC5n3kz7h70eWKjgqNdKQF0eRp8mVKlmfzMLBVHbssB9jEZEDXThOX1XFqX7s7ymia1hoHQxQagPGzkdWxtlZPZ4ZPvr1RiqkgAu6Is8MZgXXrRoBKqjmSdrP1N7uxzJ/cjfSiis9FiLjuADoqmQ1P7p2N876YPAol7Rn0+GswwAwxldbdLrmVSjfytfSBJFqTMHn4itojgxSWWN1byuckQt8hSTEv/Lg97QoeGniYP17T80pJeQyL3b+295FPHSO2AtvCgyIbKMZ0BALilAA==";
        String body = "{\"code_url\":\"weixin://wxpay/bizpayurl?pr=JyC91EIz1\"}";
        String beforeSign = String.format("%s\n%s\n%s\n", timestamp, nonce, body);
        System.out.println(config.getVerifier().verify(serial, beforeSign.getBytes(StandardCharsets.UTF_8), signature));

基于以上测试, 签名验证的逻辑是不是存在问题?

okkpp avatar Jun 20 '25 07:06 okkpp

@okkpp 请问解决了吗

shou-heng avatar Aug 29 '25 08:08 shou-heng