From d2948a7e43e58b069cdc0616672a26c705f98dac Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Mon, 7 Apr 2025 19:28:57 +0800 Subject: [PATCH] =?UTF-8?q?feat(wxapi):=20=E6=96=B0=E5=A2=9E=E5=BE=AE?= =?UTF-8?q?=E4=BF=A1=E5=B0=8F=E5=BA=97=E6=8D=A2=E8=B4=A7=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...echatApiClientExecuteChannelsExtensions.cs | 69 +++++++++++ ...sECAftersaleAcceptExchangeReshipRequest.cs | 29 +++++ ...ECAftersaleAcceptExchangeReshipResponse.cs | 9 ++ ...elsECAftersaleGetAftersaleOrderResponse.cs | 110 ++++++++++++++++++ ...AftersaleMerchantUpdateAftersaleRequest.cs | 59 ++++++++++ ...ftersaleMerchantUpdateAftersaleResponse.cs | 9 ++ ...sECAftersaleRejectExchangeReshipRequest.cs | 38 ++++++ ...ECAftersaleRejectExchangeReshipResponse.cs | 9 ++ ...CAftersaleAcceptExchangeReshipRequest.json | 5 + ...tersaleMerchantUpdateAftersaleRequest.json | 12 ++ ...CAftersaleRejectExchangeReshipRequest.json | 5 + 11 files changed, 354 insertions(+) create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECAftersale/ChannelsECAftersaleAcceptExchangeReshipRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECAftersale/ChannelsECAftersaleAcceptExchangeReshipResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECAftersale/ChannelsECAftersaleMerchantUpdateAftersaleRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECAftersale/ChannelsECAftersaleMerchantUpdateAftersaleResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECAftersale/ChannelsECAftersaleRejectExchangeReshipRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECAftersale/ChannelsECAftersaleRejectExchangeReshipResponse.cs create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECAftersale/ChannelsECAftersaleAcceptExchangeReshipRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECAftersale/ChannelsECAftersaleMerchantUpdateAftersaleRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECAftersale/ChannelsECAftersaleRejectExchangeReshipRequest.json diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteChannelsExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteChannelsExtensions.cs index 3e213156..18be4af5 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteChannelsExtensions.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteChannelsExtensions.cs @@ -107,6 +107,75 @@ namespace SKIT.FlurlHttpClient.Wechat.Api return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); } + /// + /// 异步调用 [POST] /channels/ec/aftersale/acceptexchangereship 接口。 + /// + /// REF:
+ /// + ///
+ ///
+ /// + /// + /// + /// + public static async Task ExecuteChannelsECAftersaleAcceptExchangeReshipAsync(this WechatApiClient client, Models.ChannelsECAftersaleAcceptExchangeReshipRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + IFlurlRequest flurlReq = client + .CreateFlurlRequest(request, HttpMethod.Post, "channels", "ec", "aftersale", "acceptexchangereship") + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); + } + + /// + /// 异步调用 [POST] /channels/ec/aftersale/rejectexchangereship 接口。 + /// + /// REF:
+ /// + ///
+ ///
+ /// + /// + /// + /// + public static async Task ExecuteChannelsECAftersaleRejectExchangeReshipAsync(this WechatApiClient client, Models.ChannelsECAftersaleRejectExchangeReshipRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + IFlurlRequest flurlReq = client + .CreateFlurlRequest(request, HttpMethod.Post, "channels", "ec", "aftersale", "rejectexchangereship") + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); + } + + /// + /// 异步调用 [POST] /channels/ec/aftersale/merchantupdateaftersale 接口。 + /// + /// REF:
+ /// + ///
+ ///
+ /// + /// + /// + /// + public static async Task ExecuteChannelsECAftersaleMerchantUpdateAftersaleAsync(this WechatApiClient client, Models.ChannelsECAftersaleMerchantUpdateAftersaleRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + IFlurlRequest flurlReq = client + .CreateFlurlRequest(request, HttpMethod.Post, "channels", "ec", "aftersale", "merchantupdateaftersale") + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); + } + /// /// 异步调用 [POST] /channels/ec/aftersale/uploadrefundcertificate 接口。 /// diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECAftersale/ChannelsECAftersaleAcceptExchangeReshipRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECAftersale/ChannelsECAftersaleAcceptExchangeReshipRequest.cs new file mode 100644 index 00000000..de33fae0 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECAftersale/ChannelsECAftersaleAcceptExchangeReshipRequest.cs @@ -0,0 +1,29 @@ +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /channels/ec/aftersale/acceptexchangereship 接口的请求。 + /// + public class ChannelsECAftersaleAcceptExchangeReshipRequest : WechatApiRequest, IInferable + { + /// + /// 获取或设置售后单 ID。 + /// + [Newtonsoft.Json.JsonProperty("after_sale_order_id")] + [System.Text.Json.Serialization.JsonPropertyName("after_sale_order_id")] + public string AftersaleOrderId { get; set; } = string.Empty; + + /// + /// 获取或设置快递公司 ID。 + /// + [Newtonsoft.Json.JsonProperty("delivery_id")] + [System.Text.Json.Serialization.JsonPropertyName("delivery_id")] + public string DeliveryId { get; set; } = string.Empty; + + /// + /// 获取或设置快递单号。 + /// + [Newtonsoft.Json.JsonProperty("waybill_id")] + [System.Text.Json.Serialization.JsonPropertyName("waybill_id")] + public string WaybillId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECAftersale/ChannelsECAftersaleAcceptExchangeReshipResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECAftersale/ChannelsECAftersaleAcceptExchangeReshipResponse.cs new file mode 100644 index 00000000..637616a6 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECAftersale/ChannelsECAftersaleAcceptExchangeReshipResponse.cs @@ -0,0 +1,9 @@ +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /channels/ec/aftersale/acceptexchangereship 接口的响应。 + /// + public class ChannelsECAftersaleAcceptExchangeReshipResponse : WechatApiResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECAftersale/ChannelsECAftersaleGetAftersaleOrderResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECAftersale/ChannelsECAftersaleGetAftersaleOrderResponse.cs index 2c029d3b..d2407be8 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECAftersale/ChannelsECAftersaleGetAftersaleOrderResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECAftersale/ChannelsECAftersaleGetAftersaleOrderResponse.cs @@ -217,6 +217,95 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models [System.Text.Json.Serialization.JsonPropertyName("message")] public string? ErrorMessage { get; set; } } + + public class ExchangeProductInfo + { + /// + /// 获取或设置商品 ID。 + /// + [Newtonsoft.Json.JsonProperty("product_id")] + [System.Text.Json.Serialization.JsonPropertyName("product_id")] + [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)] + public long ProductId { get; set; } + + /// + /// 获取或设置旧 SKU ID。 + /// + [Newtonsoft.Json.JsonProperty("old_sku_id")] + [System.Text.Json.Serialization.JsonPropertyName("old_sku_id")] + [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)] + public long OldSKUId { get; set; } + + /// + /// 获取或设置新 SKU ID。 + /// + [Newtonsoft.Json.JsonProperty("new_sku_id")] + [System.Text.Json.Serialization.JsonPropertyName("new_sku_id")] + [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)] + public long NewSKUId { get; set; } + + /// + /// 获取或设置商品数量。 + /// + [Newtonsoft.Json.JsonProperty("product_count")] + [System.Text.Json.Serialization.JsonPropertyName("product_count")] + public int Count { get; set; } + } + + public class ExchangeDeliveryInfo + { + public static class Types + { + public class Address : ChannelsECOrderGetResponse.Types.Order.Types.OrderDetail.Types.Delivery.Types.Address + { + } + } + + /// + /// 获取或设置快递公司 ID。 + /// + [Newtonsoft.Json.JsonProperty("delivery_id")] + [System.Text.Json.Serialization.JsonPropertyName("delivery_id")] + public string DeliveryId { get; set; } = default!; + + /// + /// 获取或设置快递公司名称。 + /// + [Newtonsoft.Json.JsonProperty("delivery_name")] + [System.Text.Json.Serialization.JsonPropertyName("delivery_name")] + public string DeliveryName { get; set; } = default!; + + /// + /// 获取或设置快递单号。 + /// + [Newtonsoft.Json.JsonProperty("waybill_id")] + [System.Text.Json.Serialization.JsonPropertyName("waybill_id")] + public string WaybillId { get; set; } = default!; + + /// + /// 获取或设置地址信息。 + /// + [Newtonsoft.Json.JsonProperty("address_info")] + [System.Text.Json.Serialization.JsonPropertyName("address_info")] + public Types.Address? Address { get; set; } + } + + public class VirualTeleNumberInfo + { + /// + /// 获取或设置虚拟号码。 + /// + [Newtonsoft.Json.JsonProperty("virtual_tel_number")] + [System.Text.Json.Serialization.JsonPropertyName("virtual_tel_number")] + public string? VirtualTeleNumber { get; set; } + + /// + /// 获取或设置主动兑换的虚拟号码过期时间戳。 + /// + [Newtonsoft.Json.JsonProperty("virtual_tel_expire_time")] + [System.Text.Json.Serialization.JsonPropertyName("virtual_tel_expire_time")] + public long? VirtualTeleNumberExpireTimestamp { get; set; } + } } /// @@ -319,6 +408,27 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models [System.Text.Json.Serialization.JsonPropertyName("deadline")] public int Deadline { get; set; } + /// + /// 获取或设置换货相关商品信息。 + /// + [Newtonsoft.Json.JsonProperty("exchange_product_info")] + [System.Text.Json.Serialization.JsonPropertyName("exchange_product_info")] + public Types.ExchangeProductInfo? ExchangeProductInfo { get; set; } + + /// + /// 获取或设置换货相关物流信息。 + /// + [Newtonsoft.Json.JsonProperty("exchange_delivery_info")] + [System.Text.Json.Serialization.JsonPropertyName("exchange_delivery_info")] + public Types.ExchangeDeliveryInfo? ExchangeDeliveryInfo { get; set; } + + /// + /// 获取或设置虚拟号码信息。 + /// + [Newtonsoft.Json.JsonProperty("virtual_tel_num_info")] + [System.Text.Json.Serialization.JsonPropertyName("virtual_tel_num_info")] + public Types.VirualTeleNumberInfo? VirualTeleNumberInfo { get; set; } + /// /// 获取或设置更新时间戳。 /// diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECAftersale/ChannelsECAftersaleMerchantUpdateAftersaleRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECAftersale/ChannelsECAftersaleMerchantUpdateAftersaleRequest.cs new file mode 100644 index 00000000..a4fe2e7c --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECAftersale/ChannelsECAftersaleMerchantUpdateAftersaleRequest.cs @@ -0,0 +1,59 @@ +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /channels/ec/aftersale/merchantupdateaftersale 接口的请求。 + /// + public class ChannelsECAftersaleMerchantUpdateAftersaleRequest : WechatApiRequest, IInferable + { + /// + /// 获取或设置售后单 ID。 + /// + [Newtonsoft.Json.JsonProperty("after_sale_order_id")] + [System.Text.Json.Serialization.JsonPropertyName("after_sale_order_id")] + public string AftersaleOrderId { get; set; } = string.Empty; + + /// + /// 获取或设置售后类型。 + /// + [Newtonsoft.Json.JsonProperty("type")] + [System.Text.Json.Serialization.JsonPropertyName("type")] + public int Type { get; set; } + + /// + /// 获取或设置金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + + /// + /// 获取或设置协商原因类型。 + /// + [Newtonsoft.Json.JsonProperty("update_reason_type")] + [System.Text.Json.Serialization.JsonPropertyName("update_reason_type")] + public int UpdateReasonType { get; set; } + + /// + /// 获取或设置协商类型。 + /// + [Newtonsoft.Json.JsonProperty("merchant_update_type")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_update_type")] + public int MerchantUpdateType { get; set; } + + /// + /// 获取或设置协商描述。 + /// + [Newtonsoft.Json.JsonProperty("merchant_update_desc")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_update_desc")] + public string MerchantUpdateDescription { get; set; } = string.Empty; + + /// + /// 获取或设置协商凭证 MediaId。 + /// + [Newtonsoft.Json.JsonProperty("media_ids")] + [System.Text.Json.Serialization.JsonPropertyName("media_ids")] + public IList? CertificateMediaIdList { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECAftersale/ChannelsECAftersaleMerchantUpdateAftersaleResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECAftersale/ChannelsECAftersaleMerchantUpdateAftersaleResponse.cs new file mode 100644 index 00000000..abbc81cc --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECAftersale/ChannelsECAftersaleMerchantUpdateAftersaleResponse.cs @@ -0,0 +1,9 @@ +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /channels/ec/aftersale/merchantupdateaftersale 接口的响应。 + /// + public class ChannelsECAftersaleMerchantUpdateAftersaleResponse : WechatApiResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECAftersale/ChannelsECAftersaleRejectExchangeReshipRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECAftersale/ChannelsECAftersaleRejectExchangeReshipRequest.cs new file mode 100644 index 00000000..e5662f97 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECAftersale/ChannelsECAftersaleRejectExchangeReshipRequest.cs @@ -0,0 +1,38 @@ +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /channels/ec/aftersale/rejectexchangereship 接口的请求。 + /// + public class ChannelsECAftersaleRejectExchangeReshipRequest : WechatApiRequest, IInferable + { + /// + /// 获取或设置售后单 ID。 + /// + [Newtonsoft.Json.JsonProperty("after_sale_order_id")] + [System.Text.Json.Serialization.JsonPropertyName("after_sale_order_id")] + public string AftersaleOrderId { get; set; } = string.Empty; + + /// + /// 获取或设置拒绝原因类型。 + /// + [Newtonsoft.Json.JsonProperty("reject_reason_type")] + [System.Text.Json.Serialization.JsonPropertyName("reject_reason_type")] + public int RejectReasonType { get; set; } + + /// + /// 获取或设置拒绝原因。 + /// + [Newtonsoft.Json.JsonProperty("reject_reason")] + [System.Text.Json.Serialization.JsonPropertyName("reject_reason")] + public string? RejectReason { get; set; } + + /// + /// 获取或设置退款凭证 MediaId。 + /// + [Newtonsoft.Json.JsonProperty("reject_certificates")] + [System.Text.Json.Serialization.JsonPropertyName("reject_certificates")] + public IList? RejectCertificateMediaIdList { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECAftersale/ChannelsECAftersaleRejectExchangeReshipResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECAftersale/ChannelsECAftersaleRejectExchangeReshipResponse.cs new file mode 100644 index 00000000..c6b0045b --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECAftersale/ChannelsECAftersaleRejectExchangeReshipResponse.cs @@ -0,0 +1,9 @@ +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /channels/ec/aftersale/rejectexchangereship 接口的响应。 + /// + public class ChannelsECAftersaleRejectExchangeReshipResponse : WechatApiResponse + { + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECAftersale/ChannelsECAftersaleAcceptExchangeReshipRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECAftersale/ChannelsECAftersaleAcceptExchangeReshipRequest.json new file mode 100644 index 00000000..60cdfe33 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECAftersale/ChannelsECAftersaleAcceptExchangeReshipRequest.json @@ -0,0 +1,5 @@ +{ + "after_sale_order_id": "1768034782998651", + "waybill_id": "123", + "delivery_id": "YD" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECAftersale/ChannelsECAftersaleMerchantUpdateAftersaleRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECAftersale/ChannelsECAftersaleMerchantUpdateAftersaleRequest.json new file mode 100644 index 00000000..30507f63 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECAftersale/ChannelsECAftersaleMerchantUpdateAftersaleRequest.json @@ -0,0 +1,12 @@ +{ + "after_sale_order_id": "1768034782998651", + "type": 1, + "amount": 100, + "merchant_update_desc": "xxx", + "update_reason_type": "123", + "merchant_update_type": 6, + "media_ids": [ + "id1", + "id2" + ] +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECAftersale/ChannelsECAftersaleRejectExchangeReshipRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECAftersale/ChannelsECAftersaleRejectExchangeReshipRequest.json new file mode 100644 index 00000000..1c239c45 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECAftersale/ChannelsECAftersaleRejectExchangeReshipRequest.json @@ -0,0 +1,5 @@ +{ + "after_sale_order_id": "1768715750567651", + "reject_reason": "123", + "reject_reason_type": 1 +}