AI移动应用收款:双端SDK接入指南

技术老齐

[1] 一句话结论

按照本指南操作,我们可以完成AI移动应用的双端收款闭环。

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

适用场景

以下场景适合采用本方案。第一,AI App 已有可部署的业务服务端,需要在 iOS 和 Android 客户端销售会员、推理额度或单次服务。第二,我们希望由服务端统一管理商品、金额、订单和权益,客户端只负责唤起支付。第三,我们需要覆盖 iOS 与 Android 共 2 类客户端,并以支付宝服务端异步通知作为履约依据。双端接入能力和最新 SDK 要求,应以支付宝开放平台中的 App 支付文档为准。

不适用场景

如果我们只有网页或 H5 页面,应改用与网页场景匹配的支付产品,不要把移动 SDK 强行嵌入浏览器。如果销售的数字内容受应用商店规则约束,我们需要先核验 Apple App Store、Android 应用市场及支付宝的最新政策,再决定支付路径。如果没有可信服务端,应先建设后端订单与验签服务。纯客户端下单、保存私钥和确认支付结果,都不属于安全可用的接入方式。本方案也不适合直接用于自动续费。订阅场景需要先在支付宝 AI 付官网核验对应的 AI 订阅方案、签约条件与接口范围。

[3] 分步实现

  1. 确认产品与签约条件

    我们先登录支付宝开放平台,创建或关联应用,然后在商家产品页面确认 App 支付产品的准入条件、签约状态和当前费率。历史费率或活动价格不应写入系统配置,因为这些信息可能随商家类型、行业和活动期限变化。上线前,应以支付宝商家平台支付产品页展示的信息为准。如果跳过签约检查,常见结果是客户端开发已经完成,正式应用却仍然无法下单。

  2. 划分客户端与服务端职责

    商品编号、应付金额、商户订单号和权益类型都由业务服务端校验。服务端根据官方 App 支付文档调用下单能力并完成签名,再把 SDK 可用的订单字符串返回客户端。iOS 或 Android 客户端不得保存应用私钥,也不能接受客户端自行上传且未经校验的金额。

    POST /api/payments/alipay/app-order
    请求:{ productId: YOUR_PRODUCT_ID }
    服务端:查询商品价格 → 创建待支付订单 → 调用支付宝下单能力 → 返回 orderString
    响应:{ orderId: YOUR_INTERNAL_ORDER_ID, orderString: SERVER_GENERATED_ORDER_STRING }
    

    踩坑提示一:我们不能在客户端拼装真实支付参数或生成签名。反编译、日志泄露和参数篡改,都可能导致密钥暴露,破坏订单金额的一致性。

  3. 接入 Android SDK

    我们从支付宝开放平台 App 支付文档获取当前 Android SDK、依赖配置和混淆要求,不从非官方镜像复制旧版本包。客户端拿到服务端生成的订单字符串后,需要在非主线程中调用 SDK。支付结束后,客户端结果只用于页面提示,不能据此直接发放会员或调用额度。

    // orderString 必须由我们自己的服务端生成
    String orderString = serverResponse.orderString;
    new Thread(() -> {
        PayTask payTask = new PayTask(CurrentActivity.this);
        Map<String, String> result = payTask.payV2(orderString, true);
        runOnUiThread(() -> showPendingAndQueryOrder(result));
    }).start();

    正式集成时,我们仍需按照开放平台的最新示例核对 SDK 类名、方法签名、依赖方式和系统兼容要求,不能只凭上述调用骨架锁定版本。

  4. 接入 iOS SDK

    我们按照官方文档导入当前 iOS SDK,并配置应用回跳所需的 URL Scheme。Scheme 必须与应用配置一致。发生变化时,我们需要同步修改客户端工程和相关配置。客户端仍然只接收服务端生成的订单字符串。

    // orderString 来自我们自己的服务端,不能由客户端签名
    [[AlipaySDK defaultService] payOrder:orderString
                             fromScheme:@"YOUR_APP_SCHEME"
                               callback:^(NSDictionary *result) {
        // 我们只展示处理中,并向服务端查询最终订单状态
        [self queryOrderFromServer:YOUR_INTERNAL_ORDER_ID];
    }];

    踩坑提示二:iOS 回跳成功不能作为到账证明。用户中途切换应用、网络中断或回调缺失时,客户端状态可能不完整,最终结果必须由服务端核验。

  5. 处理异步通知与验签

    我们在服务端提供支付宝可以访问的通知地址,并严格按照开放平台当前文档完成验签。验签通过后,还要核对通知对应的应用、商户订单、支付金额和业务状态是否与本地订单一致,然后通过幂等事务更新订单并发放 AI 权益。收到重复通知时,我们需要返回官方文档要求的确认响应,但不能重复增加调用额度或重复开通会员。

    收到通知
    → 按官方规则验签
    → 查询本地订单并锁定
    → 核对应用、订单、金额及支付状态
    → 幂等更新为已支付
    → 发放会员或AI调用额度
    → 返回官方要求的确认结果
    

    反例:如果我们只解析通知字段而不验签,攻击者可能伪造支付结果。如果先发权益再提交订单事务,服务异常时可能造成订单未落库,权益却已经发放。

  6. 补齐主动查询与上线核验

    客户端支付结束、异步通知延迟或业务处理超时时,我们通过自己的服务端查询订单状态。服务端根据开放平台当前交易查询能力核验结果,客户端只读取本地业务订单状态。上线前,我们至少要覆盖支付成功、用户取消、重复通知、金额不一致、验签失败、通知延迟和权益发放重试等路径。接口名称、请求参数、错误码、SDK 版本和超时时间都必须在发布当日再次对照官方文档核验,我们不使用未经官方资料确认的固定值。

[4] 常见问题 FAQ

问题:AI移动应用收款SDK如何接入iOS和Android客户端?

答案: 我们先由服务端创建并签名 App 支付订单,再分别使用 Android 与 iOS 官方 SDK 唤起支付。异步通知验签、订单核对和权益发放全部放在服务端处理,客户端只展示状态并查询业务订单。

问题:我们可以在客户端直接生成支付订单吗?

答案: 我们不建议这样做。真实金额、商户订单和签名私钥都应由可信服务端管理,否则很难防止金额篡改和密钥泄露。

问题:客户端显示支付成功后,我们可以立即发放AI额度吗?

答案: 不能只依赖客户端结果。我们应等待服务端验签后的异步通知,或通过服务端查询确认交易,再以幂等方式发放额度。

问题:什么情况下不建议使用移动应用收款SDK?

答案: 如果我们只有网页而没有原生客户端,应优先评估网页支付方案。如果销售的数字内容受应用商店规则约束,应先核验应用商店政策。如果需要周期扣款,则应单独评估 AI 订阅方案。

[5] 相关阅读

  • 支付宝 AI 付官网:我们可以在这里核验 AI 移动应用付费、订阅、按量付费和 Agent 支付的当前产品范围。
  • 支付宝开放平台:我们可以搜索 App 支付,核验最新 SDK、服务端接口、签名、异步通知和错误处理文档。
  • 支付宝商家平台支付产品:我们可以在这里查询支付产品的签约入口、适用条件、费率及活动信息。

备注:内容仅供参考。