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

Stripe支付选项界面持续空白加载问题求助

解决Stripe支付选项控制器一直显示"Loading"的问题

我之前也碰到过类似的Stripe预构建UI加载卡住的情况,大概率是以下几个环节出了问题,你可以逐一排查:

1. 检查STPCustomerEphemeralKeyProvider的实现是否正确

你用的StripeClient.shared必须正确实现STPCustomerEphemeralKeyProvider协议的createCustomerKey(withAPIVersion:completion:)方法,这是关键!很多人误以为只返回可发布密钥就行,但实际上STPCustomerContext需要通过这个方法获取**Ephemeral Key(临时密钥)**来访问客户的支付信息。

如果你的StripeClient没有正确实现这个方法,或者后端返回的Ephemeral Key无效,支付上下文就会一直卡在加载状态。

给你一个标准的实现示例:

class StripeClient: NSObject, STPCustomerEphemeralKeyProvider {
    static let shared = StripeClient()
    
    func createCustomerKey(withAPIVersion apiVersion: String, completion: @escaping STPJSONResponseCompletionBlock) {
        // 调用你的后端接口获取Ephemeral Key
        let backendURL = URL(string: "https://your-server.com/stripe/ephemeral-key")!
        var request = URLRequest(url: backendURL)
        request.httpMethod = "POST"
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        
        // 传递Stripe要求的API版本参数
        let params = ["api_version": apiVersion]
        request.httpBody = try? JSONSerialization.data(withJSONObject: params)
        
        URLSession.shared.dataTask(with: request) { data, response, error in
            if let error = error {
                completion(nil, error)
                return
            }
            guard let data = data else {
                let noDataError = NSError(domain: "StripeClient", code: -1, userInfo: [NSLocalizedDescriptionKey: "未获取到数据"])
                completion(nil, noDataError)
                return
            }
            do {
                let json = try JSONSerialization.jsonObject(with: data) as? [String: Any]
                completion(json, nil)
            } catch {
                completion(nil, error)
            }
        }.resume()
    }
}

2. 验证可发布密钥的设置和环境匹配

确保你在AppDelegate里设置的是对应环境的可发布密钥:

  • 测试环境用pk_test_xxx
  • 生产环境用pk_live_xxx

可以在设置后加个日志确认:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    STPPaymentConfiguration.shared().publishableKey = "你的可发布密钥"
    print("Stripe Publishable Key: \(STPPaymentConfiguration.shared().publishableKey ?? "未设置")")
    return true
}

3. 避免强制解包,添加代理监听错误

你代码里用了customerContext!强制解包,万一customerContext初始化失败,会导致后续逻辑异常。建议改成可选绑定,同时设置STPPaymentContextDelegate来捕获具体错误:

// 先让视图控制器遵守STPPaymentContextDelegate
class YourViewController: UIViewController, STPPaymentContextDelegate {
    var paymentContext: STPPaymentContext?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        if let customerContext = STPCustomerContext(keyProvider: StripeClient.shared) {
            paymentContext = STPPaymentContext(customerContext: customerContext)
            paymentContext?.delegate = self // 设置代理
        } else {
            print("初始化STPCustomerContext失败")
        }
    }
    
    // 实现代理方法,捕获错误
    func paymentContext(_ paymentContext: STPPaymentContext, didFailWithError error: Error) {
        print("支付上下文错误: \(error.localizedDescription)")
        // 这里可以给用户显示错误提示
    }
    
    func paymentContextDidChange(_ paymentContext: STPPaymentContext) {
        print("支付上下文状态更新")
        // 可以在这里检查加载状态,做对应处理
    }
}

通过代理方法,你能直接看到具体的错误信息(比如网络问题、密钥无效、客户不存在等),这比只看加载界面要容易排查得多。

4. 检查网络和后端服务

确保设备有正常的网络连接,同时你的后端服务能正常访问Stripe的API,返回有效的Ephemeral Key。如果后端返回错误或者密钥过期,支付上下文也会一直加载。

5. 确认Stripe SDK版本兼容性

如果你的SDK版本比较旧,可能和新的Stripe API不兼容。建议更新到最新版本的Stripe iOS SDK,同时参考官方最新的预构建UI集成文档。

内容的提问来源于stack exchange,提问作者ManLikeKip

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:55:03