bindbox-game/.trae/documents/支付域持久化与服务对接执行方案.md
邹方成 6ee627139c
Some checks failed
Build docker and publish / linux (1.24.5) (push) Failing after 40s
feat: 新增支付测试小程序与微信支付集成
feat(pay): 添加支付API基础结构
feat(miniapp): 创建支付测试小程序页面与配置
feat(wechatpay): 配置微信支付参数与证书
fix(guild): 修复成员列表查询条件
docs: 更新代码规范文档与需求文档
style: 统一前后端枚举显示与注释格式
refactor(admin): 重构用户奖励发放接口参数处理
test(title): 添加称号效果参数验证测试
2025-11-17 00:42:08 +08:00

2.5 KiB
Raw Blame History

目标

  • 连接已生成的 payment_* 表与 Model/DAO完成真实微信支付体系预下单→通知→退款→对账统一金额/积分;管理端与前端展示一致。

后端改造

  • 预下单JSAPI
    • internal/api/user/pay_wechat_app.go 调用 jsapi 预下单成功后,写入 payment_preorders(order_id, order_no, out_trade_no=order_no, prepay_id, amount_total, payer_openid, notify_url, status, expired_at) 并回填 orders.pay_preorder_id
  • 通知验签与解密:
    • internal/api/pay/wechat_notify.go 验签解密后,写 payment_notify_events(notify_id, event_type, raw, processed=false) 并去重;写 payment_transactions(order_id, order_no, transaction_id, amount_total, success_time, raw);条件更新 orders.status:1→2,写 paid_at
  • 后台主动退款:
    • internal/api/admin/pay_refund_admin.go 调用微信退款后,写入 payment_refunds(order_id, order_no, refund_no, amount_refund, status, success_time, raw, reason)
    • 按比例恢复积分:恢复积分 = (订单积分抵扣分 × 退款分 ÷ 实付分) ÷ 100,累计不超过订单抵扣积分;全额退款一次性恢复剩余;全额时置 orders.status=4;部分退款保留 2已支付
  • 对账:
    • 新增服务在每日任务中拉取 tradebill/refundbill 入库 payment_bills;对比 payment_transactions/payment_refunds 生成 payment_bill_diff;导出差异。

管理端接口

  • 订单详情聚合:从 payment_transactions/payment_refunds 汇总展示 transaction_id/success_time/amount_totalrefund_no/amount_refund/status/success_time/reason;计算可退余额 actual_amount - 累计退款
  • 退款列表/详情:GET /api/admin/pay/refundsGET /api/admin/pay/refunds/:refund_no
  • 对账入口:POST /api/admin/pay/bills/importGET /api/admin/pay/bills/diffs

前端改造

  • 金额统一以“元”格式化展示(两位小数),接口仍用“分”;
  • 订单详情增加真实字段(交易号、退款号、渠道/支付方式),展示累计已退与可退余额(元);退款记录按元显示。

幂等与安全

  • 使用唯一索引与幂等键:order_no/notify_id/refund_no/transaction_id/out_trade_no
  • 条件更新控制并发;异常与差异告警。

验收与测试

  • 单元:分↔积分换算、比例恢复、幂等重复;
  • 集成:预下单→通知→主动退款→详情一致;
  • 对账:拉取账单并生成差异;前后端构建与联调通过。