Stripe支付STPPaymentMethodParams编码错误:需遵循Encodable协议
解决STPPaymentMethodParams JSON编码错误问题
问题根源
STPPaymentMethodParams仅实现了Stripe自定义的STPFormEncodable协议,并未遵守系统的Encodable协议,所以直接调用JSONEncoder的encode(_:)方法尝试编码该类型实例时,会触发类型不匹配的错误。
解决方案
方案一:利用STPFormEncodable的原生编码能力
修改PaymentMethodParamsWrapper的encode(to:)方法,先通过STPFormEncodable的formEncodedParameters()方法将STPPaymentMethodParams转成字典,再编码这个字典:
//MARK: PAYMENT INTENTS struct PaymentMethodParamsWrapper: Encodable { let paymentMethodParams: STPPaymentMethodParams private enum CodingKeys: String, CodingKey { case paymentMethod } func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) // 先转成Stripe支持的编码字典,再编码字典 let paramsDict = paymentMethodParams.formEncodedParameters() try container.encode(paramsDict, forKey: .paymentMethod) } }
方案二:给STPPaymentMethodParams扩展Encodable协议
如果需要在多个地方编码STPPaymentMethodParams,可以给它扩展Encodable,复用STPFormEncodable的实现:
extension STPPaymentMethodParams: Encodable { public func encode(to encoder: Encoder) throws { let paramsDict = self.formEncodedParameters() var container = encoder.singleValueContainer() try container.encode(paramsDict) } }
扩展后,原来的PaymentMethodParamsWrapper代码无需修改,即可正常使用JSONEncoder编码。
验证修改
修改后重新执行你的编码代码:
let paymentMethodParamsWrapper = PaymentMethodParamsWrapper(paymentMethodParams: paymentMethodParams) let paymentMethodParamsData = try JSONEncoder().encode(paymentMethodParamsWrapper) let paymentMethodParamsJson = String(data: paymentMethodParamsData, encoding: .utf8)!
即可成功生成符合要求的JSON字符串。
内容的提问来源于stack exchange,提问作者anish1
相关产品推荐
相关产品推荐

