最新版本支付公钥回调验证失败:非法请求,头部信息验证失败
简要描述
最新版本支付公钥回调验证失败:非法请求,头部信息验证失败 `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); 为啥这里还会验证错误勒?
模块版本情况
`
`
返回的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" }
微信客服说返回的顺序不对,应该是下面这种
试一下 4.7.6.B 呢?
我用的就是4.7.6.B版本,同样的问题: com.github.binarywang.wxpay.service.impl.EcommerceServiceImpl#parsePartnerNotifyResult: "com.github.binarywang.wxpay.exception.WxPayException","customErrorMsg":"非法请求,头部信息验证失败"
请问有解决方法吗
查了下文档如下: 1、回调使用公钥的比例:是微信支付控制的,会按照第一天0.1%,第二天1%,第三天 5%,第四天10%,第五天20%,第六天50%,第七天 100% 的进度,自动灰度,商户不可以操作。灰度期间会按照上述比例使用公钥签名,剩余比例用平台证书签名,因此商户需要实现根据回调请求的 wechatpay-serial头来判断当前的回调是使用公钥还是平台证书,并使用对应的公钥或者平台证书验签。 2、应答使用公钥的比例:是商户自己控制的,通过商户的http请求头的Wechatpay-Serial带微信支付公钥ID还是平台证书ID来判断。
也就是说,你订单请求如果走的是公钥,回单通知单的请求头可能还是平台证书的序列号,除非到了第七天100%的进度。 而4.7.6.B目前回单没兼容这两种情况。需要自己改。
我是走的公钥,目前还没灰度完,回调用这个方式先用着了..
我这目前也是在灰度 刚开始,用4.7.6.B 测试是能看到根据请求头 是否包含公钥前缀来判断是否使用公钥验签,
我在使用最新的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 请问解决了吗