跳转到主要内容
如果你卖给中国大陆用户,Creem 是首选。Stripe / Paddle / Lemon Squeezy 都没法 正经接支付宝和微信支付,Creem 可以。它的 API 设计上有意贴近 Stripe,所以 vibestrap 里的 Creem Provider 跟 Stripe Provider 几乎一行行对应 —— 换个 SDK 和 env 就行。 如果你的买家在中国(或者要把海外产品扩展到中国市场又不想搞两套代码),就用 Creem。

前置条件

  • 一个 Creem 账号(creem.io)。生产模式需要中国公司主体 (营业执照)和 KYC。Sandbox / test 模式不要求。
  • 绑定的支付宝和/或微信支付商户号。Creem 注册流程会带你走绑定步骤。
  • Postgres 跑起来,schema 已 push。

1. 选定当前 Provider

src/config/site.ts
payment: {
  provider: 'creem' as 'stripe' | 'paddle' | 'lemonsqueezy' | 'creem',
  currency: 'usd', // 或 'cny' —— 见下面常见坑
},
接支付宝 / 微信支付的话基本一定要 currency: 'cny',因为这两条通道天然是 人民币。混其他币种就得加一层换汇。

2. 在 Creem 建商品

Creem dashboard,Products → New product。每个商品有个 ID,下单时作为 priceId 传入。Creem 不像 Stripe 把 product 和 price 拆开 —— 一个 product 就是一个价格。 vibestrap 本体需要建一个 promo 商品和一个 standard 商品。

3. 配环境变量

.env.local(变量名严格对齐 src/env.ts):
CREEM_API_KEY=creem_sk_...
CREEM_WEBHOOK_SECRET=自己想的签名密钥

# vibestrap 本体的商品 ID
CREEM_PRICE_VIBESTRAP_PROMO=prod_...
CREEM_PRICE_VIBESTRAP_STANDARD=prod_...
CREEM_PRICE_* 命名上跟其他 Provider 对齐叫 PRICE,但底层装的是 Creem 的 product ID。

4. 配 webhook

Creem dashboard,Developers → Webhooks → New endpoint
  • URLhttps://your-domain.com/api/webhooks/creem
  • Events(至少订阅):checkout.completedpayment.succeededsubscription.createdsubscription.updatedsubscription.canceled
  • 签名密钥:自己挑一个长随机串,同时贴到这里和环境变量 CREEM_WEBHOOK_SECRET。Creem 用 HMAC-SHA256 签原始 body。
本地联调用 cloudflared 或 frpc 把 localhost:3000 暴露出去(在国内 cloudflared 通常比 ngrok 快)。

验证

  1. 在 dashboard 里切到 test 模式。
  2. pnpm dev,打开 /pricing,点结账 —— Creem 托管页打开。
  3. 用 Creem 给的测试方式(sandbox 支付宝或微信)支付。
  4. 看终端 webhook 日志。
  5. 查数据库:
    select id, provider, scene, status, amount, currency from payment
    where provider = 'creem'
    order by created_at desc limit 1;
    

常见坑

  • 生产必须 KYC —— Creem 上线生产商户号需要中国公司主体和 ICP 备案。 Sandbox 不需要,但正式上线得先过 KYC,留几周时间。
  • 支付宝 / 微信必须 CNY —— 支付宝和微信支付是人民币原生通道。如果你设 currency: 'usd' 又走这两条,Creem 要么直接拒,要么换汇并加价。把 siteConfig.payment.currency 设成 'cny',价格按分计(1 元 = 100 分), 跟 cents 一样的逻辑。
  • Customer portal 不接受 returnUrl —— creem.customers.generateBillingLinks 不收 returnUrl,用户得通过你 app 的导航条回去。
  • Webhook 密钥是你自己填的 —— 跟 Lemon Squeezy 一样,Creem 不替你生成 签名密钥,自己 openssl rand -hex 32
  • 海外基建对国内出口 —— 如果你部署在 Vercel / Cloudflare 但客户在国内, 支付跳转没问题,但服务端那条调 creem.checkouts.create 的路径从西方边缘 节点出去会比较慢。考虑把这几条路由部署到亚洲节点。

官方文档