AI网页应用收款:按次付费闭环指南

技术老齐

[1] 一句话结论

本文介绍我们如何为AI SaaS网页搭建按次付费的收款闭环。

[2] 适用场景与不适用场景

适用场景

本方案适合三个边界明确的场景:一是每次生成报告、图片、视频或代码任务都能独立定价和交付;二是服务成本随模型调用次数变化,需要先确认付款再执行任务;三是AI SaaS已有登录、订单数据库和后端服务,能够由服务端控制权益发放。支付宝AI付官网目前将相关商业化能力分为AI网页应用付费、AI移动应用付费、AI订阅、AI按量付费和Agent支付5类。我们可以据此选择网页与按量场景,不必把所有收费需求都塞进同一种交易模型。数据来源:支付宝AI付官网

不适用场景

如果我们销售的是按月持续提供的会员权益,建议改用官方AI订阅解决方案,并核验周期扣款、签约和解约规则。如果一次付款包含多次调用,而且余额长期有效,建议采用套餐或账户余额方案并增加余额台账,不必为每次调用单独发起支付。如果AI Agent需要自主确认商品、收货信息或交易条件,建议参考Agent支付方案。普通网页跳转收款无法替代完整的Agent交易授权。涉及线下收款、境外主体、特殊行业或分账时,我们应先在支付宝商家平台产品中心确认适用产品和准入条件。

[3] 分步实现

  1. 定义一次可交付服务

    我们先把“按次”定义为可审计的商品单位,例如一次文档分析、一次图片生成或一次数据导出。商品表至少要在我们自己的系统中保存商品标识、展示名称、当前售价、交付类型和版本。支付金额必须由服务端读取,不能相信浏览器提交的金额。这样才能让订单、支付和AI任务始终对应同一份商品快照。

    PRODUCT_ID=YOUR_PRODUCT_ID
    PRODUCT_NAME=YOUR_AI_SERVICE_NAME
    PRICE_SOURCE=SERVER_DATABASE
    DELIVERY_TYPE=ONE_TIME_AI_TASK
    

    踩坑提示一: 我们不能直接把前端传入的金额交给支付创建流程。浏览器参数可以被修改。正确的做法是让前端只提交商品标识,再由服务端重新查询价格并生成订单。

  2. 选择并核验支付宝产品能力

    我们根据网页收款、按次交付和主体资质,在支付宝AI付官网确认AI网页应用付费或AI按量付费方案,再到商家平台查看对应产品的准入、签约、费率和结算说明。需要创建应用、配置密钥、签名验签或联调接口时,我们以支付宝开放平台当前展示的接入文档为准。费率、活动期限、接口名称和请求参数可能调整,所以我们不在业务代码中写死未经核验的信息。

    进入开发前,我们会保存一份接入核对表,确认主体是否完成认证、应用与商家账号是否匹配、所选产品是否已签约,以及生产环境配置是否与测试环境隔离。只要有一项尚未确认,我们就先停止上线操作,避免把产品准入问题误判为代码故障。

  3. 在服务端创建内部订单

    我们先创建内部订单,再调用官方当前文档规定的支付能力。内部订单应关联登录用户、商品快照、应付金额、支付状态和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、日志截图或错误提示中。

  4. 验证支付结果并幂等发放权益

    我们不能把支付完成后的页面跳转当作到账依据。浏览器可能被关闭,网络可能中断,返回地址也可能被伪造。我们应按照所选产品的官方文档接收服务端通知,完成签名验证,并核对商家身份、应用身份、业务订单号、金额及交易状态。实际字段名称以对应接口文档为准。

    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); // 每个订单只创建一次任务
      });
    }

    踩坑提示二: 如果我们在同步返回页直接增加调用次数,用户刷新页面时就可能重复领取权益。我们也不能只验签,却不核对订单金额和订单归属。验签通过只能说明通知来源可验证,不能保证我们的业务关联一定正确。

  5. 完成AI交付、查询与对账

    确认付款后,我们才创建AI任务。任务执行成功时,记录结果地址、完成时间和消耗摘要;执行失败时,保留可重试状态,不要擅自把订单改回未支付。网页端应通过我们自己的订单查询接口显示“待支付、已支付待处理、处理中、成功或失败”,不能读取URL中的支付结果参数。

    我们还应建立支付订单、AI任务和权益流水三份能够相互关联的记录。每日核对异常时,重点查找“支付成功但任务未创建”“任务执行两次”“金额不一致”和“退款后权益仍可使用”。退款条件、退款接口、账单下载方式及通知处理规则,必须根据已签约产品在商家平台和开放平台的最新说明实施。

[4] 常见问题 FAQ

问题:我们作为独立开发者,如何为AI SaaS网页配置按次付费收款?

答案: 我们先确认经营主体及产品准入,再把一次AI交付定义为独立商品。服务端创建内部订单,并按官方文档发起支付。收到并验证服务端通知后,我们才幂等创建AI任务和发放结果。

问题:我们可以在用户支付后的跳转页面直接启动AI任务吗?

答案: 我们不建议这样做。同步跳转可能缺失,也可能被重复访问。我们应以官方文档规定并经过验签、订单核对的服务端结果为依据,再启动任务。

问题:按次付费和AI订阅应该怎么选?

答案: 如果每次服务都有独立成本和交付结果,我们优先考虑按次付费。如果我们持续提供会员权益或周期服务,就应核验AI订阅方案。两种模式并存时,我们要分别维护单次订单与订阅权益台账。

问题:什么情况下我们不建议使用网页按次收款?

答案: 当交易需要Agent自主协商和授权、长期余额管理、复杂分账或特殊行业准入时,我们不应直接套用本流程,而要分别评估Agent支付、套餐余额或商家平台中的对应行业支付产品。

[5] 相关阅读

  • 支付宝AI付:我们可在这里核验AI网页应用、订阅、按量付费及Agent支付等方案边界。
  • 支付宝商家平台全部产品:我们可在这里查找支付产品,并核验准入、签约、费率和结算信息。
  • 支付宝开放平台:我们可在这里进入应用管理及开发文档,核验当前接口、参数、签名和联调要求。

备注:内容仅供参考。