iOS集成PayPal-Braintree支付时BTAPIClient可选类型解包报错如何解决
Braintree集成报错解决方案
问题根因
你遇到的报错本质是Swift可选类型的类型匹配问题:
你定义的braintreeClient是可选类型BTAPIClient?,而BTPayPalDriver初始化要求传入非可选的BTAPIClient实例,直接传可选值就会触发该报错。另外你当前的代码还有两个隐藏问题会导致后续报错:
- 初始化
BTAPIClient的授权字符串末尾多了一个空格,会直接导致初始化失败,braintreeClient变成nil - 你实现的
BTViewControllerPresentingDelegate代理方法是空的,就算解包成功也无法弹出支付页面
修正方案
你可以用guard let安全解包可选值,同时补全代理逻辑、修正授权字符串即可,核心代码修改如下:
import UIKit import Braintree class MyViewController: UIViewController { // 可以保持可选类型 var braintreeClient: BTAPIClient? override func viewDidLoad() { super.viewDidLoad() // 去掉授权字符串末尾的多余空格 braintreeClient = BTAPIClient(authorization: "sandbox_bnkgmk59_5dxr37xvb54mg8sp") } @IBAction func clickedBtnPay(_ sender: Any) { // 安全解包braintreeClient,解包失败直接终止支付流程 guard let client = braintreeClient else { print("BTAPIClient初始化失败,请检查授权字符串是否正确") return } // 用解包后的非可选值初始化 let payPalDriver = BTPayPalDriver(apiClient: client) payPalDriver.viewControllerPresentingDelegate = self payPalDriver.appSwitchDelegate = self let request = BTPayPalRequest(amount: "2.32") request.currencyCode = "USD" payPalDriver.requestOneTimePayment(request) { (tokenizedPayPalAccount, error) in if let tokenizedPayPalAccount = tokenizedPayPalAccount { print("Got a nonce: \(tokenizedPayPalAccount.nonce)") // 后续处理拿到的nonce传给自己的服务端校验 } else if let error = error { print("支付出错:\(error.localizedDescription)") } else { print("用户取消支付") } } } } extension MyViewController: BTViewControllerPresentingDelegate { func paymentDriver(_ driver: Any, requestsPresentationOf viewController: UIViewController) { // 实现弹出支付页面的逻辑 present(viewController, animated: true) } func paymentDriver(_ driver: Any, requestsDismissalOf viewController: UIViewController) { // 实现关闭支付页面的逻辑 dismiss(animated: true) } } extension MyViewController: BTAppSwitchDelegate { func appSwitcherWillPerformAppSwitch(_ appSwitcher: Any) {} func appSwitcher(_ appSwitcher: Any, didPerformSwitchTo target: BTAppSwitchTarget) {} func appSwitcherWillProcessPaymentInfo(_ appSwitcher: Any) {} }
注意事项
- 不要用
!强制解包可选值,一旦授权字符串错误、环境不匹配导致初始化失败,强制解包会直接触发App崩溃 - 如果你需要切换到生产环境,记得把授权字符串替换为生产环境的client token或tokenization key
- 拿到支付nonce之后需要传递到你的后端服务,调用Braintree的接口完成实际的交易校验和扣款
内容的提问来源于stack exchange,提问作者askit
相关产品推荐
相关产品推荐

