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

Swift集成Stripe时FundsVC不遵循STPAddCardViewControllerDelegate协议问题

Stripe iOS集成报错及Done按钮无法启用解决方案

前两个报错修复

1. 协议不匹配报错修复

新版Stripe iOS SDK已经废弃了didCreateToken的STPAddCardViewControllerDelegate代理方法,替换为返回STPPaymentMethod的方法,你更新后的代理方法是正确的,注意必须保留@objc标记,因为Stripe底层为OC实现,无该标记会导致代理方法无法被识别,依然报协议不匹配错误。

2. STPPaymentConfiguration调用报错修复

新版SDK中STPPaymentConfiguration的全局实例从方法shared()改为属性shared,去掉调用的括号即可:

// 错误写法
let config = STPPaymentConfiguration.shared()
// 正确写法
let config = STPPaymentConfiguration.shared

STPAddCardViewController的Done按钮无法启用修复

按优先级排查以下问题:

  • 密钥未配置:这是最高发的原因,使用Stripe所有UI组件前必须配置发布密钥,建议在App启动时(如application:didFinishLaunchingWithOptions:方法中)添加配置:
    STPPaymentConfiguration.shared.publishableKey = "你的测试/生产发布密钥(pk_开头)"
    
    未配置密钥时表单校验逻辑不会触发,Done按钮会永久处于不可用状态。
  • 必填字段未填全:你的代码中设置了requiredBillingAddressFields = .full,要求填写完整账单地址,除卡号、有效期、CVV外,姓名、地址、邮编、国家等所有字段都要符合格式要求:
    测试环境可使用Stripe官方测试卡:4242 4242 4242 4242,有效期填任意未来日期,CVV填任意3位数字,账单地址可填符合美国格式的测试数据(如邮编填10001)即可触发校验通过。
  • SDK版本过旧:旧版Stripe SDK存在已知的表单校验Bug,可将Stripe iOS SDK升级到最新稳定版后重试,如果无特殊兼容需求,更推荐使用Stripe官方当前主推的PaymentSheet组件替代已被逐步废弃的STPAddCardViewController。
  • 代理方法签名错误:检查代理方法的参数、返回值是否完全匹配SDK定义,拼写错误会导致代理未被正确识别,影响表单提交逻辑。

修正后完整代码示例

import Stripe

class FundsVC: UIViewController, STPAddCardViewControllerDelegate {

    @IBAction func stripePaymentBtn(_ sender: Any) {
        // 修复config调用错误
        let config = STPPaymentConfiguration.shared
        config.requiredBillingAddressFields = .full
        let viewController = STPAddCardViewController(configuration: config, theme: STPTheme.default())
        viewController.delegate = self
        let navigationController = UINavigationController(rootViewController: viewController)
        present(navigationController, animated: true)
    }

    // MARK: - STPAddCardViewControllerDelegate
    func addCardViewControllerDidCancel(_ addCardViewController: STPAddCardViewController) {
        dismiss(animated: true)
    }

    @objc
    func addCardViewController(_ addCardViewController: STPAddCardViewController, didCreatePaymentMethod paymentMethod: STPPaymentMethod, completion: @escaping STPErrorBlock) {
        dismiss(animated: true)
        // 后续可将paymentMethod传给你的后端完成扣费流程
        completion(nil)
    }
}

注意:获取到paymentMethod后必须调用completion回调传nil或者error对象,漏调用会导致页面卡住。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 19:27:04