# 用户使用流程图 — 支付与结算
> **端口说明**: 📱 小程序 | 🖥 管理后台 | 📋 规划师端 | ⚙️ 系统自动
>
> **分层说明**: 🏠 页面 → 🔗 API → ⚙️ Service → 📦 数据实体
## 支付场景
系统支持三种支付场景,共享同一套支付网关:
| 场景 | 订单类型 | 触发角色 | 前端端口 |
|------|---------|---------|---------|
| 商品购买 | 实物/虚拟商品订单 | 家长 | 📱小程序 |
| 测评订单 | 测评服务订单 | 家长 | 📱小程序 |
| 模板购买 | 任务模板包订单 | 家长/规划师 | 📱小程序/📋规划师端 |
```mermaid
flowchart TD
%% ============ 颜色定义 ============
classDef page fill:#e3f2fd,stroke:#1565c0,stroke-width:2px
classDef api fill:#fff3e0,stroke:#f57c00,stroke-width:1px
classDef service fill:#e8f5e9,stroke:#388e3c,stroke-width:1px
classDef data fill:#f3e5f5,stroke:#7b1fa2,stroke-width:1px
classDef external fill:#fce4ec,stroke:#d32f2f,stroke-width:1px,stroke-dasharray:3 2
classDef actor fill:#e1f5fe,stroke:#0288d1,stroke-width:2px,stroke-dasharray:5 3
%% ============ 角色 ============
A0(("👤 家长")):::actor
B0(("📋 规划师")):::actor
C0(("🏦 微信/支付宝")):::actor
D0(("🖥 管理员")):::actor
%% ================================================================
%% 阶段一:订单创建
%% ================================================================
subgraph 阶段一[阶段一:创建订单]
direction TB
P1["🏠 选择商品/测评/模板"]:::page
P1 -->|"商品ID, 数量, 收货地址"| P1a["🏠 商品确认页"]:::page
P1a --> A1["🔗 POST /api/product/order/create"]:::api
A1 -->|"商品ID, 数量, 支付方式, 优惠券ID"| S1["⚙️ ProductOrderService.create()"]:::service
S1 -->|"写入订单, 状态=pending"| D1["📦 product_orders 表"]:::data
P1 -->|"孩子ID, 规划师ID, 套餐ID"| P1b["🏠 测评确认页"]:::page
P1b --> A1a["🔗 POST /api/dan-assessment/order/create"]:::api
A1a -->|"孩子ID, 规划师ID, 套餐ID, 家庭ID"| S1a["⚙️ AssessmentOrderService.createOrder()"]:::service
S1a -->|"写入订单, 状态=pending"| D1a["📦 assessment_orders 表"]:::data
P1 -->|"套餐ID, 支付方式"| P1c["🏠 模板确认页"]:::page
P1c --> A1b["🔗 POST /api/payment/create"]:::api
A1b -->|"套餐ID, 支付方式, 优惠券ID"| S1b["⚙️ PackagePaymentService.createOrder()"]:::service
S1b -->|"写入订单, 状态=pending"| D1b["📦 package_orders 表"]:::data
end
%% ================================================================
%% 阶段二:支付处理
%% ================================================================
subgraph 阶段二[阶段二:支付处理]
D1 --> P2["🏠 选择支付方式"]:::page
P2 -->|"微信支付"| A2["🔗 POST /api/payment/wechat/create"]:::api
A2 -->|"订单号, 商品描述, 金额(分)"| S2["⚙️ PaymentService.createWechatPayOrder()"]:::service
S2 -->|"调用微信JSAPI, 获取prepay_id"| E2["🏦 微信支付收银台"]:::external
E2 -->|"用户确认支付"| S2a["⚙️ 微信异步回调"]:::service
S2a -->|"支付结果通知"| A2a["🔗 POST /api/payment/wechat/callback"]:::api
A2a -->|"订单号, 微信交易号"| S2b["⚙️ PaymentService.handlePaymentCallback()"]:::service
S2b -->|"更新订单状态=paid"| D2["📦 对应订单表: product_orders
或 assessment_orders 或 package_orders"]:::data
P2 -->|"支付宝"| A2b["🔗 POST /api/payment/alipay/create"]:::api
A2b -->|"订单号, 商品描述, 金额"| S2c["⚙️ PaymentService.createAlipayOrder()"]:::service
S2c -->|"调用支付宝, 获取form"| E2a["🏦 支付宝收银台"]:::external
E2a -->|"用户确认支付"| S2d["⚙️ 支付宝异步回调"]:::service
S2d -->|"支付结果通知"| A2c["🔗 POST /api/payment/alipay/callback"]:::api
A2c -->|"订单号, 支付宝交易号"| S2e["⚙️ PaymentService.handlePaymentCallback()"]:::service
S2e -->|"更新订单状态=paid"| D2
D2 -->|"订单号"| P2a["🏠 支付成功页"]:::page
end
%% ================================================================
%% 阶段三:支付后处理
%% ================================================================
subgraph 阶段三[阶段三:支付后处理]
D2 -->|"商品订单paid"| P3["🏠 商品订单:等待发货"]:::page
P3 --> A3["🔗 POST /api/product/order/handlePaymentSuccess"]:::api
A3 -->|"订单号, 支付方式, 交易号"| S3["⚙️ 订单后处理"]:::service
S3 -->|"更新支付信息, 记录流水"| D3["📦 product_orders 表
更新pay_time, transaction_id"]:::data
D2 -->|"测评订单paid"| P3a["🏠 测评订单:等待预约"]:::page
P3a --> A3a["🔗 POST /api/dan-assessment/order/pay"]:::api
A3a -->|"订单号, 支付方式"| S3a["⚙️ AssessmentOrderService.payOrder()"]:::service
S3a -->|"更新状态=paid, 创建预约"| D3a["📦 assessment_orders 表
+ assessment_appointments 表"]:::data
D2 -->|"模板订单paid"| P3b["🏠 模板订单:应用模板"]:::page
P3b --> A3b["🔗 POST /api/payment/apply"]:::api
A3b -->|"订单ID, 孩子ID, 选中项"| S3b["⚙️ TaskPlanService.applyPackage()"]:::service
S3b -->|"生成任务计划实例"| D3b["📦 task_plan_instances 表
下发生成任务"]:::data
end
%% ================================================================
%% 阶段四:退款
%% ================================================================
subgraph 阶段四[阶段四:退款处理]
D3 -->|"已支付订单"| P4["🏠 申请退款"]:::page
P4 -->|"退款原因"| A4["🔗 POST /api/product/order/refund/apply"]:::api
A4 -->|"订单ID, 退款原因, 退款金额"| S4["⚙️ 退款申请处理"]:::service
S4 -->|"写入退款记录, 状态=refunding"| D4["📦 pending_refund 表"]:::data
D4 -->|"待审核退款"| P4a["🖥 管理员:退款审核页"]:::page
P4a -->|"审核通过/驳回"| A4a["🔗 POST /api/admin/product/order/refund/approve
或 /api/admin/product/order/refund/reject"]:::api
A4a -->|"退款ID, 审核结果"| S4a["⚙️ 退款审核处理"]:::service
S4a -->|"通过: 发起退款, 状态=refunded
驳回: 状态=rejected"| D4a["📦 订单退款状态更新"]:::data
end
%% ================================================================
%% 阶段五:提现
%% ================================================================
subgraph 阶段五[阶段五:佣金提现]
D2 -->|"佣金收入"| P5["📋 规划师/管家:提现页"]:::page
P5 -->|"输入金额, 账户信息"| A5["🔗 POST /api/withdrawal/apply"]:::api
A5 -->|"提现金额, 账户信息"| S5["⚙️ WithdrawalService.apply()"]:::service
S5 -->|"写入提现申请, 状态=pending"| D5["📦 withdrawal_requests 表"]:::data
D5 -->|"待审核提现"| P5a["🖥 管理员:提现审核页"]:::page
P5a -->|"审核通过/驳回"| A5a["🔗 POST /api/admin/withdrawal/approve
或 /api/admin/withdrawal/reject"]:::api
A5a -->|"提现ID, 审核结果"| S5a["⚙️ 提现审核处理"]:::service
S5a -->|"通过: 打款, 状态=completed
驳回: 状态=rejected"| D5a["📦 withdrawal_requests 表
状态更新"]:::data
end
%% ================================================================
%% 角色关联
%% ================================================================
A0 -.- P1
A0 -.- P2
A0 -.- P3
A0 -.- P4
B0 -.- P1c
B0 -.- P5
C0 -.- E2
C0 -.- E2a
D0 -.- P4a
D0 -.- P5a
```
## 端点明细
### 支付核心
| 端点 | 说明 | 端口 | 请求数据 | 响应数据 |
|------|------|------|---------|---------|
| `POST /api/payment/wechat/create` | 创建微信支付订单 | ⚙️系统 | 订单号, 商品描述, 金额(分) | prepay_id, 签名参数 |
| `POST /api/payment/alipay/create` | 创建支付宝订单 | ⚙️系统 | 订单号, 商品描述, 金额(分) | 支付宝form表单 |
| `POST /api/payment/wechat/callback` | 微信支付回调 | ⚙️系统 | 订单号, 微信交易号 | 成功/失败 |
| `POST /api/payment/alipay/callback` | 支付宝回调 | ⚙️系统 | 订单号, 支付宝交易号 | 成功/失败 |
| `POST /api/payment/order/status/{orderNo}` | 查询订单状态 | 📱小程序 | 路径: 订单号 | 订单完整信息 |
### 商品订单
| 端点 | 说明 | 端口 | 请求数据 | 响应数据 |
|------|------|------|---------|---------|
| `POST /api/product/order/create` | 创建商品订单 | 📱小程序 | 商品ID, 数量, 支付方式, 收货地址, 优惠券ID | 订单信息 |
| `POST /api/product/order/pay` | 支付商品订单 | 📱小程序 | 订单号, 支付方式 | 支付参数 |
| `POST /api/product/order/cancel` | 取消订单 | 📱小程序 | 订单号 | 成功/失败 |
| `POST /api/product/order/handlePaymentSuccess` | 支付成功处理 | ⚙️系统 | 订单号, 支付方式, 交易号 | 成功/失败 |
| `POST /api/product/order/notify` | 支付异步通知 | ⚙️系统 | 微信/支付宝通知数据 | XML响应 |
| `POST /api/product/order/refund/apply` | 申请退款 | 📱小程序 | 订单ID, 退款原因, 退款金额 | 成功/失败 |
| `POST /api/product/order/confirm` | 确认收货 | 📱小程序 | 订单号 | 成功/失败 |
| `POST /api/product/order/my` | 我的订单列表 | 📱小程序 | 页码, 页大小, 状态筛选 | 分页订单列表 |
| `POST /api/product/order/detail` | 订单详情 | 📱小程序 | 订单号 | 订单完整信息 |
### 测评订单
| 端点 | 说明 | 端口 | 请求数据 | 响应数据 |
|------|------|------|---------|---------|
| `POST /api/dan-assessment/order/create` | 创建测评订单 | 📱小程序 | 孩子ID, 规划师ID, 套餐ID, 家庭ID, 用户ID | 订单信息 |
| `POST /api/dan-assessment/order/pay` | 支付测评订单 | 📱小程序 | 订单号, 支付方式 | 成功/失败 |
| `POST /api/dan-assessment/order/cancel` | 取消测评订单 | 📱小程序 | 订单号 | 成功/失败 |
| `POST /api/dan-assessment/order/detail` | 订单详情 | 📱小程序 | 订单号 | 订单信息 |
| `POST /api/dan-assessment/order/family` | 家庭测评订单列表 | 📱小程序 | 家庭ID | 订单列表 |
### 模板订单
| 端点 | 说明 | 端口 | 请求数据 | 响应数据 |
|------|------|------|---------|---------|
| `POST /api/payment/create` | 创建模板订单 | 📱📋 | 套餐ID, 支付方式, 优惠券ID | 订单信息 |
| `POST /api/payment/wechat params` | 获取微信支付参数 | 📱📋 | 订单ID, 微信openid | 微信JSAPI参数 |
| `POST /api/payment/notify` | 支付回调通知 | ⚙️系统 | 微信XML通知 | XML响应 |
| `POST /api/payment/apply` | 支付后应用模板 | 📱📋 | 订单ID, 孩子ID, 选中项ID列表 | 任务计划实例 |
| `POST /api/payment/orders/{orderId}` | 查询订单 | 📱📋 | 路径: 订单ID | 订单信息 |
| `POST /api/payment/orders/{orderId}/cancel` | 取消订单 | 📱📋 | 路径: 订单ID | 成功/失败 |
### 退款与提现
| 端点 | 说明 | 端口 | 请求数据 | 响应数据 |
|------|------|------|---------|---------|
| `POST /api/withdrawal/apply` | 申请提现 | 📋规划师 | 提现金额, 账户信息 | 成功/失败 |
| `POST /api/withdrawal/history` | 提现记录 | 📋规划师 | 页码, 页大小 | 分页提现记录 |
| `POST /api/admin/product/order/refund/approve` | 审核通过退款 | 🖥管理后台 | 退款ID | 成功/失败 |
| `POST /api/admin/product/order/refund/reject` | 驳回退款 | 🖥管理后台 | 退款ID, 驳回原因 | 成功/失败 |
| `POST /api/admin/withdrawal/approve` | 审核通过提现 | 🖥管理后台 | 提现ID | 成功/失败 |
| `POST /api/admin/withdrawal/reject` | 驳回提现 | 🖥管理后台 | 提现ID, 驳回原因 | 成功/失败 |
## 数据实体关系
```mermaid
erDiagram
ProductOrder ||--o{ PendingRefund : "退款"
AssessmentOrder ||--o{ AssessmentAppointment : "支付后创建预约"
PackageOrder ||--o{ TaskPlanInstance : "支付后应用模板"
ProductOrder {
Long id PK
string orderNo UK "订单号"
Long productId FK
Long buyerId FK
Long familyId FK
int totalAmount "总价(分)"
int moneyAmount "现金支付(分)"
int pointsUsed "积分抵扣"
string status "pending/paid/shipped/completed/refunded/cancelled"
string paymentMethod "wechat/alipay/points"
string transactionId "微信/支付宝交易号"
datetime paidAt
datetime createdAt
}
AssessmentOrder {
Long id PK
string orderNo UK
Long familyId FK
Long userId FK
Long childId FK
Long guideId FK
Long packageId FK
string status "pending/paid/cancelled/refunded"
string payType "wechat/alipay"
string transactionId
Long appointmentId FK "支付后自动创建"
}
PackageOrder {
Long id PK
string orderNo UK
Long userId FK
Long familyId FK
Long packageId FK
int totalAmount
string status "pending/paid/cancelled"
string paymentMethod
datetime paidAt
}
PendingRefund {
Long id PK
Long orderId FK
string orderType "product/assessment"
string orderNo
int refundAmount
string reason
string status "pending/approved/rejected/refunded"
datetime createdAt
}
WithdrawalRequest {
Long id PK
Long userId FK
int amount
string accountInfo
string status "pending/approved/rejected/completed"
datetime createdAt
datetime processedAt
}
```
## 完整性分析
### 流程完整性
- ✅ 三种订单类型(商品/测评/模板)的创建→支付→后处理完整覆盖
- ✅ 微信和支付宝两种支付渠道
- ✅ 支付回调处理(同步+异步)
- ✅ 退款申请→审核→处理全流程
- ✅ 佣金提现申请→审核→打款全流程
### 异常路径
- ❌ 支付超时处理(订单自动取消)未在流程图中体现
- ❌ 支付金额校验失败路径未标注
- ❌ 微信/支付宝回调签名验证失败的处理
- ❌ 退款到原路失败的处理
### 角色覆盖
- ✅ 家长(创建订单、支付、申请退款)
- ✅ 规划师(购买模板、提现)
- ✅ 管理员(审核退款、审核提现)
- ❌ 系统(定时任务取消超时订单)未标注
### 数据流向
- ✅ 创建订单 → 写入订单表 → 调用支付网关 → 回调更新 → 后处理
- ✅ 退款申请 → 写入退款表 → 管理员审核 → 退款处理
- ✅ 提现申请 → 写入提现表 → 管理员审核 → 打款
### 遗漏端点
| 端点 | 说明 | 建议补充 |
|------|------|---------|
| `POST /api/admin/refund/list` | 退款列表 | 管理员退款审核页 |
| `POST /api/admin/withdrawal/list` | 提现列表 | 管理员提现审核页 |
| 定时任务自动取消超时未支付订单 | 系统自动 | 阶段一异常路径 |