跳转到主要内容
将此提示词复制到你的 AI 代码编辑器(Cursor、Copilot、Claude Code 等)中,即可自动完成集成:

你将构建什么

一个完整的 Next.js 收银台集成,包括:
  • 服务端创建收银台会话
  • 客户端重定向到托管收银台
  • Webhook 处理支付确认
  • 基于支付状态的受保护路由

前置条件

  • Next.js 13+ 带 App Router
  • 拥有 API 密钥的 Waffo Pancake 账户
  • 在控制台中创建的产品

项目设置

1. 安装依赖

2. 环境变量

SDK 支持多种私钥格式:PEM、base64 或原始格式 — 初始化时会自动标准化。.env 文件中的字面量 \n 也能正常使用。

创建收银台 API 路由

使用 SDK 创建一个 API 路由来生成收银台会话:
SDK 会自动处理请求签名 — 无需手动设置请求头。幂等性需自行开启:重试不能产生第二条记录时,在写操作(或 server action)的最后一个参数传 { idempotencyKey };不传就不发这个头,也不会有任何去重。

优惠

优惠适用于一次性商品、新购订阅与更换方案。Checkout Session 上有三个设置,couponId 不能与另外两个同传(同时传返回 400):
  • couponId:应用一张优惠券,买家不能更换或移除
  • promotionCode:预填一个买家能看到的码 —— 锁定,除非同时传 allowPromotionCodes: true
  • allowPromotionCodes: true:在收银台显示输码框(不传时,只在店铺有可用于该商品的码时显示;传 false 则隐藏)
不要从请求体读取 couponId 或 promotionCode。 上面的路由用你的 API Key 签名,浏览器传来的任何值都会以你的权限生效 —— 买家可以给自己的订单套用你的任意优惠券。请在服务端决定优惠:
如果使用 @waffo/pancake-nextjs 组件:链接收银台支持 discountCode(以 discount_code 传给商品页,应用并锁定);createCheckoutAction() 生成的 server action 透传 allowPromotionCodes,但出于同样的原因会剥离 couponId 与 promotionCode。要应用优惠券或预填码,请像上面一样在你自己的服务端代码中调用 @waffo/pancake-ts。
规则与码被拒绝的原因见优惠与促销。

定价页面组件

创建带有收银台按钮的定价页面:

Webhook 处理器

使用 SDK 内置的 verifyWebhook() 处理支付确认 — 它内嵌了测试和生产两个环境的公钥,因此无需管理 Webhook 密钥:
SDK 的 verifyWebhook() 使用内嵌公钥 — 无需 WAFFO_WEBHOOK_SECRET 环境变量。同时默认包含重放攻击防护。

成功页面

支付成功后显示确认信息:

受保护路由中间件

根据订阅状态保护路由:

服务端组件:检查订阅


客户门户链接

让已登录用户无需邮箱验证码即可自助管理订单和订阅。在你的服务端用一个 Route Handler 生成门户链接并跳转:
身份规则、会话有效期以及不使用辅助方法的写法,见让已登录顾客管理订单。

完整文件结构


测试清单

上线前:
  • 使用测试卡 4576 7500 0000 0110 测试收银台流程
  • 验证 Webhook 已收到(检查控制台日志)
  • 使用 4576 7500 0000 0220 测试拒绝支付
  • 确认成功页面正确显示
  • 切换到正式 API 密钥
  • 更新 Webhook URL 为生产端点

下一步

处理 Webhooks

深入了解 Webhook 处理

订阅管理

高级订阅功能