当前位置: 首页 > news >正文

微信支付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. 特别鸣谢

特别鸣谢

http://www.jsqmd.com/news/1125795/

相关文章:

  • 【2026】3ds Max 2027安装教程超详细图文步骤(附完整安装包)
  • 低压密集型母线槽核心选材标准解析,16 年生产工厂实操经验总结
  • WP7有约(三):课堂重点
  • R语言实现电力系统N-1事故分析与风险图谱生成
  • 创业是一种心态、信念和坚持,是一种生活方式
  • 商品条码查询API实战:免费接口申请到代码集成全攻略
  • UE指的是用户的体验,
  • 如何找到口碑过硬的医美材料供应商?
  • 多材质通用UV打印机:适配哪些材料?满足多场景印刷需求
  • LeetDown:3步让你的旧iPhone重获新生,macOS上一键降级体验
  • TypeScript_类型系统深度解析
  • 【Agent 个人学习分享日记】《RAG 全链路深度拆解:从知识库构建到精准问答的核心机制与工程实践》
  • 如何向妻子解释OOD
  • 商品条码查询API快速集成指南:从申请到调用实战
  • 3 个 Skills + 1 个记忆层,打造能成长的 Agent
  • 人工智能模型部署与推理服务性能调优
  • 如何建立自己的“表达结构库”
  • 深度解析 | RevokeMsgPatcher如何用二进制魔法让撤回消息“无处可藏“
  • JAVA 代码赏析:优雅的 Token 提取策略
  • SpringBoot 整合 XXL-JOB——分布式任务调度实战
  • 大气层1.7.1整合包:Switch破解系统的终极完整配置指南
  • IntelliJ IDEA 创建 Maven 项目完整指南
  • PySpark Join性能优化:解决Shuffle倾斜与Python序列化瓶颈
  • AI学习(2)——补:linux自启动llama
  • 南京会场 | 7-8月学术会议征稿通知
  • 开发板驱动环境配置(ROCK 5C为例)
  • 当我们在谈论“开源低科技”时,我们在谈论什么?
  • 数据库学习笔记2——MySQL 的锁机制
  • 编译原理第三版第五章课后题1-2题
  • 本地代码编辑器集成DeepSeek模型:从原理到实践的完整指南