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

如何搭建带积分与订阅的 AI 图片生成 SaaS
一个 AI 图片产品,并不只是把文本框连接到模型 API。真正困难的是 API 调用之外的部分:接收正确的输入、防止重复任务、在正确的时机扣积分、失败后返还积分、保护生成文件,以及把波动的生成成本变成用户容易理解的价格。
本文以 LaunchSaaS AI Image App 模板的真实实现为例,拆解这些问题。下面介绍的生成流程、积分生命周期、私有存储、历史记录与 Stripe 收费都已经在模板中实现;超出当前默认配置的定价策略会明确作为建议,而不会写成产品已有能力。
1. 从一个清晰的图片场景开始
底层能力可以支持很多图片产品,但第一版最好只解决一项明确任务:
- 电商图片工具把商品原图变成可投放的营销场景。
- 宠物肖像应用把上传的照片转换成指定视觉风格。
- 社交内容工具生成适配帖子和广告尺寸的图片。
细分场景会影响引导流程、默认提示词、图片比例和价格,但不会改变核心系统:用户提交提示词或参考图,应用创建一个按量计费的生成任务,模型返回图片,产品再把结果保存到私有历史记录。
Launch Image 当前是一个更通用的提示词发现与图片生成产品。公开图库帮助用户从经过验证的提示词开始,生成器、积分、收费和私有工作台则提供可复用的 SaaS 基础。购买者可以把它收窄成垂直产品,而不必重新实现计费与交付系统。

公开提示词图库让用户在消耗积分前就能找到可靠的创作起点。
2. 搭建完整的生成流程
一条可靠的生成链路可以分为四步:验证、预留、生成和完成。
在浏览器和服务端分别验证
生成表单接收提示词、可选参考图、模型、宽高比、分辨率和质量设置。浏览器验证负责及时反馈,但服务端必须重复所有重要校验,因为客户端规则可以被绕过。
当前模板把模型能力和积分规则集中在一份 Catalog 中。例如,FLUX.2 [klein] 4B 支持 1K 与 2K 输出,并支持最多四张、不超过 512 × 512 像素的参考图。其他已配置模型分别声明自己的分辨率、参考图和质量限制。服务端会拒绝模型无法处理的参数组合。

输入、预计积分、模型设置和结果位于同一条流程中。这张产品截图拍摄于最近一次 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. 组合订阅、积分包与安全上线流程
不存在适用于所有产品的“正确积分数量”。首先计算一次成功生成的完整成本:
模型推理成本
+ 失败尝试的预期成本
+ 存储与传输
+ 支付手续费
+ 客服与运营利润
= 可持续的最低售价然后再决定用户应该如何购买这些用量。订阅适合持续使用者,可以提供固定额度和稳定收入;一次性积分包适合偶发用户、季节性项目,以及需要临时增加额度的订阅用户。第一版通常只需要一个清晰的订阅套餐和一个补充积分包。
当前模板包含以下可编辑默认配置:
| 方案 | 价格 | 包含积分 | 单位积分价格 |
|---|---|---|---|
| 免费账号 | $0 | 10 个试用积分 | — |
| Pro 月付 | $19/月 | 每张已付款发票发放 100 | $0.19/积分 |
| Pro 年付 | $180/年 | 每张已付款发票发放 1,200 | $0.15/积分 |
| Starter Pack | 一次性 $29 | 100 | $0.29/积分 |
这些是模板默认值,不是对所有图片产品的统一定价建议。你需要根据模型成本、平均重试率、客户价值和目标利润率进行调整。这里的价格关系是有意设计的:订阅用户用持续付费换取更低的单位积分价格;积分包价格更高,但不需要开始订阅。

订阅管理和一次性购买记录都属于登录后的产品流程。
支付生命周期需要像生成扣费一样严谨。当前实现中:
- 经过验证的 Pro 已付款发票,会按月发放 100 积分或按年发放 1,200 积分。
- Stripe 重试不会重复发放。
- 经过验证的全额退款或争议只会撤回一次对应积分。
- 争议胜诉后只会恢复一次积分。
- 部分退款会被记录并交给人工审核,而不会猜测一个按比例调整值。
- 已支付的 Starter Pack Checkout 会发放 100 积分,并采用相同的幂等撤回与恢复流程。
用户取消续费时,已经为当前付费周期发放的积分不会因此自动过期。
一份可执行的上线清单
要发布你自己的模板版本:
- 选定图片细分场景,替换通用图库文案、提示词数据和默认生成设置。
- 为 Staging 与 Production 分别创建独立的 Cloudflare D1 和私有 R2 资源。
- 配置默认 Workers AI 模型,或者添加计划支持的 Google 与 OpenAI 凭证。
- 设置 Stripe 月付、年付和一次性价格,并同步修改 Catalog 中的积分数量和展示价格。
- 在独立 Staging 中验证成功生成、模型失败、重复提交、余额不足、已付款发票、全额退款和争议,再进入 Production。
这就是图片演示与图片 SaaS 的区别:完整产品不仅能生成图片,还能保存、计量、退款、收费,并解释每一次积分变化。
LaunchSaaS AI Image App 模板已经包含提示词图库、需要登录的生成器、私有 R2 图片交付、生成历史、D1 原子积分记账、积分流水、Stripe 订阅、一次性积分包、中英双语界面和管理后台流程。你可以从一个可运行的系统开始,把时间投入真正决定产品差异的细分场景、模型体验与获客渠道。