支付
支付
支付模块通过 paymentService 使用统一接口,生成时可以选择 Creem 或 Stripe。
产品页面和积分逻辑只处理统一的 checkout、订阅和 webhook 事件。
先确认选择
查看 nextdevtpl.generated.json 的 adapters.payment:
| 选择 | 变量 | Webhook 签名头 |
|---|---|---|
payment:creem | CREEM_API_KEY、CREEM_WEBHOOK_SECRET | creem-signature |
payment:stripe | STRIPE_SECRET_KEY、STRIPE_WEBHOOK_SECRET | stripe-signature |
两者统一使用:
https://your-domain.com/api/webhooks/payment
主要代码
| 路径 | 作用 |
|---|---|
src/core/services/payment.ts | 支付统一类型和能力接口 |
src/adapters/payment | Creem 或 Stripe 实现 |
src/services/payment.ts | 当前项目的支付实例 |
src/features/payment/actions.ts | Checkout Server Actions |
src/app/api/webhooks/payment/route.ts | 统一验签和事件处理 |
src/config/payment.ts | 产品和价格 ID |
src/config/subscription-plan.ts | 套餐权益 |
上线步骤
- 在供应商后台创建产品和价格。
- 把价格 ID 写入
NEXT_PUBLIC_PRICE_*变量与套餐配置。 - 配置 API Key 和 webhook secret。
- 把 webhook 指向
/api/webhooks/payment。 - 用测试环境完成订阅、取消、续费和一次性购买。
- 确认重复 webhook 不会重复发放积分。
pnpm test:run -- src/test/adapters/payment.test.ts
pnpm test:run -- src/test/payment