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

springboot 对接微信支付V2退款

在 Spring Boot 中对接微信支付 V2 退款,核心难点在于双向证书的配置和XML 格式的交互。以下是基于官方文档和实战经验整理的对接方案:

1. 核心依赖配置

推荐使用wx-java-pay(原 binarywang)SDK,它能自动处理 XML 转换和签名,避免手写复杂的证书逻辑。

  • Maven 依赖

<dependency> <groupId>com.github.binarywang</groupId> <artifactId>wx-java-pay</artifactId> <version>4.6.0</version> <!-- 建议使用最新版本 --> </dependency>
  • YAML 配置:重点配置keyPath(API Key)和keyContent(PKCS12 证书内容)。

wx: pay: appId: wx1234567890 mchId: 1234567890 keyPath: 商户API密钥(API Key) keyContent: classpath:cert/apiclient_cert.p12 # 退款必须配置证书路径

2. 退款代码实现

利用 SDK 的WxPayService发起退款请求。注意金额单位需转换为,且必须使用Integer类型。

@Autowired private WxPayService wxPayService; public WxPayRefundResult refundOrder(String orderNo, String refundNo, BigDecimal totalFee, BigDecimal refundFee) throws WxPayException { WxPayRefundRequest request = new WxPayRefundRequest(); // 1. 设置订单号(二选一,推荐用商户订单号) request.setOutTradeNo(orderNo); // 2. 设置退款单号(商户系统内唯一) request.setOutRefundNo(refundNo); // 3. 金额转换:元转分 (必须使用 int 类型) request.setTotalFee(totalFee.multiply(new BigDecimal(100)).intValue()); request.setRefundFee(refundFee.multiply(new BigDecimal(100)).intValue()); // 4. 异步回调地址(可选,用于处理退款结果通知) request.setNotifyUrl("https://your-domain.com/wx/refund/notify"); // 执行退款 return wxPayService.refund(request); }

3. 关键避坑指南

  • 证书加载失败:V2 退款接口强制要求使用商户API证书(PKCS12格式,即.p12文件),而非普通的 RSA 公钥。若报错java.security.InvalidKeyException,请检查证书密码(通常为商户号 MchId)是否正确,以及 Spring Boot 是否成功读取到了资源文件 。

  • 金额类型错误:V2 接口的金额字段(total_fee,refund_fee)定义为int。如果传入BigDecimalString,会导致 XML 解析失败或签名错误,务必做类型转换 。

  • 结果判断逻辑:接口返回的return_code仅代表“通信成功”,必须同时判断result_codeSUCCESS才代表业务受理成功。资金实际到账需等待微信异步通知或主动查询 。

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

相关文章:

  • 如何用AcFunDown三步搞定A站视频批量下载:新手完全指南
  • 8【自适应天线与相控阵技术】相控阵天线——导论
  • 蓝桥杯软件测试模拟赛实战复盘:Selenium自动化测试那些坑(附完整Python代码)
  • 大模型量化技术全景解析——从 INT8/FP8 到 GPTQ/AWQ/SmoothQuant,工程师必知的精度压缩之
  • 崩坏星穹铁道自动化助手:三月七小助手全功能使用指南
  • Windows/Linux/Mac三平台对比:Conda环境激活命令到底差在哪?附一键配置脚本
  • CANoe诊断控制台加载DLL失败?可能是Visual Studio项目配置的锅(附VS2019 x64 Release配置详解)
  • 如何在foobar2000中配置OpenLyrics开源歌词插件:从安装到高级使用完整指南
  • 为什么83%的SRE团队在MCP 2026升级后告警响应延迟翻倍?——基于217家企业的日志分析基准测试白皮书首发
  • 如何快速解锁iOS设备:applera1n开源激活锁绕过工具的完整指南
  • 专升本背景也能拿14kAI岗offer?他逆袭路打了多少人的脸
  • 如何用TVBoxOSC打造你的专属智能电视影院:3步解决所有播放难题
  • 从官方Vue2示例到生产环境:我如何重构H265web.js播放器的封装与调用逻辑
  • 终极指南:5分钟为FF14国际服注入完美中文补丁
  • SOCD解决方案:游戏按键冲突的系统级优化与竞技操作精准控制
  • In-Place Test-Time Training for Large Language Models
  • 关于java后端的详解
  • Anthropic 密集调改定价,AI 产品商业模式转向“卖电表”?
  • LaTeX写论文遇到作者名带ä, ö, ü怎么办?BibTeX特殊字符转义保姆级指南
  • 为AI Agent构建稳定桥梁:opencli-skill如何实现自动化操作与数据抓取
  • 研华DAQNavi API设计精要:从‘端口’与‘通道’说起,理解工业数据采集的抽象艺术
  • 通过 Taotoken 模型广场为特定任务 agent 快速筛选性价比最优模型
  • 强化学习自适应采样技术解析与实战优化
  • Ultimaker Cura:新手3分钟快速上手指南,免费开源切片软件终极教程
  • CMake 项目切换 Ninja 构建问题排查记录
  • Admin.NET框架资料
  • AppImageLauncher完全指南:如何在Linux桌面上轻松管理AppImage应用
  • 告别第三方工具!手把手教你用vlmcsd在Windows Server上搭建私有KMS服务器,安全激活Office 2010 VOL版
  • MCP 2026量子环境适配避坑清单:从Linux内核4.19到5.15的cgroup v2调度缺陷、CUDA-Q驱动冲突、以及Rust 1.82+ ABI断裂点
  • Clawrma:为AI Agent设计的P2P任务网络,实现去中心化网页抓取与推理