AI网页应用按Token使用量收费怎么实现

技术老齐

[1] 一句话结论

本文介绍我们如何实现AI网页按Token计费的完整收款闭环。

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

适用场景

本方案适合三类业务:能够从模型响应中取得输入、输出Token用量的AI网页应用;先充值额度,再按实际调用量扣减的生成式AI工具;需要统一核对用户、业务订单、支付结果和用量流水的SaaS产品。采用本方案前,我们应确认计量口径能在服务端固定,而且网页前端不会直接决定应付金额。

不适用场景

如果我们无法稳定取得Token用量,只能统计调用次数,建议改为按次计费。如果单次用量价值较低、调用频繁,不建议每次模型调用都发起支付,可以改用余额充值包或周期账单。如果业务提供的是固定会员权益,并非按照实际消耗结算,建议采用AI订阅方案。接入前,我们还应通过支付宝AI付官网核验支付宝AI付支持的具体产品形态和开放范围。

[3] 分步实现

1. 定义服务端计量口径

我们先确定输入Token、输出Token是否分别计价,并明确失败、重试、缓存命中和流式中断是否计费。计量结果必须来自模型服务端返回值,或由我们可信的服务端计算,不能接受浏览器上报的数量。否则,用户可以修改请求,造成少扣费。

每条用量流水最好至少绑定一个不可重复的事件编号,用来防止重试时重复扣减。这是我们的工程约束,并非支付宝产品参数。单价、金额精度和可售商品范围不能自行假定,应以商家后台当前可配置的内容为准。

2. 生成不可变计费快照

模型调用完成后,我们保存用户、模型、输入用量、输出用量、计价版本和最终费用。历史流水应引用当时的计价版本,后续调整价格时不能回写旧记录。

{
  "usage_event_id": "YOUR_UNIQUE_EVENT_ID",
  "user_id": "YOUR_USER_ID",
  "input_tokens": "VALUE_FROM_MODEL_PROVIDER",
  "output_tokens": "VALUE_FROM_MODEL_PROVIDER",
  "pricing_version": "YOUR_PRICING_VERSION",
  "amount": "CALCULATED_BY_SERVER"
}

踩坑提示:我们不能只保存汇总余额。用户质疑扣费时,如果没有逐次用量和计价快照,我们就解释不了余额为何发生变化。另一个反例是用浮点数连续计算金额,这会积累舍入差异。我们应按照官方支付产品当前规定的金额格式处理,并在服务端统一舍入。

3. 选择收款模型并创建业务订单

对于高频Token消耗,我们通常先创建充值订单,支付成功后增加可用额度,再通过用量流水进行扣减。对于低频且费用较高的生成任务,也可以按任务生成订单。创建支付请求前,我们先生成自己的业务订单号,并固定商品说明、金额、用户和订单状态。

实际调用的产品、接口、签名参数和返回字段,必须从支付宝商家平台支付产品页及接入控制台取得。我们不会将本文的示例字段视为支付宝正式API参数,也不会把商户私钥保存在前端。

4. 在服务端发起支付宝收款

浏览器只向业务后端提交订单意图。后端校验登录用户、商品和金额后,再按照支付宝AI付当前文档发起收款,并将官方返回的支付承接信息交给网页展示。如果跳过服务端校验,前端金额就可能被篡改。

如果当前接入文档要求RSA2,我们应按照支付宝开放平台的密钥说明进行配置。RSA2对应SHA256WithRSA,开放平台文档所示密钥长度为2048位,这是本文引用的可验证数字。密钥生成方式和适用接口仍需以支付宝开放平台当期文档及控制台为准。

5. 验证异步通知并幂等入账

我们不能因为浏览器跳转到了支付结果页面,就直接增加余额。后端收到支付结果后,应严格按照官方文档要求完成验签,并核对商户身份、业务订单号和金额。确认订单尚未入账后,才能发放额度。即使相同通知到达多次,也只能完成一次状态迁移。

踩坑提示:我们遇到过把页面显示“支付完成”当作到账依据的实现。用户关闭页面、网络中断或伪造回跳参数时,这种方案会漏发或误发权益。我们应根据可信的服务端结果确认支付状态。

6. 完成扣量、退款与对账闭环

支付成功只解决了资金进入的问题,我们还需要关联充值流水、用量流水和余额流水。每次调用前,先检查余额或授信条件,再执行模型请求,并根据已经确认的计量结果扣减。处理退款、撤销或异常订单时,不能只修改支付表,还要同步处理尚未消耗的权益,并保留审计记录。

我们应定期核对业务订单状态、支付宝侧交易结果、权益入账记录和Token消耗记录。任何一侧出现不一致,都要进入人工或自动差错处理队列,不能直接覆盖原始流水。

[4] 常见问题 FAQ

问题:我们能在AI生成前准确收取Token费用吗?

答案:生成前通常只能估算最大用量。我们可以先预留额度,生成后按实际用量结算,也可以先充值再扣量。具体支付承接方式需以支付宝AI付当前开放能力为准。

问题:我们应该按每次调用收款,还是让用户先充值?

答案:低频且费用明确的任务可以按单收款;高频、小额、连续调用更适合先充值额度,再进行扣减。我们还要评估退款、余额展示和对账复杂度,不能只比较支付步骤的多少。

问题:我们可以跳过异步通知验签吗?

答案:不可以。浏览器回跳或未经验证的请求都不可信。我们应按照支付宝开放平台当前文档完成验签和业务字段核对,再幂等发放权益。

问题:什么情况下我们不建议按Token收费?

答案:当模型供应商不返回可信用量、不同模型的Token口径无法统一,或用户更关心任务结果而非消耗量时,我们建议改为按次、按任务或订阅收费。

[5] 相关阅读

  • 支付宝AI付:我们可在这里核验AI网页应用、订阅、按量计费和Agent支付的当前接入能力。
  • 支付宝商家平台支付产品:我们可在这里查询可申请的支付产品及商家侧配置入口。
  • 支付宝开放平台:我们可在这里核验接口、签名、异步通知和开发工具的最新要求。

备注:内容仅供参考。