diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Events/ChannelsEC/ChannelsECCategoryAuditEvent.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/ChannelsEC/ChannelsECCategoryAuditEvent.cs
new file mode 100644
index 00000000..c58beda0
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/ChannelsEC/ChannelsECCategoryAuditEvent.cs
@@ -0,0 +1,48 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Events
+{
+ ///
+ /// 表示 EVENT.product_category_audit 事件的数据。
+ /// REF: https://developers.weixin.qq.com/doc/channels/API/category/callback/ProductCategoryAudit.html
+ ///
+ public class ChannelsECCategoryAuditEvent : WechatApiEvent, WechatApiEvent.Serialization.IJsonSerializable, WechatApiEvent.Serialization.IXmlSerializable
+ {
+ public static class Types
+ {
+ public class EventData
+ {
+ ///
+ /// 获取或设置审核单 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("audit_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("audit_id")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ [System.Xml.Serialization.XmlElement("audit_id")]
+ public long AuditId { get; set; }
+
+ ///
+ /// 获取或设置审核状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("status")]
+ [System.Text.Json.Serialization.JsonPropertyName("status")]
+ [System.Xml.Serialization.XmlElement("status")]
+ public int Status { get; set; }
+
+ ///
+ /// 获取或设置拒绝原因。
+ ///
+ [Newtonsoft.Json.JsonProperty("reason")]
+ [System.Text.Json.Serialization.JsonPropertyName("reason")]
+ [System.Xml.Serialization.XmlElement("reason", IsNullable = true)]
+ public string? RejectReason { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置事件数据。
+ ///
+ [Newtonsoft.Json.JsonProperty("ProductCategoryAudit")]
+ [System.Text.Json.Serialization.JsonPropertyName("ProductCategoryAudit")]
+ [System.Xml.Serialization.XmlElement("ProductCategoryAudit")]
+ public Types.EventData EventData { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Events/OpenProduct/OpenProductBrandAuditEvent.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/OpenProduct/OpenProductBrandAuditEvent.cs
index a96cf401..8c29e979 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Api/Events/OpenProduct/OpenProductBrandAuditEvent.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/OpenProduct/OpenProductBrandAuditEvent.cs
@@ -47,7 +47,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Events
///
[Newtonsoft.Json.JsonProperty("reject_reason")]
[System.Text.Json.Serialization.JsonPropertyName("reject_reason")]
- [System.Xml.Serialization.XmlElement("reject_reason")]
+ [System.Xml.Serialization.XmlElement("reject_reason", IsNullable = true)]
public string? RejectReason { get; set; }
}
}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Events/OpenProduct/OpenProductCategoryAuditEvent.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/OpenProduct/OpenProductCategoryAuditEvent.cs
index 65ff73aa..6d82f133 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Api/Events/OpenProduct/OpenProductCategoryAuditEvent.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/OpenProduct/OpenProductCategoryAuditEvent.cs
@@ -39,7 +39,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Events
///
[Newtonsoft.Json.JsonProperty("reject_reason")]
[System.Text.Json.Serialization.JsonPropertyName("reject_reason")]
- [System.Xml.Serialization.XmlElement("reject_reason")]
+ [System.Xml.Serialization.XmlElement("reject_reason", IsNullable = true)]
public string? RejectReason { get; set; }
}
}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteChannelsExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteChannelsExtensions.cs
index b76c6468..ded5c0e9 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteChannelsExtensions.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteChannelsExtensions.cs
@@ -55,6 +55,68 @@ namespace SKIT.FlurlHttpClient.Wechat.Api
}
#endregion
+ #region ECCategory
+ ///
+ /// 异步调用 [POST] /channels/ec/category/availablesoncategories/get 接口。
+ /// REF: https://developers.weixin.qq.com/doc/channels/API/category/getavailablesoncategories.html
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteChannelsECCategoryAvailableSonCategoriesGetAsync(this WechatApiClient client, Models.ChannelsECCategoryAvailableSonCategoriesGetRequest 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", "category", "availablesoncategories", "get")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /channels/ec/category/add 接口。
+ /// REF: https://developers.weixin.qq.com/doc/channels/API/category/add.html
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteChannelsECCategoryAddAsync(this WechatApiClient client, Models.ChannelsECCategoryAddRequest 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", "category", "add")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /channels/ec/category/audit/get 接口。
+ /// REF: https://developers.weixin.qq.com/doc/channels/API/category/audit_get.html
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteChannelsECCategoryAuditGetAsync(this WechatApiClient client, Models.ChannelsECCategoryAuditGetRequest 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", "category", "audit", "get")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+ #endregion
+
#region ECWindow
///
/// 异步调用 [POST] /channels/ec/window/product/add 接口。
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECCategory/ChannelsECCategoryAddRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECCategory/ChannelsECCategoryAddRequest.cs
new file mode 100644
index 00000000..40ac4cda
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECCategory/ChannelsECCategoryAddRequest.cs
@@ -0,0 +1,51 @@
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/category/add 接口的请求。
+ ///
+ public class ChannelsECCategoryAddRequest : WechatApiRequest, IInferable
+ {
+ public static class Types
+ {
+ public class Category
+ {
+ ///
+ /// 获取或设置一级类目 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("level1")]
+ [System.Text.Json.Serialization.JsonPropertyName("level1")]
+ public int FirstCategoryId { get; set; }
+
+ ///
+ /// 获取或设置二级类目 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("level2")]
+ [System.Text.Json.Serialization.JsonPropertyName("level2")]
+ public int SecondCategoryId { get; set; }
+
+ ///
+ /// 获取或设置三级类目 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("level3")]
+ [System.Text.Json.Serialization.JsonPropertyName("level3")]
+ public int ThirdCategoryId { get; set; }
+
+ ///
+ /// 获取或设置资质材料图片 MediaId 列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("certificate")]
+ [System.Text.Json.Serialization.JsonPropertyName("certificate")]
+ public IList? CertificateMediaIdList { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置类目信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("category_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("category_info")]
+ public Types.Category Category { get; set; } = new Types.Category();
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECCategory/ChannelsECCategoryAddResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECCategory/ChannelsECCategoryAddResponse.cs
new file mode 100644
index 00000000..814bc1e1
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECCategory/ChannelsECCategoryAddResponse.cs
@@ -0,0 +1,16 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/category/add 接口的响应。
+ ///
+ public class ChannelsECCategoryAddResponse : WechatApiResponse
+ {
+ ///
+ /// 获取或设置审核单 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("audit_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("audit_id")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ public long AuditId { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECCategory/ChannelsECCategoryAuditGetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECCategory/ChannelsECCategoryAuditGetRequest.cs
new file mode 100644
index 00000000..48711565
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECCategory/ChannelsECCategoryAuditGetRequest.cs
@@ -0,0 +1,15 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/category/audit/get 接口的请求。
+ ///
+ public class ChannelsECCategoryAuditGetRequest : WechatApiRequest, IInferable
+ {
+ ///
+ /// 获取或设置审核单 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("audit_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("audit_id")]
+ public long AuditId { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECCategory/ChannelsECCategoryAuditGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECCategory/ChannelsECCategoryAuditGetResponse.cs
new file mode 100644
index 00000000..351714e2
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECCategory/ChannelsECCategoryAuditGetResponse.cs
@@ -0,0 +1,35 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/category/audit/get 接口的响应。
+ ///
+ public class ChannelsECCategoryAuditGetResponse : WechatApiResponse
+ {
+ public static class Types
+ {
+ public class Data
+ {
+ ///
+ /// 获取或设置审核状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("status")]
+ [System.Text.Json.Serialization.JsonPropertyName("status")]
+ public int Status { get; set; }
+
+ ///
+ /// 获取或设置审核拒绝原因。
+ ///
+ [Newtonsoft.Json.JsonProperty("reject_reason")]
+ [System.Text.Json.Serialization.JsonPropertyName("reject_reason")]
+ public string? RejectReason { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置返回数据。
+ ///
+ [Newtonsoft.Json.JsonProperty("data")]
+ [System.Text.Json.Serialization.JsonPropertyName("data")]
+ public Types.Data Data { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECCategory/ChannelsECCategoryAvailableSonCategoriesGetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECCategory/ChannelsECCategoryAvailableSonCategoriesGetRequest.cs
new file mode 100644
index 00000000..8cb0f3c3
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECCategory/ChannelsECCategoryAvailableSonCategoriesGetRequest.cs
@@ -0,0 +1,15 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/category/availablesoncategories/get 接口的请求。
+ ///
+ public class ChannelsECCategoryAvailableSonCategoriesGetRequest : WechatApiRequest, IInferable
+ {
+ ///
+ /// 获取或设置上级类目 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("f_cat_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("f_cat_id")]
+ public int ParentCategoryId { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECCategory/ChannelsECCategoryAvailableSonCategoriesGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECCategory/ChannelsECCategoryAvailableSonCategoriesGetResponse.cs
new file mode 100644
index 00000000..dc790a9f
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECCategory/ChannelsECCategoryAvailableSonCategoriesGetResponse.cs
@@ -0,0 +1,42 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/category/availablesoncategories/get 接口的响应。
+ ///
+ public class ChannelsECCategoryAvailableSonCategoriesGetResponse : WechatApiResponse
+ {
+ public static class Types
+ {
+ public class Category
+ {
+ ///
+ /// 获取或设置类目 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("cat_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("cat_id")]
+ public int CategoryId { get; set; }
+
+ ///
+ /// 获取或设置类目名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("name")]
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string Name { get; set; } = default!;
+
+ ///
+ /// 获取或设置上级类目 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("f_cat_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("f_cat_id")]
+ public int ParentCategoryId { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置类目列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("cat_list")]
+ [System.Text.Json.Serialization.JsonPropertyName("cat_list")]
+ public Types.Category[] CategoryList { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Shop/Audit/ShopAuditAuditCategoryRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Shop/Audit/ShopAuditAuditCategoryRequest.cs
index 9501dbb1..9eec8d2f 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Shop/Audit/ShopAuditAuditCategoryRequest.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Shop/Audit/ShopAuditAuditCategoryRequest.cs
@@ -41,7 +41,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models
///
[Newtonsoft.Json.JsonProperty("certificate")]
[System.Text.Json.Serialization.JsonPropertyName("certificate")]
- public IList? QualificationUrlList { get; set; }
+ public IList? CertificateUrlList { get; set; }
}
}
@@ -58,6 +58,13 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models
[Newtonsoft.Json.JsonProperty("category_info")]
[System.Text.Json.Serialization.JsonPropertyName("category_info")]
public Types.Category Category { get; set; } = new Types.Category();
+
+ ///
+ /// 获取或设置商品使用场景 ID 列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("scene_group_list")]
+ [System.Text.Json.Serialization.JsonPropertyName("scene_group_list")]
+ public IList? SceneGroupIdList { get; set; }
}
}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaComponent/Register/WxaComponentFastRegisterPersonalWeappQueryRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaComponent/Register/WxaComponentFastRegisterPersonalWeappQueryRequest.cs
index bc310cd8..71f542dc 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaComponent/Register/WxaComponentFastRegisterPersonalWeappQueryRequest.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaComponent/Register/WxaComponentFastRegisterPersonalWeappQueryRequest.cs
@@ -1,7 +1,7 @@
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
///
- /// 表示 [POST] /wx/component/fastregisterpersonalweapp?action=query 接口的请求。
+ /// 表示 [POST] /wxa/component/fastregisterpersonalweapp?action=query 接口的请求。
///
public class WxaComponentFastRegisterPersonalWeappQueryRequest : WechatApiRequest, IInferable
{
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/ChannelsEC/ChannelsECCategoryAuditEvent.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/ChannelsEC/ChannelsECCategoryAuditEvent.json
new file mode 100644
index 00000000..ec2946d0
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/ChannelsEC/ChannelsECCategoryAuditEvent.json
@@ -0,0 +1,12 @@
+{
+ "ToUserName": "gh_*",
+ "FromUserName": "OpenID",
+ "CreateTime": 1662480000,
+ "MsgType": "event",
+ "Event": "product_category_audit",
+ "ProductCategoryAudit": {
+ "audit_id": "123456",
+ "status": "1",
+ "reason": "xxx原因"
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECCategory/ChannelsECCategoryAddRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECCategory/ChannelsECCategoryAddRequest.json
new file mode 100644
index 00000000..79367a8d
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECCategory/ChannelsECCategoryAddRequest.json
@@ -0,0 +1,8 @@
+{
+ "category_info": {
+ "level1": 7419,
+ "level2": 7439,
+ "level3": 7448,
+ "certificate": ["THE_MEDIA_ID_1", "THE_MEDIA_ID_2"]
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECCategory/ChannelsECCategoryAddResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECCategory/ChannelsECCategoryAddResponse.json
new file mode 100644
index 00000000..764e16f3
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECCategory/ChannelsECCategoryAddResponse.json
@@ -0,0 +1,5 @@
+{
+ "errcode": 0,
+ "errmsg": "ok",
+ "audit_id": "123456"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECCategory/ChannelsECCategoryAuditGetRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECCategory/ChannelsECCategoryAuditGetRequest.json
new file mode 100644
index 00000000..8e361082
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECCategory/ChannelsECCategoryAuditGetRequest.json
@@ -0,0 +1,3 @@
+{
+ "audit_id": "123456"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECCategory/ChannelsECCategoryAuditGetResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECCategory/ChannelsECCategoryAuditGetResponse.json
new file mode 100644
index 00000000..d18b65ea
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECCategory/ChannelsECCategoryAuditGetResponse.json
@@ -0,0 +1,8 @@
+{
+ "errcode": 0,
+ "errmsg": "ok",
+ "data": {
+ "status": 9,
+ "reject_reason": "请重新提交审核"
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECCategory/ChannelsECCategoryAvailableSonCategoriesGetRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECCategory/ChannelsECCategoryAvailableSonCategoriesGetRequest.json
new file mode 100644
index 00000000..648abcdb
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECCategory/ChannelsECCategoryAvailableSonCategoriesGetRequest.json
@@ -0,0 +1,3 @@
+{
+ "f_cat_id": 0
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECCategory/ChannelsECCategoryAvailableSonCategoriesGetResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECCategory/ChannelsECCategoryAvailableSonCategoriesGetResponse.json
new file mode 100644
index 00000000..843f879d
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECCategory/ChannelsECCategoryAvailableSonCategoriesGetResponse.json
@@ -0,0 +1,16 @@
+{
+ "errcode": 0,
+ "errmsg": "ok",
+ "cat_list": [
+ {
+ "cat_id": 1,
+ "f_cat_id": 0,
+ "name": "服饰"
+ },
+ {
+ "cat_id": 2,
+ "f_cat_id": 0,
+ "name": "鞋帽"
+ }
+ ]
+}