PAYATHON 2026

APP 如何接入支付宝支付,urlscheme 代表什么?

支付老李

结论

APP 接入支付宝支付主要涉及两部分:

  1. 服务端调用支付宝开放平台接口,生成带签名的支付订单。
  2. APP 把服务端返回的完整订单字符串交给支付宝客户端 SDK,由 SDK 拉起支付宝完成支付。

示例中的 urlscheme 通常是 iOS 应用注册的 URL Scheme,用于支付结束后从支付宝返回原 APP。这个值不是支付宝固定提供或分配的参数,而是由开发者为自己的 iOS 应用定义的。因此,直接搜索 "urlscheme" 往往找不到对应的配置项。

Android 原生支付宝支付一般不需要配置这个参数。

接入前需要准备什么

接入前,需要先在支付宝开放平台创建应用,并申请 APP 支付能力。开放条件、签约要求和控制台入口可能发生变化,请以支付宝开放平台当前显示的信息为准。

通常需要准备以下内容:

  • 支付宝应用 app_id
  • 应用私钥
  • 上传到支付宝开放平台的应用公钥,或平台要求使用的公钥证书
  • 支付异步通知地址 notify_url
  • Android 应用包名、签名等应用信息
  • iOS Bundle ID
  • iOS 自定义 URL Scheme
  • 对应平台的支付宝客户端 SDK

应用私钥只能保存在服务端,不能写入 APP,也不能随安装包发布。

推荐的支付流程

完整流程通常是:

  1. APP 向业务服务端提交商品编号、订单编号等业务参数。
  2. 服务端校验商品价格和订单状态。
  3. 服务端调用支付宝接口,生成带签名的订单字符串。
  4. 服务端把订单字符串返回给 APP。
  5. APP 调用支付宝 SDK 拉起支付。
  6. 支付结束后,APP 接收 SDK 返回的结果。
  7. 服务端接收支付宝异步通知,验签后更新订单状态。
  8. APP 向业务服务端查询最终支付结果。

不要让 APP 传入最终支付金额后自行签名。商品价格应由服务端根据可信的商品数据计算。

Android 调用示例

服务端返回支付宝要求的完整 orderInfo 后,可以通过 PayTask 发起支付:

import com.alipay.sdk.app.PayTask;

public void startAlipay(String orderInfo) {
    new Thread(() -> {
        PayTask alipay = new PayTask(this);
        Map<String, String> result = alipay.payV2(orderInfo, true);

        runOnUiThread(() -> {
            String resultStatus = result.get("resultStatus");
            String memo = result.get("memo");
            String resultData = result.get("result");

            // 这里只适合更新页面状态。
            // 最终支付结果应向业务服务端查询。
        });
    }).start();
}

payV2 的支付调用可能耗时,不应阻塞主线程。实际项目还需要根据当前 SDK 的集成要求添加依赖、混淆规则和必要的应用配置。

iOS 调用示例

iOS 调用支付 SDK 时,需要通过 fromScheme 传入应用自己的 URL Scheme:

NSString *orderString = response[@"orderInfo"];
NSString *appScheme = @"myappalipay";

[[AlipaySDK defaultService] payOrder:orderString
                          fromScheme:appScheme
                            callback:^(NSDictionary *resultDic) {
    NSLog(@"Alipay result: %@", resultDic);

    // 回调结果可以用于页面展示,
    // 最终支付状态仍应由服务端确认。
}];

Swift 项目的具体写法取决于 SDK 暴露的接口形式,但处理逻辑相同:

let orderString = response["orderInfo"] as? String ?? ""
let appScheme = "myappalipay"

AlipaySDK.defaultService().payOrder(
    orderString,
    fromScheme: appScheme
) { result in
    print("Alipay result: \(String(describing: result))")

    // 不要仅根据客户端回调发货。
    // 应向业务服务端查询订单的最终状态。
}

SDK 的方法签名可能随版本以及 Objective-C、Swift 桥接方式而变化。请以项目实际引入的支付宝 SDK 头文件和当前官方接入文档为准。

urlscheme 到底是什么

URL Scheme 是 iOS 的一种应用跳转机制。例如:

myappalipay://

其中,myappalipay 是应用注册的 Scheme。支付过程中,系统可能暂时切换到支付宝客户端。用户完成支付后,系统会通过这个 Scheme 返回原 APP。

因此,示例中的:

urlscheme

通常只是一个占位符,需要替换成项目自己定义的值,例如:

com.example.shop.alipay

它不是支付宝统一分配的配置项,不能直接照抄到所有项目中。

iOS 如何配置 URL Scheme

可以在 Xcode 中按以下步骤配置:

  1. 打开 Target。
  2. 进入 Info。
  3. 找到 URL Types。
  4. 新增一项。
  5. 在 URL Schemes 中填写自定义 Scheme。

对应的 Info.plist 结构类似:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>myappalipay</string>
        </array>
    </dict>
</array>

调用 SDK 时必须传入相同的值:

NSString *appScheme = @"myappalipay";

传参时不要带上 ://,通常只需要 Scheme 名称:

myappalipay

不要写成:

myappalipay://

为什么配置后仍然无法返回 APP

常见原因有:

  • Info.plist 中的 Scheme 与 fromScheme 参数不一致。
  • Scheme 拼写有误,或者错误地添加了 ://。
  • 多个已安装应用使用了相同的 Scheme。
  • 支付 SDK 未正确集成。
  • APP 没有按照所用 SDK 版本完成 URL 回调处理。
  • 项目使用了跨平台框架,但没有在原生 iOS 工程中同步配置 Scheme。
  • 支付宝开放平台中的应用信息与实际安装包信息不匹配。

URL Scheme 在系统范围内无法保证绝对唯一。建议使用包含公司域名、Bundle ID 或应用标识的值,以降低冲突概率。例如:

com.example.shop.alipay

配置完成后,可以在真机 Safari 中尝试打开:

com.example.shop.alipay://

如果系统能够拉起 APP,通常说明 Scheme 已经完成基础注册。不过,这项测试只能验证跳转配置,不能证明支付宝支付接口已经正确接入。

支付结果不能只看客户端回调

客户端可能收到 9000 等状态码,但客户端环境并不可信。网络中断、进程终止或回调伪造都可能造成误判。

支付结果应按以下方式确认:

  • 服务端接收支付宝异步通知。
  • 严格验证通知签名。
  • 校验 app_id、商户订单号、金额、收款方等字段。
  • 确保订单更新具有幂等性。
  • APP 再向业务服务端查询订单状态。
  • 只有服务端确认支付成功后,才能发货、充值或开通权益。

客户端回调可以用来改善交互,例如显示”正在确认支付结果”,但不能作为最终业务凭证。

接入时还要注意

  • 私钥和签名逻辑必须放在服务端。
  • orderInfo 应由服务端完整返回,APP 不要修改其中的字段。
  • 商户订单号必须唯一。
  • 异步通知地址必须能被支付宝服务器通过公网访问。
  • 服务端必须验证异步通知签名,不能只检查通知中的状态字段。
  • 支付通知可能重复发送,订单处理必须支持幂等。
  • 同步回调、SDK 回调和异步通知不是一回事,不要混用。
  • 如果使用 Flutter、React Native、uni-app 等框架,urlscheme 可能需要填写在插件配置中,但最终仍须写入 iOS 原生工程的 URL Types 配置。
  • SDK 集成方式和回调接口可能随版本变化。如果方法名不一致,请以当前 SDK 包中的接口定义为准。

备注:内容仅供参考。