前置条件
- 一个 Paddle 账号(paddle.com)。审核要几个工作日, 会问公司信息和网站 URL。
- 一个 sandbox 账号(sandbox-vendors.paddle.com) —— 正式审核没下来时可以先开发。
- Postgres 跑起来,schema 已 push。
1. 选定当前 Provider
src/config/site.ts:
2. 在 Paddle 建商品和价格
Paddle dashboard(或 sandbox dashboard):Catalog → Products → New product。 一个商品下可以挂多个价格(一次性 / 订阅、不同币种等)。复制每个会用到的价格的pri_… ID。
vibestrap 本体需要 promo 和 standard 两个价格(都是一次性)。
3. 拿到 API key、client token、webhook 密钥
- API key:Developer Tools → Authentication → API keys,用 server-side 的(secret)。
- Client token:Developer Tools → Authentication → Client-side tokens, 公开,浏览器里 Paddle.js 用。
- Webhook 密钥:Developer Tools → Notifications → New destination, 对应那个 destination 的 Notification key。它不是 API key —— 见下面 常见坑。
4. 配环境变量
.env.local(变量名严格对齐 src/env.ts):
NEXT_PUBLIC_PADDLE_ENV 同时决定服务端 SDK 的环境(Environment.sandbox 还是
Environment.production)和客户端 checkout 的接入点,二者必须保持一致。
5. 配置 Notifications(webhook destination)
Paddle 把 webhook destination 叫 Notification。新建一个:- URL:
https://your-domain.com/api/webhooks/paddle - Events(至少订阅):
transaction.completed、subscription.activated、subscription.updated、subscription.canceled。 - 复制该 destination 的 Notification key —— 就是你的
PADDLE_WEBHOOK_SECRET。
localhost:3000 暴露到公网,URL 填那个。
验证
- 设
NEXT_PUBLIC_PADDLE_ENV=sandbox,用 sandbox 的 key。 pnpm dev,打开/pricing,点结账 —— Paddle 的托管收银台应该打开。- 用 Paddle 的测试卡(sandbox 环境下
4242 4242 4242 4242,过期日填未来, CVC 填100)支付。 - 看终端,webhook 路由应该打印一条
transaction.completed处理日志。 - 查数据库:
常见坑
- Notification key 和 API key 搞混 —— 这俩是完全不同的凭证。API key 给 服务端调用用;Notification key 给 webhook 签名用。混了的话签名永远校验不过。
- Sandbox / production 环境不一致 —— 如果
NEXT_PUBLIC_PADDLE_ENV=production但 API key 是 sandbox 的(或反过来),SDK 会默默调到错的接入点,建 checkout 时报一个语焉不详的认证错误。 - Webhook unmarshal 是 async 的 ——
webhooks.unmarshal是异步的(底层做 常时间 HMAC 比对)。不要在同步回调里await,会丢事件。 - 价格 ID 跟环境绑定 —— sandbox 的
pri_…在 production 下不存在。两套 环境得各自配一份 env,或者搞个映射表。 - Portal 不接受 returnUrl ——
paddle.customerPortalSessions.create不收returnUrl,用户得通过你 app 的导航条回去。
官方文档
- Paddle 开发者门户:developer.paddle.com
- Webhooks 参考:developer.paddle.com/webhooks/overview
- Paddle.js(前端):developer.paddle.com/paddlejs/overview
- Sandbox 控制台:sandbox-vendors.paddle.com