diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteChannelsExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteChannelsExtensions.cs
index 8b5419a3..7f91cc2a 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteChannelsExtensions.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteChannelsExtensions.cs
@@ -10,6 +10,29 @@ namespace SKIT.FlurlHttpClient.Wechat.Api
public static class WechatApiClientExecuteChannelsExtensions
{
#region ECAftersale
+ ///
+ /// 异步调用 [POST] /channels/ec/aftersale/genaftersaleorder 接口。
+ ///
+ /// REF:
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteChannelsECAftersaleGenerateAftersaleOrderAsync(this WechatApiClient client, Models.ChannelsECAftersaleGenerateAftersaleOrderRequest 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", "genaftersaleorder")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
+ }
+
///
/// 异步调用 [POST] /channels/ec/aftersale/getaftersalelist 接口。
///
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECAftersale/ChannelsECAftersaleGenerateAftersaleOrderRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECAftersale/ChannelsECAftersaleGenerateAftersaleOrderRequest.cs
new file mode 100644
index 00000000..c231aa87
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECAftersale/ChannelsECAftersaleGenerateAftersaleOrderRequest.cs
@@ -0,0 +1,82 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/aftersale/genaftersaleorder 接口的请求。
+ ///
+ public class ChannelsECAftersaleGenerateAftersaleOrderRequest : WechatApiRequest, IInferable
+ {
+ ///
+ /// 获取或设置请求唯一 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("request_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("request_id")]
+ public string RequestId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置订单 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("order_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("order_id")]
+ public string OrderId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置商品 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("product_id")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.TextualNumberConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("product_id")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString | System.Text.Json.Serialization.JsonNumberHandling.WriteAsString)]
+ public long ProductId { get; set; }
+
+ ///
+ /// 获取或设置 SKU ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("sku_id")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.TextualNumberConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("sku_id")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString | System.Text.Json.Serialization.JsonNumberHandling.WriteAsString)]
+ public long SKUId { get; set; }
+
+ ///
+ /// 获取或设置发起售后数量。
+ ///
+ [Newtonsoft.Json.JsonProperty("count")]
+ [System.Text.Json.Serialization.JsonPropertyName("count")]
+ public int Count { get; set; }
+
+ ///
+ /// 获取或设置售后退款金额(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("amount")]
+ [System.Text.Json.Serialization.JsonPropertyName("amount")]
+ public int Amount { get; set; }
+
+ ///
+ /// 获取或设置售后原因。
+ ///
+ [Newtonsoft.Json.JsonProperty("reason")]
+ [System.Text.Json.Serialization.JsonPropertyName("reason")]
+ public string Reason { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置售后类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("type")]
+ [System.Text.Json.Serialization.JsonPropertyName("type")]
+ public string Type { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置退货地址 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("address_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("address_id")]
+ public long? AddressId { get; set; }
+
+ ///
+ /// 获取或设置补充说明。
+ ///
+ [Newtonsoft.Json.JsonProperty("desc")]
+ [System.Text.Json.Serialization.JsonPropertyName("desc")]
+ public string? Description { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECAftersale/ChannelsECAftersaleGenerateAftersaleOrderResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECAftersale/ChannelsECAftersaleGenerateAftersaleOrderResponse.cs
new file mode 100644
index 00000000..6d995237
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECAftersale/ChannelsECAftersaleGenerateAftersaleOrderResponse.cs
@@ -0,0 +1,16 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/aftersale/genaftersaleorder 接口的响应。
+ ///
+ public class ChannelsECAftersaleGenerateAftersaleOrderResponse : WechatApiResponse
+ {
+ ///
+ /// 获取或设置售后单 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("after_sale_order_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("after_sale_order_id")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.NumericalStringReadOnlyConverter))]
+ public string AftersaleOrderId { get; set; } = default!;
+ }
+}
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 2fb637fa..2650affa 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECAftersale/ChannelsECAftersaleGetAftersaleOrderResponse.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECAftersale/ChannelsECAftersaleGetAftersaleOrderResponse.cs
@@ -360,7 +360,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models
public string? UnionId { get; set; }
///
- /// 获取或设置退款原因。
+ /// 获取或设置售后原因。
///
[Newtonsoft.Json.JsonProperty("reason")]
[System.Text.Json.Serialization.JsonPropertyName("reason")]
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECAftersale/ChannelsECAftersaleGenerateAftersaleOrderRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECAftersale/ChannelsECAftersaleGenerateAftersaleOrderRequest.json
new file mode 100644
index 00000000..240fa4a3
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECAftersale/ChannelsECAftersaleGenerateAftersaleOrderRequest.json
@@ -0,0 +1,10 @@
+{
+ "request_id": "111222",
+ "order_id": "37123432487943243",
+ "product_id": "2346783",
+ "sku_id": "23643824",
+ "count": 1,
+ "amount": 100,
+ "reason": "双方协商一致退款",
+ "type": "REFUND"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECAftersale/ChannelsECAftersaleGenerateAftersaleOrderResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECAftersale/ChannelsECAftersaleGenerateAftersaleOrderResponse.json
new file mode 100644
index 00000000..792d1341
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECAftersale/ChannelsECAftersaleGenerateAftersaleOrderResponse.json
@@ -0,0 +1,5 @@
+{
+ "errcode": 0,
+ "errmsg": "ok",
+ "after_sale_order_id": "2082648273412"
+}