回调解密的时候出现错误
Closed this issue · 3 comments
错误描述
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
已解决
怎么解决的呀,我看都说原始报文,但是都试了一下好像还是不行。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);
}
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]