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
相关产品推荐
相关产品推荐

