# AliPaySDK **Repository Path**: jiajian_2/ali-pay-sdk ## Basic Information - **Project Name**: AliPaySDK - **Description**: 支付宝支付 SDK - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-04 - **Last Updated**: 2026-09-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # AlipaySDK(Swift Package Manager) 支付宝 App 支付 iOS SDK(官方版本 **15.8.42.1**)的 Swift Package 封装,支持 `import AlipaySDK` 直接在 Swift / Objective-C 中调用。官方仅提供 CocoaPods 与手动导入两种集成方式,本包将其标准化为 SPM 分发。 ## 目录结构 ``` . ├── Package.swift ├── XCFrameworks/ │ ├── Standard/AlipaySDK.xcframework # 标准版(含 UTDID) │ └── NoUtdid/AlipaySDK.xcframework # 合规版(无 UTDID) ├── Sources/ │ ├── AlipaySDKWrapper/ # 标准版资源 + 辅助工具 │ └── AlipaySDKNoUtdidWrapper/ # 合规版资源 + 辅助工具 └── Docs/AlipaySDK.PrivacyInfo.xcprivacy # 官方隐私清单(见「隐私清单」) ``` ## 如何选择 Product | Product | 说明 | | --- | --- | | `AlipaySDK` | 标准版,与 CocoaPods `AlipaySDK-iOS` 等价。**包含阿里 UTDID 设备标识组件**,会读写剪贴板/设备标识用于风控。 | | `AlipaySDK-NoUtdid` | 合规版,剔除 UTDID 组件。工信部/隐私合规审查较严、或无阿里系 UTDID 依赖的 App 推荐此项。 | 两者均含 `ios-arm64`(真机)与 `ios-arm64_x86_64`(模拟器)切片,最低支持 **iOS 12**。**不要同时引入两个 product**(它们提供同名模块 `AlipaySDK`,会重复符号)。 ## 安装 Xcode → File → Add Package Dependencies → 填写本仓库地址,在 "Package Product Rules" 中选择 `AlipaySDK` 或 `AlipaySDK-NoUtdid`。 或在 `Package.swift` 中: ```swift dependencies: [ .package(url: "https://gitee.com/jiajian_2/ali-pay-sdk.git", from: "15.8.47"), ], targets: [ .target(name: "MyApp", dependencies: [.product(name: "AlipaySDK-NoUtdid", package: "AlipaySDK")]), ] ``` 引入包即可,无需再手动添加 `libc++`、`libz`、`SystemConfiguration`、`CoreTelephony`、`WebKit`、`Network`——已由包自动声明。 ## 配置工程 1. **URL Scheme**(支付完成后跳回 App 必需)。Info → URL Types 添加自有 scheme(如 `yourapp`,勿与支付宝的 `alipay`/`alipays`/`itms-apps` 冲突——SDK 二进制中已声明这些为「需查询 scheme」,见下)。 2. **LSApplicationQueriesSchemes**(检测支付宝是否安装),Info.plist 添加: ```xml LSApplicationQueriesSchemes alipay alipays alipayshare itms-apps ``` 3. **Universal Links**:SDK 的防黑产校验(`registerApp`)与「返回商家 App」优化依赖 Universal Link。需配置 Apple-Associated Domains 与开放平台后台填写一致。 ## 代码接入 ### 1. 注册 appId(支付前尽早调用,如「选择支付方式的订单页」) ```swift import AlipaySDK AlipaySDK.defaultService()?.registerApp("<你的APPID>", universalLink: "https://你的域名/path/") ``` 不调用不影响支付链路,但防黑产与唤起提速策略不生效。 ### 2. 发起支付 `orderString` **必须由商家服务端**组装并用应用私钥签名(RSA2)后下发(接口 `alipay.trade.app.pay`,详见开放平台文档)。客户端只透传: ```swift let orderString: String = /* 服务端下发的已签名订单串 */ AlipaySDK.defaultService()?.payOrder(orderString, fromScheme: "yourapp") { result in // result 为同步返回字典,resultStatus 含义: // 9000 支付成功(需服务端异步通知二次确认) 8000/6004 处理中/结果未知 // 4000 失败 5000/6001/6002 重复请求/用户取消/网络异常 print(result ?? [:]) } ``` 若已配置 Universal Link,可改用 `payOrder(_:fromScheme:fromUniversalLink:callback:)`。 ### 3. 处理支付宝回跳 `AppDelegate.swift`(两个方法都实现,兼容不同系统/Scene 配置): ```swift import AlipaySDK // scheme 回跳 func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool { if url.host == "safepay" { AlipaySDK.defaultService()?.processOrder(withPaymentResult: url, standbyCallback: { result in print(result ?? [:]) }) } return true } // Universal Link 回跳(支付结果、授权结果) func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { guard let url = userActivity.webpageURL, url.path.hasPrefix("/你的ULink路径/") else { return false } AlipaySDK.defaultService()?.handleOpenUniversalLink(userActivity, standbyCallback: { result in print(result ?? [:]) }) return true } ``` > 同步回调仅作 UI 展示,**订单最终状态以服务端异步通知验签为准**(同步通知验签见开放平台文档)。 ### 4. (可选)H5 收银台离线资源 未安装支付宝客户端时 SDK 走内置 H5 收银台,其离线资源(`bridge.js`、图片)依赖主 bundle 根目录的 `AlipaySDK.bundle`。CocoaPods 会直接拷入主 bundle,SPM 做不到,因此提供辅助安装(建议 App 启动时调用一次;不安装则 H5 降级路径会走线上资源,唤起支付宝 App 的主流程完全不受影响): ```swift import AlipaySDKWrapper // 或 AlipaySDKNoUtdidWrapper AlipaySDKSupport.installResourcesIfNeeded() ``` ## 隐私清单 SDK 使用了文件时间戳、磁盘空间、系统启动时间、UserDefaults 四类「Required Reason API」。官方 `PrivacyInfo.xcprivacy`(内容见 `Docs/`)已注入两个 xcframework 的全部 framework 切片。 自 `15.8.47` 起,切片是正式动态库并会随 App 嵌入(`.app/Frameworks/AlipaySDK.framework`),Apple 上传扫描**能直接识别**切片内的隐私清单,ITMS-91053 不再依赖人工动作。若你的工程曾按旧文档把 4 条 `NSPrivacyAccessedAPITypes` 合并进 App 自己的 `PrivacyInfo.xcprivacy`,可以保留(无害)也可以移除。 ## 已知问题 - **上传报 `Invalid Bundle. The bundle xxx.app/Frameworks/AlipaySDK.framework does not support the minimum OS Version specified in the Info.plist`(90208)**:`15.8.46` 及之前存在,**`15.8.47` 起根治**。完整根因链(Xcode 26.6 实测取证): 1. 官方 xcframework 的切片二进制是单个 `MH_OBJECT` 目标文件(framework 只是容器)。只要包里存在 **framework 形态的 binary artifact**,Xcode 构建 iOS App 时就会**无条件把它嵌入** `.app/Frameworks/`——实测与产品类型声明(`.static`/`.automatic`)、产品 targets 成员、切片二进制格式(换成 ar 归档同样嵌入)均无关,消费方的嵌入开关也管不到这条自动路径。 2. 嵌入时对非 `MH_DYLIB` 的切片二进制,Xcode 不原样拷贝,而是**替换成重链出的桩 dylib**:`LC_BUILD_VERSION minos` 取你 App 的部署目标(如 16.0)。 3. 桩搭配的还是切片自带 `Info.plist` 的 `MinimumOSVersion 12.0`。二进制要求 16.0、plist 声称支持 12.0,自相矛盾 → Apple 校验拒绝。对齐 plist 无解:桩的 minos 永远跟随消费者目标,plist 是包里写死的。 - `15.8.47` 的修复:把 4 个切片的二进制由官方目标文件**重链为正式动态库**(install name `@rpath/AlipaySDK.framework/AlipaySDK`,`minos 12.0`,与切片 plist 一致;显式链接 Foundation/UIKit/WebKit/SystemConfiguration/CoreTelephony/Network/Security/QuartzCore/CoreGraphics + `libc++`/`libz`)。Xcode 的自动嵌入因此变成**原样嵌入这个自洽 bundle**——二进制与 plist 同为 12.0,任何部署目标的 App 上传都合法。SDK 经 `@rpath` 动态加载,194 个 ObjC 类由 dyld 启动时注册。 - 消费方动作:升级到 `15.8.47` → Clean Build Folder → 重新 Archive。产物 `YourApp.app/Frameworks/AlipaySDK.framework` 约 0.9 MB(正常且必需的动态库,Apple 会一并校验签名,由 Xcode 自动完成)。如你的工程此前为绕过 90208 打过 Info.plist 补丁脚本,可以删掉了。 - **手工拖入 xcframework 做 Embed & Sign 报 `did not contain an Info.plist`**:官方切片原本缺失 `Info.plist`(仅有一份未填模板 `AlipaySDK-inside-Info.plist`)。本包已在全部 4 个切片补齐标准 `Info.plist`(`CFBundleIdentifier: com.alipay.sdk`,`MinimumOSVersion: 12.0`)。`15.8.47` 起切片为正式动态库,手工嵌入与普通动态库的常规校验一致。旧 tag `15.8.42` 无清单补齐,请使用 ≥ 15.8.43(SwiftPM 只识别三段式 semver tag,四段式如 `15.8.42.1` 不会被解析器选中)。 - **NoUtdid 版需要宿主提供 UTDID**:官方 NoUtdid 切片保留对 `_OBJC_CLASS_$_UTDevice` 的未定义引用(官方设计:面向已自行集成 UTDID 的 App,避免符号重复)。静态形态下表现为**链接期报 undefined symbol**;`15.8.47` 动态形态下表现为**启动时 dyld 找不到符号**——适用前提相同:宿主工程必须含 UTDID。若不需要,请选标准版 `AlipaySDK`(UTDID 已内含)。 - **上传 App Store 报 ITMS-90562(Invalid Version)**:官方 framework 切片的 `Info.plist` 携带四段式版本 `15.8.42.1`,而 App Store Connect 要求 `CFBundleShortVersionString` 为最多三段正整数。`15.8.43` tag 及之前仍带此问题;自 `15.8.44` 起已将全部 4 个切片的 `CFBundleShortVersionString` / `CFBundleVersion` 修正为三段式 `15.8.43`。若此前解析到了旧版本,请在 Xcode 中 File → Packages → Update to Latest Package Versions 后确认生效版本。 - **unrecognized selector**:`15.8.47` 起 SDK 为动态库,ObjC 类别由 dyld 在启动时自动注册,无需 `-ObjC`/`-force_load`。仅当你仍用旧版静态形态且工程启用了死代码裁剪时才需要关注此项。 - 支付宝官方文档中 Swift 需桥接调用的限制,本包已通过 framework 自带 `module.modulemap` 解决,可直接 `import AlipaySDK`。 ## 版本 - AlipaySDK 官方版本:`15.8.42.1`(含 Standard 与 NoUtdid 双变体,模拟器 arm64 可用) - 包版本规则:取官方版本前三段为基线,本地封装修复递增 patch 位(`15.8.43` 起)。实质修复:`15.8.44` 切片版本改三段式(ITMS-90562);`15.8.46` 产品显式 `.static`(仅影响 wrapper 源码链接形态,**并不能**阻止 Xcode 对包内 framework 工件的强制嵌入,该认知于 `15.8.47` 修正);**`15.8.47` 将 4 个切片的官方目标文件重链为正式动态库(`minos 12.0` 与切片 plist 一致),使 Xcode 的自动嵌入变为原样嵌入自洽 bundle,根治 90208 Invalid Bundle 上传拒绝;链接形态由静态转为动态(App 主包约 +0.9 MB)**。Xcode 添加时 Dependency Rule 建议选 "Up to Next Major from 15.8.47";旧工程从 `15.8.44` 起选 "Up to Next Major" 会自动升级吃到本修复 - 切片构建信息:4 个切片动态库由 Xcode 26.6(iOS SDK 26.5)链接,`-Os`,无调试段;`import AlipaySDK` 的模块接口(modulemap/Headers)与官方一致,未改动 - 构建要求:Xcode 14+(swift-tools-version 5.7),最低部署 iOS 12