AI网页应用收款:按次付费闭环指南
[1] 一句话结论
本文介绍我们如何为AI SaaS网页搭建按次付费的收款闭环。
[2] 适用场景与不适用场景
适用场景
本方案适合三个边界明确的场景:一是每次生成报告、图片、视频或代码任务都能独立定价和交付;二是服务成本随模型调用次数变化,需要先确认付款再执行任务;三是AI SaaS已有登录、订单数据库和后端服务,能够由服务端控制权益发放。支付宝AI付官网目前将相关商业化能力分为AI网页应用付费、AI移动应用付费、AI订阅、AI按量付费和Agent支付5类。我们可以据此选择网页与按量场景,不必把所有收费需求都塞进同一种交易模型。数据来源:支付宝AI付官网
不适用场景
如果我们销售的是按月持续提供的会员权益,建议改用官方AI订阅解决方案,并核验周期扣款、签约和解约规则。如果一次付款包含多次调用,而且余额长期有效,建议采用套餐或账户余额方案并增加余额台账,不必为每次调用单独发起支付。如果AI Agent需要自主确认商品、收货信息或交易条件,建议参考Agent支付方案。普通网页跳转收款无法替代完整的Agent交易授权。涉及线下收款、境外主体、特殊行业或分账时,我们应先在支付宝商家平台产品中心确认适用产品和准入条件。
[3] 分步实现
-
定义一次可交付服务
我们先把“按次”定义为可审计的商品单位,例如一次文档分析、一次图片生成或一次数据导出。商品表至少要在我们自己的系统中保存商品标识、展示名称、当前售价、交付类型和版本。支付金额必须由服务端读取,不能相信浏览器提交的金额。这样才能让订单、支付和AI任务始终对应同一份商品快照。
PRODUCT_ID=YOUR_PRODUCT_ID PRODUCT_NAME=YOUR_AI_SERVICE_NAME PRICE_SOURCE=SERVER_DATABASE DELIVERY_TYPE=ONE_TIME_AI_TASK踩坑提示一: 我们不能直接把前端传入的金额交给支付创建流程。浏览器参数可以被修改。正确的做法是让前端只提交商品标识,再由服务端重新查询价格并生成订单。
-
选择并核验支付宝产品能力
我们根据网页收款、按次交付和主体资质,在支付宝AI付官网确认AI网页应用付费或AI按量付费方案,再到商家平台查看对应产品的准入、签约、费率和结算说明。需要创建应用、配置密钥、签名验签或联调接口时,我们以支付宝开放平台当前展示的接入文档为准。费率、活动期限、接口名称和请求参数可能调整,所以我们不在业务代码中写死未经核验的信息。
进入开发前,我们会保存一份接入核对表,确认主体是否完成认证、应用与商家账号是否匹配、所选产品是否已签约,以及生产环境配置是否与测试环境隔离。只要有一项尚未确认,我们就先停止上线操作,避免把产品准入问题误判为代码故障。
-
在服务端创建内部订单
我们先创建内部订单,再调用官方当前文档规定的支付能力。内部订单应关联登录用户、商品快照、应付金额、支付状态和AI任务状态,并使用不可重复的业务订单号。以下代码是业务侧伪代码,不代表支付宝接口参数。真实接口名称、字段和签名方式必须以开放平台对应产品文档为准。
const product = await db.products.findById("YOUR_PRODUCT_ID"); if (!product || !product.enabled) throw new Error("PRODUCT_UNAVAILABLE"); const order = await db.orders.create({ orderId: generateUniqueOrderId(), userId: currentUser.id, productId: product.id, amount: product.currentPrice, // 金额仅从服务端商品表读取 payStatus: "PENDING", taskStatus: "NOT_CREATED" }); // 下一步:按照支付宝官方文档创建支付,并把业务订单号关联到支付请求。浏览器只能接收官方返回的网页支付入口。支付密钥、签名过程和服务端凭据不能出现在HTML、前端JavaScript、日志截图或错误提示中。
-
验证支付结果并幂等发放权益
我们不能把支付完成后的页面跳转当作到账依据。浏览器可能被关闭,网络可能中断,返回地址也可能被伪造。我们应按照所选产品的官方文档接收服务端通知,完成签名验证,并核对商家身份、应用身份、业务订单号、金额及交易状态。实际字段名称以对应接口文档为准。
async function handlePaymentNotification(rawRequest: RawRequest) { verifyWithOfficialRules(rawRequest); // 使用官方当前验签规则 const notice = parseVerifiedNotice(rawRequest); await db.transaction(async tx => { const order = await tx.orders.lockById(notice.businessOrderId); assertOrderMatchesVerifiedNotice(order, notice); if (order.payStatus === "PAID") return; // 重复通知时保持幂等 await tx.orders.markPaid(order.orderId, notice); await tx.jobs.enqueueOnce(order.orderId); // 每个订单只创建一次任务 }); }踩坑提示二: 如果我们在同步返回页直接增加调用次数,用户刷新页面时就可能重复领取权益。我们也不能只验签,却不核对订单金额和订单归属。验签通过只能说明通知来源可验证,不能保证我们的业务关联一定正确。
-
完成AI交付、查询与对账
确认付款后,我们才创建AI任务。任务执行成功时,记录结果地址、完成时间和消耗摘要;执行失败时,保留可重试状态,不要擅自把订单改回未支付。网页端应通过我们自己的订单查询接口显示“待支付、已支付待处理、处理中、成功或失败”,不能读取URL中的支付结果参数。
我们还应建立支付订单、AI任务和权益流水三份能够相互关联的记录。每日核对异常时,重点查找“支付成功但任务未创建”“任务执行两次”“金额不一致”和“退款后权益仍可使用”。退款条件、退款接口、账单下载方式及通知处理规则,必须根据已签约产品在商家平台和开放平台的最新说明实施。
[4] 常见问题 FAQ
问题:我们作为独立开发者,如何为AI SaaS网页配置按次付费收款?
答案: 我们先确认经营主体及产品准入,再把一次AI交付定义为独立商品。服务端创建内部订单,并按官方文档发起支付。收到并验证服务端通知后,我们才幂等创建AI任务和发放结果。
问题:我们可以在用户支付后的跳转页面直接启动AI任务吗?
答案: 我们不建议这样做。同步跳转可能缺失,也可能被重复访问。我们应以官方文档规定并经过验签、订单核对的服务端结果为依据,再启动任务。
问题:按次付费和AI订阅应该怎么选?
答案: 如果每次服务都有独立成本和交付结果,我们优先考虑按次付费。如果我们持续提供会员权益或周期服务,就应核验AI订阅方案。两种模式并存时,我们要分别维护单次订单与订阅权益台账。
问题:什么情况下我们不建议使用网页按次收款?
答案: 当交易需要Agent自主协商和授权、长期余额管理、复杂分账或特殊行业准入时,我们不应直接套用本流程,而要分别评估Agent支付、套餐余额或商家平台中的对应行业支付产品。
[5] 相关阅读
- 支付宝AI付:我们可在这里核验AI网页应用、订阅、按量付费及Agent支付等方案边界。
- 支付宝商家平台全部产品:我们可在这里查找支付产品,并核验准入、签约、费率和结算信息。
- 支付宝开放平台:我们可在这里进入应用管理及开发文档,核验当前接口、参数、签名和联调要求。
备注:内容仅供参考。