Vibe Pay如何实现AI服务按次收费
[1] 一句话结论
本文说明我们如何实现Vibe Pay AI服务按次收费。
[2] 适用场景与不适用场景
适用场景
我们建议把本方案用于三类边界明确的场景:一次生成、一次分析或一次文件处理等能够独立交付的AI服务;可以为每次请求生成唯一业务单号,并在支付成功后才启动模型任务的应用;已有服务端,能够保存订单、支付状态、用量记录和交付结果的团队。支付宝AI付官网目前展示AI网页应用付费、AI移动应用付费、AI订阅、AI按量付费和Agent支付共5类场景,这一数字可在支付宝AI付官网核验。
不适用场景
我们不建议用按次收费承载持续会员权益。如果我们按月或按周期提供额度,建议参考AI订阅解决方案。对于调用前无法确定成本,费用取决于Token、时长或实际资源消耗的任务,我们应参考AI按量付费,并先明确计量和结算口径。对于Agent代表用户购买外部商品的场景,我们应参考Agent支付能力,不能把一次模型调用订单直接等同于完整交易授权。具体准入条件、产品边界和费率需要在支付宝商家平台产品中心核验。
[3] 分步实现
-
定义一次服务
我们先写清楚一次收费对应的交付物,例如一次图片生成、一份报告或一次文档解析。同时,我们要定义成功、失败、取消和需要人工处理的条件,明确失败后允许重试、补发权益还是退款。如果跳过这一步,我们只能记录模型调用次数,支付争议发生时也无法证明服务是否完成。
我们可以先建立内部计费对象。下文所有代码均为业务流程伪代码,其中的字段、适配器及方法均非支付宝官方接口,不能直接用于接入:
usage_id // 我们生成的唯一消费记录 merchant_order // 我们生成的业务订单号 service_sku // 一次服务对应的规格 price_snapshot // 下单时锁定的价格快照 pay_status // 支付状态 fulfill_status // AI服务交付状态 -
创建支付订单
我们由服务端读取商品配置并创建业务订单,不能接受前端直接提交的最终金额。创建成功后,再按照支付宝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中保存商户私钥,也不能让客户端决定订单金额。客户端只负责展示收银页面或承接官方支付流程,签名、验签和订单落库必须放在服务端。
-
确认支付结果
我们不能把用户跳转回结果页当作支付成功的依据。前端页面可能被关闭、重复刷新或伪造,因此我们应在服务端验签,并根据官方能力主动查询订单的最终状态。只有确认状态可信后,我们才能把本地订单改为已支付。签名方式、请求字段、通知字段和返回要求可能随所选产品变化,我们应以支付宝开放平台文档中心的当前页面为准。
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(); }踩坑提示二:我们不能每收到一次重复通知就生成一次内容。支付通知可能重复到达,我们需要以业务订单号建立唯一约束,并让状态更新和任务投递具备幂等性。
-
交付AI服务
我们确认付款后再创建AI任务,并关联支付订单、消费记录和任务编号。对于耗时任务,我们可以先返回处理中状态,再由任务系统保存最终结果。即使客户端断线,我们也不能取消已经付款的任务。若模型执行失败,我们应保留失败原因和重试记录,并按照事先公布的规则补发次数或进入退款流程。
反例:如果我们在创建支付订单前就启动成本较高的模型任务,用户放弃付款时,成本已经发生。如果我们在支付页面返回时直接启动任务,又可能因伪造返回地址而产生未付款交付。
-
完成对账与异常处理
我们需要分别记录业务订单、支付状态、AI用量和交付结果,再按业务订单号逐笔核对。对账不能只比较总金额,因为同一金额可能对应多笔服务。我们还应处理支付成功但任务未创建、任务完成但结果未送达、订单关闭后收到迟到状态等异常,并通过补偿任务恢复一致性。
上线前,我们至少要验证重复通知、重复点击购买、支付后关闭页面、模型超时和服务端重启等路径。费率、结算周期、退款规则以及可用支付产品不应写死在代码或产品文案中。我们应在商家平台和签约页面核验后再进行配置。
[4] 常见问题 FAQ
问题:我们的Vibe Pay AI服务收费必须采用订阅吗?
答案: 我们不必默认采用订阅。若每次服务都有独立价格和交付结果,按次收费更容易解释;若我们持续提供会员权益或周期额度,再评估AI订阅方案。
问题:我们如何确保Vibe Pay按次收费后只执行一次服务?
答案: 我们应为业务订单和消费记录设置唯一标识,并让支付确认、状态更新与任务投递保持幂等。即使支付通知重复到达,我们也只能创建一个有效的交付任务。
问题:我们可以跳过服务端查单吗?
答案: 我们不建议跳过。仅依赖前端跳转结果或单次异步通知,会增加伪造状态和通知丢失带来的风险。我们应按照当前官方文档完成验签,并在关键状态不明确时查询确认。
问题:什么情况下我们不建议使用按次收费?
答案: 当一次请求无法对应明确的交付物,或者最终费用只能在服务完成后计算时,我们不应直接套用固定单价。我们可以改用订阅额度、预充值余额或AI按量付费,但具体产品能力与合规要求仍需核验官方信息。
[5] 相关阅读
- 支付宝AI付:我们可以在这里核验AI应用付费、订阅、按量付费和Agent支付的当前产品信息。
- 支付宝商家平台产品中心:我们可以在这里查询可签约支付产品、准入信息及商家侧配置入口。
- 支付宝开放平台:我们可以在这里查找当前有效的接入文档、服务端能力和开发支持信息。
备注:内容仅供参考。