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 次删除

查看文件

@@ -253,6 +253,24 @@ export async function initDatabase(): Promise<void> {
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
`);
// 7.5.1 微信原路退款记录(幂等:out_refund_no 唯一)
await conn.query(`
CREATE TABLE IF NOT EXISTS payment_refunds (
id INT PRIMARY KEY AUTO_INCREMENT,
out_refund_no VARCHAR(64) UNIQUE NOT NULL,
out_trade_no VARCHAR(64) NOT NULL,
order_id VARCHAR(64) DEFAULT '',
refund_id VARCHAR(64) DEFAULT '',
refund_cents INT NOT NULL DEFAULT 0,
total_cents INT NOT NULL DEFAULT 0,
status VARCHAR(32) NOT NULL DEFAULT 'PROCESSING',
reason VARCHAR(255) DEFAULT '',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_order (order_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
`);
// 8. 线下合规场所库
await conn.query(`
CREATE TABLE IF NOT EXISTS safety_places (