苹果支付(Apple Pay)深度集成开发实战指南
Apple Pay的核心集成流程是:注册开发者账户、配置商户ID与支付证书、集成PassKit框架、处理支付令牌、实现服务端验证与订单处理,关键在于安全地解密PaymentToken并与支付网关/银行系统交互完成扣款。

前期必备配置
- Apple开发者账户:
确保拥有有效的Apple Developer Program会员资格。
- 商户标识符(Merchant Identifier):
- 在Apple Developer Portal创建唯一的商户ID(例如
merchant.com.yourcompany.appname)。 - 此ID用于标识您的业务,并在处理支付时使用。
- 在Apple Developer Portal创建唯一的商户ID(例如
- 支付处理证书(Payment Processing Certificate):
- 为您的商户ID创建并下载支付处理证书(
.cer文件)。 - 此证书用于服务端解密Apple Pay支付令牌(Payment Token),是安全交易的核心,保管好私钥!
- 为您的商户ID创建并下载支付处理证书(
- Apple Pay能力(Capability):
- 在Xcode项目的
Signing & Capabilities标签页中,添加Apple Pay能力。 - 勾选您在开发者门户中创建的商户ID。
- 在Xcode项目的
- 支付网络支持:
确认您的支付服务提供商(PSP)或银行支持Apple Pay,并支持您业务所在地区的卡网络(如Visa, Mastercard, Amex, 银联UnionPay等),在开发者账户的商户ID配置中勾选支持的卡网络。
iOS客户端集成(使用PassKit框架)
-
检查设备支持性:
import PassKit ... if PKPaymentAuthorizationViewController.canMakePayments() { // 设备支持Apple Pay if PKPaymentAuthorizationViewController.canMakePayments(usingNetworks: [.visa, .masterCard, .chinaUnionPay]) { // 设备支持至少一种您需要的卡网络 } else { // 引导用户添加支持的卡 let passLibrary = PKPassLibrary() passLibrary.openPaymentSetup() } } else { // 设备不支持Apple Pay,提供备选支付方式 } -
创建支付请求(PKPaymentRequest):

let paymentRequest = PKPaymentRequest() paymentRequest.merchantIdentifier = "merchant.com.yourcompany.appname" // 配置的商户ID paymentRequest.countryCode = "CN" // 国家代码 paymentRequest.currencyCode = "CNY" // 货币代码 paymentRequest.supportedNetworks = [.visa, .masterCard, .chinaUnionPay] // 支持的卡网络 paymentRequest.merchantCapabilities = .capability3DS // 支持3D Secure认证 // 设置订单详情 let item1 = PKPaymentSummaryItem(label: "商品A", amount: NSDecimalNumber(string: "99.99")) let item2 = PKPaymentSummaryItem(label: "运费", amount: NSDecimalNumber(string: "10.00")) let total = PKPaymentSummaryItem(label: "您的公司名称", amount: NSDecimalNumber(string: "109.99")) // 最后一项必须是总计 paymentRequest.paymentSummaryItems = [item1, item2, total] // 可选:设置账单/配送地址要求 paymentRequest.requiredBillingContactFields = [.name, .postalAddress] // paymentRequest.requiredShippingContactFields = [.emailAddress, .phoneNumber]
-
展示支付授权视图控制器(PKPaymentAuthorizationViewController):
guard let paymentVC = PKPaymentAuthorizationViewController(paymentRequest: paymentRequest) else { // 创建失败处理 return } paymentVC.delegate = self // 设置代理 present(paymentVC, animated: true, completion: nil) -
实现授权代理(PKPaymentAuthorizationViewControllerDelegate):
处理授权状态 (paymentAuthorizationViewController(_:didAuthorizePayment:handler:)):func paymentAuthorizationViewController(_ controller: PKPaymentAuthorizationViewController, didAuthorizePayment payment: PKPayment, handler completion: @escaping (PKPaymentAuthorizationResult) -> Void) { // 关键:获取加密的支付令牌 (payment.token) let paymentToken = payment.token let paymentData = paymentToken.paymentData // 这是加密的JSON数据 // 将 paymentData (Base64编码字符串) 和订单信息发送给您的服务器 // 服务器负责解密token、与支付网关通信验证扣款 sendPaymentToServer(paymentData: paymentData) { success, error in if success { // 支付成功 completion(PKPaymentAuthorizationResult(status: .success, errors: nil)) } else { // 支付失败,传递错误 let errors = [error].compactMap { $0 } completion(PKPaymentAuthorizationResult(status: .failure, errors: errors)) } } }处理完成 (
paymentAuthorizationViewControllerDidFinish(_:)):func paymentAuthorizationViewControllerDidFinish(_ controller: PKPaymentAuthorizationViewController) { controller.dismiss(animated: true) { // 可在此处进行界面更新(如跳转到订单成功页或处理失败) } }
服务端关键处理
- 接收客户端数据:
- 接收来自iOS App的
paymentData(Base64编码字符串)和关联的订单信息(订单号、金额等)。
- 接收来自iOS App的
- 解密支付令牌(Payment Token):
- 使用您在Apple Developer Portal下载的支付处理证书对应的私钥来解密
paymentData。 - 解密后得到JSON对象,包含真实卡信息(DPAN – 设备主账号编号)、交易详情、加密密钥等。绝对不要存储DPAN!
- 使用您在Apple Developer Portal下载的支付处理证书对应的私钥来解密
- 与支付网关/银行通信:
- 将解密后的必要信息(通常包括DPAN、交易金额、货币、加密信息等)按照您的支付服务提供商(PSP)或银行要求的格式和API,发送支付授权请求。
- 重要: 此步骤通常涉及支付网关的Tokenization API或直接银行接口,确保您已与PSP/银行完成集成配置。
- 处理支付结果:
- 解析支付网关/银行返回的响应。
- 验证交易是否成功授权。
- 执行后续业务逻辑(如更新订单状态、发货、通知用户等)。
- 响应客户端:
将支付处理结果(成功/失败)返回给iOS客户端,客户端据此更新UI。

安全与最佳实践
- 服务端核心: 支付令牌解密和与支付网关的交互必须在服务端完成,客户端仅负责收集和传递加密令牌。
- 敏感数据处理: 服务端解密后获得的卡信息(DPAN)仅用于当次交易请求,严禁存储,Apple Pay的核心安全优势在于商家无需处理或存储原始卡号。
- 证书安全: 支付处理证书的私钥是最高机密,必须安全存储(如硬件安全模块HSM、云服务密钥管理服务KMS),避免泄露。
- 订单一致性: 服务端务必校验从客户端接收的订单金额、货币等信息与发送给支付网关的信息严格一致,防止篡改。
- 强身份验证: 在
PKPaymentRequest中声明.capability3DS,利用Apple Pay内置的强客户认证(SCA)满足监管要求(如PSD2)。 - 支付回调(Webhook): 实现支付网关发送的异步交易结果通知(回调),作为服务端主动校验交易最终状态的“双保险”。
- 详细日志与监控: 记录关键步骤的日志(注意脱敏),并设置交易监控告警。
测试与上线
- 沙盒测试(Sandbox):
- 在Xcode中使用沙盒测试环境。
- 在Wallet App中添加沙盒测试卡(在Apple Developer账户中获取)。
- 在设备和服务器端模拟完整支付流程。
- 测试各种场景:成功支付、失败(卡余额不足、银行拒绝)、用户取消、网络中断等。
- 真机测试: 使用配置了沙盒测试卡的物理设备进行测试。
- 审核: 确保App的Apple Pay功能描述准确,用户体验符合规范,提交App Store审核。
- 生产环境:
- 确保App使用生产环境的商户ID、支付处理证书和支付网关配置。
- 密切监控上线初期的交易情况和错误日志。
集成Apple Pay能显著提升移动端支付转化率与用户满意度,其核心在于客户端的安全信息收集与服务端的安全解密及支付网关对接,务必严格遵循安全规范,利用好苹果提供的令牌化技术优势,避免触碰敏感卡信息。 你在集成过程中遇到最棘手的环节是客户端交互还是服务端与支付网关的对接?是否有特定的支付服务提供商(如Stripe、Adyen、银联)的集成经验或疑问?欢迎分享你的实战挑战或见解。
原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/33631.html