# AI语音应用 - 订阅支付系统

## 💰 定价策略（重要！）

### 成本基础
根据AI模型真实定价（你提供的数据）：
- **DeepSeek V3.2**：¥2.0/千token（基础成本）
- **通义 Qwen Plus**：¥4.0/千token（高质量）
- **豆包 Pro**：¥2.0/千token（稳定通用）

### 定价原则
1. **Token单价 ≥ ¥2.0**（成本价，保证不亏本）
2. **利润率 ≥ 30%**（企业健康运营）
3. **免费版平台补贴**（获客引流）

### 套餐定价

| 套餐 | 月付 | 年付 | Token配额 | Token成本 | 利润率 | 定位 |
|------|------|------|----------|---------|--------|------|
| **免费版** | ¥0 | ¥0 | 5,000/月 | ¥10 | 0% | 体验引流 |
| **入门版** | ¥9.9 | ¥99 | 10,000/月 | ¥20 | -101% | 获客转化 |
| **专业版** | ¥59 | ¥590 | 20,000/月 | ¥40 | +32% | ⭐主要盈利 |
| **旗舰版** | ¥199 | ¥1999 | 50,000/月 | ¥100 | +50% | 高端用户 |

### 成本分析示例

**专业版（¥59/月）**：
```
Token配额：20,000/月
Token成本：20,000 × ¥2.0/千 = ¥40.0
售价：¥59.0
利润：¥19.0
利润率：32% ✅ 合理
```

**旗舰版（¥199/月）**：
```
Token配额：50,000/月
Token成本：50,000 × ¥2.0/千 = ¥100.0
售价：¥199.0
利润：¥99.0
利润率：50% ✅ 优质利润
```

### 超额使用计费

超过月配额后自动按量计费：

| 套餐 | 超额单价 | 说明 |
|------|---------|------|
| 入门版 | ¥3.5/千token | 确保不亏本 |
| 专业版 | ¥3.0/千token | 批量优惠 |
| 旗舰版 | ¥2.5/千token | 大客户折扣 |

### 每次生成限制

| 套餐 | 每次最多 | 每日次数 | 每月Token |
|------|---------|---------|----------|
| 免费版 | 1000字 | 3次 | 5,000 |
| 入门版 | 3000字 | 10次 | 10,000 |
| 专业版 | 10000字 | 50次 | 20,000 |
| 旗舰版 | 50000字 | 无限制 | 50,000 |

---

## 📌 快速开始

### 1. 启动后端服务

```bash
cd server
npm install
npx prisma db push    # 初始化数据库
npx tsc               # 编译TypeScript
node dist/app.js      # 启动服务
```

### 2. 启动前端服务

```bash
cd my-uniapp-vue3
npm install
npm run dev:h5       # H5开发模式
```

### 3. 访问订阅页面

1. 打开浏览器访问 `http://localhost:8080`
2. 登录账号
3. 点击底部导航「我的」
4. 点击「会员中心」或「订阅套餐」

---

## 💳 功能列表

### ✅ 已完成功能

#### 1. 套餐系统
- 4个套餐等级：免费版、基础版、专业版、旗舰版
- 月付和年付价格
- Token配额限制
- 功能权限控制

#### 2. 订阅管理
- 创建订阅订单
- 订阅状态管理
- 订阅有效期计算
- 自动续费开关

#### 3. 支付系统
- 支付宝支付（集成接口）
- 微信支付（集成接口）
- 模拟支付（开发环境）
- 支付回调处理

#### 4. Token配额系统
- Token余额管理
- Token使用记录
- 配额检查和扣费
- 月度/年度重置

#### 5. 前端页面
- 订阅套餐页面（pages/member/index.vue）
- 订单历史页面（pages/orders/index.vue）
- Token余额显示
- 支付方式选择

---

## 🏷️ 套餐详情

### 免费版（¥0/月）
```
✅ 每天3次生成
✅ 每次最多2000字
✅ 基础音色5种
✅ 标准音质
❌ 每月10000 Token
❌ 无高清音质
❌ 无优先队列
```

### 基础版（¥9.9/月）
```
✅ 无限制生成次数
✅ 每次最多10000字
✅ 全部音色
✅ 高清音质
✅ 优先队列
✅ 每月50000 Token
❌ 无API访问
❌ 无批量处理
```

### 专业版（¥29.9/月）⭐ 推荐
```
✅ 无限制生成次数
✅ 每次最多50000字
✅ 全部音色+定制音色
✅ 无损音质
✅ VIP优先队列
✅ API访问
✅ 每月200000 Token
❌ 无批量处理
❌ 无团队管理
```

### 旗舰版（¥99/月）
```
✅ 无限制生成次数
✅ 每次最多200000字
✅ 全部功能
✅ 无损音质
✅ 专属技术支持
✅ 批量处理
✅ 团队管理
✅ 每年1000000 Token
```

---

## 🔌 API 接口

### 订阅相关

#### 获取套餐列表
```bash
GET /api/subscription/plans
```

响应：
```json
{
  "code": 0,
  "data": {
    "plans": [
      {
        "id": 1,
        "name": "免费版",
        "level": 0,
        "priceMonthly": 0,
        "priceYearly": 0,
        "features": ["每天3次生成", "每次最多2000字"],
        "monthlyTokens": 10000
      },
      // ...
    ]
  }
}
```

#### 获取Token余额
```bash
GET /api/subscription/balance
Authorization: Bearer <token>
```

响应：
```json
{
  "code": 0,
  "data": {
    "totalTokens": 50000,
    "usedTokens": 1200,
    "remainingTokens": 48800,
    "isUnlimited": false,
    "resetDate": "2026-05-01T00:00:00.000Z"
  }
}
```

#### 获取Token使用记录
```bash
GET /api/subscription/usage?page=1&pageSize=20
Authorization: Bearer <token>
```

响应：
```json
{
  "code": 0,
  "data": {
    "list": [
      {
        "id": 1,
        "type": "text_to_speech",
        "amount": 1500,
        "contentLength": 1500,
        "createdAt": "2026-04-12T10:00:00.000Z"
      }
    ],
    "total": 50,
    "page": 1,
    "pageSize": 20,
    "totalPages": 3
  }
}
```

#### 检查配额
```bash
POST /api/subscription/check-quota
Authorization: Bearer <token>
Content-Type: application/json

{
  "tokens": 5000
}
```

响应：
```json
{
  "code": 0,
  "data": {
    "allowed": true,
    "reason": null
  }
}
```

### 支付相关

#### 创建支付订单
```bash
POST /api/payment/create
Authorization: Bearer <token>
Content-Type: application/json

{
  "planId": 2,
  "paymentMethod": "alipay"
}
```

响应：
```json
{
  "code": 0,
  "message": "订单创建成功",
  "data": {
    "orderNo": "PAY20260412123456",
    "amount": 9.9,
    "planName": "基础版",
    "paymentUrl": "https://..."
  }
}
```

#### 模拟支付（开发环境）
```bash
POST /api/payment/mock
Authorization: Bearer <token>
Content-Type: application/json

{
  "orderNo": "PAY20260412123456"
}
```

#### 获取订单列表
```bash
GET /api/payment/orders?page=1&pageSize=10
Authorization: Bearer <token>
```

响应：
```json
{
  "code": 0,
  "data": {
    "list": [
      {
        "id": 1,
        "orderNo": "PAY20260412123456",
        "planName": "基础版",
        "amount": 9.9,
        "status": "paid",
        "paymentMethod": "alipay",
        "createdAt": "2026-04-12T10:00:00.000Z",
        "paidAt": "2026-04-12T10:05:00.000Z"
      }
    ],
    "total": 5,
    "page": 1,
    "pageSize": 10,
    "totalPages": 1
  }
}
```

---

## 🗄️ 数据库表

### SubscriptionPlan（套餐表）
```sql
SELECT * FROM SubscriptionPlan;
```

### Subscription（订阅表）
```sql
SELECT * FROM Subscription WHERE userId = <user_id>;
```

### TokenUsage（Token使用记录）
```sql
SELECT * FROM TokenUsage WHERE userId = <user_id> ORDER BY createdAt DESC LIMIT 20;
```

### TokenBalance（Token余额）
```sql
SELECT * FROM TokenBalance WHERE userId = <user_id>;
```

### Order（订单表）
```sql
SELECT * FROM Order WHERE userId = <user_id> ORDER BY createdAt DESC LIMIT 20;
```

---

## 🧪 测试支付

### 1. 创建订单
```bash
curl -X POST http://localhost:3000/api/payment/create \
  -H "Authorization: Bearer <your_token>" \
  -H "Content-Type: application/json" \
  -d '{"planId": 2, "paymentMethod": "mock"}'
```

### 2. 模拟支付
```bash
curl -X POST http://localhost:3000/api/payment/mock \
  -H "Authorization: Bearer <your_token>" \
  -H "Content-Type: application/json" \
  -d '{"orderNo": "PAY20260412XXXXXX"}'
```

### 3. 查看Token余额
```bash
curl http://localhost:3000/api/subscription/balance \
  -H "Authorization: Bearer <your_token>"
```

---

## 📱 前端页面路径

### 订阅套餐页面
```
pages/member/index.vue
```
访问方式：用户中心 → 会员中心

### 订单历史页面
```
pages/orders/index.vue
```
访问方式：用户中心 → 订单历史

### Token使用记录
在订单历史页面底部显示

---

## ⚙️ 配置说明

### 环境变量

在 `server/.env` 中配置：

```env
# 支付宝配置（可选）
ALIPAY_APP_ID=your_app_id
ALIPAY_PRIVATE_KEY=your_private_key
ALIPAY_PUBLIC_KEY=alipay_public_key

# 微信支付配置（可选）
WECHAT_APP_ID=your_app_id
WECHAT_MCH_ID=your_mch_id
WECHAT_API_KEY=your_api_key

# 数据库配置
DATABASE_URL=mysql://user:password@localhost:3306/audio_book
```

### 套餐配置

编辑 `server/src/modules/subscription/subscription.service.ts` 中的 `DEFAULT_PLANS` 数组。

---

## 🔒 Token消耗逻辑

### 扣费时机
1. 用户提交生成请求
2. 后端检查Token余额
3. 余额充足 → 扣除Token → 开始生成
4. 余额不足 → 返回错误

### 扣费示例
```
用户请求生成：1500字
扣费：1500 Token
剩余Token：48800 - 1500 = 47300
```

---

## 🎯 使用流程

### 用户订阅流程
1. 用户进入订阅页面
2. 查看套餐列表和价格
3. 选择套餐
4. 选择支付方式（支付宝/微信）
5. 点击「立即订阅」
6. 完成支付
7. 订阅成功，自动激活
8. Token配额到账

### Token使用流程
1. 用户进入生成页面
2. 输入文本内容
3. 系统计算Token消耗
4. 检查Token余额
5. 余额充足 → 扣除Token → 生成音频
6. 余额不足 → 提示充值

---

## ❓ 常见问题

### Q: 如何配置真实支付？
A: 请参考 `docs/支付集成指南.md`

### Q: Token可以退款吗？
A: 可以联系客服处理

### Q: 订阅可以升级吗？
A: 可以，补差价升级

### Q: 自动续费如何关闭？
A: 在订阅管理页面关闭

---

## 📞 技术支持

如有问题，请查看：
- 详细支付集成文档：`docs/支付集成指南.md`
- 数据库表结构：`server/prisma/schema.prisma`
- 后端日志输出

---

## 🚀 未来计划

- [ ] 真实支付宝支付集成
- [ ] 真实微信支付集成
- [ ] 批量Token购买
- [ ] 团队管理功能
- [ ] API访问控制
- [ ] 自动续费功能
- [ ] 退款管理功能
- [ ] 数据分析报表
