diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Events/ChannelsEC/ChannelsECCategoryAuditEvent.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/ChannelsEC/ChannelsECProductCategoryAuditEvent.cs
similarity index 87%
rename from src/SKIT.FlurlHttpClient.Wechat.Api/Events/ChannelsEC/ChannelsECCategoryAuditEvent.cs
rename to src/SKIT.FlurlHttpClient.Wechat.Api/Events/ChannelsEC/ChannelsECProductCategoryAuditEvent.cs
index c58beda0..c41993fc 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Api/Events/ChannelsEC/ChannelsECCategoryAuditEvent.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/ChannelsEC/ChannelsECProductCategoryAuditEvent.cs
@@ -4,7 +4,7 @@ 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 class ChannelsECProductCategoryAuditEvent : WechatApiEvent, WechatApiEvent.Serialization.IJsonSerializable, WechatApiEvent.Serialization.IXmlSerializable
{
public static class Types
{
@@ -28,12 +28,12 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Events
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; }
+ public string? Reason { get; set; }
}
}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Events/ChannelsEC/ChannelsECProductSPUAuditEvent.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/ChannelsEC/ChannelsECProductSPUAuditEvent.cs
new file mode 100644
index 00000000..02575b17
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/ChannelsEC/ChannelsECProductSPUAuditEvent.cs
@@ -0,0 +1,48 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Events
+{
+ ///
+ /// 表示 EVENT.product_spu_audit 事件的数据。
+ /// REF: https://developers.weixin.qq.com/doc/channels/API/product/callback/ProductSpuAudit.html
+ ///
+ public class ChannelsECProductSPUAuditEvent : WechatApiEvent, WechatApiEvent.Serialization.IJsonSerializable, WechatApiEvent.Serialization.IXmlSerializable
+ {
+ public static class Types
+ {
+ public class EventData
+ {
+ ///
+ /// 获取或设置商品 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("product_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("product_id")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ [System.Xml.Serialization.XmlElement("product_id")]
+ public long ProductId { 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? Reason { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置事件数据。
+ ///
+ [Newtonsoft.Json.JsonProperty("ProductSpuAudit")]
+ [System.Text.Json.Serialization.JsonPropertyName("ProductSpuAudit")]
+ [System.Xml.Serialization.XmlElement("ProductSpuAudit")]
+ public Types.EventData EventData { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Events/ChannelsEC/ChannelsECProductSPUListingEvent.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/ChannelsEC/ChannelsECProductSPUListingEvent.cs
new file mode 100644
index 00000000..25d393c9
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/ChannelsEC/ChannelsECProductSPUListingEvent.cs
@@ -0,0 +1,48 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Events
+{
+ ///
+ /// 表示 EVENT.product_spu_listing 事件的数据。
+ /// REF: https://developers.weixin.qq.com/doc/channels/API/product/callback/ProductSpuListing.html
+ ///
+ public class ChannelsECProductSPUListingEvent : WechatApiEvent, WechatApiEvent.Serialization.IJsonSerializable, WechatApiEvent.Serialization.IXmlSerializable
+ {
+ public static class Types
+ {
+ public class EventData
+ {
+ ///
+ /// 获取或设置商品 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("product_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("product_id")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ [System.Xml.Serialization.XmlElement("product_id")]
+ public long ProductId { 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? Reason { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置事件数据。
+ ///
+ [Newtonsoft.Json.JsonProperty("ProductSpuListing")]
+ [System.Text.Json.Serialization.JsonPropertyName("ProductSpuListing")]
+ [System.Xml.Serialization.XmlElement("ProductSpuListing")]
+ public Types.EventData EventData { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteChannelsExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteChannelsExtensions.cs
index 5a575eab..d87b453c 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteChannelsExtensions.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteChannelsExtensions.cs
@@ -303,6 +303,188 @@ namespace SKIT.FlurlHttpClient.Wechat.Api
#endregion
#endregion
+ #region Product
+ ///
+ /// 异步调用 [POST] /channels/ec/product/add 接口。
+ /// REF: https://developers.weixin.qq.com/doc/channels/API/product/add.html
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteChannelsECProductAddAsync(this WechatApiClient client, Models.ChannelsECProductAddRequest 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", "product", "add")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /channels/ec/product/update 接口。
+ /// REF: https://developers.weixin.qq.com/doc/channels/API/product/update.html
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteChannelsECProductUpdateAsync(this WechatApiClient client, Models.ChannelsECProductUpdateRequest 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", "product", "update")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /channels/ec/product/delete 接口。
+ /// REF: https://developers.weixin.qq.com/doc/channels/API/product/delete.html
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteChannelsECProductDeleteAsync(this WechatApiClient client, Models.ChannelsECProductDeleteRequest 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", "product", "delete")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /channels/ec/product/get 接口。
+ /// REF: https://developers.weixin.qq.com/doc/channels/API/product/get.html
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteChannelsECProductGetAsync(this WechatApiClient client, Models.ChannelsECProductGetRequest 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", "product", "get")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /channels/ec/product/list/get 接口。
+ /// REF: https://developers.weixin.qq.com/doc/channels/API/product/list_get.html
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteChannelsECProductListGetAsync(this WechatApiClient client, Models.ChannelsECProductListGetRequest 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", "product", "list", "get")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /channels/ec/product/listing 接口。
+ /// REF: https://developers.weixin.qq.com/doc/channels/API/product/listing.html
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteChannelsECProductListingAsync(this WechatApiClient client, Models.ChannelsECProductListingRequest 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", "product", "listing")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /channels/ec/product/delisting 接口。
+ /// REF: https://developers.weixin.qq.com/doc/channels/API/product/delisting.html
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteChannelsECProductDelistingAsync(this WechatApiClient client, Models.ChannelsECProductDelistingRequest 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", "product", "delisting")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /channels/ec/product/audit/cancel 接口。
+ /// REF: https://developers.weixin.qq.com/doc/channels/API/product/audit_cancel.html
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteChannelsECProductAuditCancelAsync(this WechatApiClient client, Models.ChannelsECProductAuditCancelRequest 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", "product", "audit", "cancel")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /channels/ec/product/stock/update 接口。
+ /// REF: https://developers.weixin.qq.com/doc/channels/API/product/stock_update.html
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteChannelsECProductStockUpdateAsync(this WechatApiClient client, Models.ChannelsECProductStockUpdateRequest 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", "product", "stock", "update")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+ #endregion
+
#region Order
#region Order/Delivery
///
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECOrder/Delivery/ChannelsECOrderDeliverySendRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECOrder/Delivery/ChannelsECOrderDeliverySendRequest.cs
index 40854653..e73f5160 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECOrder/Delivery/ChannelsECOrderDeliverySendRequest.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECOrder/Delivery/ChannelsECOrderDeliverySendRequest.cs
@@ -57,7 +57,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models
///
[Newtonsoft.Json.JsonProperty("deliver_type")]
[System.Text.Json.Serialization.JsonPropertyName("deliver_type")]
- public int DeliverType { get; set; }
+ public int DeliverMethod { get; set; }
///
/// 获取或设置商品列表。
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductAddRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductAddRequest.cs
new file mode 100644
index 00000000..fa4ce210
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductAddRequest.cs
@@ -0,0 +1,220 @@
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/product/add 接口的请求。
+ ///
+ public class ChannelsECProductAddRequest : WechatApiRequest, IInferable
+ {
+ public static class Types
+ {
+ public class Detail
+ {
+ ///
+ /// 获取或设置商品详情图片 URL 列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("imgs")]
+ [System.Text.Json.Serialization.JsonPropertyName("imgs")]
+ public IList ImageUrlList { get; set; } = new List();
+
+ ///
+ /// 获取或设置商品详情文字。
+ ///
+ [Newtonsoft.Json.JsonProperty("desc")]
+ [System.Text.Json.Serialization.JsonPropertyName("desc")]
+ public string? Description { get; set; }
+ }
+
+ public class Category
+ {
+ ///
+ /// 获取或设置商品类目 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("cat_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("cat_id")]
+ public int CategoryId { get; set; }
+ }
+
+ public class Attribute
+ {
+ ///
+ /// 获取或设置属性的 Key。
+ ///
+ [Newtonsoft.Json.JsonProperty("attr_key")]
+ [System.Text.Json.Serialization.JsonPropertyName("attr_key")]
+ public string Key { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置属性的值。
+ ///
+ [Newtonsoft.Json.JsonProperty("attr_value")]
+ [System.Text.Json.Serialization.JsonPropertyName("attr_value")]
+ public string Value { get; set; } = string.Empty;
+ }
+
+ public class Express
+ {
+ ///
+ /// 获取或设置运费模板 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("template_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("template_id")]
+ public long TemplateId { get; set; }
+ }
+
+ public class SKU
+ {
+ ///
+ /// 获取或设置商家自定义 SKU ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("out_sku_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("out_sku_id")]
+ public string OutSKUId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置缩略图 Url。
+ ///
+ [Newtonsoft.Json.JsonProperty("thumb_img")]
+ [System.Text.Json.Serialization.JsonPropertyName("thumb_img")]
+ public string ThumbnailUrl { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置售价(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("sale_price")]
+ [System.Text.Json.Serialization.JsonPropertyName("sale_price")]
+ public int SalePrice { get; set; }
+
+ ///
+ /// 获取或设置市场价(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("market_price")]
+ [System.Text.Json.Serialization.JsonPropertyName("market_price")]
+ public int MarketPrice { get; set; }
+
+ ///
+ /// 获取或设置库存。
+ ///
+ [Newtonsoft.Json.JsonProperty("stock_num")]
+ [System.Text.Json.Serialization.JsonPropertyName("stock_num")]
+ public int Stock { get; set; }
+
+ ///
+ /// 获取或设置商品编码。
+ ///
+ [Newtonsoft.Json.JsonProperty("sku_code")]
+ [System.Text.Json.Serialization.JsonPropertyName("sku_code")]
+ public string? SKUCode { get; set; }
+
+ ///
+ /// 获取或设置商品属性列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("sku_attrs")]
+ [System.Text.Json.Serialization.JsonPropertyName("sku_attrs")]
+ public IList? AttributeList { get; set; }
+ }
+
+ public class Limitation
+ {
+ ///
+ /// 获取或设置限购周期类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("period_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("period_type")]
+ public int PeriodType { get; set; }
+
+ ///
+ /// 获取或设置限购数量。
+ ///
+ [Newtonsoft.Json.JsonProperty("limited_buy_num")]
+ [System.Text.Json.Serialization.JsonPropertyName("limited_buy_num")]
+ public int? LimitedBuyCount { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置商家自定义商品 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("out_product_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("out_product_id")]
+ public string? OutProductId { get; set; }
+
+ ///
+ /// 获取或设置商品标题。
+ ///
+ [Newtonsoft.Json.JsonProperty("title")]
+ [System.Text.Json.Serialization.JsonPropertyName("title")]
+ public string Title { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置商品副标题。
+ ///
+ [Newtonsoft.Json.JsonProperty("sub_title")]
+ [System.Text.Json.Serialization.JsonPropertyName("sub_title")]
+ public string? SubTitle { get; set; }
+
+ ///
+ /// 获取或设置主图 URL 列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("head_imgs")]
+ [System.Text.Json.Serialization.JsonPropertyName("head_imgs")]
+ public IList HeadImageUrlList { get; set; } = new List();
+
+ ///
+ /// 获取或设置商品详情信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("desc_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("desc_info")]
+ public Types.Detail Detail { get; set; } = new Types.Detail();
+
+ ///
+ /// 获取或设置商品类目列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("cats")]
+ [System.Text.Json.Serialization.JsonPropertyName("cats")]
+ public IList CategoryList { get; set; } = new List();
+
+ ///
+ /// 获取或设置商品属性列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("attrs")]
+ [System.Text.Json.Serialization.JsonPropertyName("attrs")]
+ public IList? AttributeList { get; set; }
+
+ ///
+ /// 获取或设置发货方式。
+ ///
+ [Newtonsoft.Json.JsonProperty("deliver_method")]
+ [System.Text.Json.Serialization.JsonPropertyName("deliver_method")]
+ public int? DeliverMethod { get; set; }
+
+ ///
+ /// 获取或设置运费信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("express_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("express_info")]
+ public Types.Express? Express { get; set; }
+
+ ///
+ /// 获取或设置售后说明。
+ ///
+ [Newtonsoft.Json.JsonProperty("aftersale_desc")]
+ [System.Text.Json.Serialization.JsonPropertyName("aftersale_desc")]
+ public string? AftersaleDescription { get; set; }
+
+ ///
+ /// 获取或设置 SKU 列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("skus")]
+ [System.Text.Json.Serialization.JsonPropertyName("skus")]
+ public IList? SKUList { get; set; }
+
+ ///
+ /// 获取或设置限购信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("limited_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("limited_info")]
+ public Types.Limitation? Limitation { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductAddResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductAddResponse.cs
new file mode 100644
index 00000000..07e5ef46
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductAddResponse.cs
@@ -0,0 +1,40 @@
+using System;
+
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/product/add 接口的响应。
+ ///
+ public class ChannelsECProductAddResponse : WechatApiResponse
+ {
+ public static class Types
+ {
+ public class Data
+ {
+ ///
+ /// 获取或设置商品 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("product_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("product_id")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ public long ProductId { get; set; }
+
+ ///
+ /// 获取或设置创建时间。
+ ///
+ [Newtonsoft.Json.JsonProperty("create_time")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RegularDateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("create_time")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RegularDateTimeOffsetConverter))]
+ public DateTimeOffset CreateTime { 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/ECProduct/ChannelsECProductAuditCancelRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductAuditCancelRequest.cs
new file mode 100644
index 00000000..a5d814f6
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductAuditCancelRequest.cs
@@ -0,0 +1,15 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/product/audit/cancel 接口的请求。
+ ///
+ public class ChannelsECProductAuditCancelRequest : WechatApiRequest, IInferable
+ {
+ ///
+ /// 获取或设置商品 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("product_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("product_id")]
+ public long ProductId { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductAuditCancelResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductAuditCancelResponse.cs
new file mode 100644
index 00000000..1826ffb8
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductAuditCancelResponse.cs
@@ -0,0 +1,9 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/product/audit/cancel 接口的响应。
+ ///
+ public class ChannelsECProductAuditCancelResponse : WechatApiResponse
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductDeleteRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductDeleteRequest.cs
new file mode 100644
index 00000000..c2efd199
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductDeleteRequest.cs
@@ -0,0 +1,15 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/product/delete 接口的请求。
+ ///
+ public class ChannelsECProductDeleteRequest : WechatApiRequest, IInferable
+ {
+ ///
+ /// 获取或设置商品 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("product_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("product_id")]
+ public long ProductId { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductDeleteResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductDeleteResponse.cs
new file mode 100644
index 00000000..88beaed3
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductDeleteResponse.cs
@@ -0,0 +1,9 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/product/delete 接口的响应。
+ ///
+ public class ChannelsECProductDeleteResponse : WechatApiResponse
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductDelistingRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductDelistingRequest.cs
new file mode 100644
index 00000000..e87f4bfe
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductDelistingRequest.cs
@@ -0,0 +1,15 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/product/delisting 接口的请求。
+ ///
+ public class ChannelsECProductDelistingRequest : WechatApiRequest, IInferable
+ {
+ ///
+ /// 获取或设置商品 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("product_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("product_id")]
+ public long ProductId { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductDelistingResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductDelistingResponse.cs
new file mode 100644
index 00000000..6dbc51ea
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductDelistingResponse.cs
@@ -0,0 +1,9 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/product/delisting 接口的响应。
+ ///
+ public class ChannelsECProductDelistingResponse : WechatApiResponse
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductGetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductGetRequest.cs
new file mode 100644
index 00000000..f4490a64
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductGetRequest.cs
@@ -0,0 +1,22 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/product/get 接口的请求。
+ ///
+ public class ChannelsECProductGetRequest : WechatApiRequest, IInferable
+ {
+ ///
+ /// 获取或设置商品 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("product_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("product_id")]
+ public long ProductId { get; set; }
+
+ ///
+ /// 获取或设置数据类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("data_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("data_type")]
+ public int? DataType { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductGetResponse.cs
new file mode 100644
index 00000000..f0351707
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductGetResponse.cs
@@ -0,0 +1,285 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/product/get 接口的响应。
+ ///
+ public class ChannelsECProductGetResponse : WechatApiResponse
+ {
+ public static class Types
+ {
+ public class Product
+ {
+
+ public static class Types
+ {
+ public class Detail
+ {
+ ///
+ /// 获取或设置商品详情图片 URL 列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("imgs")]
+ [System.Text.Json.Serialization.JsonPropertyName("imgs")]
+ public string[] ImageUrlList { get; set; } = default!;
+
+ ///
+ /// 获取或设置商品文字描述。
+ ///
+ [Newtonsoft.Json.JsonProperty("desc")]
+ [System.Text.Json.Serialization.JsonPropertyName("desc")]
+ public string? Description { get; set; }
+ }
+
+ public class Category
+ {
+ ///
+ /// 获取或设置商品类目 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("cat_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("cat_id")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ public int CategoryId { get; set; }
+ }
+
+ public class Attribute
+ {
+ ///
+ /// 获取或设置属性的 Key。
+ ///
+ [Newtonsoft.Json.JsonProperty("attr_key")]
+ [System.Text.Json.Serialization.JsonPropertyName("attr_key")]
+ public string Key { get; set; } = default!;
+
+ ///
+ /// 获取或设置属性的值。
+ ///
+ [Newtonsoft.Json.JsonProperty("attr_value")]
+ [System.Text.Json.Serialization.JsonPropertyName("attr_value")]
+ public string Value { get; set; } = default!;
+ }
+
+ public class Express
+ {
+ ///
+ /// 获取或设置运费模板 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("template_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("template_id")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ public long TemplateId { get; set; }
+ }
+
+ public class SKU
+ {
+ ///
+ /// 获取或设置 SKU ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("sku_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("sku_id")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ public long SKUId { get; set; }
+
+ ///
+ /// 获取或设置商家自定义 SKU ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("out_sku_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("out_sku_id")]
+ public string OutSKUId { get; set; } = default!;
+
+ ///
+ /// 获取或设置缩略图 URL。
+ ///
+ [Newtonsoft.Json.JsonProperty("thumb_img")]
+ [System.Text.Json.Serialization.JsonPropertyName("thumb_img")]
+ public string ThumbnailUrl { get; set; } = default!;
+
+ ///
+ /// 获取或设置售价(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("sale_price")]
+ [System.Text.Json.Serialization.JsonPropertyName("sale_price")]
+ public int SalePrice { get; set; }
+
+ ///
+ /// 获取或设置市场价(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("market_price")]
+ [System.Text.Json.Serialization.JsonPropertyName("market_price")]
+ public int MarketPrice { get; set; }
+
+ ///
+ /// 获取或设置库存。
+ ///
+ [Newtonsoft.Json.JsonProperty("stock_num")]
+ [System.Text.Json.Serialization.JsonPropertyName("stock_num")]
+ public int Stock { get; set; }
+
+ ///
+ /// 获取或设置商品编码。
+ ///
+ [Newtonsoft.Json.JsonProperty("sku_code")]
+ [System.Text.Json.Serialization.JsonPropertyName("sku_code")]
+ public string? SKUCode { get; set; }
+
+ ///
+ /// 获取或设置商品属性列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("sku_attrs")]
+ [System.Text.Json.Serialization.JsonPropertyName("sku_attrs")]
+ public Attribute[]? AttributeList { get; set; }
+
+ ///
+ /// 获取或设置 SKU 状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("status")]
+ [System.Text.Json.Serialization.JsonPropertyName("status")]
+ public int Status { get; set; }
+ }
+
+ public class Limitation
+ {
+ ///
+ /// 获取或设置限购周期类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("period_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("period_type")]
+ public int PeriodType { get; set; }
+
+ ///
+ /// 获取或设置限购数量。
+ ///
+ [Newtonsoft.Json.JsonProperty("limited_buy_num")]
+ [System.Text.Json.Serialization.JsonPropertyName("limited_buy_num")]
+ public int? LimitedBuyCount { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置商品 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("product_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("product_id")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ public long ProductId { get; set; }
+
+ ///
+ /// 获取或设置商家自定义商品 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("out_product_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("out_product_id")]
+ public string? OutProductId { get; set; }
+
+ ///
+ /// 获取或设置商品标题。
+ ///
+ [Newtonsoft.Json.JsonProperty("title")]
+ [System.Text.Json.Serialization.JsonPropertyName("title")]
+ public string Title { get; set; } = default!;
+
+ ///
+ /// 获取或设置商品副标题。
+ ///
+ [Newtonsoft.Json.JsonProperty("sub_title")]
+ [System.Text.Json.Serialization.JsonPropertyName("sub_title")]
+ public string? SubTitle { get; set; }
+
+ ///
+ /// 获取或设置主图 URL 列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("head_imgs")]
+ [System.Text.Json.Serialization.JsonPropertyName("head_imgs")]
+ public string[] HeadImageUrlList { get; set; } = default!;
+
+ ///
+ /// 获取或设置商品详情信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("desc_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("desc_info")]
+ public Types.Detail Detail { get; set; } = default!;
+
+ ///
+ /// 获取或设置商品类目列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("cats")]
+ [System.Text.Json.Serialization.JsonPropertyName("cats")]
+ public Types.Category[] CategoryList { get; set; } = default!;
+
+ ///
+ /// 获取或设置商品属性列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("attrs")]
+ [System.Text.Json.Serialization.JsonPropertyName("attrs")]
+ public Types.Attribute[]? AttributeList { get; set; }
+
+ ///
+ /// 获取或设置发货方式。
+ ///
+ [Newtonsoft.Json.JsonProperty("deliver_method")]
+ [System.Text.Json.Serialization.JsonPropertyName("deliver_method")]
+ public int? DeliverMethod { get; set; }
+
+ ///
+ /// 获取或设置运费信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("express_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("express_info")]
+ public Types.Express? Express { get; set; }
+
+ ///
+ /// 获取或设置售后说明。
+ ///
+ [Newtonsoft.Json.JsonProperty("aftersale_desc")]
+ [System.Text.Json.Serialization.JsonPropertyName("aftersale_desc")]
+ public string? AftersaleDescription { get; set; }
+
+ ///
+ /// 获取或设置商品状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("status")]
+ [System.Text.Json.Serialization.JsonPropertyName("status")]
+ public int Status { get; set; }
+
+ ///
+ /// 获取或设置商品草稿状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("edit_status")]
+ [System.Text.Json.Serialization.JsonPropertyName("edit_status")]
+ public int EditingStatus { get; set; }
+
+ ///
+ /// 获取或设置 SKU 最低价格(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("min_price")]
+ [System.Text.Json.Serialization.JsonPropertyName("min_price")]
+ public int MinPrice { get; set; }
+
+ ///
+ /// 获取或设置 SKU 列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("skus")]
+ [System.Text.Json.Serialization.JsonPropertyName("skus")]
+ public Types.SKU[]? SKUList { get; set; }
+
+ ///
+ /// 获取或设置限购信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("limited_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("limited_info")]
+ public Types.Limitation? Limitation { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置线上商品信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("product")]
+ [System.Text.Json.Serialization.JsonPropertyName("product")]
+ public Types.Product? Product { get; set; }
+
+ ///
+ /// 获取或设置草稿商品信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("edit_product")]
+ [System.Text.Json.Serialization.JsonPropertyName("edit_product")]
+ public Types.Product? EditingProduct { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductListGetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductListGetRequest.cs
new file mode 100644
index 00000000..9412ddee
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductListGetRequest.cs
@@ -0,0 +1,30 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/product/list/get 接口的请求。
+ ///
+ public class ChannelsECProductListGetRequest : WechatApiRequest, IInferable
+ {
+ ///
+ /// 获取或设置商品状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("status")]
+ [System.Text.Json.Serialization.JsonPropertyName("status")]
+ public int? Status { get; set; }
+
+ ///
+ /// 获取或设置翻页标记。
+ ///
+ [Newtonsoft.Json.JsonProperty("next_key")]
+ [System.Text.Json.Serialization.JsonPropertyName("next_key")]
+ public string? Cursor { get; set; }
+
+ ///
+ /// 获取或设置分页每页数量。
+ /// 默认值:10
+ ///
+ [Newtonsoft.Json.JsonProperty("page_size")]
+ [System.Text.Json.Serialization.JsonPropertyName("page_size")]
+ public int Limit { get; set; } = 10;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductListGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductListGetResponse.cs
new file mode 100644
index 00000000..5c68c7e6
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductListGetResponse.cs
@@ -0,0 +1,30 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/product/list/get 接口的响应。
+ ///
+ public class ChannelsECProductListGetResponse : WechatApiResponse
+ {
+ ///
+ /// 获取或设置商品 ID 列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("product_ids")]
+ [System.Text.Json.Serialization.JsonPropertyName("product_ids")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.TextualLongArrayConverter))]
+ public long[] ProductIdList { get; set; } = default!;
+
+ ///
+ /// 获取或设置翻页标记。
+ ///
+ [Newtonsoft.Json.JsonProperty("next_key")]
+ [System.Text.Json.Serialization.JsonPropertyName("next_key")]
+ public string? NextCursor { get; set; }
+
+ ///
+ /// 获取或设置总数量。
+ ///
+ [Newtonsoft.Json.JsonProperty("total_num")]
+ [System.Text.Json.Serialization.JsonPropertyName("total_num")]
+ public int TotalCount { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductListingRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductListingRequest.cs
new file mode 100644
index 00000000..f35c564c
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductListingRequest.cs
@@ -0,0 +1,15 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/product/listing 接口的请求。
+ ///
+ public class ChannelsECProductListingRequest : WechatApiRequest, IInferable
+ {
+ ///
+ /// 获取或设置商品 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("product_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("product_id")]
+ public long ProductId { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductListingResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductListingResponse.cs
new file mode 100644
index 00000000..c4b995ff
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductListingResponse.cs
@@ -0,0 +1,9 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/product/listing 接口的响应。
+ ///
+ public class ChannelsECProductListingResponse : WechatApiResponse
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductStockUpdateRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductStockUpdateRequest.cs
new file mode 100644
index 00000000..8d7d42cf
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductStockUpdateRequest.cs
@@ -0,0 +1,36 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/product/stock/update 接口的请求。
+ ///
+ public class ChannelsECProductStockUpdateRequest : WechatApiRequest, IInferable
+ {
+ ///
+ /// 获取或设置商品 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("product_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("product_id")]
+ public long ProductId { get; set; }
+
+ ///
+ /// 获取或设置 SKU ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("sku_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("sku_id")]
+ public long SKUId { get; set; }
+
+ ///
+ /// 获取或设置修改类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("diff_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("diff_type")]
+ public int DiffType { get; set; }
+
+ ///
+ /// 获取或设置修改数量。
+ ///
+ [Newtonsoft.Json.JsonProperty("num")]
+ [System.Text.Json.Serialization.JsonPropertyName("num")]
+ public int DiffCount { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductStockUpdateResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductStockUpdateResponse.cs
new file mode 100644
index 00000000..6b06257e
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductStockUpdateResponse.cs
@@ -0,0 +1,9 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/product/stock/update 接口的响应。
+ ///
+ public class ChannelsECProductStockUpdateResponse : WechatApiResponse
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductUpdateRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductUpdateRequest.cs
new file mode 100644
index 00000000..39c5cc45
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductUpdateRequest.cs
@@ -0,0 +1,178 @@
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/product/update 接口的请求。
+ ///
+ public class ChannelsECProductUpdateRequest : WechatApiRequest, IInferable
+ {
+ public static class Types
+ {
+ public class Detail : ChannelsECProductAddRequest.Types.Detail
+ {
+ }
+
+ public class Category : ChannelsECProductAddRequest.Types.Category
+ {
+ }
+
+ public class Attribute : ChannelsECProductAddRequest.Types.Attribute
+ {
+ }
+
+ public class Express : ChannelsECProductAddRequest.Types.Express
+ {
+ }
+
+ public class SKU
+ {
+ ///
+ /// 获取或设置 SKU ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("sku_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("sku_id")]
+ public long SKUId { get; set; }
+
+ ///
+ /// 获取或设置缩略图 URL。
+ ///
+ [Newtonsoft.Json.JsonProperty("thumb_img")]
+ [System.Text.Json.Serialization.JsonPropertyName("thumb_img")]
+ public string ThumbnailUrl { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置售价(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("sale_price")]
+ [System.Text.Json.Serialization.JsonPropertyName("sale_price")]
+ public int SalePrice { get; set; }
+
+ ///
+ /// 获取或设置市场价(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("market_price")]
+ [System.Text.Json.Serialization.JsonPropertyName("market_price")]
+ public int MarketPrice { get; set; }
+
+ ///
+ /// 获取或设置库存。
+ ///
+ [Newtonsoft.Json.JsonProperty("stock_num")]
+ [System.Text.Json.Serialization.JsonPropertyName("stock_num")]
+ public int Stock { get; set; }
+
+ ///
+ /// 获取或设置商品编码。
+ ///
+ [Newtonsoft.Json.JsonProperty("sku_code")]
+ [System.Text.Json.Serialization.JsonPropertyName("sku_code")]
+ public string? SKUCode { get; set; }
+
+ ///
+ /// 获取或设置商品属性列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("sku_attrs")]
+ [System.Text.Json.Serialization.JsonPropertyName("sku_attrs")]
+ public IList? AttributeList { get; set; }
+ }
+
+ public class Limitation : ChannelsECProductAddRequest.Types.Limitation
+ {
+ }
+ }
+
+ ///
+ /// 获取或设置商品 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("product_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("product_id")]
+ public long ProductId { get; set; }
+
+ ///
+ /// 获取或设置商品标题。
+ ///
+ [Newtonsoft.Json.JsonProperty("title")]
+ [System.Text.Json.Serialization.JsonPropertyName("title")]
+ public string Title { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置商品副标题。
+ ///
+ [Newtonsoft.Json.JsonProperty("sub_title")]
+ [System.Text.Json.Serialization.JsonPropertyName("sub_title")]
+ public string? SubTitle { get; set; }
+
+ ///
+ /// 获取或设置主图 URL 列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("head_imgs")]
+ [System.Text.Json.Serialization.JsonPropertyName("head_imgs")]
+ public IList HeadImageUrlList { get; set; } = new List();
+
+ ///
+ /// 获取或设置商品详情信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("desc_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("desc_info")]
+ public Types.Detail Detail { get; set; } = new Types.Detail();
+
+ ///
+ /// 获取或设置商品类目列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("cats")]
+ [System.Text.Json.Serialization.JsonPropertyName("cats")]
+ public IList CategoryList { get; set; } = new List();
+
+ ///
+ /// 获取或设置商品属性列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("attrs")]
+ [System.Text.Json.Serialization.JsonPropertyName("attrs")]
+ public IList? AttributeList { get; set; }
+
+ ///
+ /// 获取或设置发货方式。
+ ///
+ [Newtonsoft.Json.JsonProperty("deliver_method")]
+ [System.Text.Json.Serialization.JsonPropertyName("deliver_method")]
+ public int? DeliverMethod { get; set; }
+
+ ///
+ /// 获取或设置运费信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("express_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("express_info")]
+ public Types.Express? Express { get; set; }
+
+ ///
+ /// 获取或设置售后说明。
+ ///
+ [Newtonsoft.Json.JsonProperty("aftersale_desc")]
+ [System.Text.Json.Serialization.JsonPropertyName("aftersale_desc")]
+ public string? AftersaleDescription { get; set; }
+
+ ///
+ /// 获取或设置 SKU 列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("skus")]
+ [System.Text.Json.Serialization.JsonPropertyName("skus")]
+ public IList? SKUList { get; set; }
+
+ ///
+ /// 获取或设置限购信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("limited_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("limited_info")]
+ public Types.Limitation? Limitation { get; set; }
+
+ ///
+ /// 获取或设置更新后是否立即上架。
+ ///
+ [Newtonsoft.Json.JsonProperty("listing")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.NumericalNullableBooleanConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("listing")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.NumericalNullableBooleanConverter))]
+ public bool? RequireListing { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductUpdateResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductUpdateResponse.cs
new file mode 100644
index 00000000..d5f9f9f8
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECProduct/ChannelsECProductUpdateResponse.cs
@@ -0,0 +1,40 @@
+using System;
+
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/product/update 接口的响应。
+ ///
+ public class ChannelsECProductUpdateResponse : WechatApiResponse
+ {
+ public static class Types
+ {
+ public class Data
+ {
+ ///
+ /// 获取或设置商品 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("product_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("product_id")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ public long ProductId { get; set; }
+
+ ///
+ /// 获取或设置更新时间。
+ ///
+ [Newtonsoft.Json.JsonProperty("update_time")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RegularDateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("update_time")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RegularDateTimeOffsetConverter))]
+ public DateTimeOffset UpdateTime { 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/Product/SPU/ProductSPUAddRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Product/SPU/ProductSPUAddRequest.cs
index 10958cfc..667a5ebf 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Product/SPU/ProductSPUAddRequest.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Product/SPU/ProductSPUAddRequest.cs
@@ -198,7 +198,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models
///
[Newtonsoft.Json.JsonProperty("express_info")]
[System.Text.Json.Serialization.JsonPropertyName("express_info")]
- public Types.Express Express { get; set; } = new Types.Express();
+ public Types.Express? Express { get; set; }
///
/// 获取或设置 SKU 列表。
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/ChannelsEC/ChannelsECCategoryAuditEvent.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/ChannelsEC/ChannelsECProductCategoryAuditEvent.json
similarity index 100%
rename from test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/ChannelsEC/ChannelsECCategoryAuditEvent.json
rename to test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/ChannelsEC/ChannelsECProductCategoryAuditEvent.json
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/ChannelsEC/ChannelsECProductSPUAuditEvent.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/ChannelsEC/ChannelsECProductSPUAuditEvent.json
new file mode 100644
index 00000000..958f566d
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/ChannelsEC/ChannelsECProductSPUAuditEvent.json
@@ -0,0 +1,12 @@
+{
+ "ToUserName": "gh_*",
+ "FromUserName": "OPENID",
+ "CreateTime": 1662480000,
+ "MsgType": "event",
+ "Event": "product_spu_audit",
+ "ProductSpuAudit": {
+ "product_id": "12345678",
+ "status": 3,
+ "reason": "abc"
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/ChannelsEC/ChannelsECProductSPUListingEvent.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/ChannelsEC/ChannelsECProductSPUListingEvent.json
new file mode 100644
index 00000000..78a82c84
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/ChannelsEC/ChannelsECProductSPUListingEvent.json
@@ -0,0 +1,12 @@
+{
+ "ToUserName": "gh_*",
+ "FromUserName": "OPENID",
+ "CreateTime": 1662480000,
+ "MsgType": "event",
+ "Event": "product_spu_listing",
+ "ProductSpuListing": {
+ "product_id": "12345678",
+ "status": 3,
+ "reason": "abc"
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECProduct/ChannelsECProductAddRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECProduct/ChannelsECProductAddRequest.json
new file mode 100644
index 00000000..c5cdd7ca
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECProduct/ChannelsECProductAddRequest.json
@@ -0,0 +1,55 @@
+{
+ "title": "任天堂 Nintendo Switch 国行续航增强版 NS家用体感游戏机掌机 便携掌上游戏机 红蓝主机",
+ "sub_title": "随时随地,一起趣玩。",
+ "head_imgs": [
+ "https://mmecimage.cn/p/wx37f38d59298839c3/HJE9eJaEc5bJk-eaArVdILSB7MMaHgdK2-JIn51nMQ"
+ ],
+ "desc_info": {
+ "imgs": [
+ "https://mmecimage.cn/p/wx37f38d59298839c3/HJE9eJaEc5bJk-eaArVdILSB7MMaHgdK2-JIn51nMQ"
+ ]
+ },
+ "cats": [
+ {
+ "cat_id": "6033"
+ },
+ {
+ "cat_id": "6057"
+ },
+ {
+ "cat_id": "6091"
+ }
+ ],
+ "attrs": [
+ {
+ "attr_key": "商品毛重",
+ "attr_value": "380g"
+ },
+ {
+ "attr_key": "商品产地",
+ "attr_value": "中国大陆"
+ }
+ ],
+ "express_info": {
+ "template_id": "47428464001"
+ },
+ "skus": [
+ {
+ "thumb_img": "https://mmecimage.cn/p/wx37f38d59298839c3/HJE9eJaEc5bJk-eaArVdILSB7MMaHgdK2-JIn51nMQ",
+ "sale_price": 1300,
+ "market_price": 1500,
+ "stock_num": 100,
+ "sku_code": "A24525252",
+ "sku_attrs": [
+ {
+ "attr_key": "选择颜色",
+ "attr_value": "红蓝主机"
+ },
+ {
+ "attr_key": "选择套装",
+ "attr_value": "主机+保护套"
+ }
+ ]
+ }
+ ]
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECProduct/ChannelsECProductAddResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECProduct/ChannelsECProductAddResponse.json
new file mode 100644
index 00000000..871dfed3
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECProduct/ChannelsECProductAddResponse.json
@@ -0,0 +1,8 @@
+{
+ "errcode": 0,
+ "errmsg": "ok",
+ "data": {
+ "product_id": 23423523452345235,
+ "create_time": "2020-03-25 12:05:25"
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECProduct/ChannelsECProductDeleteRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECProduct/ChannelsECProductDeleteRequest.json
new file mode 100644
index 00000000..43d5663d
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECProduct/ChannelsECProductDeleteRequest.json
@@ -0,0 +1,3 @@
+{
+ "product_id": "324545"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECProduct/ChannelsECProductGetRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECProduct/ChannelsECProductGetRequest.json
new file mode 100644
index 00000000..8f08445d
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECProduct/ChannelsECProductGetRequest.json
@@ -0,0 +1,5 @@
+{
+ "product_id": "324545",
+ "data_type": 1
+}
+
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECProduct/ChannelsECProductGetResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECProduct/ChannelsECProductGetResponse.json
new file mode 100644
index 00000000..c6463a93
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECProduct/ChannelsECProductGetResponse.json
@@ -0,0 +1,58 @@
+{
+ "errcode": 0,
+ "errmsg": "ok",
+ "product": {
+ "product_id": "123456789",
+ "out_product_id": "OUT_PRODUCT_ID_TEST",
+ "title": "任天堂 Nintendo Switch 国行续航增强版",
+ "sub_title": "【国行Switch,更安心的保修服务,更快的国行服务器】一台主机三种模式,游戏掌机,随时随地,一起趣玩",
+ "head_imgs": [
+ "https://mmecimage.cn/p/wx37f38d59298839c3/HJE9eJaEc5bJk-eaArVdILSB7MMaHgdK2-JIn51nMQ"
+ ],
+ "desc_info": {
+ "imgs": [
+ "https://mmecimage.cn/p/wx37f38d59298839c3/HJE9eJaEc5bJk-eaArVdILSB7MMaHgdK2-JIn51nMQ"
+ ]
+ },
+ "cats": [
+ {
+ "cat_id": "1"
+ },
+ {
+ "cat_id": "2"
+ },
+ {
+ "cat_id": "3"
+ }
+ ],
+ "attrs": [
+ {
+ "attr_key": "商品毛重",
+ "attr_value": "380g"
+ },
+ {
+ "attr_key": "商品产地",
+ "attr_value": "中国大陆"
+ }
+ ],
+ "express_info": {
+ "template_id": "123456"
+ },
+ "status": 5,
+ "edit_status": 2,
+ "skus": [
+ {
+ "sku_id": "123456001",
+ "out_sku_id": "OUT_SKU_ID_TEST",
+ "thumb_img": "",
+ "sale_price": 1,
+ "market_price": 2,
+ "stock_num": 5,
+ "sku_code": "SKU_CODE_TEST",
+ "sku_attrs": [],
+ "status": 0
+ }
+ ],
+ "min_price": 1
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECProduct/ChannelsECProductListGetRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECProduct/ChannelsECProductListGetRequest.json
new file mode 100644
index 00000000..aee9e0d5
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECProduct/ChannelsECProductListGetRequest.json
@@ -0,0 +1,5 @@
+{
+ "status": 5,
+ "page_size": 10,
+ "next_key": "THE_NEXT_KEY"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECProduct/ChannelsECProductListGetResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECProduct/ChannelsECProductListGetResponse.json
new file mode 100644
index 00000000..0dc1fbb7
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECProduct/ChannelsECProductListGetResponse.json
@@ -0,0 +1,18 @@
+{
+ "errcode": 0,
+ "errmsg": "ok",
+ "product_ids": [
+ "1234567001",
+ "1234567002",
+ "1234567003",
+ "1234567004",
+ "1234567005",
+ "1234567006",
+ "1234567007",
+ "1234567008",
+ "1234567009",
+ "1234567010"
+ ],
+ "next_key": "THE_NEXT_KEY_NEW",
+ "total_num": 100
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECProduct/ChannelsECProductListingRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECProduct/ChannelsECProductListingRequest.json
new file mode 100644
index 00000000..bc59141e
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECProduct/ChannelsECProductListingRequest.json
@@ -0,0 +1,3 @@
+{
+ "product_id": "1234234"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECProduct/ChannelsECProductStockUpdateRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECProduct/ChannelsECProductStockUpdateRequest.json
new file mode 100644
index 00000000..e52b7eac
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECProduct/ChannelsECProductStockUpdateRequest.json
@@ -0,0 +1,6 @@
+{
+ "product_id": "324545",
+ "sku_id": "9328425",
+ "diff_type": 1,
+ "num": 10
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECProduct/ChannelsECProductUpdateRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECProduct/ChannelsECProductUpdateRequest.json
new file mode 100644
index 00000000..f7b9ad7b
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECProduct/ChannelsECProductUpdateRequest.json
@@ -0,0 +1,74 @@
+{
+ "product_id": "10000000089215",
+ "title": "任天堂 Nintendo Switch 国行续航增强版 NS家用体感游戏机掌机 便携掌上游戏机 红蓝主机",
+ "sub_title": "随时随地,一起趣玩。【更新】",
+ "head_imgs": [
+ "https://mmecimage.cn/p/wx37f38d59298839c3/HJE9eJaEc5bJk-eaArVdILSB7MMaHgdK2-JIn51nMQ"
+ ],
+ "desc_info": {
+ "imgs": [
+ "https://mmecimage.cn/p/wx37f38d59298839c3/HJE9eJaEc5bJk-eaArVdILSB7MMaHgdK2-JIn51nMQ"
+ ]
+ },
+ "cats": [
+ {
+ "cat_id": "6033"
+ },
+ {
+ "cat_id": "6057"
+ },
+ {
+ "cat_id": "6091"
+ }
+ ],
+ "attrs": [
+ {
+ "attr_key": "商品毛重",
+ "attr_value": "380g"
+ },
+ {
+ "attr_key": "商品产地",
+ "attr_value": "中国大陆"
+ }
+ ],
+ "express_info": {
+ "template_id": "47428464001"
+ },
+ "skus": [
+ {
+ "sku_id": "462966903",
+ "thumb_img": "https://mmecimage.cn/p/wx37f38d59298839c3/HJE9eJaEc5bJk-eaArVdILSB7MMaHgdK2-JIn51nMQ",
+ "sale_price": 1300,
+ "market_price": 1500,
+ "stock_num": 100,
+ "sku_code": "A24525252",
+ "sku_attrs": [
+ {
+ "attr_key": "选择颜色",
+ "attr_value": "红蓝主机"
+ },
+ {
+ "attr_key": "选择套装",
+ "attr_value": "主机+保护套"
+ }
+ ]
+ },
+ {
+ "thumb_img": "https://mmecimage.cn/p/wx37f38d59298839c3/HJE9eJaEc5bJk-eaArVdILSB7MMaHgdK2-JIn51nMQ",
+ "sale_price": 1000,
+ "market_price": 1200,
+ "stock_num": 100,
+ "sku_code": "A24525252",
+ "sku_attrs": [
+ {
+ "attr_key": "选择颜色",
+ "attr_value": "红蓝主机"
+ },
+ {
+ "attr_key": "选择套装",
+ "attr_value": "标配"
+ }
+ ]
+ }
+ ]
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECProduct/ChannelsECProductUpdateResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECProduct/ChannelsECProductUpdateResponse.json
new file mode 100644
index 00000000..2f799556
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECProduct/ChannelsECProductUpdateResponse.json
@@ -0,0 +1,8 @@
+{
+ "errcode": 0,
+ "errmsg": "ok",
+ "data": {
+ "product_id": "23423523452345235",
+ "update_time": "2020-06-20 10:00:00"
+ }
+}