微信支付V3 微信小程序支付 线下正常、线上验签失败 回调异常 报错 com.wechat.pay.java.core.exception.ValidationException
微信支付V3 线下正常、线上验签失败 微信小程序支付回调异常:com.wechat.pay.java.core.exception.ValidationException
1. 故障现象
在微信小程序使用微信支付V3接口时,支付正常(线上和线下),在线下使用Cpolar内网穿透,支付回调正常。打包上线后,服务端收到支付回调后抛出以下异常:
com.wechat.pay.java.core.exception.ValidationException:ProcessingWechatPaynotification,signature verification failed,signType[WECHATPAY2-SHA256-RSA2048]...2. 问题定位
验签
transaction=notificationParser.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;BufferedReaderreader=null;StringBuildersb=newStringBuilder();try{stream=request.getInputStream();// 获取响应reader=newBufferedReader(newInputStreamReader(stream);Stringline;while((line=reader.readLine())!=null){sb.append(line);}}catch(IOExceptione){thrownewIOException("读取返回支付接口数据流出现异常!");}finally{if(reader!=null){reader.close();}}returnsb.toString();}3. 其他常规解决方法
请求头的问题 : 回调读取不到请求数据
证书及证书ID:支付和回调的config,使用参数不同步
4. 当前问题,正确解决方法
可以正确解析的代码:
publicstaticStringgetRequestBody(HttpServletRequestrequest)throwsIOException{ServletInputStreamstream;BufferedReaderreader=null;StringBuildersb=newStringBuilder();try{stream=request.getInputStream();// 获取响应reader=newBufferedReader(newInputStreamReader(stream,StandardCharsets.UTF_8));Stringline;while((line=reader.readLine())!=null){sb.append(line);}}catch(IOExceptione){thrownewIOException("读取返回支付接口数据流出现异常!");}finally{if(reader!=null){reader.close();}}returnsb.toString();}两者区别,在于对流的编码指定
StandardCharsets.UTF_8至此解决当前问题
5. 特别鸣谢
特别鸣谢
