diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteChannelsExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteChannelsExtensions.cs
index 0038aaa5..0cb9a9be 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteChannelsExtensions.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteChannelsExtensions.cs
@@ -1567,6 +1567,68 @@ namespace SKIT.FlurlHttpClient.Wechat.Api
#endregion
#endregion
+ #region ECLogistics
+ ///
+ /// 异步调用 [POST] /channels/ec/logistics/phonenumberpool/get 接口。
+ /// REF: https://developers.weixin.qq.com/doc/channels/API/logistics/delivery_virtual_number.html
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteChannelsECLogisticsPhoneNumberPoolGetAsync(this WechatApiClient client, Models.ChannelsECLogisticsPhoneNumberPoolGetRequest 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
+ .CreateRequest(request, HttpMethod.Post, "channels", "ec", "logistics", "phonenumberpool", "get")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /channels/ec/logistics/phonenumber/get 接口。
+ /// REF: https://developers.weixin.qq.com/doc/channels/API/logistics/delivery_virtual_number_get.html
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteChannelsECLogisticsPhoneNumberGetAsync(this WechatApiClient client, Models.ChannelsECLogisticsPhoneNumberGetRequest 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
+ .CreateRequest(request, HttpMethod.Post, "channels", "ec", "logistics", "phonenumber", "get")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /channels/ec/logistics/virtualnumber/get 接口。
+ /// REF: https://developers.weixin.qq.com/doc/channels/API/logistics/delivery_virtual_number_get_virtual.html
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteChannelsECLogisticsVirtualNumberGetAsync(this WechatApiClient client, Models.ChannelsECLogisticsVirtualNumberGetRequest 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
+ .CreateRequest(request, HttpMethod.Post, "channels", "ec", "logistics", "virtualnumber", "get")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+ #endregion
+
#region ECSharer
///
/// 异步调用 [POST] /channels/ec/sharer/bind 接口。
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECLogistics/ChannelsECLogisticsPhoneNumberGetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECLogistics/ChannelsECLogisticsPhoneNumberGetRequest.cs
new file mode 100644
index 00000000..b3e05054
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECLogistics/ChannelsECLogisticsPhoneNumberGetRequest.cs
@@ -0,0 +1,22 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/logistics/phonenumber/get 接口的请求。
+ ///
+ public class ChannelsECLogisticsPhoneNumberGetRequest : WechatApiRequest, IInferable
+ {
+ ///
+ /// 获取或设置运单号。
+ ///
+ [Newtonsoft.Json.JsonProperty("waybill_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("waybill_id")]
+ public string WaybillId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置虚拟号码。
+ ///
+ [Newtonsoft.Json.JsonProperty("private_phone")]
+ [System.Text.Json.Serialization.JsonPropertyName("private_phone")]
+ public string? VirtualPhoneNumber { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECLogistics/ChannelsECLogisticsPhoneNumberGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECLogistics/ChannelsECLogisticsPhoneNumberGetResponse.cs
new file mode 100644
index 00000000..dcfbfd8b
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECLogistics/ChannelsECLogisticsPhoneNumberGetResponse.cs
@@ -0,0 +1,15 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/logistics/phonenumber/get 接口的响应。
+ ///
+ public class ChannelsECLogisticsPhoneNumberGetResponse : WechatApiResponse
+ {
+ ///
+ /// 获取或设置真实号码。
+ ///
+ [Newtonsoft.Json.JsonProperty("phone")]
+ [System.Text.Json.Serialization.JsonPropertyName("phone")]
+ public string PhoneNumber { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECLogistics/ChannelsECLogisticsPhoneNumberPoolGetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECLogistics/ChannelsECLogisticsPhoneNumberPoolGetRequest.cs
new file mode 100644
index 00000000..084a1d34
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECLogistics/ChannelsECLogisticsPhoneNumberPoolGetRequest.cs
@@ -0,0 +1,23 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/logistics/phonenumberpool/get 接口的请求。
+ ///
+ public class ChannelsECLogisticsPhoneNumberPoolGetRequest : WechatApiRequest, IInferable
+ {
+ ///
+ /// 获取或设置分页每页数量。
+ /// 默认值: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/ECLogistics/ChannelsECLogisticsPhoneNumberPoolGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECLogistics/ChannelsECLogisticsPhoneNumberPoolGetResponse.cs
new file mode 100644
index 00000000..7d16946f
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECLogistics/ChannelsECLogisticsPhoneNumberPoolGetResponse.cs
@@ -0,0 +1,36 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/logistics/phonenumberpool/get 接口的响应。
+ ///
+ public class ChannelsECLogisticsPhoneNumberPoolGetResponse : WechatApiResponse
+ {
+ ///
+ /// 获取或设置虚拟号码列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("phonenumbers")]
+ [System.Text.Json.Serialization.JsonPropertyName("phonenumbers")]
+ public string[] VirtualPhoneNumberList { get; set; } = default!;
+
+ ///
+ /// 获取或设置总数量。
+ ///
+ [Newtonsoft.Json.JsonProperty("total_num")]
+ [System.Text.Json.Serialization.JsonPropertyName("total_num")]
+ public int TotalCount { get; set; }
+
+ ///
+ /// 获取或设置是否还有更多。
+ ///
+ [Newtonsoft.Json.JsonProperty("has_more")]
+ [System.Text.Json.Serialization.JsonPropertyName("has_more")]
+ public bool HasMore { get; set; }
+
+ ///
+ /// 获取或设置翻页标记。
+ ///
+ [Newtonsoft.Json.JsonProperty("next_key")]
+ [System.Text.Json.Serialization.JsonPropertyName("next_key")]
+ public string? NextCursor { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECLogistics/ChannelsECLogisticsVirtualNumberGetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECLogistics/ChannelsECLogisticsVirtualNumberGetRequest.cs
new file mode 100644
index 00000000..11b7bd67
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECLogistics/ChannelsECLogisticsVirtualNumberGetRequest.cs
@@ -0,0 +1,15 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/logistics/virtualnumber/get 接口的请求。
+ ///
+ public class ChannelsECLogisticsVirtualNumberGetRequest : WechatApiRequest, IInferable
+ {
+ ///
+ /// 获取或设置运单号。
+ ///
+ [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/ECLogistics/ChannelsECLogisticsVirtualNumberGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECLogistics/ChannelsECLogisticsVirtualNumberGetResponse.cs
new file mode 100644
index 00000000..28c450d0
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECLogistics/ChannelsECLogisticsVirtualNumberGetResponse.cs
@@ -0,0 +1,29 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/logistics/virtualnumber/get 接口的响应。
+ ///
+ public class ChannelsECLogisticsVirtualNumberGetResponse : WechatApiResponse
+ {
+ ///
+ /// 获取或设置打码的真实号码。
+ ///
+ [Newtonsoft.Json.JsonProperty("masked_real_phone")]
+ [System.Text.Json.Serialization.JsonPropertyName("masked_real_phone")]
+ public string MaskedPhoneNumber { get; set; } = default!;
+
+ ///
+ /// 获取或设置虚拟号码。
+ ///
+ [Newtonsoft.Json.JsonProperty("main_phone")]
+ [System.Text.Json.Serialization.JsonPropertyName("main_phone")]
+ public string VirtualPhoneNumber { get; set; } = default!;
+
+ ///
+ /// 获取或设置完整虚拟号码。
+ ///
+ [Newtonsoft.Json.JsonProperty("virtual_phone")]
+ [System.Text.Json.Serialization.JsonPropertyName("virtual_phone")]
+ public string FullVirtualPhoneNumber { get; set; } = default!;
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECLogistics/ChannelsECLogisticsPhoneNumberGetRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECLogistics/ChannelsECLogisticsPhoneNumberGetRequest.json
new file mode 100644
index 00000000..0bffc9dd
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECLogistics/ChannelsECLogisticsPhoneNumberGetRequest.json
@@ -0,0 +1,4 @@
+{
+ "waybill_id": "xxxxxx",
+ "private_phone": "xxxxxx"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECLogistics/ChannelsECLogisticsPhoneNumberGetResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECLogistics/ChannelsECLogisticsPhoneNumberGetResponse.json
new file mode 100644
index 00000000..2b143698
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECLogistics/ChannelsECLogisticsPhoneNumberGetResponse.json
@@ -0,0 +1,5 @@
+{
+ "errcode": 0,
+ "errmsg": "ok",
+ "phone": "xxxxx"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECLogistics/ChannelsECLogisticsPhoneNumberPoolGetRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECLogistics/ChannelsECLogisticsPhoneNumberPoolGetRequest.json
new file mode 100644
index 00000000..a8bb1144
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECLogistics/ChannelsECLogisticsPhoneNumberPoolGetRequest.json
@@ -0,0 +1,4 @@
+{
+ "page_size": 10,
+ "next_key": "xxxx"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECLogistics/ChannelsECLogisticsPhoneNumberPoolGetResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECLogistics/ChannelsECLogisticsPhoneNumberPoolGetResponse.json
new file mode 100644
index 00000000..324263ed
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECLogistics/ChannelsECLogisticsPhoneNumberPoolGetResponse.json
@@ -0,0 +1,8 @@
+{
+ "errcode": 0,
+ "errmsg": "ok",
+ "has_more": true,
+ "next_key": "xxxxx",
+ "total_num": 3000,
+ "phonenumbers": [ "xxxx", "xxxx" ]
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECLogistics/ChannelsECLogisticsVirtualNumberGetRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECLogistics/ChannelsECLogisticsVirtualNumberGetRequest.json
new file mode 100644
index 00000000..6dfc7d75
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECLogistics/ChannelsECLogisticsVirtualNumberGetRequest.json
@@ -0,0 +1,3 @@
+{
+ "waybill_id": "xxxx"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECLogistics/ChannelsECLogisticsVirtualNumberGetResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECLogistics/ChannelsECLogisticsVirtualNumberGetResponse.json
new file mode 100644
index 00000000..3aed139b
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECLogistics/ChannelsECLogisticsVirtualNumberGetResponse.json
@@ -0,0 +1,7 @@
+{
+ "errcode": 0,
+ "errmsg": "ok",
+ "masked_real_phone": "123****8901",
+ "virtual_phone": "12345678901-1234",
+ "main_phone": "12345678901"
+}