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

iOS Swift中Stripe支付Sheet崩溃及密钥格式错误问题排查

问题排查与修复方案

核心崩溃原因

你遇到的断言失败是因为初始化PaymentSheet时使用了错误的密钥类型:

  • PaymentSheet要求传入的是支付意图(Payment Intent)返回的客户端密钥(client_secret),格式为pi_xxx_secret_xxx
  • 但你在viewDidLoad里直接用了服务器端的Stripe秘钥(Constants.secret_Key,通常是sk_开头),这完全不符合客户端密钥的格式规范

同时你的流程逻辑存在问题:支付意图还未创建完成,就提前用错误的密钥初始化了PaymentSheet,导致打开时崩溃。


具体修复步骤

1. 修正支付意图API的解析与PaymentSheet初始化逻辑

在postRequestForPayment方法中,解析支付意图响应里的client_secret字段,并用它来初始化PaymentSheet,而不是提前在viewDidLoad中初始化:

func postRequestForPayment(customerID: String, amount: Int) {
    let headers: HTTPHeaders = [
        Constants.authorization: Constants.bearer,
    ]

    let params: [String: Any] = [
        Constants.Params.customer: customerID,
        Constants.Params.amount: amount,
        Constants.Params.currency: Constants.Params.usd
    ]

    AF.request(Constants.stripeBaseURL + Constants.payment_intents, method: .post, parameters: params, encoding: URLEncoding.httpBody, headers: headers)
        .validate(statusCode: 200..<300)
        .response { [self] response in
            switch response.result {
            case .success(let value):
                if let jsonData = value {
                    do {
                        let json = try JSON(data: jsonData)
                        // 关键:解析支付意图的client_secret,而非id
                        if let clientSecret = json["client_secret"].string {
                            // 用正确的客户端密钥初始化PaymentSheet
                            let configuration = PaymentSheet.Configuration()
                            paymentSheet = PaymentSheet(paymentIntentClientSecret: clientSecret, configuration: configuration)
                            // 初始化完成后再打开支付面板
                            openPaymentSheet()
                            print("Payment Intent Client Secret: \(clientSecret)")
                        } else {
                            print("Payment Intent client_secret字段未找到")
                        }
                    } catch {
                        print("支付意图JSON解析错误: \(error.localizedDescription)")
                    }
                } else {
                    print("支付意图响应格式异常")
                }

            case .failure(let error):
                if let data = response.data, let errorMessage = String(data: data, encoding: .utf8) {
                    print("支付意图请求错误: \(errorMessage)")
                } else {
                    print("支付意图请求错误: \(error.localizedDescription)")
                }
            }
        }
}

2. 移除viewDidLoad中的错误初始化代码

删除viewDidLoad里提前初始化PaymentSheet的代码,等待支付意图创建完成后再初始化:

override func viewDidLoad() {
    super.viewDidLoad()
    xibRegister()
    setUI()
    // 移除以下两行错误代码
    // let configuration = PaymentSheet.Configuration()
    // paymentSheet = PaymentSheet(paymentIntentClientSecret: Constants.secret_Key, configuration: configuration)
}

3. 额外检查项

  • 确认Constants.secret_Key是服务器端秘钥(sk_开头),绝对不能在客户端代码中暴露,只能用于服务器端调用Stripe API
  • 打印支付意图API的完整响应,确认返回结果中确实包含client_secret字段

内容的提问来源于stack exchange,提问作者M. Ameen Akbar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 12:04:55