如何搭建带积分与订阅的 AI 图片生成 SaaS

一篇基于真实实现的 AI 图片 SaaS 指南,涵盖提示词与参考图生成、私有历史记录、可靠的积分扣费、Stripe 订阅和积分包。

如何搭建带积分与订阅的 AI 图片生成 SaaS
V
Victory
2026-10-221 分钟阅读

如何搭建带积分与订阅的 AI 图片生成 SaaS

一个 AI 图片产品,并不只是把文本框连接到模型 API。真正困难的是 API 调用之外的部分:接收正确的输入、防止重复任务、在正确的时机扣积分、失败后返还积分、保护生成文件,以及把波动的生成成本变成用户容易理解的价格。

本文以 LaunchSaaS AI Image App 模板的真实实现为例,拆解这些问题。下面介绍的生成流程、积分生命周期、私有存储、历史记录与 Stripe 收费都已经在模板中实现;超出当前默认配置的定价策略会明确作为建议,而不会写成产品已有能力。

1. 从一个清晰的图片场景开始

底层能力可以支持很多图片产品,但第一版最好只解决一项明确任务:

  • 电商图片工具把商品原图变成可投放的营销场景。
  • 宠物肖像应用把上传的照片转换成指定视觉风格。
  • 社交内容工具生成适配帖子和广告尺寸的图片。

细分场景会影响引导流程、默认提示词、图片比例和价格,但不会改变核心系统:用户提交提示词或参考图,应用创建一个按量计费的生成任务,模型返回图片,产品再把结果保存到私有历史记录。

Launch Image 当前是一个更通用的提示词发现与图片生成产品。公开图库帮助用户从经过验证的提示词开始,生成器、积分、收费和私有工作台则提供可复用的 SaaS 基础。购买者可以把它收窄成垂直产品,而不必重新实现计费与交付系统。

Launch Image 中可搜索和复用的提示词图库

公开提示词图库让用户在消耗积分前就能找到可靠的创作起点。

2. 搭建完整的生成流程

一条可靠的生成链路可以分为四步:验证、预留、生成和完成。

在浏览器和服务端分别验证

生成表单接收提示词、可选参考图、模型、宽高比、分辨率和质量设置。浏览器验证负责及时反馈,但服务端必须重复所有重要校验,因为客户端规则可以被绕过。

当前模板把模型能力和积分规则集中在一份 Catalog 中。例如,FLUX.2 [klein] 4B 支持 1K 与 2K 输出,并支持最多四张、不超过 512 × 512 像素的参考图。其他已配置模型分别声明自己的分辨率、参考图和质量限制。服务端会拒绝模型无法处理的参数组合。

包含提示词、模型设置、积分成本与生成结果的 Launch Image 生成器

输入、预计积分、模型设置和结果位于同一条流程中。这张产品截图拍摄于最近一次 FLUX 参考图更新之前;当前实现已经支持最多四张符合要求的 FLUX 参考图。

调用模型前先预留任务和积分

验证完成后,服务端计算积分成本并插入一条 pending 生成记录。这个插入操作就是积分预留边界:D1 Trigger 会检查用户余额,并在同一个数据库事务中扣除积分。

执行顺序非常重要。如果先调用模型、成功后才扣积分,并发请求可能同时使用同一份余额,应用也可能为无力支付的账号生成一张有实际成本的图片。先预留可以在外部工作开始前确定所有权、成本和任务状态。

整个过程可以简化为:

验证请求
  -> 插入 pending 生成记录
  -> 原子预留积分
  -> 调用图片模型
  -> 保存到私有对象存储
  -> 把生成记录更新为 succeeded

模板通过 AI Binding 支持 Cloudflare Workers AI;配置凭证后,也可以启用 Google 和 OpenAI Adapter。因此,默认 FLUX 路径在 Staging 与 Production 中不需要额外的第三方 API Key。

私有保存图片,再完成数据库记录

生成的图片字节存放在私有 Cloudflare R2 Bucket 中,对象路径由用户和生成任务共同确定。D1 只保存对象 Key 和生成元数据,不保存图片本身。

R2 与 D1 无法加入同一个共享事务,所以模板把 D1 中的 pending 记录视为所有权预留。只有对象已经写入,而且对应记录成功从 pending 原子更新为 succeeded,系统才会向用户报告生成成功。如果完成过程失去预留记录,代码会删除对象或保留清理引用,而不会暴露一张没有数据库归属的图片。

图片通过需要登录的路由提供。服务端会验证生成记录属于当前用户,响应使用 private, no-store 缓存规则,同一路由也可以返回下载附件。即使知道对象 Key,也无法读取其他用户的图片。

把历史记录当作产品的一部分

历史记录并不是附加页面,而是用户从已经消耗的积分中持续获得价值的地方。Launch Image 会记录提示词、模型、宽高比、分辨率、质量、状态、积分成本、时间以及存储对象引用。

用户可以在私有历史页筛选成功或失败任务、复用提示词、查看结果,或者删除已结束的记录和对应 R2 对象。所有权由服务端查询和图片路由强制执行,而不是仅仅隐藏导航入口。

包含生成结果、参数、复用和删除操作的私有历史记录

每张结果图都会保留生成它所使用的提示词与设置。

3. 设计不会重复扣费的积分机制

积分可以把波动的基础设施成本变成用户容易理解的单位,但也会带来一个简单的 credits = credits - 1 更新无法安全解决的记账问题。

在任务被接受时扣积分

Launch Image 在插入 pending 生成记录时扣积分,而不是在用户点击按钮时扣,也不是等模型成功后再扣。

这个边界具有几个重要特性:

  • 无效请求不会进入插入阶段,因此不消耗积分。
  • 余额不足会在调用外部模型前失败。
  • 并发请求不能重复消费同一份余额。
  • 每一笔已接受的扣费都有生成 ID 和明确成本。

成本来自服务端维护的模型 Catalog。目前标准 FLUX 1K 生成消耗 1 积分,FLUX 2K 消耗 4 积分。不同模型、分辨率和受支持的质量设置可以使用不同成本,界面会在提交前显示相同的计算结果。

通过状态变化自动返还

模型错误、缺少可选 Provider 凭证、限流和存储失败,都可能发生在积分预留之后。当任务从 pending 变成 failed 时,D1 Trigger 会把原始 creditCost 加回用户余额。

退款绑定在状态变化上,而不是分散到每一条异常分支中。只有 pending → failed 会触发返还,因此同一个失败任务不会重复退款。

Worker 也可能在预留和完成之间中断。用户下次发起产品请求时,恢复逻辑会查找超过 15 分钟仍处于 Pending 的任务,删除确定性 R2 路径下可能存在的对象,再把任务标记为失败。随后仍由正常的数据库 Trigger 返还积分。

用幂等性处理重试

浏览器可能自动重试,用户可能连续点击,移动网络也可能在服务端已经接收任务后断开。

因此,每次提交都会携带一个 Idempotency Key。数据库对 (userId, idempotencyKey) 建立唯一约束。如果同一请求再次到达,API 会返回已有任务的状态和图片地址,而不是创建第二条记录、再次扣费或再次调用模型。

关键点是:幂等性不能只依赖前端的 Loading 状态。它必须由数据库唯一约束保证,并且与积分预留发生在同一个边界。

保留只追加的积分流水

当前余额只能回答“用户现在可以消费多少积分”,无法回答“余额为什么是这个数字”。

Launch Image 在余额之外维护只追加的 credit_transaction 流水。每一条记录包含带正负号的变动值、变动后余额、原因、可选关联 ID 和时间。D1 Trigger 会在余额变化的同一个事务中写入对应流水。

流水覆盖:

  • 试用积分与迁移前初始余额;
  • 生成扣费与失败返还;
  • 一次性积分包的发放、撤回与恢复;
  • 订阅积分的发放、撤回与恢复。

普通用户只能查看自己的流水;管理员拥有单独授权的分页视图,并可在服务端按用户与活动类型筛选。即使用户删除一条生成记录,对应的财务历史也不会消失。

显示当前积分余额和最近生成结果的工作台

余额是当前可消费的投影,交易流水才是解释余额变化的审计记录。

4. 组合订阅、积分包与安全上线流程

不存在适用于所有产品的“正确积分数量”。首先计算一次成功生成的完整成本:

模型推理成本
+ 失败尝试的预期成本
+ 存储与传输
+ 支付手续费
+ 客服与运营利润
= 可持续的最低售价

然后再决定用户应该如何购买这些用量。订阅适合持续使用者,可以提供固定额度和稳定收入;一次性积分包适合偶发用户、季节性项目,以及需要临时增加额度的订阅用户。第一版通常只需要一个清晰的订阅套餐和一个补充积分包。

当前模板包含以下可编辑默认配置:

方案价格包含积分单位积分价格
免费账号$010 个试用积分—
Pro 月付$19/月每张已付款发票发放 100$0.19/积分
Pro 年付$180/年每张已付款发票发放 1,200$0.15/积分
Starter Pack一次性 $29100$0.29/积分

这些是模板默认值,不是对所有图片产品的统一定价建议。你需要根据模型成本、平均重试率、客户价值和目标利润率进行调整。这里的价格关系是有意设计的:订阅用户用持续付费换取更低的单位积分价格;积分包价格更高,但不需要开始订阅。

带月付和年付控制的 Launch Image Billing 页面

订阅管理和一次性购买记录都属于登录后的产品流程。

支付生命周期需要像生成扣费一样严谨。当前实现中:

  • 经过验证的 Pro 已付款发票,会按月发放 100 积分或按年发放 1,200 积分。
  • Stripe 重试不会重复发放。
  • 经过验证的全额退款或争议只会撤回一次对应积分。
  • 争议胜诉后只会恢复一次积分。
  • 部分退款会被记录并交给人工审核,而不会猜测一个按比例调整值。
  • 已支付的 Starter Pack Checkout 会发放 100 积分,并采用相同的幂等撤回与恢复流程。

用户取消续费时,已经为当前付费周期发放的积分不会因此自动过期。

一份可执行的上线清单

要发布你自己的模板版本:

  1. 选定图片细分场景,替换通用图库文案、提示词数据和默认生成设置。
  2. 为 Staging 与 Production 分别创建独立的 Cloudflare D1 和私有 R2 资源。
  3. 配置默认 Workers AI 模型,或者添加计划支持的 Google 与 OpenAI 凭证。
  4. 设置 Stripe 月付、年付和一次性价格,并同步修改 Catalog 中的积分数量和展示价格。
  5. 在独立 Staging 中验证成功生成、模型失败、重复提交、余额不足、已付款发票、全额退款和争议,再进入 Production。

这就是图片演示与图片 SaaS 的区别:完整产品不仅能生成图片,还能保存、计量、退款、收费,并解释每一次积分变化。

LaunchSaaS AI Image App 模板已经包含提示词图库、需要登录的生成器、私有 R2 图片交付、生成历史、D1 原子积分记账、积分流水、Stripe 订阅、一次性积分包、中英双语界面和管理后台流程。你可以从一个可运行的系统开始,把时间投入真正决定产品差异的细分场景、模型体验与获客渠道。