You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

后端基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 10:25:20