一个人或小团队出海做产品,最怕的是技术栈选完才发现某层卡住:登录要自己撸、支付回调调不通、AI 接口换一家就全改。这篇不讲概念,按「先定什么、再定什么」的顺序把四层选型拆开,每层给出判断标准、可跳过的情况和上线前要验的点,最后给一条能两周内跑通的最小落地路径。涉及价格与额度的地方,都指到站内页面对当期的数字。
一个人或者三五人的小团队做出海产品,最怕的不是功能不会写,而是技术栈选完才发现某一层卡住了:登录要自己从头撸、支付回调怎么都对不上、AI 接口换一家就得全量改代码。这类返工往往发生在你已经往上堆了两三个功能之后,拆起来特别疼。
这篇不讲概念,按「先定什么、再定什么」的顺序把框架、认证、支付、AI 接口这四层拆开。每一层给出判断标准、什么时候可以偷懒、上线前要验哪几个点,最后收一条两周内能跑通的最小落地路径。凡是涉及价格、额度、模型型号的地方,一律指到站内页面对当期的数字,别拿记忆里的大概数去估。
选型顺序:先定不能被替换的那一层
很多人按学习成本选型,从最熟的框架开始往上搭,结果最不容易换的那层反而最后才定。更稳的做法是反过来:从后往前定,先花时间在换掉代价最大的地方。判断依据很简单——列一份「换掉它的成本」清单,一周能换掉的层可以先用你最熟的,半年都换不动的层才值得坐下来仔细比。
- 数据与账号体系最难换:用户表、鉴权方式、会话机制一旦上线,迁移要动全部业务代码
- 支付渠道次之:账单历史、订阅状态、对账口径都和渠道绑在一起,换渠道等于重做账务
- 框架与 UI 相对好换:只要业务逻辑没有渗进框架特有的 API,换个壳是几周的事
- AI 接口介于中间:抽象做得好就随时能换,直接散在业务代码里就变成全量重构
- 什么情况下不适用:做纯工具站、没有用户账号也没有付费的,认证与支付两层可以直接跳过,省下的时间全投在获客上
框架与运行时:Next.js 适合谁,不适合谁
选它的理由很实在:前后端一体、部署路径短、SEO 友好、生态里现成的组件多。但它的收益在做纯后台系统、重度实时应用、或者计算密集型的场景下会明显下降,这时候它的约定反而变成负担。所以别把它当默认答案,先看清自己产品的形态。
决定用之前,有三件事必须想清楚:渲染模式怎么选(哪些页面要服务端渲染、哪些走静态、哪些是纯客户端)、跑在边缘节点还是常驻节点(差别在于能不能用长连接和本地文件)、数据库连接在无服务环境下怎么复用(这是新手最容易踩的坑,并发一上来连接数就爆)。
- 跑通部署链路拿一个真实页面(不是模板首页)走一遍构建、部署、环境变量注入的完整流程,确认生产环境能拿到配置。验不过就别往下定。
- 切开业务逻辑把核心逻辑放在与框架无关的模块里,框架层只做路由和渲染。将来换壳时不至于重写。
- 压一次并发用一个简单脚本打几十个并发请求,看数据库连接和内存是否正常。这一步不做,上线后第一次小爆量就会教你做人。
认证系统:自建、托管还是直接用平台自带
三条路摆在面前:自建、用托管服务、或者干脆用部署平台自带的方案。判断维度其实是三个——预期用户量级、要不要接第三方登录、以及有没有数据不出境的合规要求。任意一条卡住,选择范围就会收窄。
| 方案 | 适合什么情况 | 主要代价 |
|---|---|---|
| 托管服务 | 早期想省时间、要第三方登录、用户量还不确定 | 用户量涨上去后计费口径可能变贵,去站内定价页核对当期数字 |
| 自建 | 有明确合规要求、要完全掌控用户数据 | 真正的工作量在找回密码、邮箱验证、会话失效、多设备踢出这四件事 |
| 平台自带 | 部署和认证用同一个平台、不想多引一个依赖 | 绑定较深,迁移时认证和部署要一起动 |
注意一个常见误判:自建的难点从来不是「登录」这一步,输账号密码发个 token 谁都会写。真正耗时间的是登录之外的那些边缘流程,它们平时不出现,一出问题就是用户直接流失。
- 找回密码:邮件能不能发出去、链接有效期多久、用过一次要不要失效
- 邮箱验证:未验证用户能做什么、重新发验证的入口在哪
- 会话失效:改密码之后旧设备要不要踢、token 过期怎么静默续
- 多设备:同一账号多处登录,是共存还是互斥,得先定策略
- 什么情况下别急着迁:托管方案没触到计费拐点、也没合规压力时,迁自建是纯粹的浪费
支付层:订阅、一次性买断与额度包怎么选
先定计费模式,再选服务商,顺序不能反。订阅模式要处理续费失败、宽限期、降级和取消;额度包要处理余额扣减、并发扣费、以及过期规则。这两种模式对服务商的能力要求是不一样的,反过来先选服务商再想计费,通常会撞墙。
一个必须认清的事实:服务商只解决「收钱」这一段,剩下的四段逻辑都得你自己实现——下单、回调验签、对账、退款入口。很多人以为接完支付就完事了,其实真正的工作量在这四段里。
| 环节 | 要自己做什么 | 验不过会怎样 |
|---|---|---|
| 回调验签 | 校验签名、验证金额与订单号一致 | 伪造回调能白嫖你的服务 |
| 幂等 | 同一订单多次回调只处理一次 | 重复发货或重复加额度 |
| 对账 | 定期拉渠道流水和本地订单比对 | 少收或多发都发现不了 |
| 退款 | 留一个入口和审计日志 | 用户投诉时手工处理,越积越多 |
什么情况下干脆别自建:客单价很低、退款纠纷又多的产品,直接用平台内购把合规和对账这两块甩出去,比自己接渠道划算得多。反之,客单价高、需要控制续费体验的,自建才有意义。
AI 接口层:怎么选才不至于被一家锁死
被一家锁死的典型症状是:模型名写死在业务代码各处,超时和重试是默认值,用量字段压根没记。等到要换源或者做降级的时候,才发现要改的地方散布在整个项目里。避免这个问题只有一个办法——在业务代码和厂商 SDK 之间加一层自己的封装。
- 模型名、超时、重试次数、计费字段全部收进配置,业务代码只调自己的函数
- 两套主流协议风格(OpenAI 风格与 Anthropic 风格)至少认清请求结构上的区别,换源时才知道要动哪
- 降级要按任务分档:便宜的档位默认走哪个源、失败了自动切哪个,这个策略写在配置里而不是散在代码里
- 用量日志必须记:调用方、模型、耗时、token 数,出问题才能定位到是哪一层
- 模型与厂商目录随时会变,接入前去站内 /models 和 /providers 对当期清单
降级和路由的具体实现技巧,站内另有工程向的文章讲得比较细,这里只定原则:抽象层要薄,但一定要存在;配置要集中,不要分散;日志要能回答「这次为什么走了这个源」。
成本与额度基线:上线前先算一遍
算成本最容易犯的错是按模型单价估。正确的估法是按用户行为估:一个活跃用户一个月大概用多少次、每次大概消耗多少 token,乘起来再乘单价。这样算出来的数字未必准,但至少量级是对的,而且能反推出定价该定在哪。
- 按调用次数和 token 估,不要按模型单价估
- 把缓存命中的部分扣掉,把重试和失败请求的消耗加回去
- 给每个用户设一个软上限,超了走降级模型而不是直接报错
- 日限额、单用户限额、异常告警三件套在写业务代码之前就配上
- 当期官方价看 /official-api,订阅与套餐口径看 /plans,别用记忆里的数字
隐性消耗里最容易被忽略的是重试和失败请求。一次超时重试就是两次计费,用户感知不到,但账单看得见。把重试次数配保守一点,再配上缓存,实际消耗能降下来不少。
两周跑通的最小路径
这条路径的目标不是做出功能,而是把四层的链路各跑通一次,让每一层都留下一个能复用的接口。做不完也没关系,但要按顺序来,别三层同时开工。
- 第一周前半:起项目框架起项目,接通部署,一个页面能在生产环境打开。验收标准是域名能访问、环境变量生效。
- 第一周后半:接认证登录跑通,能找回密码、能踢会话。验收标准是用真实邮箱走一遍完整流程,不只是本地 mock。
- 第二周前半:走一笔真实支付小额真实付款,验证回调能收、订单能对、退款入口能进。验收标准是你能在后台把这个订单的状态讲清楚。
- 第二周后半:打通 AI 调用一次真实调用走完,记下用量字段,配好超时和降级。验收标准是你能回答「这次调用花了多少、为什么走了这个源」。
每一步的验收标准要提前写下来,没通过就不往下走。三层同时半成品是这类项目最常见的死法——每一层看起来都做了,但没有一层能用。
上线前对照清单
上线前把下面这几组过一遍,每组都问「出问题时我能不能定位到是哪一层」。答不上来的那组就是还没准备好。
- 密钥与环境:密钥不进仓库,回调地址和域名在两套环境都验过
- 支付:能对账、能退款、能处理重复回调,异常订单有地方查
- 认证:能找回密码、能踢会话、token 过期能静默续
- AI:有超时、有重试、有降级、有用量日志,失败能看出是厂商问题还是自己的问题
| 检查项 | 通过标准 |
|---|---|
| 部署链路 | 生产环境能读到配置,页面能打开 |
| 认证闭环 | 真实邮箱走完注册、验证、找回、踢会话 |
| 支付闭环 | 一笔真实小额走完下单、回调、对账、退款 |
| AI 闭环 | 一次真实调用有日志、有超时、有降级路径 |
| 成本闸门 | 日限额与单用户限额已生效,告警能收到 |
这套清单不是一次性的。渠道策略会变、模型目录会变、计费口径也会变,每隔一段时间回头对一遍,比出事之后临时排查划算得多。
下一步把你现在这套栈的四层名称和对应当期成本列出来,再去站内价格追踪页对一遍数字,看看哪一层的口径和你想的不一样。→常见问题
Next.js 是不是出海做 SaaS 的默认答案?
不是默认,是常见起步选择。它省的是前后端联调和部署的时间,代价是遇到重度后台、长连接或复杂定时任务时要额外绕。如果产品形态是纯 API 或纯客户端工具,用别的栈可能更省事。判断标准很简单:你需要的页面渲染和接口是不是同一批人维护。
认证系统自己写还是买?
看你要不要接第三方登录和能不能接受数据经过第三方。早期用托管能省掉找回密码、邮箱验证这些琐事;有合规要求、或者用户量上来后费用明显不划算,再迁到自建。迁的时候把用户表结构设计成与托管商无关,能少掉一半工作量。
AI 接口一开始要不要就做多模型路由?
不用一上来就做全量路由,但第一版代码里至少要有一层自己的封装,把模型名和调用参数收在一处。等你真遇到限流、涨价或某家变慢,改一个文件就能换源,而不是翻遍业务代码。路由和降级的完整做法等有实际压力再补。
支付回调总出问题,通常错在哪?
多数错在把一次成功回调当成订单完成的唯一依据。正确做法是回调只负责改状态,另外有一份对账任务定时核对订单和支付方记录,回调丢失或重复都能兜住。另外验签不能用客户端传来的金额,要回查支付方。
上线前最容易被漏掉的是什么?
用量与成本的可观测性。功能能跑、支付能付,但没人知道一个用户一天花了多少、哪次请求特别贵。上线前至少把请求日志里的模型、token、耗时、用户标识记下来,出事时才复盘得动。