支付回调发生异常
var resHandler = new TenPayNotifyHandler(HttpContext);
var orderReturnJson = await resHandler.DecryptGetObjectAsync(false);
更新到最新的版本(Senparc.Weixin.TenPayV3 2.6.1)发生异常信息,我看异常信息应该是JSON 反序列化时类型不匹配
错误位置:$.promotion_detail[0].wechatpay_contribute(JSON 中第一个优惠详情的 wechatpay_contribute 字段)
预期类型:string(字符串)
实际类型:number(数字,如 100)
C# 模型中 wechatpay_contribute 属性定义为 string,但微信支付返回的 JSON 中该字段是数字(例如 0 或 100),导致反序列化失败。
需做个兼容设置或直接改成int类型(wechatpay_contribute,merchant_contribute ,other_contribute )
System.Text.Json.JsonException: The JSON value could not be converted to System.String. Path: $.promotion_detail[0].wechatpay_contribute | LineNumber: 0 | BytePositionInLine: 604. ---> System.InvalidOperationException: Cannot get the value of a token type 'Number' as a string. at System.Text.Json.ThrowHelper.ThrowInvalidOperationException_ExpectedString(JsonTokenType tokenType) at System.Text.Json.Serialization.Metadata.JsonPropertyInfo1.ReadJsonAndSetMember(Object obj, ReadStack& state, Utf8JsonReader& reader) at System.Text.Json.Serialization.Converters.ObjectDefaultConverter1.OnTryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value) at System.Text.Json.Serialization.JsonConverter1.TryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value, Boolean& isPopulatedValue) at System.Text.Json.Serialization.JsonCollectionConverter2.OnTryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, TCollection& value) at System.Text.Json.Serialization.JsonConverter1.TryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value, Boolean& isPopulatedValue) at System.Text.Json.Serialization.Metadata.JsonPropertyInfo1.ReadJsonAndSetMember(Object obj, ReadStack& state, Utf8JsonReader& reader) at System.Text.Json.Serialization.Converters.ObjectDefaultConverter1.OnTryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value) at System.Text.Json.Serialization.JsonConverter1.ReadCore(Utf8JsonReader& reader, T& value, JsonSerializerOptions options, ReadStack& state) --- End of inner exception stack trace --- at System.Text.Json.ThrowHelper.ReThrowWithPath(ReadStack& state, Utf8JsonReader& reader, Exception ex) at System.Text.Json.Serialization.JsonConverter1.ReadCore(Utf8JsonReader& reader, T& value, JsonSerializerOptions options, ReadStack& state) at System.Text.Json.JsonSerializer.ReadFromSpan[TValue](ReadOnlySpan1 json, JsonTypeInfo1 jsonTypeInfo) at System.Text.Json.JsonSerializer.Deserialize[TValue](String json, JsonSerializerOptions options) at Senparc.CO2NET.Helpers.SerializerHelper.GetObject[T](String jsonString) at Senparc.Weixin.TenPayV3.TenPayNotifyHandler.AesGcmDecryptGetObjectAsync[T](String nonce, String associated_data, Boolean isTenPayPubKey) at Senparc.Weixin.TenPayV3.TenPayNotifyHandler.DecryptGetObjectAsync[T](Boolean isPublicKey, String nonce, String associated_data) at X.Manager.Areas.WeChat.Controllers.TenPayController.Notify(String appid) in WeChat\Controllers\TenPayController.cs:line 36 at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.TaskOfIActionResultExecutor.Execute(ActionContext actionContext, IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask1 actionResultValueTask) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync() --- End of stack trace from previous location --- at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|26_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
Source: JeffreySu/WeiXinMPSDK