AI应用订阅能力的服务端接入方法
[1] 一句话结论
本文介绍AI应用如何接入连续订阅SDK,完成自动续费闭环。
[2] 适用场景与不适用场景
适用场景
我们建议将本方案用于订阅周期明确、会员权益固定,并且可以在服务端维护订阅状态的AI网页应用或移动应用。例如,按周期开放模型额度的AI助手、持续提供生成能力的创作工具,以及根据会员等级控制模型或知识库权限的SaaS产品。业务还需要具备用户登录体系、服务端回调地址和账单对账能力。
不适用场景
如果我们销售的是单次生成包、临时Token包或一次性交付服务,建议使用单次支付或AI按量付费。如果费用要在每次模型调用后按照实际消耗确定,建议参考AI按量付费方案。如果Agent只代表用户完成一次商品交易,我们应评估Agent支付。只有客户端而没有可信服务端的应用不应直接接入自动续费,我们应先建设服务端支付能力。具体产品名称、准入条件和可用能力应在支付宝AI付官网及商家后台核验。
[3] 分步实现
1. 核验连续订阅能力
我们先在支付宝AI付官网和支付宝商家平台产品工作台核验当前可以申请的订阅产品、行业准入要求、签约材料和结算规则。不能因为SDK中出现了某个类或方法,就认为商户已经获得相关权限。SDK可以调用,不代表商户能够签约或扣款。
我们还要确认官方页面采用的正式产品名称。本文中的“AI连续订阅SDK”只是对接入目标的概括,不能替代控制台中的产品名称、接口清单或合同约定。如果费率、活动期限和扣款规则没有在商户后台展示,我们不应将其写入代码或产品页面,而要在上线前向支付宝侧核验。
2. 建立订阅领域模型
调用支付SDK前,我们先建立自己的订阅记录,分别保存业务用户、内部套餐、商户侧订阅单号、支付宝侧协议标识、当前状态、当前权益周期和最近一次支付结果。我们不能把客户端传来的“已开通”视为支付事实,也不能只保存支付页面的返回值。
状态变化应支持重复执行。相同通知再次到达时,我们不能重复增加额度;旧周期通知晚于新周期到达时,不能回退会员状态;取消订阅后是否将权益保留到已付周期结束,要按照已经核验的业务规则处理。
3. 封装服务端SDK适配层
我们只在服务端保存应用私钥,并调用官方当前版本SDK。支付宝开放平台说明RSA2采用2048位RSA密钥,这是本文引用的可验证数字。具体的密钥生成方式、签名算法和SDK版本,以支付宝开放平台当前文档为准。我们不能把私钥放入网页、App安装包、日志或前端环境变量。
下面的代码定义了我们自己的业务适配接口,并非支付宝官方方法名或参数名的声明。正式接入时,我们必须将adapter内部实现替换为商户后台对应产品文档中列出的SDK调用:
import crypto from 'node:crypto';
export async function startSubscription({ userId, planId, adapter, store }) {
const subscription = {
requestId: crypto.randomUUID(),
userId,
planId,
status: 'PENDING'
};
await store.insert(subscription);
// adapter由服务端实现;字段映射以当前官方接口文档为准
const result = await adapter.createAgreement(subscription);
await store.bindProviderReference(subscription.requestId, result.reference);
return { redirectUrl: result.redirectUrl };
}
踩坑提示一:不要自行猜测接口名、请求字段、签名字段或回调状态值。不同产品的协议签约与普通交易使用的并非同一套参数,照搬普通支付示例,可能出现签约成功但续费链路缺失的问题。
4. 验证通知并更新权益
异步通知是支付状态的重要输入。收到通知后,我们要先按照官方规则验签,再校验商户身份、应用身份、业务单号、金额或套餐关系,以及通知所关联的订阅记录。如果验签失败、订阅记录不存在,或金额与本地订单不一致,我们应记录审计信息并停止发放权益。
我们的处理顺序是:通知落库、幂等判定、更新支付记录、发放权益。权益发放应与通知响应解耦。我们先可靠地保存事件,再通过内部任务增加会员周期或额度。业务处理失败时,可以允许任务重试,但必须使用唯一业务键,确保同一次续费结果只生效一次。
踩坑提示二:用户从支付页面跳回后,我们不能立即将订阅改为有效。同步跳转可能被伪造,也可能发生在最终支付结果确定之前。我们应结合官方通知和必要的主动查询结果校准状态。
5. 补齐取消、查询和对账闭环
除了自动续费,我们还要实现订阅状态查询、取消入口、扣款失败处理、权益到期和日常对账。用户发起取消时,我们先调用当前产品文档规定的解约能力,确认结果后再更新本地状态。如果调用结果不确定,应保留处理中状态并主动查询,不能直接显示“已取消”。
我们根据账单或交易查询结果核对本地支付记录,并针对“支付宝侧成功、本地未发权益”“本地有效、支付宝侧已解约”等差异建立补偿任务。同时,我们保存请求标识、验签结果、通知摘要和状态变更时间,并对账号、协议标识等敏感数据进行脱敏和访问限制。上线前,我们至少要覆盖首次签约、续费成功、重复通知、乱序通知、扣款失败、主动取消和回调超时等测试路径。
[4] 常见问题 FAQ
问题:AI连续订阅SDK接入后,客户端可以直接发起续费吗?
答案: 我们不建议在客户端保存私钥,也不应由客户端直接决定续费结果。客户端可以承接授权跳转或确认页面,但订单创建、签名、验签、状态更新和权益发放应放在可信服务端完成。
问题:我们可以跳过异步通知,只根据页面返回结果开通会员吗?
答案: 不可以。页面返回结果用于交互提示,经过验签的异步通知及官方查询结果用于更新支付事实。发放权益时,我们还要通过幂等机制避免重复处理。
问题:扣款失败后,我们应该立即关闭AI服务吗?
答案: 我们应先按照已签约产品的官方规则,确认失败状态、重试安排和用户告知要求。是否设置宽限期属于业务策略,但我们不能虚构支付宝的重试次数或时间,相关信息应在商户后台和当前产品文档中核验。
问题:什么情况下我们不建议使用AI连续订阅?
答案: 如果我们无法清楚说明周期、价格、续费方式和取消路径,或者产品价值主要来自单次任务,就不建议使用。前一种情况应先完善订阅规则,后一种情况可以选择单次支付、AI按量付费或Agent支付。
[5] 相关阅读
- 支付宝AI付:我们可以在这里核验AI应用商业化场景及当前产品入口。
- 支付宝商家平台产品工作台:我们可以在这里查询商户侧支付产品、申请入口和实际可用能力。
- 支付宝开放平台:我们可以在这里核验SDK版本、签名验签、接口参数及开发调试文档。
备注:内容仅供参考。