diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/GetMerchantServiceComplaintByComplaintIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/GetMerchantServiceComplaintByComplaintIdResponse.cs index 63fbccb5..0386869f 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/GetMerchantServiceComplaintByComplaintIdResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/GetMerchantServiceComplaintByComplaintIdResponse.cs @@ -74,6 +74,38 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models [System.Text.Json.Serialization.JsonPropertyName("state")] public string? State { get; set; } } + + public class AdditionalInfo + { + public static class Types + { + public class SharePowerInfo + { + /// + /// 获取或设置归还时间。 + /// + [Newtonsoft.Json.JsonProperty("return_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("return_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? ReturnTime { get; set; } + } + } + + /// + /// 获取或设置补充信息类型。 + /// + [Newtonsoft.Json.JsonProperty("type")] + [System.Text.Json.Serialization.JsonPropertyName("type")] + public string Type { get; set; } = default!; + + /// + /// 获取或设置共享充电宝投诉相关信息。 + /// + [Newtonsoft.Json.JsonProperty("share_power_info")] + [System.Text.Json.Serialization.JsonPropertyName("share_power_info")] + public Types.SharePowerInfo? SharePowerInfo { get; set; } + } } /// @@ -111,6 +143,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// [Newtonsoft.Json.JsonProperty("complainted_mchid")] [System.Text.Json.Serialization.JsonPropertyName("complainted_mchid")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.NumericalStringReadOnlyConverter))] public string? ComplaintedMerchantId { get; set; } /// @@ -198,5 +231,12 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models [Newtonsoft.Json.JsonProperty("service_order_info")] [System.Text.Json.Serialization.JsonPropertyName("service_order_info")] public Types.ServiceOrder[]? ServiceOrderList { get; set; } + + /// + /// 获取或设置补充信息。 + /// + [Newtonsoft.Json.JsonProperty("additional_info")] + [System.Text.Json.Serialization.JsonPropertyName("additional_info")] + public Types.AdditionalInfo? AdditionalInfo { get; set; } } } diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintNegotiationHistoriesResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintNegotiationHistoriesResponse.cs index fa320d29..85228b50 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintNegotiationHistoriesResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintNegotiationHistoriesResponse.cs @@ -1,4 +1,5 @@ -using System; +using System; +using Flurl.Http.Configuration; namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models { @@ -66,11 +67,101 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// 获取或设置投诉资料列表。 /// [Newtonsoft.Json.JsonProperty("complaint_media_list")] + [Newtonsoft.Json.JsonConverter(typeof(Converters.ResponsePropertyNegotiationHistoryItemComplaintMediaListNewtonsoftJsonConverter))] [System.Text.Json.Serialization.JsonPropertyName("complaint_media_list")] + [System.Text.Json.Serialization.JsonConverter(typeof(Converters.ResponsePropertyNegotiationHistoryItemComplaintMediaListSystemTextJsonConverter))] public Types.ComplaintMedia[]? ComplaintMediaList { get; set; } } } + internal static class Converters + { + internal class ResponsePropertyNegotiationHistoryItemComplaintMediaListNewtonsoftJsonConverter : Newtonsoft.Json.JsonConverter + { + public override bool CanWrite + { + get { return false; } + } + + public override Types.NegotiationHistory.Types.ComplaintMedia[]? ReadJson(Newtonsoft.Json.JsonReader reader, Type objectType, Types.NegotiationHistory.Types.ComplaintMedia[]? existingValue, bool hasExistingValue, Newtonsoft.Json.JsonSerializer serializer) + { + /* + * NOTICE: + * 2023-03-07 微信支付调整了返回结果的数据结构。 + * 原 "complaint_media_list" 字段是数组形式,现改为对象形式。 + * 此转换器为了适配并同时兼容新旧两种数据结构。 + */ + + 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.NegotiationHistory.Types.ComplaintMedia[] array = new Types.NegotiationHistory.Types.ComplaintMedia[1]; + array[0] = serializer.Deserialize(reader)!; + return array; + } + } + + throw new Newtonsoft.Json.JsonException(); + } + + public override void WriteJson(Newtonsoft.Json.JsonWriter writer, Types.NegotiationHistory.Types.ComplaintMedia[]? value, Newtonsoft.Json.JsonSerializer serializer) + { + throw new NotImplementedException(); + } + } + + internal class ResponsePropertyNegotiationHistoryItemComplaintMediaListSystemTextJsonConverter : System.Text.Json.Serialization.JsonConverter + { + public override Types.NegotiationHistory.Types.ComplaintMedia[]? Read(ref System.Text.Json.Utf8JsonReader reader, Type typeToConvert, System.Text.Json.JsonSerializerOptions options) + { + /* + * NOTICE: + * 2023-03-07 微信支付调整了返回结果的数据结构。 + * 原 "complaint_media_list" 字段是数组形式,现改为对象形式。 + * 此转换器为了适配并同时兼容新旧两种数据结构。 + */ + + 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.NegotiationHistory.Types.ComplaintMedia[] array = new Types.NegotiationHistory.Types.ComplaintMedia[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.NegotiationHistory.Types.ComplaintMedia[]? value, System.Text.Json.JsonSerializerOptions options) + { + writer.WriteRawValue(System.Text.Json.JsonSerializer.Serialize(value, typeof(Types.NegotiationHistory.Types.ComplaintMedia[]), options)); + } + } + } + /// /// 获取或设置投诉协商历史列表。 /// diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintsResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintsResponse.cs index a2d45905..f324f407 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintsResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintsResponse.cs @@ -21,6 +21,14 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models public class ComplaintMedia : GetMerchantServiceComplaintByComplaintIdResponse.Types.ComplaintMedia { } + + public class ServiceOrder : GetMerchantServiceComplaintByComplaintIdResponse.Types.ServiceOrder + { + } + + public class AdditionalInfo : GetMerchantServiceComplaintByComplaintIdResponse.Types.AdditionalInfo + { + } } /// @@ -58,6 +66,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// [Newtonsoft.Json.JsonProperty("complainted_mchid")] [System.Text.Json.Serialization.JsonPropertyName("complainted_mchid")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.NumericalStringReadOnlyConverter))] public string? ComplaintedMerchantId { get; set; } /// @@ -138,10 +147,20 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models [Newtonsoft.Json.JsonProperty("user_tag_list")] [System.Text.Json.Serialization.JsonPropertyName("user_tag_list")] public string[]? UserTagList { get; set; } - } - public class ServiceOrder : GetMerchantServiceComplaintByComplaintIdResponse.Types.ServiceOrder - { + /// + /// 获取或设置关联服务单列表。 + /// + [Newtonsoft.Json.JsonProperty("service_order_info")] + [System.Text.Json.Serialization.JsonPropertyName("service_order_info")] + public Types.ServiceOrder[]? ServiceOrderList { get; set; } + + /// + /// 获取或设置补充信息。 + /// + [Newtonsoft.Json.JsonProperty("additional_info")] + [System.Text.Json.Serialization.JsonPropertyName("additional_info")] + public Types.AdditionalInfo? AdditionalInfo { get; set; } } } @@ -152,13 +171,6 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models [System.Text.Json.Serialization.JsonPropertyName("data")] public Types.Complaint[] ComplaintList { get; set; } = default!; - /// - /// 获取或设置关联服务单列表。 - /// - [Newtonsoft.Json.JsonProperty("service_order_info")] - [System.Text.Json.Serialization.JsonPropertyName("service_order_info")] - public Types.ServiceOrder[]? ServiceOrderList { get; set; } - /// /// 获取或设置分页大小。 /// diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/GetMerchantServiceComplaintByComplaintIdResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/GetMerchantServiceComplaintByComplaintIdResponse.json index 6a61b15c..0450e886 100644 --- a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/GetMerchantServiceComplaintByComplaintIdResponse.json +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/GetMerchantServiceComplaintByComplaintIdResponse.json @@ -1,9 +1,9 @@ -{ +{ "complaint_id": "200201820200101080076610000", "complaint_time": "2015-05-20T13:29:35.120+08:00", "complaint_detail": "反馈一个重复扣费的问题", - "complaint_state": "PENDING", "complainted_mchid": "1900012181", + "complaint_state": "PENDING", "payer_phone": "sGdNeTHMQGlxCWiUyHu6XNO9GCYln2Luv4HhwJzZBfcL12sB", "payer_openid": "oUpF8uMuAJO_M2pxb1Q9zNjWeS6o", "complaint_media_list": [ @@ -21,15 +21,21 @@ "amount": 3 } ], - "complaint_full_refunded": true, - "incoming_user_response": true, - "problem_description": "不满意商家服务", - "user_complaint_times": 1, "service_order_info": [ { "order_id": "15646546545165651651", "out_order_no": "1234323JKHDFE1243252", - "state": "CREATED" + "state": "DOING" } - ] + ], + "complaint_full_refunded": true, + "incoming_user_response": true, + "problem_description": "不满意商家服务", + "user_complaint_times": 1, + "additional_info": { + "share_power_info": { + "return_time": "2023-02-10T14:44:00+08:00" + }, + "type": "SHARE_POWER_TYPE" + } } diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintNegotiationHistoriesResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintNegotiationHistoriesResponse.json index e3f91912..b88cad9a 100644 --- a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintNegotiationHistoriesResponse.json +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintNegotiationHistoriesResponse.json @@ -1,23 +1,23 @@ -{ +{ "data": [ { - "complaint_media_list": [ - { - "media_type": "USER_COMPLAINT_IMAGE", - "media_url": [ - "https://api.mch.weixin.qq.com/v3/merchant-service/images/xxxxx" - ] - } - ], + "complaint_media_list": { + "media_type": "USER_COMPLAINT_IMAGE", + "media_url": [ + "https://api.mch.weixin.qq.com/v3/merchant-service/images/xxxxx" + ] + }, "log_id": "300285320210322170000071077", "operator": "投诉人", "operate_time": "2015-05-20T13:29:35.120+08:00", "operate_type": "USER_CREATE_COMPLAINT", "operate_details": "已与用户电话沟通解决", - "image_list": ["https://qpic.cn/xxx"] + "image_list": [ + "https://qpic.cn/xxx" + ] } ], - "limit": 10, + "limit": 50, "offset": 50, "total_count": 1000 } diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintsResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintsResponse.json index c422e848..2890b699 100644 --- a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintsResponse.json +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintsResponse.json @@ -1,12 +1,34 @@ -{ +{ "data": [ { + "additional_info": { + "share_power_info": { + "return_time": "2023-02-10T14:44:00+08:00" + }, + "type": "SHARE_POWER_TYPE" + }, "complaint_id": "200201820200101080076610000", "complaint_time": "2015-05-20T13:29:35.120+08:00", "complaint_detail": "反馈一个重复扣费的问题", "complaint_state": "PENDING", - "complainted_mchid": "1900012181", "payer_phone": "Qe41VhP/sGdNeTHMQGlxCWiUyHu6XNO9GCYln2Luv4HhwJzZBfcL12sB+PgZcS5NhePBog30NgJ1xRaK+gbGDKwpg==", + "complaint_order_info": [ + { + "transaction_id": "4200000404201909069117582536", + "out_trade_no": "20190906154617947762231", + "amount": 3 + } + ], + "service_order_info": [ + { + "order_id": "15646546545165651651", + "out_order_no": "1234323JKHDFE1243252", + "state": "DOING" + } + ], + "complaint_full_refunded": true, + "incoming_user_response": true, + "user_complaint_times": 1, "complaint_media_list": [ { "media_type": "USER_COMPLAINT_IMAGE", @@ -15,32 +37,10 @@ ] } ], - "complaint_order_info": [ - { - "transaction_id": "4200000404201909069117582536", - "out_trade_no": "20190906154617947762231", - "amount": 3 - }, - { - "transaction_id": "4200000404201909069117582836", - "out_trade_no": "20190906154617947762291", - "amount": 4 - } - ], - "complaint_full_refunded": true, - "incoming_user_response": true, - "problem_description": "不满意商家服务", - "user_complaint_times": 1 + "problem_description": "不满意商家服务" } ], "limit": 5, "offset": 10, - "total_count": 1000, - "service_order_info": [ - { - "order_id": "15646546545165651651", - "out_order_no": "1234323JKHDFE1243252", - "state": "CREATED" - } - ] + "total_count": 1000 }