
微信支付V3 线下正常、线上验签失败 微信小程序支付回调异常com.wechat.pay.java.core.exception.ValidationException1. 故障现象在微信小程序使用微信支付V3接口时支付正常线上和线下在线下使用Cpolar内网穿透支付回调正常。打包上线后服务端收到支付回调后抛出以下异常com.wechat.pay.java.core.exception.ValidationException:ProcessingWechatPaynotification,signature verification failed,signType[WECHATPAY2-SHA256-RSA2048]...2. 问题定位验签transactionnotificationParser.parse(WxPayV3Utils.handleNodifyRequestParam(request));// 验签参数封装// WxPayV3Utils.handleNodifyRequestParam(request)// 返回值returnnewRequestParam.Builder().serialNumber(serial).nonce(nonce).signature(signature).timestamp(timestamp).body(getRequestBody(request)).build();在封装body的时候 getRequestBody方法当下为导致异常的代码publicstaticStringgetRequestBody(HttpServletRequestrequest)throwsIOException{ServletInputStreamstream;BufferedReaderreadernull;StringBuildersbnewStringBuilder();try{streamrequest.getInputStream();// 获取响应readernewBufferedReader(newInputStreamReader(stream);Stringline;while((linereader.readLine())!null){sb.append(line);}}catch(IOExceptione){thrownewIOException(读取返回支付接口数据流出现异常);}finally{if(reader!null){reader.close();}}returnsb.toString();}3. 其他常规解决方法请求头的问题 回调读取不到请求数据证书及证书ID支付和回调的config,使用参数不同步4. 当前问题正确解决方法可以正确解析的代码publicstaticStringgetRequestBody(HttpServletRequestrequest)throwsIOException{ServletInputStreamstream;BufferedReaderreadernull;StringBuildersbnewStringBuilder();try{streamrequest.getInputStream();// 获取响应readernewBufferedReader(newInputStreamReader(stream,StandardCharsets.UTF_8));Stringline;while((linereader.readLine())!null){sb.append(line);}}catch(IOExceptione){thrownewIOException(读取返回支付接口数据流出现异常);}finally{if(reader!null){reader.close();}}returnsb.toString();}两者区别在于对流的编码指定StandardCharsets.UTF_8至此解决当前问题5. 特别鸣谢特别鸣谢