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] 相关阅读

备注:内容仅供参考。