From bff3d94f6dbf92fb8c57ec5de1ecde77b9e46210 Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Tue, 29 Apr 2025 23:22:10 +0800 Subject: [PATCH] =?UTF-8?q?fix(wxapi):=20=E4=BF=AE=E5=A4=8D=E5=B0=8F?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=94=A8=E6=88=B7=E4=BA=A4=E6=98=93=E7=B1=BB?= =?UTF-8?q?=E6=8A=95=E8=AF=89=E5=9B=9E=E8=B0=83=E9=80=9A=E7=9F=A5=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E5=AE=9A=E4=B9=89=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WxaMiniShop/ComplaintCallbackEvent.cs | 479 ++++++++++++++++-- .../WxaMiniShop/ComplaintCallbackEvent.1.json | 26 + .../WxaMiniShop/ComplaintCallbackEvent.2.json | 28 + 3 files changed, 494 insertions(+), 39 deletions(-) create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/WxaMiniShop/ComplaintCallbackEvent.1.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/WxaMiniShop/ComplaintCallbackEvent.2.json diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Events/WxaMiniShop/ComplaintCallbackEvent.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/WxaMiniShop/ComplaintCallbackEvent.cs index e82efd3f..fa1fe270 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/Events/WxaMiniShop/ComplaintCallbackEvent.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/WxaMiniShop/ComplaintCallbackEvent.cs @@ -1,3 +1,5 @@ +using System; + namespace SKIT.FlurlHttpClient.Wechat.Api.Events { /// @@ -9,6 +11,8 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Events /// public class ComplaintCallbackEvent : WechatApiEvent { + private readonly object _lockObj = new object(); + public static class Types { public class EventData @@ -22,6 +26,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Events /// [Newtonsoft.Json.JsonProperty("time")] [System.Text.Json.Serialization.JsonPropertyName("time")] + [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)] [System.Xml.Serialization.XmlElement("time")] public long Timestamp { get; set; } @@ -46,150 +51,546 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Events /// /// 获取或设置小程序 AppId。 /// - [Newtonsoft.Json.JsonProperty("appid")] - [System.Text.Json.Serialization.JsonPropertyName("appid")] + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] [System.Xml.Serialization.XmlElement("appid")] public string AppId { get; set; } = default!; /// /// 获取或设置事件通知类型。 /// - [Newtonsoft.Json.JsonProperty("option_type")] - [System.Text.Json.Serialization.JsonPropertyName("option_type")] + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] [System.Xml.Serialization.XmlElement("option_type")] public string OptionType { get; set; } = default!; /// /// 获取或设置投诉单号。 /// - [Newtonsoft.Json.JsonProperty("complaint_order_id")] - [System.Text.Json.Serialization.JsonPropertyName("complaint_order_id")] - [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling - .AllowReadingFromString)] + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] [System.Xml.Serialization.XmlElement("complaint_order_id")] public long ComplaintOrderId { get; set; } /// /// 获取或设置用户 OpenId。 /// - [Newtonsoft.Json.JsonProperty("open_id")] - [System.Text.Json.Serialization.JsonPropertyName("open_id")] + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] [System.Xml.Serialization.XmlElement("open_id")] public string OpenId { get; set; } = default!; /// /// 获取或设置投诉问题类型。 /// - [Newtonsoft.Json.JsonProperty("type")] - [System.Text.Json.Serialization.JsonPropertyName("type")] + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] [System.Xml.Serialization.XmlElement("type")] public int Type { get; set; } /// /// 获取或设置订单状态。 /// - [Newtonsoft.Json.JsonProperty("status")] - [System.Text.Json.Serialization.JsonPropertyName("status")] + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] [System.Xml.Serialization.XmlElement("status")] public int Status { get; set; } /// /// 获取或设置用户手机号码。 /// - [Newtonsoft.Json.JsonProperty("phone_number")] - [System.Text.Json.Serialization.JsonPropertyName("phone_number")] - [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.NumericalStringConverter))] + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] [System.Xml.Serialization.XmlElement("phone_number")] public string PhoneNumber { get; set; } = default!; /// /// 获取或设置投诉材料内容。 /// - [Newtonsoft.Json.JsonProperty("customer_material_content")] - [System.Text.Json.Serialization.JsonPropertyName("customer_material_content")] + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] [System.Xml.Serialization.XmlElement("customer_material_content", IsNullable = true)] public string? CustomerMaterialContent { get; set; } /// /// 获取或设置投诉材料图片 MediaId 列表字符串(以逗号分隔)。 /// - [Newtonsoft.Json.JsonProperty("customer_material_media_id_list")] - [System.Text.Json.Serialization.JsonPropertyName("customer_material_media_id_list")] + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] [System.Xml.Serialization.XmlElement("customer_material_media_id_list", IsNullable = true)] public string? CustomerMaterialMediaIdListString { get; set; } /// /// 获取或设置订单号。 /// - [Newtonsoft.Json.JsonProperty("order_id")] - [System.Text.Json.Serialization.JsonPropertyName("order_id")] + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] [System.Xml.Serialization.XmlElement("order_id")] public string OrderId { get; set; } = default!; /// /// 获取或设置商户订单号。 /// - [Newtonsoft.Json.JsonProperty("out_trade_no")] - [System.Text.Json.Serialization.JsonPropertyName("out_trade_no")] + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] [System.Xml.Serialization.XmlElement("out_trade_no")] public string OutTradeNumber { get; set; } = default!; /// /// 获取或设置商品名称。 /// - [Newtonsoft.Json.JsonProperty("product_name")] - [System.Text.Json.Serialization.JsonPropertyName("product_name")] + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] [System.Xml.Serialization.XmlElement("product_name")] public string ProductName { get; set; } = default!; /// /// 获取或设置支付时间戳。 /// - [Newtonsoft.Json.JsonProperty("pay_time")] - [System.Text.Json.Serialization.JsonPropertyName("pay_time")] + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] [System.Xml.Serialization.XmlElement("pay_time")] public long PayTimestamp { get; set; } /// /// 获取或设置交易金额(单位:分)。 /// - [Newtonsoft.Json.JsonProperty("total_cost")] - [System.Text.Json.Serialization.JsonPropertyName("total_cost")] + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] [System.Xml.Serialization.XmlElement("total_cost")] public int TotalCost { get; set; } /// /// 获取或设置投诉发起时间戳。 /// - [Newtonsoft.Json.JsonProperty("create_time")] - [System.Text.Json.Serialization.JsonPropertyName("create_time")] + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] [System.Xml.Serialization.XmlElement("create_time")] public long ComplaintCreateTimestamp { get; set; } /// /// 获取或设置投诉状态过期时间戳。 /// - [Newtonsoft.Json.JsonProperty("expire_time")] - [System.Text.Json.Serialization.JsonPropertyName("expire_time")] + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] [System.Xml.Serialization.XmlElement("expire_time")] public long ComplaintStatusExpireTimestamp { get; set; } /// /// 获取或设置投诉进度列表。 /// - [Newtonsoft.Json.JsonProperty("history")] - [System.Text.Json.Serialization.JsonPropertyName("history")] + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] [System.Xml.Serialization.XmlElement("history", Type = typeof(Types.ComplaintHistory))] public Types.ComplaintHistory[] ComplaintHistoryList { get; set; } = default!; } } + internal static class Converters + { + internal class EventPropertyComplaintHistoryListNewtonsoftJsonConverter : Newtonsoft.Json.JsonConverter + { + public override bool CanWrite + { + get { return false; } + } + + public override Types.EventData.Types.ComplaintHistory[]? ReadJson(Newtonsoft.Json.JsonReader reader, Type objectType, Types.EventData.Types.ComplaintHistory[]? existingValue, bool hasExistingValue, Newtonsoft.Json.JsonSerializer serializer) + { + /* + * NOTICE: + * "history" 字段有时是对象形式,有时是数组形式。 + * 此转换器为了同时兼容这两种数据结构。 + */ + + switch (reader.TokenType) + { + case Newtonsoft.Json.JsonToken.Null: + { + return existingValue; + } + + case Newtonsoft.Json.JsonToken.StartArray: + { + return serializer.Deserialize(reader); + } + + case Newtonsoft.Json.JsonToken.StartObject: + { + Types.EventData.Types.ComplaintHistory[] array = new Types.EventData.Types.ComplaintHistory[1]; + array[0] = serializer.Deserialize(reader)!; + return array; + } + } + + throw new Newtonsoft.Json.JsonException(); + } + + public override void WriteJson(Newtonsoft.Json.JsonWriter writer, Types.EventData.Types.ComplaintHistory[]? value, Newtonsoft.Json.JsonSerializer serializer) + { + throw new NotImplementedException(); + } + } + + internal class EventPropertyComplaintHistoryListSystemTextJsonConverter : System.Text.Json.Serialization.JsonConverter + { + public override Types.EventData.Types.ComplaintHistory[]? Read(ref System.Text.Json.Utf8JsonReader reader, Type typeToConvert, System.Text.Json.JsonSerializerOptions options) + { + /* + * NOTICE: + * "history" 字段有时是对象形式,有时是数组形式。 + * 此转换器为了同时兼容这两种数据结构。 + */ + + switch (reader.TokenType) + { + case System.Text.Json.JsonTokenType.Null: + { + return default; + } + + case System.Text.Json.JsonTokenType.StartArray: + { + return System.Text.Json.JsonSerializer.Deserialize(ref reader, options); + } + + case System.Text.Json.JsonTokenType.StartObject: + { + Types.EventData.Types.ComplaintHistory[] array = new Types.EventData.Types.ComplaintHistory[1]; + array[0] = System.Text.Json.JsonSerializer.Deserialize(ref reader, options)!; + return array; + } + } + + throw new System.Text.Json.JsonException(); + } + + public override void Write(System.Text.Json.Utf8JsonWriter writer, Types.EventData.Types.ComplaintHistory[]? value, System.Text.Json.JsonSerializerOptions options) + { + writer.WriteRawValue(System.Text.Json.JsonSerializer.Serialize(value, typeof(Types.EventData.Types.ComplaintHistory[]), options)); + } + } + } + /// /// 获取或设置事件数据。 /// - [Newtonsoft.Json.JsonProperty("BussiCallBackInfo")] - [System.Text.Json.Serialization.JsonPropertyName("BussiCallBackInfo")] + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] [System.Xml.Serialization.XmlElement("BussiCallBackInfo")] public Types.EventData EventData { get; set; } = default!; + + /// + /// 获取或设置小程序 AppId。 + /// 等效于 + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + [System.Xml.Serialization.XmlIgnore] + public string AppId + { + get { return this.EventData?.AppId ?? default!; } + set + { + EnsureEventDataInitialized(); + this.EventData.AppId = value!; + } + } + + /// + /// 获取或设置事件通知类型。 + /// 等效于 + /// + [Newtonsoft.Json.JsonProperty("option_type")] + [System.Text.Json.Serialization.JsonPropertyName("option_type")] + [System.Xml.Serialization.XmlIgnore] + public string OptionType + { + get { return this.EventData?.OptionType ?? default!; } + set + { + EnsureEventDataInitialized(); + this.EventData.OptionType = value!; + } + } + + /// + /// 获取或设置投诉单号。 + /// 等效于 + /// + [Newtonsoft.Json.JsonProperty("complaint_order_id")] + [System.Text.Json.Serialization.JsonPropertyName("complaint_order_id")] + [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)] + [System.Xml.Serialization.XmlIgnore] + public long ComplaintOrderId + { + get { return this.EventData?.ComplaintOrderId ?? default; } + set + { + EnsureEventDataInitialized(); + this.EventData.ComplaintOrderId = value; + } + } + + /// + /// 获取或设置用户 OpenId。 + /// 等效于 + /// + [Newtonsoft.Json.JsonProperty("open_id")] + [System.Text.Json.Serialization.JsonPropertyName("open_id")] + [System.Xml.Serialization.XmlIgnore] + public string OpenId + { + get { return this.EventData?.OpenId ?? default!; } + set + { + EnsureEventDataInitialized(); + this.EventData.OpenId = value!; + } + } + + /// + /// 获取或设置投诉问题类型。 + /// 等效于 + /// + [Newtonsoft.Json.JsonProperty("type")] + [System.Text.Json.Serialization.JsonPropertyName("type")] + [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)] + [System.Xml.Serialization.XmlIgnore] + public int Type + { + get { return this.EventData?.Type ?? default; } + set + { + EnsureEventDataInitialized(); + this.EventData.Type = value; + } + } + + /// + /// 获取或设置订单状态。 + /// 等效于 + /// + [Newtonsoft.Json.JsonProperty("status")] + [System.Text.Json.Serialization.JsonPropertyName("status")] + [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)] + [System.Xml.Serialization.XmlIgnore] + public int Status + { + get { return this.EventData?.Status ?? default; } + set + { + EnsureEventDataInitialized(); + this.EventData.Status = value; + } + } + + /// + /// 获取或设置用户手机号码。 + /// 等效于 + /// + [Newtonsoft.Json.JsonProperty("phone_number")] + [System.Text.Json.Serialization.JsonPropertyName("phone_number")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.NumericalStringConverter))] + [System.Xml.Serialization.XmlIgnore] + public string PhoneNumber + { + get { return this.EventData?.PhoneNumber ?? default!; } + set + { + EnsureEventDataInitialized(); + this.EventData.PhoneNumber = value!; + } + } + + /// + /// 获取或设置投诉材料内容。 + /// 等效于 + /// + [Newtonsoft.Json.JsonProperty("customer_material_content")] + [System.Text.Json.Serialization.JsonPropertyName("customer_material_content")] + [System.Xml.Serialization.XmlIgnore] + public string? CustomerMaterialContent + { + get { return this.EventData?.CustomerMaterialContent ?? default; } + set + { + EnsureEventDataInitialized(); + this.EventData.CustomerMaterialContent = value; + } + } + + /// + /// 获取或设置投诉材料图片 MediaId 列表字符串(以逗号分隔)。 + /// 等效于 + /// + [Newtonsoft.Json.JsonProperty("customer_material_media_id_list")] + [System.Text.Json.Serialization.JsonPropertyName("customer_material_media_id_list")] + [System.Xml.Serialization.XmlIgnore] + public string? CustomerMaterialMediaIdListString + { + get { return this.EventData?.CustomerMaterialMediaIdListString ?? default; } + set + { + EnsureEventDataInitialized(); + this.EventData.CustomerMaterialMediaIdListString = value; + } + } + + /// + /// 获取或设置订单号。 + /// 等效于 + /// + [Newtonsoft.Json.JsonProperty("order_id")] + [System.Text.Json.Serialization.JsonPropertyName("order_id")] + [System.Xml.Serialization.XmlIgnore] + public string OrderId + { + get { return this.EventData?.OrderId ?? default!; } + set + { + EnsureEventDataInitialized(); + this.EventData.OrderId = value!; + } + } + + /// + /// 获取或设置商户订单号。 + /// 等效于 + /// + [Newtonsoft.Json.JsonProperty("out_trade_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_trade_no")] + [System.Xml.Serialization.XmlIgnore] + public string OutTradeNumber + { + get { return this.EventData?.OutTradeNumber ?? default!; } + set + { + EnsureEventDataInitialized(); + this.EventData.OutTradeNumber = value!; + } + } + + /// + /// 获取或设置商品名称。 + /// 等效于 + /// + [Newtonsoft.Json.JsonProperty("product_name")] + [System.Text.Json.Serialization.JsonPropertyName("product_name")] + [System.Xml.Serialization.XmlIgnore] + public string ProductName + { + get { return this.EventData?.ProductName ?? default!; } + set + { + EnsureEventDataInitialized(); + this.EventData.ProductName = value!; + } + } + + /// + /// 获取或设置支付时间戳。 + /// 等效于 + /// + [Newtonsoft.Json.JsonProperty("pay_time")] + [System.Text.Json.Serialization.JsonPropertyName("pay_time")] + [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)] + [System.Xml.Serialization.XmlIgnore] + public long PayTimestamp + { + get { return this.EventData?.PayTimestamp ?? default; } + set + { + EnsureEventDataInitialized(); + this.EventData.PayTimestamp = value; + } + } + + /// + /// 获取或设置交易金额(单位:分)。 + /// 等效于 + /// + [Newtonsoft.Json.JsonProperty("total_cost")] + [System.Text.Json.Serialization.JsonPropertyName("total_cost")] + [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)] + [System.Xml.Serialization.XmlIgnore] + public int TotalCost + { + get { return this.EventData?.TotalCost ?? default; } + set + { + EnsureEventDataInitialized(); + this.EventData.TotalCost = value; + } + } + + /// + /// 获取或设置投诉发起时间戳。 + /// 等效于 + /// + [Newtonsoft.Json.JsonProperty("create_time")] + [System.Text.Json.Serialization.JsonPropertyName("create_time")] + [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)] + [System.Xml.Serialization.XmlIgnore] + public long ComplaintCreateTimestamp + { + get { return this.EventData?.ComplaintCreateTimestamp ?? default; } + set + { + EnsureEventDataInitialized(); + this.EventData.ComplaintCreateTimestamp = value; + } + } + + /// + /// 获取或设置投诉状态过期时间戳。 + /// 等效于 + /// + [Newtonsoft.Json.JsonProperty("expire_time")] + [System.Text.Json.Serialization.JsonPropertyName("expire_time")] + [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)] + [System.Xml.Serialization.XmlIgnore] + public long ComplaintStatusExpireTimestamp + { + get { return this.EventData?.ComplaintStatusExpireTimestamp ?? default; } + set + { + EnsureEventDataInitialized(); + this.EventData.ComplaintStatusExpireTimestamp = value; + } + } + + /// + /// 获取或设置投诉进度列表。 + /// 等效于 + /// + [Newtonsoft.Json.JsonProperty("history")] + [Newtonsoft.Json.JsonConverter(typeof(Converters.EventPropertyComplaintHistoryListNewtonsoftJsonConverter))] + [System.Text.Json.Serialization.JsonPropertyName("history")] + [System.Text.Json.Serialization.JsonConverter(typeof(Converters.EventPropertyComplaintHistoryListSystemTextJsonConverter))] + [System.Xml.Serialization.XmlIgnore] + public Types.EventData.Types.ComplaintHistory[] ComplaintHistoryList + { + get { return this.EventData?.ComplaintHistoryList ?? default!; } + set + { + EnsureEventDataInitialized(); + this.EventData.ComplaintHistoryList = value!; + } + } + + protected void EnsureEventDataInitialized() + { + if (this.EventData is null) + { + lock (_lockObj) + { + if (this.EventData is null) + { + this.EventData = new Types.EventData(); + } + } + } + } } } diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/WxaMiniShop/ComplaintCallbackEvent.1.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/WxaMiniShop/ComplaintCallbackEvent.1.json new file mode 100644 index 00000000..6af95108 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/WxaMiniShop/ComplaintCallbackEvent.1.json @@ -0,0 +1,26 @@ +{ + "ToUserName": "gh_adcbcb8bf3ba", + "FromUserName": "oR2XT5TrHrdQ1PBpMpEtJ3h9MU4", + "CreateTime": 1744244407, + "MsgType": "event", + "Event": "complaint callback", + "appid": "wxb6cb90b2dd", + "complaint_order_id": "2157", + "create_time": "1744244406", + "expire_time": "1744244406", + "history": { + "time": "1744244406", + "content": "content", + "media_id_list": [] + }, + "open_id": "oR2XT5Z70fuusMRK", + "option_type": "1", + "order_id": "payorder@_4200002656202", + "out_trade_no": "1909917325", + "pay_time": "1744194760", + "phone_number": "1396", + "product_name": "五", + "status": "201", + "total_cost": "5000", + "type": "643" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/WxaMiniShop/ComplaintCallbackEvent.2.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/WxaMiniShop/ComplaintCallbackEvent.2.json new file mode 100644 index 00000000..f5a17dfa --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/WxaMiniShop/ComplaintCallbackEvent.2.json @@ -0,0 +1,28 @@ +{ + "ToUserName": "gh_adcbcb8bf3ba", + "FromUserName": "oR2XT5TrHrdQ1PBpMpEtJ3h9MU4", + "CreateTime": 1744244407, + "MsgType": "event", + "Event": "complaint callback", + "appid": "wxb6cb90b2dd", + "complaint_order_id": "2157", + "create_time": "1744244406", + "expire_time": "1744244406", + "history": [ + { + "time": "1744244406", + "content": "content", + "media_id_list": [] + } + ], + "open_id": "oR2XT5Z70fuusMRK", + "option_type": "1", + "order_id": "payorder@_4200002656202", + "out_trade_no": "1909917325", + "pay_time": "1744194760", + "phone_number": "1396", + "product_name": "五", + "status": "201", + "total_cost": "5000", + "type": "643" +}