本文档引用的文件
订阅付费系统是一个完整的会员制付费解决方案,集成了多种支付方式、套餐管理和计费规则。该系统支持支付宝和微信支付两种主流支付渠道,提供灵活的订阅套餐设计和精细化的计费管理。
系统采用模块化架构设计,包含支付模块、订阅模块、用户管理模块等多个核心组件。通过Prisma ORM实现数据持久化,支持MySQL数据库。系统具备完善的订单管理、回调处理、状态跟踪等功能。
项目采用前后端分离的架构模式,主要分为以下层次:
graph TB
subgraph "前端层"
UI[用户界面]
Orders[订单页面]
PaymentResult[支付结果页面]
end
subgraph "后端层"
API[API服务器]
Auth[认证中间件]
Security[安全中间件]
end
subgraph "服务层"
PaymentService[支付服务]
SubscriptionService[订阅服务]
TokenService[令牌服务]
end
subgraph "数据层"
Prisma[Prisma ORM]
MySQL[(MySQL数据库)]
end
UI --> API
Orders --> API
PaymentResult --> API
API --> Auth
API --> Security
API --> PaymentService
API --> SubscriptionService
PaymentService --> Prisma
SubscriptionService --> Prisma
Prisma --> MySQL
图表来源
章节来源
系统提供4个层级的订阅套餐,从免费版到企业版,满足不同用户需求:
| 套餐级别 | 月付价格 | 年付价格 | 月度Token配额 | 主要功能 |
|---|---|---|---|---|
| 免费版 | ¥0 | ¥0 | 1,500 | 基础音质,10分钟音频 |
| 入门版 | ¥19 | ¥190 | 4,500 | 高清音质,30分钟音频 |
| 专业版 | ¥59 | ¥590 | 15,000 | 高清音质,100分钟音频 |
| 旗舰版 | ¥199 | ¥1,990 | 60,000 | 高清音质,400分钟音频 |
| 企业版 | ¥599 | ¥5,990 | 225,000 | 高清音质,1,500分钟音频 |
系统采用双轨制计费模式:
音频时长计费:基于实际生成的音频时长
flowchart TD
Start([开始计费]) --> CheckQuota{检查套餐配额}
CheckQuota --> |在配额内| InQuota[按包月批发价计费]
CheckQuota --> |超出配额| Overage[按零售价计费]
InQuota --> CalcTotal[计算总费用]
Overage --> CalcOverage[计算超量费用]
CalcOverage --> CalcTotal
CalcTotal --> ApplyDiscount{是否有折扣}
ApplyDiscount --> |是| FinalPrice[应用折扣]
ApplyDiscount --> |否| FinalPrice
FinalPrice --> End([结束])
图表来源
章节来源
系统采用分层架构设计,确保各组件职责清晰、耦合度低:
graph TB
subgraph "表现层"
Frontend[前端应用]
Mobile[移动端应用]
end
subgraph "控制层"
PaymentController[支付控制器]
SubscriptionController[订阅控制器]
AuthController[认证控制器]
end
subgraph "服务层"
PaymentService[支付服务]
SubscriptionService[订阅服务]
TokenService[令牌服务]
OrderService[订单服务]
end
subgraph "数据访问层"
PrismaClient[Prisma客户端]
Database[(MySQL数据库)]
end
Frontend --> PaymentController
Mobile --> PaymentController
PaymentController --> PaymentService
SubscriptionController --> SubscriptionService
AuthController --> PaymentService
PaymentService --> PrismaClient
SubscriptionService --> PrismaClient
PrismaClient --> Database
图表来源
支付模块是系统的核心组件,负责处理各种支付方式和回调处理:
sequenceDiagram
participant User as 用户
participant Frontend as 前端应用
participant PaymentController as 支付控制器
participant PaymentService as 支付服务
participant AlipaySDK as 支付宝SDK
participant WechatPay as 微信支付
participant Database as 数据库
User->>Frontend : 选择套餐并发起支付
Frontend->>PaymentController : POST /api/payment/create
PaymentController->>PaymentService : createPaymentOrder()
PaymentService->>Database : 创建订单记录
alt 支付宝支付
PaymentService->>AlipaySDK : 生成支付链接
AlipaySDK-->>PaymentService : 支付链接
else 微信支付
PaymentService->>WechatPay : 创建支付订单
WechatPay-->>PaymentService : 二维码链接
end
PaymentService-->>PaymentController : 返回支付信息
PaymentController-->>Frontend : 支付页面
Note over User,Database : 用户完成支付后
AlipaySDK-->>PaymentController : 支付回调通知
WechatPay-->>PaymentController : 支付回调通知
PaymentController->>PaymentService : handlePaymentCallback()
PaymentService->>Database : 更新订单状态
PaymentService->>Database : 激活订阅服务
PaymentService->>Database : 更新用户状态
图表来源
系统实现了完善的支付回调处理机制:
章节来源
订阅模块负责管理用户的订阅状态和配额:
stateDiagram-v2
[*] --> 未订阅
未订阅 --> 订阅中 : 支付成功
订阅中 --> 已过期 : 到期日到达
订阅中 --> 续费中 : 自动续费
续费中 --> 订阅中 : 续费成功
续费中 --> 已过期 : 续费失败
已过期 --> 未订阅 : 重新购买
订阅中 --> 取消订阅 : 用户取消
取消订阅 --> [*]
图表来源
系统采用多层次的配额管理机制:
章节来源
系统采用Prisma ORM进行数据建模,主要数据表包括:
erDiagram
User {
int id PK
string phone
string openid
int memberLevel
datetime memberExpireAt
int usedAudioMinutes
datetime subscriptionResetDate
}
SubscriptionPlan {
int id PK
string name
int level
decimal priceMonthly
decimal priceYearly
int monthlyTokens
int monthlyMinutes
boolean overageEnabled
decimal overagePrice
}
Subscription {
int id PK
int userId FK
int planId FK
datetime startDate
datetime endDate
string status
boolean autoRenew
}
Order {
int id PK
int userId FK
string orderNo UK
int planId FK
string productType
decimal amount
string status
string paymentMethod
datetime paidAt
}
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
datetime createdAt
}
User ||--o{ Subscription : "拥有"
User ||--o{ Order : "创建"
User ||--o{ TokenBalance : "拥有"
User ||--o{ TokenUsage : "产生"
SubscriptionPlan ||--o{ Subscription : "定义"
SubscriptionPlan ||--o{ Order : "关联"
Order ||--o{ TokenUsage : "产生"
图表来源
章节来源
系统各组件之间的依赖关系如下:
graph TD
subgraph "外部依赖"
AlipaySDK[alipay-sdk]
WechatPay[wechatpay-node-v3]
PrismaClient[prisma-client-js]
KoaRouter[@koa/router]
end
subgraph "内部模块"
PaymentController[payment.controller.ts]
PaymentService[payment.service.ts]
SubscriptionController[subscription.controller.ts]
SubscriptionService[subscription.service.ts]
SecurityMiddleware[security.ts]
end
subgraph "数据模型"
UserModel[User模型]
OrderModel[Order模型]
SubscriptionModel[Subscription模型]
TokenBalanceModel[TokenBalance模型]
end
PaymentController --> PaymentService
SubscriptionController --> SubscriptionService
PaymentService --> PrismaClient
SubscriptionService --> PrismaClient
PaymentService --> AlipaySDK
PaymentService --> WechatPay
SecurityMiddleware --> PaymentController
SecurityMiddleware --> SubscriptionController
PaymentService --> UserModel
PaymentService --> OrderModel
SubscriptionService --> SubscriptionModel
SubscriptionService --> TokenBalanceModel
图表来源
章节来源
系统采用多级缓存策略提升性能:
支付链接生成失败
支付回调失败
二维码生成失败
订单查询失败
检查用户状态
Token余额异常
章节来源
订阅付费系统是一个功能完整、架构清晰的会员制付费解决方案。系统具备以下优势:
系统目前支持核心功能的实现,包括套餐管理、支付处理、订阅激活等。后续可以进一步完善自动续费、退款处理、财务对账等高级功能。
| 接口 | 方法 | 描述 | 请求参数 | 响应示例 |
|---|---|---|---|---|
| /api/payment/create | POST | 创建支付订单 | planId, paymentMethod, returnUrl | 订单信息 |
| /api/payment/mock | POST | 模拟支付成功 | orderNo | 支付结果 |
| /api/payment/orders | GET | 获取订单列表 | page, pageSize | 订单列表 |
| /api/payment/orders/:orderNo | GET | 获取订单详情 | - | 订单详情 |
| 接口 | 方法 | 描述 | 请求参数 | 响应示例 |
|---|---|---|---|---|
| /api/subscription/plans | GET | 获取套餐列表 | - | 套餐列表 |
| /api/subscription/subscription | GET | 获取用户订阅信息 | - | 订阅信息 |
| /api/subscription/balance | GET | 获取用户Token余额 | - | 余额信息 |
| /api/subscription/usage | GET | 获取Token使用记录 | page, pageSize | 使用记录 |
# 支付宝配置
ALIPAY_APP_ID=your_app_id
ALIPAY_PRIVATE_KEY=your_private_key
ALIPAY_PUBLIC_KEY=alipay_public_key
ALIPAY_NOTIFY_URL=https://your-domain.com/api/payment/alipay/notify
# 微信支付配置
WECHAT_APP_ID=your_app_id
WECHAT_MCH_ID=your_mch_id
WECHAT_APIV3_KEY=your_api_key
WECHAT_NOTIFY_URL=https://your-domain.com/api/payment/wechat/notify
# 数据库配置
DATABASE_URL=mysql://user:password@localhost:3306/database_name