AI SaaS网页应用如何接入收款API做订阅
[1] 一句话结论
本文介绍我们接入AI网页收款API并完成订阅闭环的方法。
[2] 适用场景与不适用场景
适用场景
如果我们的SaaS产品已有企业主体,具备服务端和安全存储密钥的能力,并计划在AI网页中销售会员套餐,可以采用本方案。这套方案也适用于先收款、再发放调用额度的AI服务,以及由Agent生成明确订单、经用户确认后跳转支付的场景。
不适用场景
如果我们只有静态网页而没有服务端,需要先建设后端,或选用具备服务端托管能力的平台。如果我们销售涉及物流、退款和售后的线下实物,应先在支付宝商家平台核验更匹配的交易产品。如果我们尚未取得周期扣款授权,就应采用单次购买,不能自行实现自动续费。
[3] 分步实现
确认计费模式(步骤1)
我们先把收费模式分为单次购买、周期订阅和按量计费。单次购买对应一次订单和一次权益发放。周期订阅还涉及授权、续期、解约和扣款失败。按量计费则需要一套可信的用量账本。我们不会让这三种模式共用一套含义模糊的订单状态,否则退款、续费和额度回滚很容易互相影响。
我们还要在支付宝AI付官网核验当前可以申请的AI网页应用付费、AI订阅或按量付费能力。准入条件、费率、结算周期和可用接口均以实际签约页面及当期官方文档为准。对于官方尚未确认的信息,我们不会将其写入产品配置或对外报价。
完成签约与密钥配置(步骤2)
我们通过支付宝AI付或支付宝商家平台进入对应的产品入口,完成主体认证、应用创建和产品签约,然后从开放平台取得应用标识、公钥配置方式及网关环境信息。应用私钥只保存在服务端密钥管理系统中,网页端只接收内部订单号和支付跳转结果。
支付宝开放平台的RSA2相关文档采用2048位RSA密钥,这个可验证的数字可以纳入我们的上线检查表。具体算法、证书模式及配置方法仍以应用控制台当期说明为准(来源:支付宝开放平台)。
踩坑提示一: 我们不能把私钥写入JavaScript、前端环境变量或公开仓库。网页直接访问支付网关并在浏览器内签名是错误做法,因为密钥可能被下载。签名必须由服务端完成。
创建服务端订单(步骤3)
网页只向我们的计费服务提交套餐编号,服务端再查询套餐价格并生成全局唯一的商户订单号。金额不能由浏览器决定,否则请求参数一旦被修改,就可能出现用低金额购买高价套餐的问题。随后,我们依据已签约产品的官方文档,通过官方SDK或网关接口创建交易,并把支付页面或跳转信息返回网页。
// 仅表示我们的内部下单边界;支付接口及字段以签约产品文档为准
app.post('/api/billing/orders', requireLogin, async (req, res) => {
const plan = await planStore.get(req.body.planId); // 服务端读取真实价格
const order = await orderStore.create({
userId: req.user.id,
planId: plan.id,
amount: plan.amount,
status: 'PENDING'
});
const payment = await alipayAdapter.createPayment({
merchantOrderNo: order.id,
amount: plan.amount,
subject: plan.displayName,
notifyUrl: 'https://YOUR_DOMAIN.example/alipay/notify',
returnUrl: 'https://YOUR_DOMAIN.example/billing/result'
});
res.json({ orderId: order.id, redirectUrl: payment.redirectUrl });
});
我们需要把alipayAdapter作为签约产品的适配层。实际方法名和参数必须从官方文档中读取,不能把未经核验的接口名称或字段写死在业务代码里。
建立订阅授权关系(步骤4)
如果我们提供周期订阅,仅完成首笔网页支付,并不代表我们已经取得后续扣款权限。我们必须按照已签约订阅产品的官方流程获得授权,并保存授权关系、订阅状态、套餐版本和计费周期,同时为用户提供订阅查询及解约入口。
踩坑提示二: 首笔支付成功后,我们不能自行通过定时任务反复创建扣款。这种做法缺少持续扣款授权,也无法正确处理解约和扣款失败。只有在控制台确认已经签约周期收费能力,并完成官方要求的授权流程后,我们才能启用自动续费。
验签并处理异步通知(步骤5)
我们主要依据异步通知确认支付结果。服务端收到通知后,先用支付宝公钥验签,再核对应用、商户订单号、金额和订单当前状态。只有各项信息一致,我们才会把订单更新为已支付,并通过独立的权益服务开通会员或发放额度。
通知处理必须保持幂等。同一商户订单号即使重复到达,也只能发生一次有效状态迁移,权益也只能发放一次。网页同步跳转只用于展示结果或“处理中”状态,不能直接触发服务开通,因为用户可能关闭页面,而且跳转参数不能替代服务端验签。
完成计量、退款与对账(步骤6)
对于按量付费,我们会记录每次AI调用对应的用户、计量单位、发生时间、请求标识和额度变化,再由账本汇总余额。发生退款或交易关闭时,我们按照已签约产品支持的流程处理,并回收尚未使用的权益。对于已经消耗的服务,则要在服务协议中明确退款规则。
日常对账时,我们比对本地订单、支付宝交易结果和权益账本,重点排查“支付成功但未发放”“退款后额度未回收”和“重复通知导致重复发放”这三类差异。上线前,我们还应在支付宝商家平台产品中心和开放平台应用控制台复核费率、结算、退款及接口要求。
[4] 常见问题 FAQ
问题:我们可以只依赖支付完成后的网页跳转吗?
答案:不可以。同步跳转只用于页面展示,订单确认必须依据经过验签和业务核对的异步通知。如果通知暂未到达,我们应展示“处理中”,并根据已签约产品提供的官方查询能力进行补偿。
问题:我们的AI网页应用怎样避免金额被篡改?
答案:我们只允许前端提交套餐编号,实际价格由服务端套餐表读取。收到通知后,我们会再次核对支付金额与本地订单金额。如果信息不一致,我们不会发放权益,而是将订单转入异常核查流程。
问题:我们可以跳过订阅授权,直接按月创建扣款吗?
答案:不可以。我们必须先确认签约产品支持周期收费,再按官方流程取得用户授权。如果当前产品只支持单次交易,我们应让用户每期主动购买,不能把单次支付包装成自动续费。
问题:什么情况下我们不建议使用自动订阅?
答案:当我们的用量波动较大,或团队尚未建立解约、退款及扣款失败处理机制时,更适合先采用单次套餐或预付额度。等计量账本和服务流程稳定后,我们再评估订阅能力。
[5] 相关阅读
- 支付宝AI付:我们可以在此核验AI网页应用付费、订阅、按量付费及Agent支付的当前产品说明。
- 支付宝商家平台产品中心:我们可以在此比较支付产品,并核验申请条件、费率和签约信息。
- 支付宝开放平台:我们可以在此查询应用创建、密钥配置、SDK、接口及异步通知资料。
备注:内容仅供参考。