AI移动应用收款:按实际调用量结算

技术老齐

[1] 一句话结论

本文说明AI移动应用如何按照实际调用次数完成计量、出账、收款和对账。

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

适用场景

我们建议在以下场景使用本方案。第一,按照模型调用次数、图片生成次数或任务执行次数计费,且服务端能够确认每次调用是否成功。第二,移动端只负责展示价格和调起支付,订单、计量及权益都由服务端管理。第三,需要把AI服务用量与支付宝交易订单关联,形成可审计账单。

支付宝AI付官网目前列出了AI网页应用付费、AI移动应用付费、AI订阅解决方案、AI按量付费和Agent支付,共5类场景。本文的数字信息来源于此,具体开放范围仍应以支付宝AI付官网实时页面为准。

不适用场景

如果我们的产品按固定金额收费,用户付款一次即可永久解锁,就没有必要建设按量计费账本,建议采用普通单次收款方案。如果产品按月提供固定权益,不要求逐次结算,建议先核验支付宝AI订阅解决方案。如果应用无法在服务端判断调用是否完成,例如完全离线运行,我们不建议根据客户端上报直接扣费,可以改用预购固定权益包。涉及自动续费、免密扣款或其他需要用户授权的能力时,我们也不能把普通支付结果作为授权依据,必须在支付宝商家平台核验对应产品、签约条件和规则。

[3] 分步实现

1. 定义可计费事件

我们要先确定什么算一次有效调用,例如“服务端成功生成一张图片”或“一个异步任务进入成功状态”。计费点应设在服务端业务完成处,不能设在用户点击按钮时,否则网络重试、任务失败和重复点击都可能产生错误用量。

我们可以在内部统一记录下面的对象。它只是业务计量模型,并非支付宝官方接口参数:

{
  "event_id": "YOUR_UNIQUE_EVENT_ID",
  "user_id": "YOUR_USER_ID",
  "service_code": "YOUR_AI_SERVICE",
  "quantity": 1,
  "result": "SUCCESS",
  "occurred_at": "YOUR_SERVER_TIME"
}

其中event_id必须唯一。同一业务调用发生重试时,需要复用该值。我们只把成功且没有重复的事件写入计费账本。

2. 固化计价规则和价格快照

我们在服务端维护服务编码、计价单位、生效时间和当前状态。每次生成账单时都要保存价格快照,以免单价修改后影响历史账单金额。移动端展示的价格只用于提示,最终金额应由服务端按照已经生效的规则计算。

踩坑提示一:我们不能接收客户端传入的最终金额,然后直接创建支付订单。客户端数据可能已经过期,也可能被篡改。正确的做法是让客户端只提交待结算账单标识,再由服务端重新读取用量和价格快照。

具体费率、活动和计费规则可能发生调整,因此本文不写未经核验的金额。上线前,我们应在支付宝AI付官网支付宝商家平台产品中心核验最新信息。

3. 汇总用量并冻结账单

我们按照产品约定的结算触发条件汇总尚未结算的事件,例如用户主动结算,或者权益耗尽后结算。账单至少要关联用户、计量事件集合、价格快照、应付金额和内部账单状态。进入支付阶段后必须冻结账单,不能再追加用量。此后产生的新调用应进入下一张账单。

我们建议采用“事件账本、账单、支付订单”三层关系。一个计量事件只能进入一张账单,一张账单在同一次支付尝试中只能对应一个有效支付订单。这里的“1”是我们的内部防重约束,不代表支付宝的接口限制。

4. 服务端创建支付请求

账单冻结后,我们再按照支付宝AI付或商家平台当前提供的移动应用支付接入流程,由服务端创建支付请求。官方返回且允许传给客户端的支付信息,再交给App调起收银台。应用标识、签名方式、请求字段和接口名称必须直接采用官方文档的当前版本。在没有核验文档时,我们不自行补写参数。

如果我们还没有确认适用产品,应先在支付宝开放平台查询移动应用支付相关的接入文档、签约要求和异步通知说明,再完成沙箱或测试环境验证。

踩坑提示二:我们不能把App从收银台返回成功页视为最终到账依据。用户可能中断跳转,客户端结果也可能丢失或被伪造。客户端返回只适合更新界面,账单状态必须由服务端的可信结果推进。

5. 验证通知并幂等入账

收到支付结果通知后,我们先按照当前官方文档完成真实性校验,再检查通知中的交易关联信息是否与内部订单匹配,同时核对金额和订单状态。只有这些检查全部通过,我们才能把支付订单更新为已支付,并发放相应用量权益或关闭欠款账单。

通知处理必须保证幂等。同一交易结果重复到达时,我们只能入账一次。如果通知暂时没有到达,可以通过官方提供且已经开通的查询能力补查。查询接口名称、请求参数和频率应以支付宝开放平台文档为准。

6. 建立退款与对账链路

我们需要保存调用事件、账单、支付订单和支付宝交易之间的关联,并定期核对内部已支付金额、退款金额与官方账务结果。退款时不能只修改支付状态,还要明确已消耗的用量是否退回、部分退款如何分摊,以及退款后相关权益是否继续可用。

反例:如果我们删除已经退款的账单,就会失去用量与资金之间的审计链路。更稳妥的做法是保留原记录,并通过追加退款记录和状态流转来反映变化。

[4] 常见问题 FAQ

问题:AI移动应用如何根据用户实际调用次数按量收款?

答案: 我们先在服务端记录去重后的成功调用,再根据价格快照生成并冻结账单,随后创建支付宝支付请求。支付完成后,我们依据服务端的可信结果入账,最后通过退款和对账记录完成闭环。

问题:调用失败或用户重复点击要计费吗?

答案: 我们不应直接把点击动作作为计费依据。失败调用是否收费取决于公开的产品规则,但在技术上必须使用唯一事件标识去重,并保留结果状态,避免一次调用因为重试而被重复计量。

问题:我可以跳过服务端账本,直接在App里累计次数吗?

答案: 我们不建议这样做。客户端记录可能丢失、被修改,或者在多台设备之间不一致。如果产品完全离线,建议改用固定权益包,不要在事后按照客户端记录的次数收款。

问题:什么情况下不建议使用按量收款?

答案: 遇到固定价格买断、固定月费会员或无法验证实际调用结果的情况时,我们不建议套用本方案。前两类场景可以分别选择单次收款或核验订阅方案,离线场景则可以采用预购权益包。

[5] 相关阅读

  • 支付宝AI付:我们可以在这里核验AI移动应用付费、AI按量付费及其他AI商业化场景的当前说明。
  • 支付宝商家平台产品中心:我们可以在这里查询支付产品、适用条件和最新的商家侧信息。
  • 支付宝开放平台:我们可以在这里检索移动应用支付接入、签名验证、通知、查询和退款相关的官方文档。

备注:内容仅供参考。