Stripe iOS SDK编译报错:STPPaymentResult类型无source成员
报错原因
你的判断准确,该报错是Stripe iOS SDK版本升级导致的接口变更:21.0.0及以上正式版本中,STPPaymentResult类的source属性被完全移除,原有基于Source的旧支付流程接口被废弃,统一替换为PaymentMethod体系的相关接口。
修复方案
方案1:适配新版SDK(推荐)
将原有获取支付凭证的逻辑从读取source改为读取新版的paymentMethod属性,同时同步调整前后端对接的字段名,修改后的代码如下:
func paymentContext(_ paymentContext: STPPaymentContext, didCreatePaymentResult paymentResult: STPPaymentResult, completion: @escaping STPErrorBlock) { // 新版SDK从paymentMethod属性获取支付标识 let paymentMethodId = paymentResult.paymentMethod.stripeId // call api to process payment apiTask?.cancel() showLoading() // 注意将接口参数替换为和后端约定的PaymentMethod字段名 apiTask = PaymentService.topUpBalance(paymentContext.paymentAmount, stripePaymentMethodId: paymentMethodId, completion: { (error) in completion(error) }) }
如果你的后端之前是对接Stripe旧版Source创建Charge的逻辑,需要同步调整后端代码:将入参从Source ID改为接收PaymentMethod ID,调用Stripe官方新版接口创建PaymentIntent完成扣款即可。
- PaymentMethod ID可以直接替代原有Source ID传入Stripe新版支付接口,支付能力完全兼容原有Source支持的卡支付、本地支付等场景
- 适配时不要混用新旧版SDK的接口调用,否则会出现支付状态不匹配、扣款失败等问题
方案2:锁定SDK旧版本(临时兼容)
如果暂时无法调整前后端支付逻辑,可以在项目Podfile中锁定Stripe SDK到最后一个支持source属性的20.x正式版本,添加以下配置后执行pod install即可恢复原有代码编译:
pod 'Stripe', '~> 20.1.0'
注意:该方案仅作临时兼容使用,旧版本SDK不再获得官方安全更新,也无法支持后续新增的支付方式,建议尽快完成新版接口适配。
内容的提问来源于stack exchange,提问作者davidwim
相关产品推荐
相关产品推荐

