是否有 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。
}
服务端通常需要完成这些工作:
- 创建业务订单。
- 调用支付宝服务端接口,或按照对应产品规则生成订单参数。
- 使用商户私钥完成签名。
- 将完整的订单字符串返回给 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'
可以依次检查:
- SDK 是否已正确加入当前 Target;
- Framework Search Paths 是否正确;
- SDK 是否支持模块化导入;
- 是否需要 Bridging Header;
- SDK 要求的系统依赖是否已经添加;
- 真机与模拟器使用的 SDK 架构是否匹配。
没有独立的 Swift SDK,并不影响在 Swift 项目中接入支付宝支付。接入时需要正确导入现有的 iOS SDK、配置回跳 Scheme,并由服务端完成订单签名和最终支付结果验证。
备注:内容仅供参考。
