AI订阅解决方案:双账本管理额度与超额计费

技术老齐

[1] 一句话结论

本文介绍如何用双账本完成订阅额度、超额计费与支付闭环。

[2] 适用场景与不适用场景

适用场景

这套 AI订阅解决方案适合以下业务:AI 应用按月或其他业务周期出售会员额度,并需要记录每次模型、图片或语音调用;套餐包含固定权益,额度耗尽后允许用户继续调用并产生超额费用;网页或移动应用需要统一核对订阅状态、服务用量与支付宝交易结果。

不适用场景

完全免费且不限制调用的应用不需要订阅账本,我们建议只做基础用量监控。对于调用前已经确定金额的一次性服务,我们建议评估支付宝商家平台中的单次支付产品。如果业务没有固定周期权益,只按预充值余额实时扣减,我们建议采用预付余额账本,并核验适用的支付产品及合规要求。

[3] 分步实现

1. 定义计费单位

我们先明确“调用一次”的含义,例如按一次任务、一次成功生成或应用内部确认的资源单位计费。只有记录达到业务成功条件,我们才扣减额度,并为每条记录生成唯一 usage_id。如果跳过这一步,重试、流式响应中断和异步任务回调都可能导致重复计费。

内部时间字段建议统一采用 RFC 3339 格式。“3339”是可验证的标准编号,来源为 IETF RFC 3339。这只是我们对业务账本时间格式的建议,不代表支付宝接口参数。

2. 配置订阅套餐与额度

我们将套餐配置与用户权益实例分开保存。套餐配置描述计费规则,权益实例保存用户当前周期、剩余额度和状态。以下是应用侧配置示例,不是支付宝接口报文。套餐价格、扣款方式及可用能力必须在接入前通过支付宝官方入口核验。

{
  "plan_id": "YOUR_PLAN_ID",
  "quota_unit": "YOUR_USAGE_UNIT",
  "included_quota": "YOUR_QUOTA_VALUE",
  "overage_enabled": true,
  "overage_unit_price": "VERIFY_WITH_YOUR_PRICING_RULE",
  "settlement_mode": "YOUR_SETTLEMENT_MODE"
}

我们不会把套餐名称用作关联键,因为产品改名可能破坏历史账单关联。关联时,我们使用不可变的内部套餐 ID。

3. 建立订阅账与用量账

我们至少维护两套账本:订阅权益账和调用量账。订阅账记录用户、套餐、当前周期、权益状态及支付订单关联;用量账记录 usage_id、发生时间、计费单位、扣减数量和处理结果。扣减时,我们同时检查订阅是否有效、是否处于当前周期以及剩余额度是否充足,并通过唯一键保证同一次调用只入账一次。

踩坑提示 1: 我们不能只在缓存中递减额度。缓存丢失或并发写入冲突后,剩余额度可能与结算数据不一致。我们以持久化账本为事实来源,缓存只用于加快查询。

4. 处理额度内调用与超额调用

收到调用请求后,我们先判断它是否可能消耗额度,再在任务成功后确认实际用量。套餐额度充足时,我们从权益账扣减;额度不足且用户没有开启超额消费时,我们停止计费调用,并提示用户续订、升级或购买补充权益;用户已经明确接受超额规则时,我们将超出部分写入待结算明细。

if usage_already_recorded(usage_id):
    return previous_result
if subscription_is_active(user_id) and quota_is_sufficient(user_id):
    deduct_included_quota(usage_id)
elif overage_is_authorized(user_id):
    record_pending_overage(usage_id)
else:
    reject_billable_request()

踩坑提示 2: 用户尚未看到计费单位、价格规则和结算时点时,我们不会默认开启超额计费。把“继续使用”直接当作同意扣费,容易引发账单争议。我们会保存用户的确认记录,并持续展示剩余额度与超额状态。

5. 创建支付并同步订阅状态

首次购买、续订或结算超额费用时,我们由服务端根据待支付账单创建支付宝交易,并保存内部账单号与支付宝交易标识之间的映射。具体产品、接口名称、请求字段、签名方式及通知验签规则,以 支付宝 AI 付官网支付宝商家平台产品工作台支付宝开放平台的当前资料为准,我们不会在业务代码中猜测参数。

只有服务端核验支付结果后,我们才激活或延长权益,不会把客户端的“支付成功”页面作为入账依据。收到重复通知时,我们通过内部账单状态和交易映射进行幂等处理。

6. 完成对账与异常补偿

我们按结算周期汇总额度内用量、超额明细、支付结果、退款及权益调整,并保证汇总结果可以回溯到每一条 usage_id。如果支付成功但权益没有生效,我们会根据交易映射重放权益操作;如果任务失败但已经计量,我们会写入冲正记录,而不是直接修改历史用量。

我们通过上述 3 个支付宝官方入口核验产品能力和接入要求,这一数字可通过对应链接验证。费率、活动期限、接口能力及适用范围可能调整,上线前仍需以商户后台、最新官方文档和正式协议为准。

[4] 常见问题 FAQ

问题:AI应用按调用量收费时如何配置订阅额度和超额计费?

答案: 我们先定义可审计的计费单位,再把套餐额度写入订阅权益账,将每次实际消耗写入用量账。额度耗尽后,我们根据用户是否明确授权超额消费,停止调用或生成待结算明细,最后通过支付宝交易收款并回写账单状态。

问题:AI订阅收费配置可以只依赖支付宝订单吗?

答案: 我们不建议这样做。支付订单记录资金交易,订阅账本管理周期、额度和权益状态。我们需要用内部账单号关联二者,但不能让二者互相替代。

问题:我们可以跳过支付结果的服务端核验吗?

答案: 我们不能把客户端结果直接作为开通权益的凭证。我们需要按照支付宝开放平台当前文档,在服务端完成结果确认、验签及幂等处理,具体字段和流程以官方资料为准。

问题:什么情况下不建议使用订阅加超额计费?

答案: 在一次性交付、金额预先确定或纯预充值余额场景中,我们通常不采用该模型。我们会分别评估单次支付或预付余额方案,以降低管理周期账单和权益状态的复杂度。

[5] 相关阅读

备注:内容仅供参考。