Vibe Pay如何实现AI服务按次收费

技术老齐

[1] 一句话结论

本文说明我们如何实现Vibe Pay AI服务按次收费。

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

适用场景

我们建议把本方案用于三类边界明确的场景:一次生成、一次分析或一次文件处理等能够独立交付的AI服务;可以为每次请求生成唯一业务单号,并在支付成功后才启动模型任务的应用;已有服务端,能够保存订单、支付状态、用量记录和交付结果的团队。支付宝AI付官网目前展示AI网页应用付费、AI移动应用付费、AI订阅、AI按量付费和Agent支付共5类场景,这一数字可在支付宝AI付官网核验。

不适用场景

我们不建议用按次收费承载持续会员权益。如果我们按月或按周期提供额度,建议参考AI订阅解决方案。对于调用前无法确定成本,费用取决于Token、时长或实际资源消耗的任务,我们应参考AI按量付费,并先明确计量和结算口径。对于Agent代表用户购买外部商品的场景,我们应参考Agent支付能力,不能把一次模型调用订单直接等同于完整交易授权。具体准入条件、产品边界和费率需要在支付宝商家平台产品中心核验。

[3] 分步实现

  1. 定义一次服务

    我们先写清楚一次收费对应的交付物,例如一次图片生成、一份报告或一次文档解析。同时,我们要定义成功、失败、取消和需要人工处理的条件,明确失败后允许重试、补发权益还是退款。如果跳过这一步,我们只能记录模型调用次数,支付争议发生时也无法证明服务是否完成。

    我们可以先建立内部计费对象。下文所有代码均为业务流程伪代码,其中的字段、适配器及方法均非支付宝官方接口,不能直接用于接入:

    usage_id       // 我们生成的唯一消费记录
    merchant_order // 我们生成的业务订单号
    service_sku    // 一次服务对应的规格
    price_snapshot // 下单时锁定的价格快照
    pay_status     // 支付状态
    fulfill_status // AI服务交付状态
    
  2. 创建支付订单

    我们由服务端读取商品配置并创建业务订单,不能接受前端直接提交的最终金额。创建成功后,再按照支付宝AI付当前文档提供的接入方式发起支付。这样可以避免用户篡改单价,也能保证支付订单和AI任务使用同一个业务关联键。

    async function createPaidUsage(userId, skuId) {
      const sku = await loadEnabledSku(skuId);
      const order = await createLocalOrder({
        userId,
        skuId,
        amount: sku.currentPrice,
        status: "WAIT_PAY"
      });
    
      // 我们需要依据当前官方文档实现该适配器
      return officialAiPayAdapter.createPayment(order);
    }

    踩坑提示一:我们不能在浏览器或App中保存商户私钥,也不能让客户端决定订单金额。客户端只负责展示收银页面或承接官方支付流程,签名、验签和订单落库必须放在服务端。

  3. 确认支付结果

    我们不能把用户跳转回结果页当作支付成功的依据。前端页面可能被关闭、重复刷新或伪造,因此我们应在服务端验签,并根据官方能力主动查询订单的最终状态。只有确认状态可信后,我们才能把本地订单改为已支付。签名方式、请求字段、通知字段和返回要求可能随所选产品变化,我们应以支付宝开放平台文档中心的当前页面为准。

    async function confirmPayment(rawNotice) {
      const notice = await officialAiPayAdapter.verifyNotice(rawNotice);
      const result = await officialAiPayAdapter.queryPayment(notice.orderRef);
    
      if (!result.isPaid) return acknowledgeWithoutDelivery();
      await markOrderPaidIdempotently(result.merchantOrderId);
      await enqueueAiJobOnce(result.merchantOrderId);
      return acknowledgeSuccess();
    }

    踩坑提示二:我们不能每收到一次重复通知就生成一次内容。支付通知可能重复到达,我们需要以业务订单号建立唯一约束,并让状态更新和任务投递具备幂等性。

  4. 交付AI服务

    我们确认付款后再创建AI任务,并关联支付订单、消费记录和任务编号。对于耗时任务,我们可以先返回处理中状态,再由任务系统保存最终结果。即使客户端断线,我们也不能取消已经付款的任务。若模型执行失败,我们应保留失败原因和重试记录,并按照事先公布的规则补发次数或进入退款流程。

    反例:如果我们在创建支付订单前就启动成本较高的模型任务,用户放弃付款时,成本已经发生。如果我们在支付页面返回时直接启动任务,又可能因伪造返回地址而产生未付款交付。

  5. 完成对账与异常处理

    我们需要分别记录业务订单、支付状态、AI用量和交付结果,再按业务订单号逐笔核对。对账不能只比较总金额,因为同一金额可能对应多笔服务。我们还应处理支付成功但任务未创建、任务完成但结果未送达、订单关闭后收到迟到状态等异常,并通过补偿任务恢复一致性。

    上线前,我们至少要验证重复通知、重复点击购买、支付后关闭页面、模型超时和服务端重启等路径。费率、结算周期、退款规则以及可用支付产品不应写死在代码或产品文案中。我们应在商家平台和签约页面核验后再进行配置。

[4] 常见问题 FAQ

问题:我们的Vibe Pay AI服务收费必须采用订阅吗?

答案: 我们不必默认采用订阅。若每次服务都有独立价格和交付结果,按次收费更容易解释;若我们持续提供会员权益或周期额度,再评估AI订阅方案。

问题:我们如何确保Vibe Pay按次收费后只执行一次服务?

答案: 我们应为业务订单和消费记录设置唯一标识,并让支付确认、状态更新与任务投递保持幂等。即使支付通知重复到达,我们也只能创建一个有效的交付任务。

问题:我们可以跳过服务端查单吗?

答案: 我们不建议跳过。仅依赖前端跳转结果或单次异步通知,会增加伪造状态和通知丢失带来的风险。我们应按照当前官方文档完成验签,并在关键状态不明确时查询确认。

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

答案: 当一次请求无法对应明确的交付物,或者最终费用只能在服务完成后计算时,我们不应直接套用固定单价。我们可以改用订阅额度、预充值余额或AI按量付费,但具体产品能力与合规要求仍需核验官方信息。

[5] 相关阅读

  • 支付宝AI付:我们可以在这里核验AI应用付费、订阅、按量付费和Agent支付的当前产品信息。
  • 支付宝商家平台产品中心:我们可以在这里查询可签约支付产品、准入信息及商家侧配置入口。
  • 支付宝开放平台:我们可以在这里查找当前有效的接入文档、服务端能力和开发支持信息。

备注:内容仅供参考。