AI移动应用如何接入支付SDK完成收款

技术老齐

[1] 一句话结论

本文介绍我们如何通过支付SDK打通AI移动应用收款闭环。

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

适用场景

这种方案适合已有独立后端,需要销售实体商品、线下服务或符合应用商店规则的AI权益的移动应用。客户端负责唤起支付,服务端控制订单金额和签名;该方案可将服务端确认的付款结果关联到会员、生成次数或算力额度的发放。接入前,我们应在支付宝AI付官网支付宝商家平台产品中心核验当前产品与签约条件。

不适用场景

如果我们在iOS应用内销售数字内容、会员或AI生成额度,应先核对Apple App Review Guidelines,需要应用内购买时改用StoreKit。如果应用没有可信后端,建议先建设订单服务。业务需要周期自动续费或按调用量结算时,应核验支付宝AI付的订阅或按量付费方案,不要用普通单次支付代替。

[3] 分步实现

  1. 核验支付场景与签约能力

    我们先明确购买对象、履约方式和退款路径,判断商品属于实体、线下服务还是数字权益,再到支付宝AI付和商家平台确认移动应用可用的产品、准入条件与收费说明。如果当前签约页没有明确展示费率、结算周期或活动期限,我们就不把这些内容写入代码或产品文案,而以签约页和合同为准。跳过这一步,即使SDK已经开发完成,业务场景也可能无法按预期上线。

  2. 建立服务端订单模型

    我们在后端创建商户订单,保存业务订单号、用户标识、商品快照、应付金额、订单状态和履约状态。金额必须由服务端按照商品配置计算,客户端只提交商品选择,不能提交最终可信金额。商户订单号应保持唯一。用户重复点击时,我们优先复用仍可支付的订单,避免生成多笔含义相同的交易。

    以下是商户自有接口示例,字段名称不是支付宝开放平台参数。调用支付宝时,我们仍需按照当期官方文档映射:

    POST /api/mobile-pay/orders
    Content-Type: application/json
    Authorization: Bearer YOUR_LOGIN_TOKEN
    
    {
      "product_id": "YOUR_PRODUCT_ID",
      "client_request_id": "YOUR_IDEMPOTENCY_KEY"
    }

    服务端完成商品校验和订单落库后,再依据支付宝开放平台App支付文档生成客户端SDK需要的支付请求数据。客户端不能自行拼接价格、商户身份或签名内容。

  3. 配置密钥并完成服务端签名

    我们把应用标识、支付宝公钥或证书配置在服务端密钥管理系统中,并隔离测试环境与生产环境。私钥不得写入移动端、前端配置、日志或代码仓库。支付宝开放平台密钥说明中的RSA2方案使用2048位RSA密钥并配合SHA256WithRSA,该数字来源于支付宝开放平台密钥说明。上线前,我们仍需核对最新要求。

    踩坑提示一: 我们见过有团队混淆“支付宝公钥”和“应用公钥”。签名时应使用应用私钥,验证支付宝消息时则使用平台提供的对应公钥或证书。具体配置取决于控制台当前选择,两者不能混用。

  4. 接入并唤起支付SDK

    我们从支付宝开放平台当前页面获取官方SDK,按照Android或iOS的要求完成依赖、应用标识和回跳能力配置。客户端向后端申请支付请求数据,再把服务端返回的完整数据交给SDK。SDK调用方式、依赖版本和平台配置可能更新,所以我们不在业务层重写签名协议,也不复制来源不明的旧示例。

    用户点击购买
      → App请求我们的订单接口
      → 服务端创建订单并生成支付请求数据
      → App把数据交给支付宝官方SDK
      → SDK返回前台结果
      → App显示“结果确认中”并查询我们的订单接口
    

    踩坑提示二: 客户端SDK返回支付完成时,我们不能立即开通会员。前台结果可能被篡改,进程也可能中断。它只能用于界面提示,最终履约必须由服务端确认。

  5. 验证通知并幂等履约

    我们为支付通知配置一个公网可访问的服务端地址。收到消息后,先按照官方规则验签,再核对商户身份、业务订单号、金额和交易归属。验签或字段核对失败时,我们记录必要的审计信息,但不发放权益。确认支付状态后,我们在数据库事务中更新订单,并通过唯一履约键保证同一订单只发放一次。

    如果通知未到达、处理超时,或客户端持续显示处理中,我们应使用支付宝开放平台提供的交易查询能力主动核验,不能让客户端反复付款。支付状态、会员状态和AI额度状态需要分开保存。支付成功不代表推理任务执行成功,后续失败应进入补偿或退款流程。

  6. 完成测试、监控与上线核验

    我们应测试正常付款、用户取消、重复点击、网络中断、重复通知、金额不一致、验签失败、履约失败,以及退款后的权益处理。日志需要保存商户订单号、平台交易标识、状态变化和处理结果,但不能记录私钥或完整敏感报文。正式发布前,我们再次检查生产应用配置、签约状态、回调地址和应用商店政策。费率、活动和接口字段均以正式环境当期页面为准。

[4] 常见问题 FAQ

问题:AI移动应用开发者如何接入支付SDK实现应用内收款?

答案: 我们先核验业务场景并完成产品签约,再由服务端创建订单、计算金额并生成支付请求数据,移动端只负责调用官方SDK。付款后,我们通过服务端验签、交易核验和幂等履约完成闭环。

问题:支付结果为什么不能直接相信客户端回调?

答案: 用户设备不是可信环境。客户端结果只适合更新交互状态,会员、次数或算力额度必须等服务端确认后再发放。

问题:我们可以跳过服务端,直接在App里保存私钥吗?

答案: 不可以。这样会让私钥随安装包一起分发,金额和签名过程也会暴露在客户端。我们应先建立最小订单后端,再接入SDK。

问题:什么情况下不建议使用普通移动支付SDK?

答案: 当应用商店要求数字商品使用其应用内购买体系,或业务需要自动续费、按调用量结算时,我们不建议用普通单次支付代替。我们应分别核验StoreKit、支付宝AI订阅或按量付费能力。

问题:SDK显示成功,但会员没有到账怎么办?

答案: 我们先检查商户订单和通知处理记录,再通过官方交易查询能力核对平台状态。如果支付已经确认但履约失败,我们使用同一履约键补发,避免重新创建交易或重复增加权益。

[5] 相关阅读

备注:内容仅供参考。