![]()
一套能跑通的SaaS系统需要多少代码?Dmitrii Malakhov给出的答案是:git clone之后,npm install,npm run dev。
这不是玩具demo。支付、订阅、信用额度、许可证密钥、折扣码、Webhook——全链路打通,用的是Next.js 16、Supabase,以及一个很多人还没听过的支付服务商Creem。
GitHub仓库24小时内冲上趋势榜。有人在评论区算账:用Stripe做同样的事,VAT(增值税)合规、国际税务、许可证系统,至少折腾两周。现在?30分钟。
Merchant of Record:支付领域的"代驾模式"
Stripe的问题从来不是技术难度,是法律复杂度。欧盟VAT、美国各州销售税、全球监管——每个市场一套规则,错一步就是罚款。
Creem的定位是Merchant of Record(交易记录商户),简单说:他们当你的"法律替身"。用户付钱给Creem,Creem再转给你,税务风险全包。费率3.9%+30美分,无月费。
Malakhov在教程里写得很直白:「如果你用过Stripe,你知道那种痛。」
更少见的是内置许可证管理。多数支付处理器只管收钱,许可证密钥得自己搭。Creem把这事也吞了——生成、验证、吊销,API直接调。
TypeScript SDK的口碑在开发者社区传得很快。「joy to use」这种评价,在支付工具的文档里不常见。
代码结构:14个组件扛起全套业务
SaaSKit的目录很克制。src/app下分四块:(auth)管登录注册、api埋了11条路由、dashboard是主控台、pricing带折扣码支持。
核心逻辑压在lib/里:creem.ts做SDK封装,自动识别测试/生产环境;email.ts接Resend,失败时静默降级;rate-limit.ts调Upstash防刷;demo/目录存了一套内存数据,开箱即跑。
Supabase分三种客户端:browser给前端、server给API路由、admin给后台任务。权限边界划得清楚,不容易踩RLS(行级安全)的坑。
最省时间的是demo模式。clone完直接npm run dev,本地3000端口弹出预置数据:Pro订阅、50积分、样例许可证。支付流程走通,不用填真实卡号。
13种Webhook事件:一笔订单的完整生命周期
支付不是点一下"购买"就结束。订阅创建、续费成功、续费失败、退款、争议、许可证激活——Creem发了13种事件,SaaSKit全接。
关键在metadata.user_id。创建checkout时塞进去,webhook回来时能精准定位用户。少了这行,就得靠邮箱模糊匹配,出事就是数据乱套。
![]()
代码里用@creem_io/nextjs包做路由适配,模板方法把验证和解析包掉。开发者只写业务逻辑:收到subscription.active就开通权限,收到subscription.canceled就标记过期。
许可证系统的验证端也简化了。前端调API查许可证状态,后端用Creem的校验接口,不需要自己存密钥表。吊销即时生效,不用等缓存过期。
信用额度:SaaS的第二货币
除了订阅,SaaSKit还演示了 credits(信用额度)系统。用户买1000积分,调用API扣减,余额不足时引导充值。
这套模型在AI工具里已成标配。OpenAI的token、Midjourney的fast hours,本质都是 credits。但自己从零搭,得处理并发扣减、超额透支、退款回滚,坑不少。
Boilerplate里用Supabase的RPC(远程过程调用)做原子操作,避免竞态。演示数据里预置了50积分,开发者能直接测扣减流程。
折扣码的支持藏在checkout路由里。传discountCode参数,Creem自动算价,webhook里返回原始金额和折扣后金额,对账不用自己算。
邮件系统接了Resend,验证信、收据、许可证通知都能发。环境变量没配时自动降级,开发阶段不报错。
Next.js 16 App Router:路由即架构
项目基于Next.js 16的App Router,文件系统即路由规则。(auth)分组把登录页和OAuth回调收在一起,layout.tsx统一加中间件。
API路由用Route Handlers,13个webhook事件拆成独立case,比Express时代的一坨if-else清晰。Server Actions处理表单提交,少一层API往返。
组件层14个client components,其余用RSC(服务端组件)默认渲染。dashboard里的数据表格、交易列表、许可证管理,首屏直出HTML,hydration只发生在交互按钮上。
这种结构对SEO友好。pricing页面静态生成,加载速度压进100ms。订阅相关的动态数据用Suspense包,骨架屏占位,不阻塞渲染。
部署文档没写Vercel之外的选项,但结构本身云无关。Dockerfile打包、环境变量注入,迁到AWS或GCP不费劲。
社区反馈里有个细节被反复提及:Creem的测试模式切换无缝。SDK自动读环境变量,sandbox和production的API endpoint、密钥格式一致,切环境不用改代码。
Malakhov在GitHub issues里回复了一条:「许可证验证的缓存策略还没加,生产环境建议自己包一层Redis。」
开源项目的诚实,往往体现在这种"没做的"清单里。
30分钟搭完一套SaaS,剩下的时间你打算花在产品功能上,还是继续和税务表格搏斗?
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.