## 实施范围 - 对接已生成的 payment_* 表与 Model/DAO,落地真实支付服务逻辑与管理端展示 ## 后端服务对接 - 预下单(JSAPI) - 写入 `payment_preorders`:`order_id/order_no/out_trade_no=order_no/prepay_id/amount_total/payer_openid/notify_url/status=created/expired_at` - 回填 `orders.pay_preorder_id`;返回四行签名参数给小程序 - 支付通知(验签与解密) - 入库 `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` - 后台主动退款(全额/部分) - 生成 `refund_no` 并调用微信退款 API,入库 `payment_refunds`:`order_id/order_no/refund_no/amount_refund/status/success_time/raw/reason` - 积分恢复(统一换算与幂等): - 部分退款:`恢复积分 = (订单积分抵扣分 × 退款分 ÷ 实付分) ÷ 100`,累计不超过订单抵扣积分;幂等以“累计已恢复”校验 - 全额退款:一次性恢复剩余积分,置 `orders.status=4` - 对账基础能力 - 拉取交易/退款账单入库 `payment_bills`;比对生成 `payment_bill_diff`;导出差异 ## 管理端接口 - 订单详情聚合字段: - 交易:`transaction_id/success_time/amount_total` - 退款:累计已退与明细 `refund_no/amount_refund/status/success_time/reason` - 可退余额(分):`actual_amount - 累计退款` - 退款列表与详情:`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/支付方式`、累计已退与可退余额(元);退款记录按元显示 ## 幂等与安全 - 幂等键:`order_no/notify_id/refund_no`;唯一索引已在表层 - 条件更新控制并发;日志与告警覆盖验签失败、金额不一致、退款异常、对账差异 ## 验收与测试 - 单元:分↔积分换算、部分/全额退款恢复、幂等重复 - 集成:真实预下单→通知→主动退款→详情对齐;对账拉取与差异 - 构建与联调通过,数据持久化与展示一致