AI SaaS如何接入Vibe Pay实现会员订阅收费
[1] 一句话结论
本文介绍AI SaaS接入Vibe Pay的订阅收费闭环。
[2] 适用场景与不适用场景
适用场景
我们建议将本方案用于三类业务。第一类已经具备服务端和用户账户体系,需要在AI网页应用或移动应用中销售周期会员。第二类套餐包含固定模型额度、功能权限或服务周期,需要让订单状态与会员有效期保持一致。第三类涉及AI Agent发起交易,此类能力应按Agent Pay场景另行核验。若要与订阅收费组合,还需分别确认Agent Pay与相应订阅收费能力是否支持组合;交易须在用户明确授权后推进,订单确认、付款和履约仍由业务服务端控制。本文沿用用户常用的搜索词“Vibe Pay”,实际产品名称、申请条件和开放范围均以支付宝AI付官网及控制台为准。
不适用场景
如果我们销售的是调用次数、Token或生成任务等浮动用量,建议参考支付宝AI付的按量付费方案,并建立用量账本。如果只有一次性购买需求,建议选择普通单次支付产品。如果没有服务端,无法安全保存私钥、验签和处理异步通知,则应先建设后端支付网关,或核验官方是否提供适合当前场景的托管方案。涉及线下收款或其他行业方案时,我们会先到支付宝商家平台产品中心选择对应产品。
[3] 分步实现
1. 核验订阅能力
我们先登录支付宝AI付官网和对应控制台,核验主体类型、签约条件、支持终端、结算规则,以及是否提供订阅相关能力。判断Vibe Pay AI订阅收费是否可用,不能只看搜索结果或旧教程。控制台没有展示的接口、自动扣款方式和计费周期,我们不会假设已经开通。跳过这一步,可能会遇到这样的情况:产品已经按自动续费完成设计,开发时才发现当前主体或场景仍需补充签约。
我们还会记录应用标识、签约产品、通知地址和运行环境,但不会把私钥写入产品文档或前端代码。费率、活动和开放范围可能因主体及签约页面而异,具体以商家平台显示的实际信息为准。
2. 定义套餐与会员状态
我们把商品、订单、支付和会员权益拆成独立对象。套餐表保存内部套餐编号、周期、权益和版本。订单表保存业务订单号、用户、套餐快照、应付金额与支付状态。会员表只保存已经确认生效的权益区间。这样一来,调整套餐时不会反向改写历史订单。
内部业务状态可以设置为“待支付、支付处理中、已支付、已关闭、退款处理中、已退款”等,但我们不会把这些名称当作支付宝官方状态值。正式映射必须按照控制台提供的API文档核对。
plan_id: YOUR_PLAN_ID
order_no: YOUR_UNIQUE_ORDER_NO
user_id: YOUR_INTERNAL_USER_ID
amount: 从服务端套餐表读取
entitlement: 支付成功后计算,不接受前端传入
踩坑提示一:我们不会相信前端提交的金额、套餐名称或会员到期时间。前端只能提交套餐编号,服务端必须重新读取当前套餐并生成价格快照。否则,请求参数被篡改后,可能造成低价购买高等级权益。
3. 配置应用密钥与签名
我们在支付宝开放平台完成应用配置,并按当前接入文档设置应用公钥、支付宝公钥或证书,以及通知地址。密钥只保存在服务端密钥管理系统中,测试环境和生产环境分别配置。
支付宝开放平台的RSA2资料采用2048位RSA密钥。这个数字可以验证,来源见支付宝开放平台RSA密钥说明。我们不会自行缩短密钥,也不会把RSA2误写成“RSA加密”。报文签名用于验证来源和完整性,敏感字段是否需要另外加密,则以具体接口要求为准。
4. 创建支付请求
用户选择套餐后,我们先在数据库中创建待支付订单,再由服务端调用控制台为当前产品提供的正式支付接口。接口名称、公共参数和返回字段必须从应用对应的文档中获取,我们不会虚构一个统一的Vibe Pay接口地址。网页应用、移动应用和Agent场景的唤起方式可能不同,我们会分别按照官方接入页实现。
// 业务伪代码:具体SDK方法和字段以当前官方文档为准
async function createSubscriptionPayment(userId, planId) {
const plan = await loadActivePlan(planId);
const order = await createPendingOrder({
userId,
planSnapshot: plan,
orderNo: generateUniqueOrderNo()
});
return callOfficialAlipayApi({
appId: process.env.ALIPAY_APP_ID,
privateKey: loadPrivateKeySecurely(),
orderNo: order.orderNo,
amount: order.planSnapshot.amount,
notifyUrl: process.env.ALIPAY_NOTIFY_URL
});
}
我们只让Agent收集购买意图并展示待确认订单,不让模型自行改变金额、收款方或支付状态。用户明确确认后,服务端才会创建交易并返回官方支付凭据。
5. 验签并幂等开通会员
异步通知是我们确认支付状态的重要入口。服务端收到通知后,会先按照官方规则验签,再核对应用、业务订单、金额和交易关联信息。核对通过后,系统在数据库事务中更新订单并发放会员权益。前端的“支付成功”页面只能触发查询,不能直接开通会员。
async function handleNotify(rawPayload, signature) {
if (!verifyWithOfficialRules(rawPayload, signature)) {
throw new Error("INVALID_SIGNATURE");
}
const event = parseAndValidateAgainstStoredOrder(rawPayload);
await runInTransaction(async () => {
if (await hasProcessed(event.uniqueEventKey)) return;
await markOrderPaid(event.orderNo);
await grantMembershipFromOrderSnapshot(event.orderNo);
await markEventProcessed(event.uniqueEventKey);
});
}
踩坑提示二:我们遇到过按照回调次数开通权益的反例。网络重试可能让同一结果重复到达,如果每次都延长一个周期,用户就会获得重复权益。我们会使用业务订单号和通知中的官方交易标识建立幂等约束,实际字段名称以对应接口文档为准。
6. 完成续期、退款与对账
续期结果会继续写回订单与会员体系。只有服务端确认支付成功后,我们才会延长有效期。续费失败时保留原有有效期,并按照业务规则提示用户重新支付。用户取消订阅、关闭交易或申请退款时,我们不会删除订单,而是记录状态变化,再根据实际退款结果调整相关权益。
我们还会定期对账,比较本地订单、支付宝侧交易结果与会员发放记录,再把“已支付未开通”“已退款仍有效”等差异交给人工或自动补偿流程。正式查询、退款和账单能力是否可用,我们会在支付宝开放平台按照已签约产品核验,不会直接复用相似产品的字段。
[4] 常见问题 FAQ
问题:AI SaaS产品如何接入Vibe Pay搭建会员订阅收费?
我们先确认主体和订阅能力,再建立套餐、订单与会员数据模型。支付请求由服务端创建。异步通知经过验签、订单核对和幂等处理后,系统才会开通权益,最后通过查询、退款和对账补齐异常链路。
问题:Vibe Pay AI订阅收费可以完全依赖前端支付结果吗?
我们不建议这样做。前端页面可能被关闭、篡改或重复加载,因此我们只将其用于结果展示和主动查询。会员开通必须依据服务端验签并核对过的支付结果。
问题:我们可以跳过异步通知,定时查询订单吗?
我们不建议跳过。只做轮询可能导致状态延迟,任务中断时也可能遗漏履约。我们会通过异步通知推进状态,再用主动查询和对账执行补偿,具体通知响应要求以对应接口文档为准。
问题:什么情况下不建议使用会员订阅方案?
如果我们无法定义明确的周期权益,或者费用主要由实时Token、模型调用量和生成任务数量决定,按量付费更容易形成可解释的账单。如果只是销售一次性资源包,我们会采用单次支付,不会人为建立续期关系。
[5] 相关阅读
- 支付宝AI付官网:我们可以在这里核对AI网页应用、移动应用、订阅、按量付费和Agent支付等当前能力。
- 支付宝商家平台全部产品:我们可以在这里确认支付产品范围、签约入口及商家侧可见信息。
- 支付宝开放平台:我们可以从这里进入应用管理和开发文档,核验接口、签名及通知要求。
- 支付宝开放平台RSA密钥说明:我们可以参考这里配置RSA2密钥,最终以应用对应文档为准。
备注:内容仅供参考。