集成能力
Stripe 计费
基于月付/年付价格与唯一 lookup_key 的 Stripe 订阅计费,并通过 webhook 同步积分账本。
Setup
1. 配置 Stripe 凭据
配置 Secret Key、Webhook Secret 以及不同环境的回调地址。
2. 创建产品与价格(月付/年付)
建议每个套餐对应一个 Stripe Product,在同一 Product 下创建两条 recurring price:
- 月付:
recurring.interval = month - 年付:
recurring.interval = year
并为每个价格设置全局唯一的 lookup_key。
| 套餐 | 月付 lookup_key | 年付 lookup_key |
|---|---|---|
| Creator | creator_monthly | creator_yearly |
| Pro | pro_monthly | pro_yearly |
| Scale | scale_monthly | scale_yearly |
积分包(一次性价格)建议使用:
credits_startercredits_growthcredits_scale
注意:同一个 Stripe 账户内所有 lookup_key 都必须唯一。
3. 年付优惠配置
推荐:直接创建“已折扣”的年付价格(如月价 * 12 * 0.9)。
可选:通过 Coupon/Promotion Code 实现优惠,但要确保回调幂等和权益发放一致。
4. 配置环境变量价格引用
本项目支持两种价格引用方式:
- 直接
price_id(price_xxx) - lookup 引用(
lookup:creator_monthly或creator_monthly)
可通过环境变量覆盖 lookup 回退:
STRIPE_PRICE_SUB_CREATOR_MONTHLYSTRIPE_PRICE_SUB_CREATOR_YEARLYSTRIPE_PRICE_SUB_PRO_MONTHLYSTRIPE_PRICE_SUB_PRO_YEARLYSTRIPE_PRICE_SUB_SCALE_MONTHLYSTRIPE_PRICE_SUB_SCALE_YEARLYSTRIPE_PRICE_CREDITS_STARTER(兼容STRIPE_PRICE_CREDITS_500)STRIPE_PRICE_CREDITS_GROWTH(兼容STRIPE_PRICE_CREDITS_1200)STRIPE_PRICE_CREDITS_SCALE(兼容STRIPE_PRICE_CREDITS_3000)
5. 验证关键回调事件
重点验证支付成功、订阅续费、扣费失败、取消订阅等关键事件。
6. 执行 seed 写入产品与支付配置
bun run seed:prod -- --env-file ../../apps/ship-api/.env.productionBunship 已经实现的部分
- 订阅 Checkout 与一次性支付 Checkout
- Stripe Customer Portal(用户自助管理订阅)
- 回调入口与事件处理:
apps/ship-api/src/services/webhook/stripe.ts - 续费事件幂等发放积分(
invoice.paid/invoice.payment_succeeded)
代码位置
- 订阅与订单 API:
apps/ship-api/src/module/subscription.ts、apps/ship-api/src/module/orders.ts - Webhook 路由:
apps/ship-api/src/module/webhook/stripe.ts - Webhook 业务逻辑:
apps/ship-api/src/services/webhook/stripe.ts - 产品与价格 seed:
packages/db/src/drizzle/seed/product.ts
买家上线检查
- Stripe 后台产品/价格与 seed 映射一致。
- 生产环境 webhook 可被 Stripe 正常访问。
- 续费、失败扣费、取消订阅都做过回归。
- 用户端与后台端订单/订阅状态展示一致。