diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Events/WxaSecOrder/TradeManageOrderSettlementEvent.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/WxaSecOrder/TradeManageOrderSettlementEvent.cs
index c06ec4ca..c65c4c23 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Api/Events/WxaSecOrder/TradeManageOrderSettlementEvent.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/WxaSecOrder/TradeManageOrderSettlementEvent.cs
@@ -45,13 +45,5 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Events
[System.Text.Json.Serialization.JsonPropertyName("settlement_time")]
[System.Xml.Serialization.XmlElement("settlement_time", IsNullable = true)]
public long? SettlementTimestamp { get; set; }
-
- ///
- /// 获取或设置消息文本内容。
- ///
- [Newtonsoft.Json.JsonProperty("msg")]
- [System.Text.Json.Serialization.JsonPropertyName("msg")]
- [System.Xml.Serialization.XmlElement("msg", IsNullable = true)]
- public string? Message { get; set; }
}
}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteChannelsExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteChannelsExtensions.cs
index c1c3b681..23be464f 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteChannelsExtensions.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteChannelsExtensions.cs
@@ -4153,6 +4153,43 @@ namespace SKIT.FlurlHttpClient.Wechat.Api
return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
+
+ ///
+ /// 异步调用 [POST] /channels/ec/open/upload 接口。
+ ///
+ /// REF:
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteChannelsECOpenUploadAsync(this WechatApiClient client, Models.ChannelsECOpenUploadRequest request, CancellationToken cancellationToken = default)
+ {
+ if (client is null) throw new ArgumentNullException(nameof(client));
+ if (request is null) throw new ArgumentNullException(nameof(request));
+
+ if (request.FileName is null)
+ request.FileName = Guid.NewGuid().ToString("N").ToLower() + ".png";
+
+ if (request.FileContentType is null)
+ request.FileContentType = MimeTypes.GetMimeMapping(request.FileName!);
+
+ IFlurlRequest flurlReq = client
+ .CreateFlurlRequest(request, HttpMethod.Post, "channels", "ec", "open", "upload")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ if (request.UploadType == 0)
+ {
+ using var httpContent = Utilities.HttpContentBuilder.BuildWithFile(fileName: request.FileName, fileBytes: request.FileBytes!, fileContentType: request.FileContentType, formDataName: "file");
+ return await client.SendFlurlRequestAsync(flurlReq, httpContent: httpContent, cancellationToken: cancellationToken).ConfigureAwait(false);
+ }
+ else
+ {
+ return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
+ }
+ }
#endregion
#region ECOrder
@@ -4567,6 +4604,77 @@ namespace SKIT.FlurlHttpClient.Wechat.Api
}
#endregion
+ #region ECOrder/PresentOrder
+ ///
+ /// 异步调用 [POST] /channels/ec/order/presentorder/create 接口。
+ ///
+ /// REF:
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteChannelsECOrderPresentOrderCreateAsync(this WechatApiClient client, Models.ChannelsECOrderPresentOrderCreateRequest 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", "order", "presentorder", "create")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /channels/ec/order/presentorderlist/get 接口。
+ ///
+ /// REF:
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteChannelsECOrderPresentOrderListGetAsync(this WechatApiClient client, Models.ChannelsECOrderPresentOrderListGetRequest 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", "order", "presentorderlist", "get")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /channels/ec/order/presentorder/get 接口。
+ ///
+ /// REF:
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteChannelsECOrderPresentOrderGetAsync(this WechatApiClient client, Models.ChannelsECOrderPresentOrderGetRequest 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", "order", "presentorder", "get")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+ #endregion
+
#region ECOrder/PreshipmentChangeSKU
///
/// 异步调用 [POST] /channels/ec/order/preshipmentchangesku/approve 接口。
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECOpen/ChannelsECOpenUploadRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECOpen/ChannelsECOpenUploadRequest.cs
new file mode 100644
index 00000000..5363070d
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECOpen/ChannelsECOpenUploadRequest.cs
@@ -0,0 +1,50 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/open/upload 接口的请求。
+ ///
+ public class ChannelsECOpenUploadRequest : WechatApiRequest, IInferable
+ {
+ ///
+ /// 获取或设置用户的 OpenId。
+ ///
+ [Newtonsoft.Json.JsonProperty("openid")]
+ [System.Text.Json.Serialization.JsonPropertyName("openid")]
+ public string OpenId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置返回数据类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("upload_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("upload_type")]
+ public int UploadType { get; set; }
+
+ ///
+ /// 获取或设置文件字节数组。与字段 二选一。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public byte[]? FileBytes { get; set; }
+
+ ///
+ /// 获取或设置文件名。如果不指定将由系统自动生成。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string? FileName { get; set; }
+
+ ///
+ /// 获取或设置文件 Conent-Type。如果不指定将由系统自动生成。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string? FileContentType { get; set; }
+
+ ///
+ /// 获取或设置文件 URL。与字段 二选一。
+ ///
+ [Newtonsoft.Json.JsonProperty("file_url")]
+ [System.Text.Json.Serialization.JsonPropertyName("file_url")]
+ public string? FileUrl { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECOpen/ChannelsECOpenUploadResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECOpen/ChannelsECOpenUploadResponse.cs
new file mode 100644
index 00000000..f2584090
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECOpen/ChannelsECOpenUploadResponse.cs
@@ -0,0 +1,15 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/open/upload 接口的响应。
+ ///
+ public class ChannelsECOpenUploadResponse : WechatApiResponse
+ {
+ ///
+ /// 获取或设置 MediaId。
+ ///
+ [Newtonsoft.Json.JsonProperty("media_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("media_id")]
+ public string MediaId { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECOrder/PresentOrder/ChannelsECOrderPresentOrderCreateRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECOrder/PresentOrder/ChannelsECOrderPresentOrderCreateRequest.cs
new file mode 100644
index 00000000..fc74a1ca
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECOrder/PresentOrder/ChannelsECOrderPresentOrderCreateRequest.cs
@@ -0,0 +1,74 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/order/presentorder/create 接口的请求。
+ ///
+ public class ChannelsECOrderPresentOrderCreateRequest : WechatApiRequest, IInferable
+ {
+ public static class Types
+ {
+ public class AuditItem
+ {
+ ///
+ /// 获取或设置审核项名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("item_name")]
+ [System.Text.Json.Serialization.JsonPropertyName("item_name")]
+ public string ItemName { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置审核项值。
+ ///
+ [Newtonsoft.Json.JsonProperty("item_value")]
+ [System.Text.Json.Serialization.JsonPropertyName("item_value")]
+ public string ItemValue { get; set; } = string.Empty;
+ }
+ }
+
+ ///
+ /// 获取或设置活动 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("activity_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("activity_id")]
+ public string ActivityId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置用户的 OpenId。
+ ///
+ [Newtonsoft.Json.JsonProperty("openid")]
+ [System.Text.Json.Serialization.JsonPropertyName("openid")]
+ public string OpenId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置合作小店 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("shop_appid")]
+ [System.Text.Json.Serialization.JsonPropertyName("shop_appid")]
+ public string ShopAppId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置祝福语。
+ ///
+ [Newtonsoft.Json.JsonProperty("wishmessage")]
+ [System.Text.Json.Serialization.JsonPropertyName("wishmessage")]
+ public string? WishMessage { get; set; }
+
+ ///
+ /// 获取或设置商品 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; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECOrder/PresentOrder/ChannelsECOrderPresentOrderCreateResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECOrder/PresentOrder/ChannelsECOrderPresentOrderCreateResponse.cs
new file mode 100644
index 00000000..a667bed2
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECOrder/PresentOrder/ChannelsECOrderPresentOrderCreateResponse.cs
@@ -0,0 +1,15 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/order/presentorder/create 接口的响应。
+ ///
+ public class ChannelsECOrderPresentOrderCreateResponse : WechatApiResponse
+ {
+ ///
+ /// 获取或设置礼物订单 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("present_order_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("present_order_id")]
+ public string PresentOrderId { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECOrder/PresentOrder/ChannelsECOrderPresentOrderGetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECOrder/PresentOrder/ChannelsECOrderPresentOrderGetRequest.cs
new file mode 100644
index 00000000..7b4c6f7b
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECOrder/PresentOrder/ChannelsECOrderPresentOrderGetRequest.cs
@@ -0,0 +1,22 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/order/presentorder/get 接口的请求。
+ ///
+ public class ChannelsECOrderPresentOrderGetRequest : WechatApiRequest, IInferable
+ {
+ ///
+ /// 获取或设置礼物订单 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("present_order_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("present_order_id")]
+ public string PresentOrderId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置用户的 OpenId。
+ ///
+ [Newtonsoft.Json.JsonProperty("open_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("open_id")]
+ public string? OpenId { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECOrder/PresentOrder/ChannelsECOrderPresentOrderGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECOrder/PresentOrder/ChannelsECOrderPresentOrderGetResponse.cs
new file mode 100644
index 00000000..e1de1acf
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECOrder/PresentOrder/ChannelsECOrderPresentOrderGetResponse.cs
@@ -0,0 +1,116 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/order/presentorder/get 接口的响应。
+ ///
+ public class ChannelsECOrderPresentOrderGetResponse : WechatApiResponse
+ {
+ public static class Types
+ {
+ public class PresentOrder
+ {
+ public static class Types
+ {
+ public class ECGiftInfo
+ {
+ public static class Types
+ {
+ public class GiftList
+ {
+ ///
+ /// 获取或设置礼品列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("gift")]
+ [System.Text.Json.Serialization.JsonPropertyName("gift")]
+ public GiftItem[] Items { get; set; } = default!;
+ }
+
+ public class GiftItem
+ {
+ ///
+ /// 获取或设置礼物订单 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("order_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("order_id")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.NumericalStringReadOnlyConverter))]
+ public string PresentOrderId { get; set; } = default!;
+
+ ///
+ /// 获取或设置礼物状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("giftstatus")]
+ [System.Text.Json.Serialization.JsonPropertyName("giftstatus")]
+ public int GiftStatus { get; set; }
+
+ ///
+ /// 获取或设置祝福语。
+ ///
+ [Newtonsoft.Json.JsonProperty("wishmessage")]
+ [System.Text.Json.Serialization.JsonPropertyName("wishmessage")]
+ public string? WishMessage { get; set; }
+
+ ///
+ /// 获取或设置过期时间戳。
+ ///
+ [Newtonsoft.Json.JsonProperty("expired_time")]
+ [System.Text.Json.Serialization.JsonPropertyName("expired_time")]
+ public long? ExpireTimestamp { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置礼品列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("gifts")]
+ [System.Text.Json.Serialization.JsonPropertyName("gifts")]
+ public Types.GiftList GiftList { get; set; } = default!;
+
+ ///
+ /// 获取或设置用户视角类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("user_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("user_type")]
+ public int UserType { get; set; }
+
+ ///
+ /// 获取或设置祝福语。
+ ///
+ [Newtonsoft.Json.JsonProperty("wishmessage")]
+ [System.Text.Json.Serialization.JsonPropertyName("wishmessage")]
+ public string? WishMessage { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置礼物信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("ecsgift")]
+ [System.Text.Json.Serialization.JsonPropertyName("ecsgift")]
+ public Types.ECGiftInfo ECGiftInfo { get; set; } = default!;
+
+ ///
+ /// 获取或设置是否不能收礼。
+ ///
+ [Newtonsoft.Json.JsonProperty("cannot_receive")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.NumericalBooleanConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("cannot_receive")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.NumericalBooleanConverter))]
+ public bool IsCannotReceive { get; set; }
+
+ ///
+ /// 获取或设置不能收礼原因。
+ ///
+ [Newtonsoft.Json.JsonProperty("cannot_receive_tips")]
+ [System.Text.Json.Serialization.JsonPropertyName("cannot_receive_tips")]
+ public string? CannotReceiveTips { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置礼物订单信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("present_order_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("present_order_info")]
+ public Types.PresentOrder PresentOrder { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECOrder/PresentOrder/ChannelsECOrderPresentOrderListGetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECOrder/PresentOrder/ChannelsECOrderPresentOrderListGetRequest.cs
new file mode 100644
index 00000000..7d1ded37
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECOrder/PresentOrder/ChannelsECOrderPresentOrderListGetRequest.cs
@@ -0,0 +1,58 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/order/presentorderlist/get 接口的请求。
+ ///
+ public class ChannelsECOrderPresentOrderListGetRequest : WechatApiRequest, IInferable
+ {
+ public static class Types
+ {
+ public class TimeRange : ChannelsECOrderListGetRequest.Types.TimeRange
+ {
+ }
+ }
+
+ ///
+ /// 获取或设置合作小店 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("shop_appid")]
+ [System.Text.Json.Serialization.JsonPropertyName("shop_appid")]
+ public string ShopAppId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置用户的 OpenId。
+ ///
+ [Newtonsoft.Json.JsonProperty("open_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("open_id")]
+ public string? OpenId { get; set; }
+
+ ///
+ /// 获取或设置创建订单时间范围。
+ ///
+ [Newtonsoft.Json.JsonProperty("create_time_range")]
+ [System.Text.Json.Serialization.JsonPropertyName("create_time_range")]
+ public Types.TimeRange? CreateTimeRange { get; set; }
+
+ ///
+ /// 获取或设置更新订单时间范围。
+ ///
+ [Newtonsoft.Json.JsonProperty("update_time_range")]
+ [System.Text.Json.Serialization.JsonPropertyName("update_time_range")]
+ public Types.TimeRange? UpdateTimeRange { get; set; }
+
+ ///
+ /// 获取或设置分页每页数量。
+ /// 默认值:10
+ ///
+ [Newtonsoft.Json.JsonProperty("page_size")]
+ [System.Text.Json.Serialization.JsonPropertyName("page_size")]
+ public int Limit { get; set; } = 10;
+
+ ///
+ /// 获取或设置翻页标记。
+ ///
+ [Newtonsoft.Json.JsonProperty("next_key")]
+ [System.Text.Json.Serialization.JsonPropertyName("next_key")]
+ public string? Cursor { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECOrder/PresentOrder/ChannelsECOrderPresentOrderListGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECOrder/PresentOrder/ChannelsECOrderPresentOrderListGetResponse.cs
new file mode 100644
index 00000000..a7a04cb1
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECOrder/PresentOrder/ChannelsECOrderPresentOrderListGetResponse.cs
@@ -0,0 +1,43 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/order/presentorderlist/get 接口的响应。
+ ///
+ public class ChannelsECOrderPresentOrderListGetResponse : WechatApiResponse
+ {
+ public static class Types
+ {
+ public class PresentOrder
+ {
+ ///
+ /// 获取或设置礼物订单 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("present_order_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("present_order_id")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.NumericalStringReadOnlyConverter))]
+ public string PresentOrderId { get; set; } = default!;
+
+ ///
+ /// 获取或设置订单 ID 列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("order_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("order_id")]
+ public string[] OrderIdList { get; set; } = default!;
+ }
+ }
+
+ ///
+ /// 获取或设置礼物订单列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("present_order_list")]
+ [System.Text.Json.Serialization.JsonPropertyName("present_order_list")]
+ public Types.PresentOrder[] PresentOrderList { get; set; } = default!;
+
+ ///
+ /// 获取或设置翻页标记。
+ ///
+ [Newtonsoft.Json.JsonProperty("next_key")]
+ [System.Text.Json.Serialization.JsonPropertyName("next_key")]
+ public string? NextCursor { get; set; }
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECOpen/ChannelsECOpenUploadRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECOpen/ChannelsECOpenUploadRequest.json
new file mode 100644
index 00000000..1a09f72f
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECOpen/ChannelsECOpenUploadRequest.json
@@ -0,0 +1,4 @@
+{
+ "openid": "xxx",
+ "file_url": "xxx"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECOpen/ChannelsECOpenUploadResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECOpen/ChannelsECOpenUploadResponse.json
new file mode 100644
index 00000000..ff0e2e13
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECOpen/ChannelsECOpenUploadResponse.json
@@ -0,0 +1,5 @@
+{
+ "errcode": 0,
+ "errmsg": "成功",
+ "media_id": "892AERDPD2323"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECOrder/PresentOrder/ChannelsECOrderPresentOrderCreateRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECOrder/PresentOrder/ChannelsECOrderPresentOrderCreateRequest.json
new file mode 100644
index 00000000..f0666eee
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECOrder/PresentOrder/ChannelsECOrderPresentOrderCreateRequest.json
@@ -0,0 +1,8 @@
+{
+ "activity_id": "22123",
+ "openid": "oDiTs6x9ccP19TfQH5OvKOWeXAeo",
+ "shop_appid": "wxxxxxxxxxxxxxxxxx",
+ "wishmessage": "祝福你",
+ "product_id": "10000239729501",
+ "sku_id": "3623160014"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECOrder/PresentOrder/ChannelsECOrderPresentOrderCreateResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECOrder/PresentOrder/ChannelsECOrderPresentOrderCreateResponse.json
new file mode 100644
index 00000000..18472a1f
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECOrder/PresentOrder/ChannelsECOrderPresentOrderCreateResponse.json
@@ -0,0 +1,5 @@
+{
+ "errcode": 0,
+ "errmsg": "ok",
+ "present_order_id": "4226341196275658752"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECOrder/PresentOrder/ChannelsECOrderPresentOrderGetRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECOrder/PresentOrder/ChannelsECOrderPresentOrderGetRequest.json
new file mode 100644
index 00000000..0278895e
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECOrder/PresentOrder/ChannelsECOrderPresentOrderGetRequest.json
@@ -0,0 +1,4 @@
+{
+ "present_order_id": "4226341196275658752",
+ "open_id": "OPENID"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECOrder/PresentOrder/ChannelsECOrderPresentOrderGetResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECOrder/PresentOrder/ChannelsECOrderPresentOrderGetResponse.json
new file mode 100644
index 00000000..157ef254
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECOrder/PresentOrder/ChannelsECOrderPresentOrderGetResponse.json
@@ -0,0 +1,18 @@
+{
+ "errcode": 0,
+ "errmsg": "ok",
+ "present_order_info": {
+ "ecsgift": {
+ "gifts": {
+ "gift": [
+ {
+ "order_id": 4226341196275658752,
+ "wishmessage": "祝福你",
+ "giftstatus": 0
+ }
+ ]
+ },
+ "user_type": 1
+ }
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECOrder/PresentOrder/ChannelsECOrderPresentOrderListGetRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECOrder/PresentOrder/ChannelsECOrderPresentOrderListGetRequest.json
new file mode 100644
index 00000000..37f69318
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECOrder/PresentOrder/ChannelsECOrderPresentOrderListGetRequest.json
@@ -0,0 +1,10 @@
+{
+ "shop_appid": "wxxxxxxxxxxxxxxxxx",
+ "open_id": "OPENID",
+ "create_time_range": {
+ "start_time": "1749007175",
+ "end_time": "1749008175"
+ },
+ "page_size": 10,
+ "next_key": "THE_NEXT_KEY"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECOrder/PresentOrder/ChannelsECOrderPresentOrderListGetResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECOrder/PresentOrder/ChannelsECOrderPresentOrderListGetResponse.json
new file mode 100644
index 00000000..a1804812
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECOrder/PresentOrder/ChannelsECOrderPresentOrderListGetResponse.json
@@ -0,0 +1,10 @@
+{
+ "errcode": 0,
+ "errmsg": "ok",
+ "present_order_list": [
+ {
+ "present_order_id": "4226341196275658752",
+ "order_id": [ "3805363027490897920", "3805363027490897924" ]
+ }
+ ]
+}