后端基于Stripe处理Apple Pay时Completion Block调用异常问题
Apple Pay 对接 Stripe 时调用 Completion Block 崩溃问题解决
问题背景
我在后端基于 Stripe 处理 Apple Pay 支付时,因自定义实现流程遇到了崩溃问题:
官方标准流程:
- 请求 Payment Intent,获取 client-secret 密钥
- 将 client-secret 传入 Completion Block
- 触发
didCompleteWith方法
我改用的自定义流程:
- 将支付方式 ID 传给后端
- 后端创建 Payment Intent 并完成扣款
- 客户端收到 200 响应后直接调用 Completion Block
- 期望触发
didCompleteWith方法
问题核心:直接调用 completion(nil, nil) 不传入 client-secret,导致应用崩溃。已知STPIntentClientSecretCompletionBlock要求第一个参数为可选类型的 client-secret 字符串。
问题原因
Stripe iOS SDK 中,STPApplePayContext 内部依赖 client-secret 来同步支付状态、完成后续流程校验。即便后端已经完成扣款操作,客户端 SDK 仍需要通过 client-secret 确认支付结果的合法性,否则会因内部状态缺失导致崩溃。
解决方案
后端创建 Payment Intent 后,务必将对应的 client-secret 返回给客户端,将其传入 Completion Block,而非传 nil。
修改后的代码示例
func applePayContext(_ context: STPApplePayContext, didCreatePaymentMethod paymentMethod: STPPaymentMethod, paymentInformation: PKPayment, completion: @escaping STPIntentClientSecretCompletionBlock) { // 调用后端支付接口,传入支付方式ID API.makePayment(paymentInformation.stripeId) { result in switch result { case .success(let paymentResponse): // 将后端返回的client-secret传入completion completion(paymentResponse.clientSecret, nil) case .failure(let error): // 支付请求失败时传入错误信息 completion(nil, error) } } } func applePayContext(_ context: STPApplePayContext, didCompleteWith status: STPPaymentStatus, error: Error?) { switch status { case .success: // 处理支付成功逻辑 print("支付完成") case .error: // 处理支付错误逻辑 print("支付失败: \(error?.localizedDescription ?? "未知错误")") case .userCancellation: // 处理用户取消逻辑 print("用户取消支付") @unknown default: fatalError() } }
内容的提问来源于stack exchange,提问作者joethemow
相关产品推荐
相关产品推荐

