docs: 添加付费功能系统完整设计文档

- 新增第十二章:付费功能系统
- 支付下单接口 POST /api/payment/create-order
- 支付回调接口 POST /api/payment/callback
- payment_orders 表结构设计
- 配额查询 API GET /api/user/quota
- 定价策略(包月/包年/永久)
- 实施优先级和注意事项
This commit is contained in:
2026-04-16 13:22:48 +08:00
parent 3055023790
commit ca7ddcc55e

View File

@@ -540,6 +540,173 @@ fi
---
## 十二、付费功能系统
### 当前状态
**已有基础设施:**
- ✅ 数据库字段:`is_paid` (boolean), `paid_expires_at` (timestamp)
- ✅ 配额检查逻辑:`db.rs:15-24` 非付费用户限制 20 条数据
- ✅ 管理员 API`PUT /api/admin/users/{id}/payment` 手动设置付费状态
- ✅ 用户查询 API`GET /api/user/profile` 返回 `is_paid`, `is_paid_active`, `paid_expires_at`
**缺失功能:**
- ❌ 支付下单接口
- ❌ 微信支付回调接口
- ❌ 前端付费 UI
- ❌ 购买记录表
### 12.1 支付下单接口
**需求**:用户点击购买后,后端生成微信支付订单。
**建议实现**
```rust
// POST /api/payment/create-order
// Request
{
"package_type": "monthly" | "yearly" | "permanent"
}
// Response
{
"success": true,
"data": {
"order_id": "wx_order_xxx",
"prepay_id": "wx_prepay_xxx", // 用于调起支付
"pay_sign": "...",
"expire_time": "2026-05-16T12:00:00Z"
}
}
```
**需新增环境变量**
```
WECHAT_PAYMENT_MCHID=商户号
WECHAT_PAYMENT_SECRET=支付密钥
WECHAT_PAYMENT_NOTIFY_URL=https://your-domain.com/api/payment/callback
```
### 12.2 支付回调接口
**需求**:接收微信支付成功回调,激活用户付费状态。
**建议实现**
```rust
// POST /api/payment/callback (微信支付服务器调用)
{
"event_type": "TRANSACTION.SUCCESS",
"resource": {
"order_id": "wx_order_xxx",
"out_trade_no": "internal_order_xxx",
"trade_state": "SUCCESS",
"amount": {
"total": 100, // 金额(分)
"currency": "CNY"
}
}
}
```
**数据库变更**
```sql
-- 新增订单表
CREATE TABLE payment_orders (
id SERIAL PRIMARY KEY,
user_id INTEGER NOT NULL REFERENCES users(id),
order_no VARCHAR(64) UNIQUE NOT NULL, -- 内部订单号
wx_order_id VARCHAR(64), -- 微信订单号
package_type VARCHAR(20) NOT NULL, -- monthly/yearly/permanent
amount INTEGER NOT NULL, -- 金额(分)
status VARCHAR(20) NOT NULL DEFAULT 'pending', -- pending/paid/cancelled/refunded
paid_at TIMESTAMPTZ, -- 支付时间
created_at TIMESTAMPTZ DEFAULT NOW(),
expires_at TIMESTAMPTZ -- 付费到期时间
);
CREATE INDEX idx_payment_orders_user_id ON payment_orders(user_id);
CREATE INDEX idx_payment_orders_order_no ON payment_orders(order_no);
```
### 12.3 查询配额 API
**需求**:前端显示用户已使用的数据条数和上限。
**建议实现**
```rust
// GET /api/user/quota
// Response
{
"success": true,
"data": {
"is_paid": true,
"is_paid_active": true,
"paid_expires_at": "2026-12-31T23:59:59Z",
"data_usage": {
"used": 45,
"limit": 20, // 非付费用户限制
"unlimited": false // 付费用户无限制
}
}
}
```
**需新增**`db::get_user_quota(pool, user_id) -> QuotaInfo`
### 12.4 前端付费 UI
**页面建议**
```
pages/
├── upgrade/
│ ├── upgrade.js # 购买页面
│ ├── upgrade.wxml # 套餐选择 + 支付按钮
│ └── upgrade.json
└── ...
```
**功能**
1. 展示套餐(包月/包年/永久)
2. 调用后端创建订单
3. 调起微信支付
4. 支付成功/失败提示
5. 跳转回首页
**首页配额展示**
- 非付费用户:显示「已用 X/20 条,开通付费解锁无限存储」
- 付费用户:显示「已用 X 条,无限存储」
### 12.5 定价建议
| 套餐 | 价格 | 有效期 | 说明 |
|------|------|--------|------|
| 包月 | ¥9.9 | 30天 | 尝鲜用户 |
| 包年 | ¥59 | 365天 | 主流套餐 |
| 永久 | ¥199 | 永久 | 忠实用户 |
### 12.6 实施优先级
| 阶段 | 内容 | 复杂度 |
|------|------|--------|
| P1 | 后端:订单表 + 支付回调 | 中 |
| P1 | 后端:下单接口 + 微信支付集成 | 高 |
| P2 | 后端:配额查询 API | 低 |
| P2 | 前端:升级页面 + 支付流程 | 中 |
| P3 | 前端:首页配额展示 | 低 |
### 12.7 注意事项
1. **支付安全**:回调接口必须验证微信签名
2. **幂等性**:支付回调需处理重复通知
3. **退款处理**:需实现退款接口和状态更新
4. **试用期**:可考虑新用户首月免费
---
## 十一、检查清单
### 代码提交前检查