## 目标 - 按真实微信支付流程完善一个完整的支付体系:持久化预下单/交易/退款/通知/对账,统一金额/积分口径,优化退款恢复与幂等,前后端一致展示。 ## 数据库与模型 - 新增表(均使用“分”为金额单位): - payment_preorders(id, order_id, order_no[UNIQUE], channel, prepay_id, out_trade_no[UNIQUE], amount_total, payer_openid, status(created/expired/paid), notify_url, created_at, expired_at) - payment_transactions(id, order_id, order_no[UNIQUE], channel, transaction_id[UNIQUE], amount_total, success_time, raw(JSON), created_at) - payment_refunds(id, order_id, order_no, refund_no[UNIQUE], channel, status(submitted/success/abnormal/closed), amount_refund, reason, success_time, raw(JSON), created_at) - payment_notify_events(id, notify_id[UNIQUE], resource_type, event_type, summary, raw(JSON), processed(bool), created_at) - payment_bills(id, bill_date, type(tradebill/refundbill), file_url, digest, imported(bool), created_at) - payment_bill_diff(id, bill_date, diff_type(missing/amount_mismatch/extra), local_tx_id, wechat_tx_id, detail, created_at) - 订单唯一索引:orders.order_no[UNIQUE] - 迁移:生成/应用 GORM 迁移脚本;保持向后兼容(不破坏现有数据)。 ## Repository/DAO - 生成 gorm/gen DAO 与 model 文件;在 internal/repository/mysql/dao, model 下新增 payment_* 的 gen 文件。 ## Service 逻辑 - 预下单: - 校验订单 status=1、金额与归属;调用 jsapi.Prepay,落库 payment_preorders(out_trade_no=order_no, prepay_id),回填 orders.pay_preorder_id;返回调起参数(RSA-SHA256 四行签名)。 - 支付通知: - 验签解密 payments.Transaction;幂等(notify_id 去重)入库 payment_notify_events;写入 payment_transactions(transaction_id/raw/success_time);orders 条件推进 status:1→2,写 paid_at。 - 退款: - 管理端主动退款:生成 refund_no 并调用 refunddomestic.Create,入库 payment_refunds(refund_no/amount/status/raw); - 积分恢复(统一口径): - 部分退款按比例恢复:恢复积分 = (订单积分抵扣分 × 退款分 ÷ 实付分) ÷ 100,累计不超过订单抵扣积分;全额退款一次性恢复剩余积分;幂等校验(累计已恢复积分 vs 目标)。 - 订单状态:全额退款置 4已退款;部分退款维持 2已支付,并维护累计已退款金额(聚合 payment_refunds)。 - 对账: - 每日下载交易/退款账单(依 SDK);入库 payment_bills;比对 payment_transactions/payment_refunds 生成 payment_bill_diff;提供导出与差异修复入口。 ## Admin 接口 - 订单详情:增加展示字段 transaction_id、累计已退款、每笔退款(refund_no/amount/status/时间/原因);可退余额=实付-累计退款。 - 退款列表与详情:GET /api/admin/pay/refunds, GET /api/admin/pay/refunds/:refund_no; - 对账:POST /api/admin/pay/bills/import(上传账单并入库);GET /api/admin/pay/bills/diffs(差异列表)。 ## 前端 - 金额统一格式化为“元”展示(两位小数),内部接口仍用“分”; - 订单详情页增加 transaction_id/refund_no/channel/支付方式;展示累计已退款与可退余额(元); - 退款记录表展示 refund_no/金额(元)/原因/时间; - 保持中文枚举一致(状态/来源/发货/抽奖)。 ## 幂等与安全 - 幂等键:order_no(预下单/推进)、notify_id(回调)、refund_no(退款); - 唯一索引:预下单/交易/退款/通知表关键字段; - 条件更新:WHERE status=... 控制并发; - 日志与告警:验签失败、金额不一致、退款异常、对账差异。 ## 测试与验收 - 单元:分↔积分换算、部分/全额退款恢复、幂等重复; - 集成:真实预下单→回调→主动退款→详情一致; - 对账:拉取账单并生成差异; - 验收:管理端全链路可用、金额与积分口径一致、数据持久化完整。