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

PayPal Checkout NET SDK更新带明细订单金额Patch报错咨询

问题根因
  • 直接传入AmountWithBreakdown对象实例报错,是因为SDK默认使用DataContractSerializer序列化Patch请求的Value字段,当Patch的泛型参数为Object时,序列化器未提前注册AmountWithBreakdown为已知类型,因此抛出类型不识别异常。
  • 传入手动构造的JSON字符串报错,是因为SDK会将字符串类型的Value再次做转义序列化,最终提交到PayPal接口的是带转义符的字符串值,而非标准JSON对象,因此触发INVALID_PARAMETER_SYNTAX错误。
可行解决方案

使用结构匹配的匿名类替代官方强类型AmountWithBreakdown作为Value赋值,匿名类无绑定DataContract特性,序列化器会直接按属性结构输出JSON,无需额外注册已知类型,是成本最低的解法。修改后的代码示例如下:

Private Function BuildPatchRequest() As List(Of Patch(Of Object))
    Dim patches = New List(Of Patch(Of Object)) From {
        New Patch(Of Object) With {
            .Op = "replace",
            .Path = "/intent",
            .Value = "CAPTURE"
        },
        New Patch(Of Object) With {
            .Op = "replace",
            .Path = "/purchase_units/@reference_id=='default'/amount",
            ' 构造和AmountWithBreakdown结构完全一致的匿名类
            .Value = New With {
                .currency_code = Me.Order.CurrencyCode,
                .value = Me.Order.Total.ToString("N2"),
                .breakdown = New With {
                    .item_total = New With {.currency_code = Me.Order.CurrencyCode, .value = Me.Order.SubTotal.ToString("N2")},
                    .tax_total = New With {.currency_code = Me.Order.CurrencyCode, .value = Me.Order.TaxTotal.ToString("N2")},
                    .shipping = New With {.currency_code = Me.Order.CurrencyCode, .value = Me.Order.ShippingTotal.ToString("N2")},
                    .discount = New With {.currency_code = Me.Order.CurrencyCode, .value = Me.Order.DiscountTotal.ToString("N2")},
                    .handling = New With {.currency_code = Me.Order.CurrencyCode, .value = Me.Order.HandlingFeeTotal.ToString("N2")},
                    .insurance = New With {.currency_code = Me.Order.CurrencyCode, .value = "0.00"},
                    .shipping_discount = New With {.currency_code = Me.Order.CurrencyCode, .value = "0.00"}
                }
            }
        }
    }
    Return patches
End Function

如果仍有序列化问题,可以先将AmountWithBreakdown对象通过JSON序列化工具转成JsonNode(System.Text.Json)或JObject(Newtonsoft.Json)对象,再赋值给Value字段,可避免序列化器识别类型的问题。

内容的提问来源于stack exchange,提问作者tbrinegar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 05:51:02