计费系统
所有计费按组织维度,通过 Stripe 处理支付。
计费模式
| 模式 | 说明 |
|---|---|
| 订阅(Subscription) | 月付/年付,自动续费 |
| 积分(Credits) | 一次性购买积分包 |
| 终身买断(Lifetime) | 一次性付费,永久使用 |
| 免费(Free) | 注册赠送,有过期时间 |
Stripe Webhook
端点 URL:https://api.yourdomain.com/v1/webhook/stripe
后端通过该端点接收 Stripe 事件,需要在 Stripe Dashboard 中配置。
需要监听的事件
| 事件 | 处理 |
|---|---|
checkout.session.completed | 积分购买、终身买断完成 |
customer.subscription.created | 创建订阅记录 |
customer.subscription.updated | 升降级、取消续费 |
customer.subscription.deleted | 订阅取消 |
invoice.payment_succeeded | 发票支付成功 |
invoice.payment_failed | 支付失败,标记 past_due |
invoice.paid | 发票已付,赠送积分 |
price.created | 同步新价格到本地 |
price.updated | 同步价格变更 |
price.deleted | 同步价格删除 |
配置步骤
- 登录 Stripe Dashboard → Webhooks
- 点击「添加端点」
- 端点 URL 填写:
https://api.yourdomain.com/v1/webhook/stripe - 选择上述 10 个事件
- 创建后复制 Webhook 签名密钥,填入
.env的STRIPE_WEBHOOK_SECRET_KEY
支付配置
api/src/config/website/payment.{suffix}.ts:
import type { PaymentConfig } from "@readystart/api-core"
import { PlanMode } from "@readystart/api-core"
export const getPaymentConfig = (): PaymentConfig => ({
payment: {
credit: {
enabled: true,
currency: "usd",
unit_price: 0.01, // 1 积分 = $0.01
min_credits: 1000, // 最少购买 1000 积分
interval: "lifetime", // 积分有效期
packages: [
{
mode: PlanMode.ONE_TIME_CREDITS,
plan_id: "credits_1000",
name: "1000 Credits",
credits: 1000,
amount: 1000, // $10.00(单位:分)
interval: "month",
interval_count: 1,
},
],
},
subscription: {
enabled: true,
packages: [
{
mode: PlanMode.FREE, // 计划模式
plan_id: "free", // 计划 ID
name: "Free", // 显示名称
credits: 50, // 赠送积分数
amount: 0, // 价格(免费为 0)
interval: "month", // 周期单位
interval_count: 1, // 周期数量
interval_type: "recurring", // 周期类型
},
{
mode: PlanMode.SUBSCRIPTION,
plan_id: "pro_monthly",
name: "Pro Monthly",
credits: 500,
amount: 1900, // $19.00
interval: "month",
interval_count: 1,
},
],
},
},
})
免费积分包
用户注册时自动创建免费积分包,配置为 mode: PlanMode.FREE 的套餐。
前端页面
| 页面 | 说明 |
|---|---|
/subscription | 订阅管理 |
/credits | 积分列表 |
/credits?tab=usage | 使用记录(含用户邮箱) |
/credits/packages | 积分套餐购买 |
/invoices | 发票列表 |
Dashboard 积分显示
Dashboard 的 Credits 卡片显示成员实际可用额度:
- 有限额:
限额 - 已用 - 无限额:组织总积分
- 用完:红色显示 “Exhausted”