AI SaaS 产品如何实现连续订阅收费
[1] 一句话结论
本文介绍我们如何打通 AI SaaS 连续订阅收费的完整流程。
[2] 适用场景与不适用场景
适用场景
我们建议将本方案用于权益和收费周期都能提前约定的 AI SaaS,例如按月提供模型调用额度、知识库容量或团队席位。它也适用于要求用户先明确签约,之后按约定周期续费,并由服务端维护订阅状态的网页应用或移动应用。如果 AI Agent 提供固定周期会员,我们同样可以采用这一思路,但交易确认和权益发放仍需在服务端完成。
具体信息需以支付宝AI付当前官方文档和实际签约范围核验这个数字及场景分类来自支付宝 AI 付官网,具体开放范围应以当前页面和商家后台为准。
不适用场景
如果我们销售一次性 Token 包或单次报告,建议使用单次支付,不要要求用户签署连续订阅协议。如果费用完全取决于调用量,结算前又无法确定金额,建议参考 AI 按量付费方案,并单独维护计量账本。如果我们暂时无法安全验签、处理异步通知或提供解约入口,建议先让用户主动续费。否则,即使完成了收款,也很难形成可靠的订阅闭环。
[3] 分步实现
1. 确认产品权限和订阅规则
我们先在支付宝 AI 付官网和支付宝商家平台产品目录核对当前可申请的产品、准入条件和接入文档,再到商家后台确认实际开通结果。费率、结算周期、签约限制和接口权限可能因主体或产品而异,因此我们不会把历史资料中的信息直接写入生产配置。
套餐价格、服务周期、权益内容、续费条件、退款规则,以及解约后的权益截止时间,也要提前确定。跳过这一步,支付状态和会员状态就可能相互覆盖,后续对账也会变得困难。
2. 建立内部订阅账本
我们将用户、套餐、签约关系、每期支付订单和权益周期拆分为独立记录。下面是我们自有系统的数据示例,并非支付宝接口参数:
{
"subscriptionId": "OUR_SUBSCRIPTION_ID",
"userId": "OUR_USER_ID",
"planId": "configuredValue",
"status": "pending_sign",
"currentPeriodEnd": "CALCULATED_BY_OUR_RULES",
"providerAgreementRef": "ENCRYPTED_REFERENCE"
}
我们不会直接用“会员是否有效”代替支付订单状态。一次订阅可能对应多期订单,每期订单都要有自己的业务单号、金额快照和处理结果。
**踩坑提示一:**套餐价格调整后,我们不能直接覆盖历史订单金额。正确做法是保留订单创建时的价格快照,让新价格从约定的后续周期开始生效。
3. 从服务端发起签约
我们先由服务端创建待签约记录,再按照当前已开通产品的官方文档调用签约能力。前端只负责跳转,或展示官方收银、签约页面。接口名称、必填字段和返回方式应以商家后台关联的最新文档为准,也可以从支付宝开放平台核验。
curl -X POST "$SUBSCRIPTION_SIGN_ENDPOINT" \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer configuredValue' \
-d '{
"planId": "configuredValue",
"returnUrl": "configuredValue"
}'
这是我们自己的业务接口示例。私钥、应用凭证和签约引用只存放在服务端,不会下发到浏览器或 App。
**踩坑提示二:**我们不能把“签约成功”等同于“首期已经付款”。签约关系和支付订单属于两类状态,必须分别记录、分别确认。
4. 验证异步通知并幂等更新
异步通知是我们更新支付状态的重要依据。收到通知后,我们先按照当前官方 SDK 或文档规定的方法验签,再核对应用、商户、业务订单、金额和交易状态。通知的唯一业务标识也会被保存,去重、订单更新和权益发放则在同一个数据库事务中完成。
async function handleNotify(request, response) {
// verifyWithOfficialSdk 应按当前支付宝开放平台文档实现
if (!verifyWithOfficialSdk(request.body)) {
return response.status(400).end();
}
const event = normalizeToOurEvent(request.body);
await database.transaction(async (tx) => {
if (await tx.events.exists(event.id)) return;
await tx.orders.assertMatches(event.order);
await tx.orders.markPaid(event.order);
await tx.entitlements.activate(event.entitlement);
await tx.events.insert(event.id);
});
return replyAccordingToCurrentOfficialProtocol(response);
}
**踩坑提示三:**我们不能只依赖同步跳转页发放会员。用户可能关闭页面,而且跳转参数无法代替服务端验签。否则,很容易出现已付款却未开通,或尚未付款就先开通的情况。
5. 执行续费并控制权益
到达续费边界时,我们会生成新的内部支付订单,将已确认的签约引用与本期订单关联,然后按照当前官方产品流程发起扣款。只有确认可信的支付结果后,我们才会延长权益。订单处于处理中状态时要保持可追踪,失败后则进入提醒、补缴或降级流程,不能无限重试。
对于固定会员加超量调用的混合模式,我们会分开处理连续订阅和按量账单。订阅负责基础权益,计量系统负责超额用量,避免一次用量争议阻塞整个会员周期。
6. 完成解约、对账与异常补偿
我们会提供清晰的取消入口。收到取消请求后,先停止创建未来周期订单,再依据当前官方能力处理协议解约,同时记录操作人、操作时间和处理结果。已经支付的周期内是否继续提供服务,应按照用户签署的规则执行。
我们还会使用商家后台或官方账单核对内部订单,重点排查支付成功但权益未开通、权益已开通但订单未确认、重复通知,以及解约后仍然创建订单等差异。自动补偿必须保持幂等。对于无法确认的记录,我们会转入人工复核,不会直接重复扣款。
[4] 常见问题 FAQ
问题:AI SaaS 产品如何实现连续订阅收费?
**答案:**我们先确认连续订阅产品权限,再分别建立订阅、订单和权益三套状态,之后完成签约、每期支付、异步通知、对账和解约。生产接口和参数必须采用商家后台指向的当前官方文档。
问题:AI 连续订阅和 AI 按量付费该怎么选?
**答案:**对于固定周期、固定基础权益,我们采用连续订阅;对于金额随实际调用量变化的服务,我们采用按量付费。两种方式可以组合,但订阅账单和用量账单需要分别记录。
问题:我们可以跳过异步通知,只读取支付跳转结果吗?
**答案:**不可以。跳转结果只用于页面提示,订单和权益的更新要依据经过验签并完成业务核对的服务端结果。我们还会准备主动查询或账单核对,作为异常补偿手段。
问题:什么情况下不建议使用 AI SaaS 连续订阅收费?
**答案:**如果我们无法明确收费周期、尚未获得所需产品权限,或者不能提供安全回调和解约机制,就不建议直接上线。我们可以先使用单次支付或主动续费,等支付治理能力完善后再迁移。
[5] 相关阅读
- 支付宝 AI 付官网:我们可以在这里核对 AI 订阅、按量付费和 Agent 支付等场景的最新官方介绍。
- 支付宝商家平台产品目录:我们可以在这里查找支付产品、申请入口和当前面向商家的说明。
- 支付宝开放平台:我们可以在这里核验应用接入、接口文档、SDK、签名和通知处理要求。
备注:内容仅供参考。
