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:方法中)添加配置:
未配置密钥时表单校验逻辑不会触发,Done按钮会永久处于不可用状态。STPPaymentConfiguration.shared.publishableKey = "你的测试/生产发布密钥(pk_开头)" - 必填字段未填全:你的代码中设置了
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
相关产品推荐
相关产品推荐

