订阅付费系统.md 17 KB

订阅付费系统

本文档引用的文件

  • 支付集成指南.md
  • 订阅系统使用说明.md
  • subscription.controller.ts
  • subscription.service.ts
  • payment.controller.ts
  • payment.service.ts
  • auth.ts
  • schema.prisma
  • index.ts
  • index.vue
  • orders/index.vue

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构概览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考虑
  8. 故障排除指南
  9. 结论
  10. 附录

简介

订阅付费系统是一个完整的基于套餐制的付费解决方案,集成了多种支付渠道、会员等级管理和使用统计功能。该系统采用前后端分离架构,后端使用Koa.js + Prisma构建,前端使用UniApp Vue3开发。

系统核心功能包括:

  • 套餐设计与定价策略:支持免费版、基础版、专业版、旗舰版四个等级
  • 支付流程集成:支持支付宝、微信支付、模拟支付
  • 使用统计与计费:基于Token的使用量统计和计费
  • 会员等级管理:动态的会员等级和权益管理
  • 订阅状态控制:完整的订阅生命周期管理
  • 计费规则实现:包月配额+按量超支的混合计费模式

项目结构

该项目采用模块化组织结构,主要分为以下层次:

graph TB
subgraph "前端层"
FE1[UniApp Vue3 应用]
FE2[成员页面]
FE3[订单页面]
FE4[支付确认页面]
end
subgraph "后端层"
BE1[Koa.js 服务器]
BE2[认证中间件]
BE3[支付模块]
BE4[订阅模块]
BE5[类型定义]
end
subgraph "数据层"
DB1[Prisma ORM]
DB2[MySQL 数据库]
DB3[用户表]
DB4[订单表]
DB5[套餐表]
DB6[Token表]
end
FE1 --> BE1
BE1 --> BE2
BE1 --> BE3
BE1 --> BE4
BE2 --> DB1
BE3 --> DB1
BE4 --> DB1
DB1 --> DB2

图表来源

  • subscription.controller.ts:1-191
  • payment.controller.ts:1-258
  • schema.prisma:1-470

章节来源

  • subscription.controller.ts:1-191
  • payment.controller.ts:1-258
  • schema.prisma:1-470

核心组件

套餐管理系统

系统提供四个层级的套餐,每个套餐都有独特的功能组合和定价策略:

套餐等级 月付价格 年付价格 Token配额 主要功能
免费版 ¥0 ¥0 5,000/月 基础音色、标准音质
基础版 ¥9.9 ¥99 10,000/月 全部音色、高清音质
专业版 ¥29.9 ¥299 20,000/月 无损音质、API访问
旗舰版 ¥99 ¥999 50,000/月 批量处理、团队管理

支付系统架构

系统支持三种支付方式,每种都有完整的集成方案:

flowchart TD
A[用户选择套餐] --> B[创建支付订单]
B --> C{支付方式选择}
C --> |支付宝| D[生成支付宝链接]
C --> |微信支付| E[生成微信二维码]
C --> |模拟支付| F[开发环境测试]
D --> G[用户支付]
E --> G
F --> H[模拟支付成功]
G --> I[支付回调处理]
H --> I
I --> J[激活订阅]
J --> K[更新Token余额]
K --> L[完成订阅]

图表来源

  • payment.service.ts:122-191
  • payment.controller.ts:9-33

计费系统设计

系统采用混合计费模式,结合包月配额和按量超支:

flowchart TD
A[用户生成内容] --> B[计算Token消耗]
B --> C{检查配额}
C --> |余额充足| D[扣除Token]
C --> |余额不足| E{是否超配额}
E --> |支持超配额| F[按量计费]
E --> |不支持超配额| G[拒绝请求]
D --> H[开始生成]
F --> H
G --> I[返回错误]
H --> J[记录使用日志]
J --> K[更新余额]

图表来源

  • subscription.service.ts:411-450
  • subscription.service.ts:557-600

章节来源

  • subscription.service.ts:158-296
  • payment.service.ts:122-191
  • subscription.service.ts:557-600

架构概览

系统采用分层架构设计,确保各组件职责清晰、耦合度低:

graph TB
subgraph "表现层"
UI1[成员页面]
UI2[订单页面]
UI3[支付页面]
end
subgraph "应用层"
AC[认证控制器]
PC[支付控制器]
SC[订阅控制器]
end
subgraph "服务层"
AS[认证服务]
PS[支付服务]
SS[订阅服务]
end
subgraph "数据访问层"
PR[Prisma客户端]
DB[MySQL数据库]
end
UI1 --> AC
UI2 --> PC
UI3 --> SC
AC --> AS
PC --> PS
SC --> SS
AS --> PR
PS --> PR
SS --> PR
PR --> DB

图表来源

  • auth.ts:1-81
  • payment.controller.ts:1-258
  • subscription.controller.ts:1-191

系统的关键特性包括:

  • 模块化设计:每个功能模块独立封装,便于维护和扩展
  • 中间件机制:统一的认证和错误处理中间件
  • 类型安全:完整的TypeScript类型定义
  • 数据库抽象:通过Prisma实现数据库无关的数据访问

章节来源

  • auth.ts:1-81
  • index.ts:1-124
  • schema.prisma:1-470

详细组件分析

支付模块

支付模块是整个订阅系统的核心,负责处理各种支付渠道的集成和回调处理。

支付流程序列图

sequenceDiagram
participant U as 用户
participant F as 前端应用
participant B as 后端服务
participant P as 支付网关
participant D as 数据库
U->>F : 选择套餐并点击订阅
F->>B : POST /api/payment/create
B->>D : 创建订单记录
B->>P : 调用支付接口
P-->>B : 返回支付链接/二维码
B-->>F : 返回支付信息
F-->>U : 展示支付页面
U->>P : 完成支付
P->>B : 异步回调通知
B->>D : 更新订单状态
B->>D : 激活订阅服务
B->>D : 更新用户Token余额
B-->>F : 支付结果

图表来源

  • payment.controller.ts:9-33
  • payment.service.ts:359-406

支付回调处理

系统实现了完善的支付回调处理机制,确保支付状态的准确性和一致性:

flowchart TD
A[收到支付回调] --> B[验证签名]
B --> |验证失败| C[拒绝回调]
B --> |验证成功| D[查询订单状态]
D --> |订单已支付| E[直接返回成功]
D --> |订单未支付| F{支付状态判断}
F --> |支付成功| G[更新订单为已支付]
F --> |支付失败| H[更新订单为支付失败]
G --> I[激活订阅服务]
H --> J[保持原状态]
I --> K[更新用户Token余额]
K --> L[返回处理成功]
J --> L
E --> L

图表来源

  • payment.controller.ts:58-95
  • payment.service.ts:359-406

章节来源

  • payment.controller.ts:1-258
  • payment.service.ts:1-578

订阅管理模块

订阅管理模块负责处理用户的订阅生命周期,从创建到取消的完整流程。

订阅状态转换图

stateDiagram-v2
[*] --> 待支付
待支付 --> 已支付 : 支付成功
待支付 --> 已取消 : 支付失败
已支付 --> 激活中 : 激活订阅
激活中 --> 已激活 : 订阅生效
已激活 --> 已过期 : 到期时间到
已激活 --> 已取消 : 用户取消
已过期 --> 待续费 : 自动续费
待续费 --> 已激活 : 续费成功
待续费 --> 已取消 : 续费失败
已取消 --> [*]
已激活 --> [*]
已过期 --> [*]

图表来源

  • subscription.service.ts:409-461

计费规则实现

系统实现了灵活的计费规则,支持包月配额和按量超支的混合模式:

章节来源

  • subscription.service.ts:519-600

使用统计模块

使用统计模块跟踪用户的Token使用情况,为计费和配额管理提供数据支持。

Token使用流程

flowchart TD
A[用户发起请求] --> B[检查Token余额]
B --> |余额充足| C[计算消耗量]
B --> |余额不足| D[拒绝请求]
C --> E[扣除Token]
E --> F[记录使用日志]
F --> G[更新统计信息]
G --> H[返回成功]
D --> I[返回错误信息]

图表来源

  • subscription.service.ts:411-450

章节来源

  • subscription.service.ts:361-408

前端交互模块

前端采用UniApp框架开发,提供了完整的用户界面和交互体验。

前端页面架构

graph TB
subgraph "用户界面"
M[成员页面]
O[订单页面]
P[支付确认页面]
R[支付结果页面]
end
subgraph "状态管理"
US[用户状态]
TS[Token状态]
PS[支付状态]
end
subgraph "数据流"
API[API调用]
CACHE[本地缓存]
STORAGE[持久化存储]
end
M --> US
O --> PS
P --> TS
R --> US
US --> API
TS --> API
PS --> API
API --> CACHE
CACHE --> STORAGE

图表来源

  • index.vue:1-253
  • orders/index.vue:1-281

章节来源

  • index.vue:1-253
  • orders/index.vue:1-281

依赖关系分析

系统采用模块化依赖设计,各模块之间的依赖关系清晰明确:

graph LR
subgraph "外部依赖"
JWT[jsonwebtoken]
ALI[alipay-sdk]
WX[wechatpay-node-v3]
PRISMA[prisma]
MYSQL[mysql2]
end
subgraph "内部模块"
AUTH[认证模块]
PAY[支付模块]
SUB[订阅模块]
TYPES[类型定义]
MWARE[中间件]
end
AUTH --> JWT
PAY --> ALI
PAY --> WX
SUB --> PRISMA
PAY --> PRISMA
SUB --> MYSQL
PAY --> MYSQL
AUTH --> TYPES
PAY --> TYPES
SUB --> TYPES
MWARE --> TYPES

图表来源

  • payment.service.ts:1-29
  • auth.ts:1-81
  • schema.prisma:1-8

数据模型关系

系统使用Prisma进行数据建模,实体间的关系设计合理:

erDiagram
User {
int id PK
string phone UK
string openid UK
int memberLevel
datetime memberExpireAt
int usedAudioMinutes
datetime subscriptionResetDate
}
SubscriptionPlan {
int id PK
string name
int level
decimal priceMonthly
int monthlyTokens
int monthlyMinutes
boolean overageEnabled
decimal overagePrice
}
Order {
int id PK
int userId FK
string orderNo UK
int planId FK
string productType
decimal amount
string status
string paymentMethod
datetime paidAt
}
Subscription {
int id PK
int userId FK
int planId FK
datetime startDate
datetime endDate
string status
boolean autoRenew
}
TokenBalance {
int id PK
int userId UK
int totalTokens
int usedTokens
datetime resetDate
}
TokenUsage {
int id PK
int userId FK
string type
int amount
int contentLength
int orderId FK
}
User ||--o{ Order : creates
User ||--o{ Subscription : has
User ||--o{ TokenBalance : has
User ||--o{ TokenUsage : makes
SubscriptionPlan ||--o{ Subscription : defines
SubscriptionPlan ||--o{ Order : for
Order ||--|| TokenUsage : generates

图表来源

  • schema.prisma:10-330

章节来源

  • schema.prisma:1-470

性能考虑

系统在设计时充分考虑了性能优化,采用了多种策略来提升用户体验:

缓存策略

  • 用户状态缓存:使用内存缓存减少数据库查询
  • 套餐列表缓存:静态套餐信息缓存30分钟
  • Token余额缓存:用户Token余额缓存10秒

数据库优化

  • 索引优化:为常用查询字段建立复合索引
  • 查询优化:使用关联查询减少N+1问题
  • 分页查询:订单和使用记录采用分页加载

异步处理

  • 支付回调异步:支付回调不阻塞主请求流程
  • 日志异步:使用异步日志记录不影响业务处理
  • 队列处理:批量操作使用队列异步处理

故障排除指南

常见问题及解决方案

支付问题

  1. 支付宝支付失败

    • 检查支付宝公钥配置
    • 验证回调URL是否可访问
    • 确认沙箱环境配置
  2. 微信支付二维码无法生成

    • 检查商户证书文件
    • 验证API密钥配置
    • 确认回调URL配置

认证问题

  1. Token过期

    • 检查JWT密钥配置
    • 验证Token生成和解析逻辑
    • 确认Token有效期设置
  2. 用户状态异常

    • 检查用户表数据完整性
    • 验证会员等级映射关系
    • 确认订阅状态同步

数据库问题

  1. 连接失败

    • 检查数据库连接字符串
    • 验证数据库服务状态
    • 确认网络连接
  2. 查询超时

    • 检查慢查询日志
    • 优化索引配置
    • 分析查询执行计划

章节来源

  • payment.service.ts:51-118
  • auth.ts:34-48

结论

订阅付费系统是一个功能完整、架构清晰的商业化解决方案。系统的主要优势包括:

技术优势

  • 模块化设计:清晰的职责分离和依赖管理
  • 类型安全:完整的TypeScript类型定义保障代码质量
  • 数据库抽象:Prisma提供强大的数据建模能力
  • 支付集成:支持主流支付渠道的完整集成方案

业务价值

  • 灵活的定价策略:支持多种套餐组合满足不同用户需求
  • 完善的计费系统:包月配额+按量超支的混合计费模式
  • 用户体验优化:简洁直观的前端界面和流畅的操作流程
  • 可扩展性:模块化架构便于功能扩展和维护

发展建议

  1. 增强安全性:添加更多安全防护措施
  2. 完善监控:增加系统监控和告警机制
  3. 优化性能:进一步优化数据库查询和缓存策略
  4. 扩展功能:支持更多支付渠道和计费模式

该系统为音频内容生成平台提供了坚实的商业基础,能够有效支撑业务的持续发展和用户增长。

附录

API接口文档

支付相关接口

  • POST /api/payment/create - 创建支付订单
  • POST /api/payment/mock - 模拟支付(开发环境)
  • POST /api/payment/alipay/notify - 支付宝异步回调
  • GET /api/payment/wechat/query/:orderNo - 查询微信支付状态

订阅相关接口

  • GET /api/subscription/plans - 获取套餐列表
  • GET /api/subscription/balance - 获取Token余额
  • GET /api/subscription/usage - 获取使用记录
  • GET /api/subscription/orders - 获取订单列表

配置说明

环境变量

  • ALIPAY_APP_ID - 支付宝应用ID
  • ALIPAY_PRIVATE_KEY - 支付宝私钥
  • WECHAT_APP_ID - 微信应用ID
  • WECHAT_MCH_ID - 微信商户ID
  • AUTH_ENABLED - 是否启用认证

数据库配置

  • DATABASE_URL - MySQL连接字符串
  • 支持SSL连接配置
  • 连接池大小配置

安全策略

支付安全

  • 支付回调签名验证
  • 防重放攻击机制
  • 敏感信息加密存储
  • HTTPS强制使用

用户数据保护

  • JWT Token安全配置
  • 密码加密存储
  • 数据访问权限控制
  • 审计日志记录