PAYATHON 2026

是否有 Swift 版支付宝支付接入文件?

支付阿杰

结论

支付宝 iOS SDK 一般不会另外提供“Swift 版 SDK”。SDK 底层可能包含 C/C++ 或 Objective-C 代码,Swift 可以通过 Objective-C 互操作机制直接调用,无需将源码改写成 Swift。

接入时,先按照支付宝开放平台当前的 iOS SDK 文档配置依赖,再在 Swift 工程中导入 AlipaySDK。SDK 版本不同,接口名称也可能有所调整,具体应以下载包中的头文件和对应版本文档为准。

接入步骤

1. 导入支付宝 iOS SDK

按照当前 SDK 支持的方式,将依赖添加到项目。不同版本可能需要手动导入、通过 CocoaPods 集成,或采用其他方式。不要直接使用未经确认的旧版依赖名称。

如果 SDK 支持模块化导入,可以在 Swift 文件中直接使用:

import AlipaySDK

如果编译器提示找不到模块,需要创建 Objective-C Bridging Header,例如:

#import <AlipaySDK/AlipaySDK.h>

然后打开 Target 的 Build Settings,将 Objective-C Bridging Header 设置为该文件的路径,例如:

$(SRCROOT)/YourProject/YourProject-Bridging-Header.h

实际的头文件名称和路径以当前使用的 SDK 包为准。

2. 配置 URL Scheme

支付宝客户端完成支付后,会通过 URL Scheme 返回应用。在 Xcode 的 Target 配置中打开:

Info > URL Types

添加应用自己的 Scheme,例如:

yourAppAlipay

Scheme 需要保持唯一,并且必须与调用支付接口时传给 fromScheme 的值完全一致。

3. 从服务端获取订单字符串

订单参数和签名应由服务端生成。客户端只负责接收签名完成的订单字符串,不应在 App 中保存商户私钥。

示例:

func requestSignedOrder(completion: @escaping (Result<String, Error>) -> Void) {
    // 请求业务服务端创建支付宝订单。
    // 服务端返回经过签名的完整 orderString。
}

服务端通常需要完成这些工作:

  1. 创建业务订单。
  2. 调用支付宝服务端接口,或按照对应产品规则生成订单参数。
  3. 使用商户私钥完成签名。
  4. 将完整的订单字符串返回给 App。

4. 在 Swift 中发起支付

常见的调用方式如下:

import AlipaySDK

func startAlipay(orderString: String) {
    let appScheme = "yourAppAlipay"

    AlipaySDK.defaultService().payOrder(
        orderString,
        fromScheme: appScheme
    ) { result in
        guard let result = result else {
            print("支付宝未返回客户端结果")
            return
        }

        let resultStatus = result["resultStatus"] as? String
        let memo = result["memo"] as? String

        print("resultStatus: \(resultStatus ?? "")")
        print("memo: \(memo ?? "")")

        // 这里的结果只能作为界面提示依据。
        // 最终支付状态必须向业务服务端查询或以支付宝异步通知为准。
    }
}

如果当前 SDK 的方法签名与示例不同,请查看 AlipaySDK.h 中实际暴露的 Objective-C 接口。Swift 会自动将 Objective-C 方法转换成对应的 Swift 调用形式。

5. 处理支付宝回跳

使用 AppDelegate 生命周期的项目,可以通过下面的方式处理 URL 回调:

import UIKit
import AlipaySDK

@main
class AppDelegate: UIResponder, UIApplicationDelegate {
    func application(
        _ app: UIApplication,
        open url: URL,
        options: [UIApplication.OpenURLOptionsKey: Any] = [:]
    ) -> Bool {
        guard url.host == "safepay" else {
            return false
        }

        AlipaySDK.defaultService().processOrder(
            withPaymentResult: url
        ) { result in
            print("支付宝回跳结果: \(String(describing: result))")

            // 不要仅凭这里的状态修改服务端订单。
            // 应继续向业务服务端确认支付结果。
        }

        return true
    }
}

使用 Scene 生命周期的项目,还要在 SceneDelegate 中处理 URL:

import UIKit
import AlipaySDK

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    var window: UIWindow?

    func scene(
        _ scene: UIScene,
        openURLContexts URLContexts: Set<UIOpenURLContext>
    ) {
        guard let url = URLContexts.first?.url,
              url.host == "safepay" else {
            return
        }

        AlipaySDK.defaultService().processOrder(
            withPaymentResult: url
        ) { result in
            print("支付宝回跳结果: \(String(describing: result))")
        }
    }
}

部分 SDK 版本还可能提供授权回调或其他回调处理接口,请根据实际业务类型选择对应的方法。

注意事项

不要在客户端生成签名

商户私钥不能放在 Swift、Objective-C、C/C++ 文件或资源文件中。即使进行了混淆,客户端中的密钥仍有可能被提取。签名必须交给可信的服务端完成。

客户端显示成功不等于最终支付成功

支付回调中的 resultStatus 可以用于客户端的交互提示,但不能作为发货、充值或更新订单状态的唯一依据。客户端结果可能被伪造,也可能因为网络或进程状态而没有返回。

最终支付结果需要通过以下方式确认:

  • 验证支付宝发给服务端的异步通知;
  • 由业务服务端主动查询支付宝订单状态;
  • 校验商户订单号、金额、商户身份和交易状态。

兼容无支付宝客户端的情况

部分支付流程可能会跳转到网页,随后再返回 App。URL Scheme 必须正确配置,并且要在真机上分别验证安装和未安装支付宝客户端的场景。

留意 Objective-C 与 Swift 的类型转换

支付宝 SDK 返回的数据可能是 Objective-C 字典,因此在 Swift 中通常需要进行可选类型转换:

let resultStatus = result?["resultStatus"] as? String

不要直接强制转换,否则字段缺失或类型发生变化时,应用可能崩溃。

以当前 SDK 头文件为准

支付宝 SDK 的分发方式、模块名和接口签名可能随版本变化。如果遇到以下错误:

No such module 'AlipaySDK'

可以依次检查:

  1. SDK 是否已正确加入当前 Target;
  2. Framework Search Paths 是否正确;
  3. SDK 是否支持模块化导入;
  4. 是否需要 Bridging Header;
  5. SDK 要求的系统依赖是否已经添加;
  6. 真机与模拟器使用的 SDK 架构是否匹配。

没有独立的 Swift SDK,并不影响在 Swift 项目中接入支付宝支付。接入时需要正确导入现有的 iOS SDK、配置回跳 Scheme,并由服务端完成订单签名和最终支付结果验证。

备注:内容仅供参考。