AI应用如何用Token Pay实现按月订阅收费
[1] 一句话结论
本文说明如何完成Token Pay按月订阅的签约、扣款和对账闭环。
[2] 适用场景与不适用场景
适用场景
我们建议在三类业务中采用本方案。第一,AI写作、图像生成或行业助手已经建立账号体系,需要按月开通固定权益。第二,AI网页或移动应用有独立后端,可以安全保存订阅关系并接收支付结果通知。第三,商家已经完成支付宝开放平台入驻,并能通过支付宝AI付官网或商家平台确认Token Pay、AI订阅相关能力的开放范围。
不适用场景
我们不建议默认把Token Pay当作通用自动续费工具。如果当前产品文档只允许单次交易,建议使用官方AI订阅解决方案,或其他明确支持周期收费的支付产品。如果AI服务根据模型调用量、生成次数或资源消耗结算,我们建议参考AI按量付费,不采用固定月费。如果Agent只在用户确认后完成一次交易,我们建议使用Agent支付或单次支付流程,避免建立不必要的长期扣款关系。具体准入条件应在支付宝商家平台产品中心核验。
[3] 分步实现
1. 核验Token Pay的订阅能力
我们先到AI付官网、商家平台和应用控制台确认三个问题:当前主体能否申请、适用个人连续订阅还是企业席位订阅、签约与持续扣款如何办理。Token Pay对应AI连续订阅,支持个人连续订阅与企业席位订阅;我们会按照当前官方文档完成签约、持续扣款和退订流程。
踩坑提示:接口返回Token,并不代表商家已经取得长期扣款权限。Token的有效期、使用范围和关联主体都要以控制台对应产品文档为准。因此,本文不会写死未经实时核验的接口名、字段名、费率或活动期限。
2. 建立内部订阅状态模型
调用支付接口前,我们会建立方案、订阅、账期和支付单四类记录。方案记录月费与权益版本,订阅记录用户、方案、签约引用和状态,账期记录应付周期,支付单记录每次实际交易。内部状态可以设计为INIT、SIGNING、ACTIVE、BILLING、PAID、PAST_DUE和CANCELED。这些名称只用于我们自己的业务状态,不对应支付宝官方状态码。
我们还会为同一用户和同一方案设置生效订阅唯一约束,并为每个账期生成不可重复的内部业务号。即使任务重新运行或通知重复到达,也不会重复开通权益。
3. 发起签约或首期支付
服务端按照控制台当前文档组装签约或支付请求,并将内部订阅号与官方返回的业务引用建立映射。前端只负责跳转、唤起或展示官方流程,既不保存私钥,也不自行拼接可能被篡改的金额和方案信息。
以下是业务编排伪代码,字段均为内部示意,不代表支付宝正式接口参数:
subscription = loadSubscription('<configuredValue>')
assert subscription.plan_status == 'ENABLED'
official_request = mapByCurrentOfficialDocs(subscription)
result = alipay_client.execute(official_request)
saveOfficialReference(subscription.id, result.business_reference)
return result.user_action
我们会在服务端按照官方要求完成签名。具体签名规则、密钥规格及配置模式,仍以当前官方文档和控制台配置为准。
4. 验证通知并主动查单
收到支付或签约通知后,我们先保留原始参数,再使用官方SDK和应用当前的密钥配置验签。验签通过后,我们不会直接采信通知中的前端展示状态,而是按照对应产品文档调用查询能力,核对商家、应用、内部业务号、金额和最终状态。全部一致后,我们才更新订阅。
if !verifyByOfficialSdk(original_notification):
reject()
event_key = buildIdempotencyKey(original_notification)
if alreadyProcessed(event_key):
return success()
latest = queryByCurrentOfficialApi(extractBusinessReference(original_notification))
if matchesInternalOrder(latest) && latest.isPaid():
grantEntitlementOnce()
markEventProcessed(event_key)
踩坑提示:一个典型反例是,前端跳转到成功页后立即开通会员。用户关闭页面、网络中断或伪造回跳参数时,这种实现会导致状态错乱。我们只根据验签后的通知与主动查询结果发放权益,并使用幂等键保证权益最多生效一次。
5. 执行月度扣款与权益续期
账期开始前,我们先生成待支付记录,再按照官方订阅或签约产品规定的触发方式处理续费。如果产品允许商家基于有效协议发起扣款,我们只使用官方返回且仍处于有效状态的授权引用。如果每期都需要用户确认,我们会生成待支付账单,引导用户完成确认,不能在后台模拟自动续费。
支付成功后,我们按照已确认的账期延长权益,不会直接从任务执行时间顺延。扣款处于处理中时,我们不重复发起新交易。扣款失败后,我们记录失败状态,暂停下一账期权益或进入宽限策略,同时向用户提供重新支付入口。哪些错误可以重试,以及重试频率和次数,都必须以对应产品的官方文档为准。
另一个反例是,定时任务每次运行都新建支付单。我们会先用内部账期号查重,然后查询上一笔交易的状态。在确定上一笔交易失败前,不会创建替代交易。
6. 完成退订、退款和对账
我们把关闭自动续费、终止签约、停止权益和退款视为不同动作。用户退订后是否立即失去权益,应由订阅条款决定。终止签约只能阻止后续收费,并不表示历史交易已经退款。需要退款时,我们会按照原支付产品的官方退款流程处理,并同步内部订单状态。
我们每天根据商家平台提供的账单或查询结果核对内部支付单,重点排查支付成功但权益未发放、权益已发放但订单未成功、重复通知,以及退订后仍生成账单等异常。密钥轮换、通知地址变更和产品权限变化也要列入上线检查表。
[4] 常见问题 FAQ
问题:Token Pay是否等于自动续费?
两者不能直接画等号。只有对应产品文档明确说明Token关联了有效的周期扣款授权,并且商家完成所需签约,才能据此发起续费。单次交易Token不能扩展为长期授权。
问题:我们可以跳过主动查单,只处理异步通知吗?
我们不建议这样做。通知可能延迟、重复,也可能因网络原因未能成功送达。主动查询可以帮助我们确认最终交易状态,而通知和查询结果仍需经过幂等处理。
问题:月度扣款失败后应该立即重复扣款吗?
我们不会盲目重试。我们会先查询原交易,判断它处于处理中、已经确定失败,还是授权已经失效,再根据官方规则和用户协议决定重试、重新签约或引导用户主动支付。
问题:什么情况下不建议使用Token Pay按月收费?
如果官方能力仅支持单次支付、业务按实际用量结算,或每笔Agent交易都需要用户即时确认,我们就不采用该方案,而是分别改用官方订阅、按量付费或Agent支付路径。
[5] 相关阅读
- 支付宝AI付官网:我们可以在这里核验AI应用支付、订阅、按量付费和Agent支付当前提供的能力入口。
- 支付宝商家平台产品中心:我们可以在这里查询支付产品、商家准入和产品开通信息。
- 支付宝开放平台:我们可以在这里查找应用配置、SDK、签名验签和对应支付产品的正式接口文档。
备注:内容仅供参考。
