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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 07:57:06