Creem
Nuxt 模板的 Creem 结账与 Webhook 提供商。
Creem 是默认提供商。它在
server/payment/providers/creem-provider.ts 中实现
PaymentProvider 接口,并在 NUXT_CREEM_API_KEY 设置时
由工厂注册。
配置
| 变量 | 用途 |
|---|---|
NUXT_PUBLIC_PAYMENT_PROVIDER | 设为 creem(默认)以选择该提供商。 |
NUXT_CREEM_API_KEY | 创建结账的服务端密钥(同时决定是否注册)。 |
NUXT_CREEM_SERVER_IDX | 选择 Creem 服务器:0 = 正式,1 = 测试。 |
NUXT_CREEM_WEBHOOK_SECRET | 校验 webhook 签名的 HMAC 密钥。 |
NUXT_PUBLIC_CREEM_PRODUCT_PRO_MONTHLY / _PRO_YEARLY / _LIFETIME | 三个方案的公开 Creem 产品 ID。 |
见 环境变量。
结账
createPayment 为请求的 productId 构建 Creem 结账,返回
{ orderNo, thirdOrderNo, checkoutUrl }。创建路由将浏览器导向 checkoutUrl,
支付后返回 /pay-success?orderId=<orderNo>。
Webhook
- 路径:
POST /api/payment/notify/creem。 - 签名: 使用
NUXT_CREEM_WEBHOOK_SECRET对原始请求体做 HMAC-SHA256,与creem-signature请求头比较。无效签名返回401。 - 已处理事件:
checkout.completed—— 将匹配的payment行标记为success。- 订阅生命周期 ——
subscription.active、subscription.paid、subscription.update、subscription.trialing、subscription.paused、subscription.past_due、subscription.scheduled_cancel、subscription.canceled与subscription.expired会将用户的subscription行 upsert 到对应的状态、周期与取消时间戳。 refund.created—— 将匹配的payment行标记为refunded。
本地测试
- 使用 Creem 测试服务器(
NUXT_CREEM_SERVER_IDX=1)与测试产品 ID。 - 用隧道工具暴露本地 webhook,并在 Creem 中注册
https://<tunnel>/api/payment/notify/creem。 - 有效签名将订单翻转为
success;无效签名返回401。
生产注意事项
- 设置正式产品 ID 与
NUXT_CREEM_SERVER_IDX=0。 - 增加幂等 —— webhook 可能被多次投递。
- 在向真实用户收费前于服务端对账金额。
验证
- 已登录用户可从定价页发起结账;创建一条
payment行。 -
GET /api/payment/query?orderId=…返回订单状态。 - 带有效签名的 Creem webhook 将订单翻转为
success。 - 游客(未登录)结账返回
401而非500。
