# 变更提案: order-payment-snapshot ## 元信息 ```yaml 类型: 功能增强 方案类型: implementation 优先级: P1 状态: 执行中 创建: 2026-04-25 ``` --- ## 1. 需求 ### 背景 当前 `Xboard-new` 的订单支付链路在支付成功后仅稳定保留了 `payment_id`、`trade_no`、`callback_no` 与 `paid_at`,后台订单详情页也主要展示基础信息、金额拆解和佣金状态。用户本轮明确要求:订单支付成功后,应额外保存并展示支付渠道、支付方法,并在 `admin-frontend` 的订单详情中以“成功订单”样式补齐支付成功信息块,至少覆盖平台订单号、商户订单号、订单金额、实际支付金额、创建 / 完成时间、支付 IP 与订单状态等关键信息。 ### 目标 - 在后端订单模型中补齐支付成功快照字段,避免后续支付配置变更后后台无法追溯真实支付上下文。 - 在支付回调成功时保存支付渠道、支付方法、实际支付金额与支付 IP,并继续兼容人工标记已支付链路。 - 在 `admin-frontend` 订单详情抽屉中新增支付成功信息块,按 Apple 化后台风格集中展示支付渠道 / 方法与支付流水信息。 ### 约束条件 ```yaml 范围约束: 本轮只补齐后台订单支付快照的保存与展示,不扩展到前台用户订单详情页 技术约束: 延续 Laravel + Vue3 + TypeScript + Element Plus 现有实现,不新增第三方支付 SDK 或前端 UI 依赖 兼容约束: 现有 `payment_id` / `callback_no` / `paid_at` 语义保持不变;支付插件回调字段缺失时必须优雅降级 视觉约束: 订单详情延续 `.helloagents/DESIGN.md` 中 Apple 风格后台基线,不回退为厚重卡片堆叠 ``` ### 验收标准 - [ ] `v2_order` 新增支付快照字段后,支付成功时可保存支付渠道、支付方法、实际支付金额与支付 IP。 - [ ] TokenPay 回调会优先写入真实回调里的平台单号 / 实付金额 / 支付 IP / 方法信息;缺失字段时后端使用合理回退值,不影响开通流程。 - [ ] 管理端订单详情可展示支付渠道、支付方法、平台订单号、商户订单号、订单金额、实际支付金额、支付时间与支付 IP。 - [ ] 订单详情 UI 仍保持现有黑色 Hero + 白色工作台的信息层级,不引入新的视觉体系。 - [ ] 后端定向测试与 `admin-frontend` 构建验证通过。 --- ## 2. 方案 ### 技术方案 1. 为 `v2_order` 增加支付快照字段,补齐模型注释与类型转换,确保支付成功后的快照能够稳定落库。 2. 调整支付成功链路: - `plugins/TokenPay/Plugin.php` 在回调验签成功后返回更完整的支付元信息。 - `app/Http/Controllers/V1/Guest/PaymentController.php` 把支付回调元信息传入订单处理链路。 - `app/Services/OrderService.php` 在 `paid()` 阶段统一写入支付快照,并兼容人工标记已支付与字段缺失场景。 3. 调整后台订单详情: - `app/Http/Controllers/V2/Admin/OrderController.php` 补载 `payment` 关系。 - `admin-frontend/src/types/api.d.ts` 补齐订单支付快照类型。 - `admin-frontend/src/views/subscriptions/OrderDetailDrawer.vue` 新增“支付成功信息”区块,按字段分组展示。 ### 影响范围 ```yaml 涉及模块: - app/Services - app/Http/Controllers/V1/Guest - app/Http/Controllers/V2/Admin - app/Models - plugins/TokenPay - database/migrations - admin-frontend/src/types - admin-frontend/src/views/subscriptions 预计变更文件: 8-10 ``` ### 风险评估 | 风险 | 等级 | 应对 | |------|------|------| | 第三方支付回调字段命名不稳定,无法保证每个字段都存在 | 中 | 采用“真实回调优先 + 支付配置回退 + 空值兜底”策略,避免因快照缺失阻断支付 | | 管理端订单详情新增字段后,旧订单历史数据为空 | 低 | UI 明确显示 `-`,仅对新成功订单逐步补齐 | | 金额快照与现有“分”单位格式不一致 | 中 | 后端统一把回调金额规范为“分”存储,前端继续复用 `formatOrderAmount()` | --- ## 3. 成果设计 ### 设计方向 - **美学基调**: Apple Admin Ledger。像运营后台里的“支付流水面板”,强调黑色首屏下的精确信息卡片与支付状态可追溯性。 - **记忆点**: 在订单详情抽屉中新增一块“支付成功信息”面板,把支付渠道 / 方法与平台流水信息收束成一眼可读的成功订单摘要。 ### 视觉要素 - **配色**: 延续黑色 Hero、白色详情卡、蓝色强调与成功绿色状态点。 - **布局**: 采用“标题说明 + 右侧状态徽章 + 双列信息网格”的后台信息卡结构,与现有基础信息 / 金额拆解区保持统一。 - **状态**: 有支付快照时优先展示成功信息;历史订单缺字段时保留 `-` 占位,不制造伪数据。 --- ## 4. 技术决策 ### order-payment-snapshot#D001: 支付渠道与支付方法采用“快照字段 + 当前支付配置回退”双轨展示 **日期**: 2026-04-25 **状态**: ✅采纳 **背景**: 仅依赖 `payment_id` 关联会受到后续支付配置改名影响,无法稳定反映订单成交当时的支付上下文。 **决策**: 在订单表新增 `payment_channel / payment_method / payment_amount / payment_ip` 快照字段,并在详情页中优先展示快照,缺失时再回退到当前 `payment` 关联信息。 **理由**: 既满足历史追溯,也兼容旧订单与人工处理场景。 ### order-payment-snapshot#D002: 实际支付金额统一以“分”为单位入库 **日期**: 2026-04-25 **状态**: ✅采纳 **背景**: 当前后台订单金额体系统一以“分”为真相源,前端已有 `formatOrderAmount()` 的统一格式化链路。 **决策**: 支付回调里的实际支付金额在后端转换为整数“分”后入库。 **理由**: 避免前后端引入第二套金额口径,复用现有订单金额展示与排序逻辑。