本文引用的文件
本技术文档面向“支付集成系统”,围绕支付宝与微信支付两大第三方支付网关,系统化阐述从 SDK 配置、API 调用流程、订单创建、参数设置、回调通知处理到支付状态同步机制的完整实现;同时覆盖支付安全策略(签名验证、防重放)、数据加密传输、支付金额计算、Token 扣减、退款处理、支付监控与对账、风控与合规要点。文档以仓库现有代码与文档为依据,提供可操作的集成指引与可视化流程图。
支付相关能力由后端 Koa 路由与服务层、前端 UniApp 页面以及 Prisma 数据模型共同构成,形成“前端交互—后端支付—第三方网关—状态回推”的闭环。
graph TB
subgraph "前端UniApp"
FE_Member["会员中心<br/>选择套餐"]
FE_Confirm["支付确认<br/>选择支付方式"]
FE_Result["支付结果<br/>展示状态"]
FE_Orders["订单列表<br/>查询与轮询"]
end
subgraph "后端Koa"
C_Payment["payment.controller.ts<br/>路由与鉴权"]
S_Payment["payment.service.ts<br/>订单/回调/激活订阅"]
C_Sub["subscription.controller.ts<br/>Token/配额API"]
S_Sub["subscription.service.ts<br/>Token/音频时长计费"]
end
subgraph "数据库Prisma"
M_Order["Order<br/>支付订单"]
M_SubPlan["SubscriptionPlan<br/>套餐计划"]
M_Sub["Subscription<br/>订阅记录"]
M_TB["TokenBalance<br/>Token余额"]
M_TU["TokenUsage<br/>Token使用记录"]
end
subgraph "第三方支付"
Ali["支付宝"]
Wx["微信支付"]
end
FE_Member --> FE_Confirm --> FE_Result
FE_Confirm --> C_Payment --> S_Payment
C_Payment --> S_Payment
S_Payment --> Ali
S_Payment --> Wx
S_Payment --> M_Order
S_Payment --> M_Sub
S_Payment --> M_TB
S_Payment --> M_TU
C_Sub --> S_Sub
S_Sub --> M_SubPlan
S_Sub --> M_Sub
S_Sub --> M_TB
S_Sub --> M_TU
FE_Orders --> C_Payment
图表来源
章节来源
章节来源
支付系统采用“前端发起—后端统一下单—第三方支付—异步回调—后端状态同步—订阅激活”的模式,确保支付安全与幂等处理。
sequenceDiagram
participant U as "用户"
participant FE as "前端页面"
participant PC as "支付控制器"
participant PS as "支付服务"
participant GW as "第三方支付网关"
participant DB as "数据库"
U->>FE : 选择套餐/支付方式
FE->>PC : POST /payment/create
PC->>PS : 创建订单并生成支付参数
PS->>GW : 调用支付接口支付宝/微信
GW-->>PS : 返回支付链接/二维码
PS-->>PC : 返回支付信息
PC-->>FE : 返回订单号/支付URL/二维码
FE->>GW : 跳转/扫码支付
GW-->>PC : 异步回调notify
PC->>PS : 验证签名/处理回调
PS->>DB : 更新订单状态/激活订阅/更新Token
PS-->>PC : 处理结果
PC-->>GW : 返回成功/失败
图表来源
订单轮询:前端轮询 /payment/orders/:orderNo 获取支付状态。
flowchart TD
Start(["创建支付订单"]) --> LoadPlan["查询套餐信息"]
LoadPlan --> GenOrderNo["生成订单号"]
GenOrderNo --> CreateOrder["写入订单记录<br/>状态=pending"]
CreateOrder --> ChoosePay{"支付方式?"}
ChoosePay --> |支付宝| Alipay["生成支付宝支付URL"]
ChoosePay --> |微信| Wechat["生成微信支付二维码"]
Alipay --> Return["返回支付URL/二维码"]
Wechat --> Return
Return --> End(["前端跳转/扫码"])
图表来源
章节来源
回调处理器:
支付失败:更新订单状态为 failed。
sequenceDiagram
participant GW as "第三方网关"
participant PC as "支付控制器"
participant PS as "支付服务"
participant DB as "数据库"
GW->>PC : POST /payment/{alipay|wechat}/notify
PC->>PS : verifyAlipaySign()/解析参数
alt 支付宝
PS->>PS : TRADE_SUCCESS/TRADE_FINISHED
else 其他状态
PS->>PS : 标记失败
end
PS->>DB : 更新订单/订阅/Token
PS-->>PC : 处理结果
PC-->>GW : SUCCESS/FAIL
图表来源
章节来源
根据套餐配置更新 Token 余额:有配额则按月重置,无配额则标记无限额。
flowchart TD
A["收到支付成功回调"] --> B["查询订单与套餐"]
B --> C{"是否存在有效订阅?"}
C --> |是| D["续期30天"]
C --> |否| E["创建新订阅30天"]
D --> F["更新用户会员等级/到期时间"]
E --> F
F --> G{"套餐是否有月Token配额?"}
G --> |是| H["更新/创建Token余额并设置重置日期"]
G --> |否| I["设置无限额"]
H --> J["结束"]
I --> J
图表来源
章节来源
订单列表:查询历史订单与使用记录。
sequenceDiagram
participant U as "用户"
participant FE_M as "会员中心"
participant FE_C as "支付确认"
participant FE_R as "支付结果"
participant PC as "支付控制器"
participant PS as "支付服务"
U->>FE_M : 选择套餐
U->>FE_C : 确认支付选择方式
FE_C->>PC : POST /payment/create
PC->>PS : 创建订单/生成支付参数
PS-->>PC : 返回支付URL/二维码
PC-->>FE_C : 返回结果
FE_C->>U : 跳转/显示二维码
U->>FE_R : 查看支付结果
图表来源
章节来源
对账思路:以第三方回调为准,核对订单状态与金额一致性;若失败则人工介入重试或退款。
erDiagram
SUBSCRIPTION_PLAN {
int id PK
string name
int level
decimal priceMonthly
decimal priceYearly
int monthlyTokens
int yearlyTokens
string features
}
ORDER {
int id PK
int userId
string orderNo UK
int planId
string productType
decimal amount
string status
string paymentMethod
datetime createdAt
datetime updatedAt
}
SUBSCRIPTION {
int id PK
int userId
int planId
datetime startDate
datetime endDate
string status
boolean autoRenew
}
TOKEN_BALANCE {
int id PK
int userId UK
int totalTokens
int usedTokens
datetime resetDate
}
TOKEN_USAGE {
int id PK
int userId
string type
int amount
int contentLength
int orderId
string description
datetime createdAt
}
ORDER }o--|| SUBSCRIPTION_PLAN : "planId"
ORDER }o--o| SUBSCRIPTION : "planId"
TOKEN_USAGE }o--|| ORDER : "orderId"
图表来源
章节来源
前端依赖:
页面间参数传递(订单号、金额、套餐名、二维码)。
graph LR
PS["payment.service.ts"] --> ENV["环境变量"]
PS --> PRISMA["Prisma Models"]
PS --> ALI["alipay-sdk"]
PS --> WX["wechatpay-node-v3"]
PC["payment.controller.ts"] --> PS
PC --> AUTH["authMiddleware"]
PC --> ERR["errorHandler"]
FE_Confirm["payment-confirm/index.vue"] --> PC
FE_Result["payment-result/index.vue"] --> PC
FE_Orders["orders/index.vue"] --> PC
图表来源
章节来源
章节来源
该支付集成系统以清晰的前后端职责划分与严谨的回调处理机制,实现了支付宝与微信支付的统一封装与订阅激活、Token 余额更新的自动化闭环。建议在生产环境中完善真实支付网关配置、强化安全校验与监控告警,并持续优化对账与风控策略。
章节来源
章节来源
章节来源