feat(pay): 接入微信支付V3原路退款(按支付渠道分流 + 幂等 + 退款回调)

- 新增微信退款客户端 createRefund/queryRefundByOutRefundNo(/v3/refund/domestic/refunds)

- 新增退款桥接模块与 payment_refunds 幂等退款记录表

- 订单退款按渠道分流:微信支付原路退回微信;余额支付退回钱包余额;微信退款失败(502)不回退余额,防重复退款

- 覆盖拒单/买家取消/仲裁全额与部分/超时自动退款;新增 /api/pay/wechat/refund-notify 回调

- 后台新增退款回调地址配置;文档补充退款验收说明

- 新增回归护栏 wechat-refund.spec.ts(77 套件/605 用例全绿)
这个提交包含在:
xcbyy
2026-10-19 08:47:08 +08:00
父节点 e719de59a2
当前提交 8edffbefa2
共有 8 个文件被更改,包括 428 次插入 和 67 次删除

查看文件

@@ -97,7 +97,21 @@ MYSQL_DATABASE=peiwan
验收:提现 1 元 → 后台通过 → 观察工单由"处理中"→"已打款"、大神微信零钱到账;人为失败(如场景ID 错误)应置"打款失败"并退回佣金。
## 六、微信订阅消息(服务通知)配置与验收
## 六、订单退款(微信原路退款)
订单退款现在按**支付渠道分流**:
- 微信支付订单 → 调用微信 V3 退款接口 `POST /v3/refund/domestic/refunds`,**原路退回买家微信零钱/银行卡**;
- 余额支付订单 → 退回平台钱包余额。
说明:
- 退款单号 `out_refund_no` 幂等(同一订单重复退款不会重复出款),退款记录落 `payment_refunds` 表;
- 退款结果回调:`POST /api/pay/wechat/refund-notify`(后台可配置 `refund_notify_url`,默认 `https://peiww.gynhc.com/api/pay/wechat/refund-notify`),未回调时以微信退款受理状态为准;
- **微信支付订单若退款接口调用失败,不会改退余额**(避免重复退款),接口返回 502,订单保持原状态可重试;超时自动退款失败会自动回滚状态等待下次重试。
- 若未配置微信支付 LIVE/就绪,微信支付订单退款会返回 502(不会静默改退余额);余额支付订单不受影响。
验收:用 LIVE 支付 1 元订单 → 拒单/仲裁全额退款 → 买家微信收到原路退款,`payment_refunds` 记录状态更新。
## 七、微信订阅消息(服务通知)配置与验收
后台「平台配置与协议规则 → 微信服务通知与模板」维护:总开关 `enablePush` + 4 类模板ID(订单状态 / 组局报名 / 提现到账 / 核销码)。
@@ -109,10 +123,10 @@ MYSQL_DATABASE=peiwan
- **小程序授权**:设置页开启通知时用**真实模板ID** 调 `wx.requestSubscribeMessage` 收集授权。订阅为**一次性**,需在关键动作前再次请求(后续可在下单/报名/提现前补请求)。
- **启动自检**:不额外打印;如需可在后台测试推送处验证。
## 七、内容安全(可选)
## 八、内容安全(可选)
后台填入真实小程序 `appId` 与 32 位 `appSecret` 后,内容检测会真实调用微信 `msgSecCheck`;未配置时自动跳过远端、仅跑本地敏感词库(fail-open,不影响业务)。
## 八、回滚
## 九、回滚
本轮改动遵循"边界内最小改动",无破坏性数据库结构变更。如需回滚,按部署前的文件/库备份还原即可。