自带 Stripe 与登录的 Next.js SaaS 模板,到底该检查什么
By make1day · Updated 2026-11-07
当你搜索「自带 Stripe 与登录的 Next.js SaaS 模板」时,真正只问一个问题:那 60% 的通用部分,我还要亲手写多少?
四项不可妥协
- 登录鉴权——托管服务商提供的邮箱魔法链接与 OAuth,默认开启行级安全。
- 计费——托管结账加上一个会把套餐标志写进数据库的 Webhook。Webhook 没接,那是演示,不是生意。
- 数据库——Postgres,含预置表结构与可读的 RLS 策略。
- 部署——Vercel 就绪配置,一条命令通往生产。
大多数模板栽在这里
Webhook 验签不是细节。签名缺失、无效或 JSON 损坏时必须返回 HTTP 400,绝不能悄悄当成「空事件列表」返回 200。本项目里每个支付适配器验签失败都会抛错,空数组只表示一件事:事件合法且已验签,但无需处理。重放事件在写 license 或套餐前会按事件 id 去重。
多数免费模板跳过幂等,而你会在第一次退款或重复事件时才发现。
一家通道还是六家?
这里默认 Waffo Pancake(Merchant of Record)。Stripe、Creem、PayPal、Lemon Squeezy 与 Waffo Acquiring 可在生成时切换,也可以选 none 自带计费。它们共用同一个 POST /api/webhook 与一份 PaymentProvider 接口,业务代码里不需要按支付商分支。
十分钟评估法
克隆、配置环境变量、启动服务,然后试四步:注册、撞付费墙、完成测试结账、看到套餐翻转。再用错误签名打一次 Webhook——必须返回 400,绝不能是 200。任何一步被缺失代码卡住,继续找。
FAQ
模板必须接 Stripe 吗?+
不必。Stripe 文档最全,但 Waffo Pancake、Lemon Squeezy 这类 Merchant of Record 能在没有公司主体时处理全球税务,部分市场还需要 PayPal 或 Creem。关键是结账与 Webhook 有一份与支付商无关的契约。
验签失败该返回什么?+
HTTP 400。返回 200 加空事件列表,会让伪造或格式错误的请求看起来成功了。验签失败必须抛错;只有「合法已验签但无需处理」的事件才可确认忽略。
包含 OAuth 吗?+
配 Supabase Auth 时包含:邮箱魔法链接加 Google、GitHub、Apple、Microsoft。本地 SQLite 回退只是账户与角色目录,不是完整认证服务:没有 MFA、OAuth 与会话轮换。
All frequently asked questions · Markdown version (for AI agents)