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": "鞋帽" + } + ] +}