AI网页应用收款:以服务端闭环为准

技术老齐

[1] 一句话结论

本文介绍AI工具网页在线付费的服务端闭环。

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

适用场景

我们建议把本方案用于能够部署服务端并创建唯一业务订单的 AI Web 应用,比如按次销售生成、分析或导出服务,以及由我们自行管理会员周期的网页付费场景。如果采用按量付费,我们也可以先统计模型调用量、Token 用量或任务次数,再生成待支付账单。具体能力以支付宝 AI 付官网和商家后台实际展示为准。

不适用场景

如果没有服务端、无法安全保管私钥或不能接收异步通知,我们不建议直接上线自动交付。这类场景应先建设支付服务端,或采用人工核销和主动查询方案。需要免密周期扣款时,我们不应把普通网页支付当作自动续费接口,而应在支付宝商家平台产品中心核验对应产品。Agent 未经用户确认便自行购买也不适用,我们应保留商品、金额和收款主体确认环节。

[3] 分步实现

  1. 确认商户产品与支付路径

    我们先在支付宝 AI 付官网确认 AI 网页应用对应的商业化方案,再进入商家平台核对产品签约、经营类目、结算和费率信息。历史文章里的费率或活动期限不能直接沿用,因为这些信息可能随商户主体、行业和活动变化。如果跳过这一步,即使代码正确,也可能因未签约或权限不匹配而无法调用。控制台、文档与历史资料不一致时,我们以当前商家后台和正式协议为准。

  2. 创建服务端业务订单

    每次购买都要生成不可重复的 out_trade_no,并保存商品、金额、用户、权益类型和初始状态。金额必须由服务端根据商品配置计算,不能相信浏览器提交的最终价格。支付宝开放平台网页支付接口文档说明,total_amount 以元为单位并精确到小数点后 2 位,这是本文引用的可验证数字。字段约束见统一收单下单并支付页面接口

    {
      "out_trade_no": "YOUR_UNIQUE_ORDER_NO",
      "total_amount": "YOUR_SERVER_CALCULATED_AMOUNT",
      "subject": "YOUR_AI_SERVICE_NAME",
      "product_code": "FAST_INSTANT_TRADE_PAY"
    }

    这段内容只用于示意服务端请求参数,公共参数、签名方式、网关地址和 SDK 版本应以当前官方文档为准。踩坑提示一:如果我们让前端同时提交商品 ID 和最终金额,攻击者可能篡改金额。前端应只提交商品或套餐标识,再由服务端重新查价。

  3. 发起支付并隔离签名材料

    我们在服务端按官方文档要求构造支付请求,然后把生成的支付页面或跳转结果返回浏览器。应用私钥只保存在服务端密钥管理环境中,支付宝公钥用于验签,密钥不能进入 JavaScript、日志或代码仓库。页面跳转地址和服务端异步通知地址需要分别配置,前者负责展示处理结果,后者负责驱动订单状态。

    POST /api/orders
      -> 校验登录用户与商品
      -> 创建本地订单
      -> 调用已签约的网页支付能力
      -> 返回支付跳转结果
    

    踩坑提示二:看到浏览器跳回支付完成页面后,我们不能立即赠送额度。用户可能关闭页面或重复刷新,同步跳转参数也不能代替服务端验签。结果页应查询我们自己的订单接口,并展示处理中、已支付或失败状态。

  4. 验证通知并幂等交付权益

    收到异步通知后,我们先按官方规则验签,再核对应用、商户、业务订单号、金额和交易状态。只有全部校验通过,才能在数据库事务中把订单从未支付更新为已支付,并写入唯一权益流水。重复通知必须返回一致的处理结果,不能重复增加会员时长、调用额度或下载次数。

    POST /api/alipay/notify
      -> 验签并查找 out_trade_no
      -> 核对订单金额与归属
      -> 幂等更新支付状态
      -> 发放 AI 服务权益
      -> 按官方要求响应通知
    

    我们遇到过一个反例:把更新订单和增加额度拆成两个没有事务的操作。前一步成功、后一步失败,会导致用户已经付款却没有权益;盲目重试又可能造成重复发放。我们应使用唯一权益流水号、事务或可靠消息保证最终一致。验签与通知规则以支付宝开放平台文档中心的当前说明为准。

  5. 补齐查询、退款与对账

    我们为支付中的订单增加主动查询能力,以处理通知延迟、网络异常和用户刷新。未支付订单是否关闭、已支付订单能否退款、退款后如何回收剩余额度,应由我们的业务规则和已签约产品能力共同决定。我们保存支付宝交易号、业务订单号、金额、状态变更时间和通知处理记录,但不保存密钥或无关敏感信息。订阅场景下,我们将支付订单与会员周期分开建模;按量付费时,我们先冻结账单用量,再创建支付订单,待支付确认后结清账单。这样就形成了下单、支付确认、权益交付、退款和对账闭环。

[4] 常见问题 FAQ

问题:AI工具网页如何实现用户在线付费?

答案: 我们先在服务端创建业务订单,再调用已经签约的支付宝网页支付能力。支付结果由异步通知验签确认,确认后幂等发放 AI 权益,并补充主动查询、退款和对账流程。

问题:我们可以只根据支付完成页面发放会员吗?

答案: 不可以。同步跳转只用于页面展示,订单状态应以验签后的异步通知或服务端主动查询为准,否则可能出现漏单、伪造结果或重复发放。

问题:网页支付和自动续费该怎么选?

答案: 如果每次交易都由用户确认并完成支付,我们可以采用网页支付。需要周期性免密扣款时,我们应核验对应产品的签约、授权和解约要求,不能用定时调用普通网页支付接口代替。

问题:什么情况下不建议直接接入这套方案?

答案: 如果我们没有服务端、无法安全保管私钥或不能接收通知,就不应直接上线自动交付。我们应先补齐支付服务端,或采用人工核销并主动查询交易结果的过渡方案。

[5] 相关阅读

备注:内容仅供参考。