diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteUnionPromoterExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteUnionPromoterExtensions.cs
new file mode 100644
index 00000000..fe287aa7
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteUnionPromoterExtensions.cs
@@ -0,0 +1,263 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net.Http;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using Flurl;
+using Flurl.Http;
+
+namespace SKIT.FlurlHttpClient.Wechat.Api
+{
+ public static class WechatApiClientExecuteUnionPromoterExtensions
+ {
+ #region Promotion
+ ///
+ /// 异步调用 [POST] /union/promoter/promotion/add 接口。
+ /// REF: https://developers.weixin.qq.com/doc/ministore/union/access-guidelines/promoter/api/promotion.html#_1-%E6%B7%BB%E5%8A%A0%E6%8E%A8%E5%B9%BF%E4%BD%8D
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteUnionPromoterPromotionAddAsync(this WechatApiClient client, Models.UnionPromoterPromotionAddRequest 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(HttpMethod.Post, "union", "promoter", "promotion", "add")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /union/promoter/promotion/del 接口。
+ /// REF: https://developers.weixin.qq.com/doc/ministore/union/access-guidelines/promoter/api/promotion.html#_2-%E5%88%A0%E9%99%A4%E6%8E%A8%E5%B9%BF%E4%BD%8D
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteUnionPromoterPromotionDeleteAsync(this WechatApiClient client, Models.UnionPromoterPromotionDeleteRequest 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(HttpMethod.Post, "union", "promoter", "promotion", "del")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /union/promoter/promotion/upd 接口。
+ /// REF: https://developers.weixin.qq.com/doc/ministore/union/access-guidelines/promoter/api/promotion.html#_3-%E7%BC%96%E8%BE%91%E6%8E%A8%E5%B9%BF%E4%BD%8D
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteUnionPromoterPromotionUpdateAsync(this WechatApiClient client, Models.UnionPromoterPromotionUpdateRequest 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(HttpMethod.Post, "union", "promoter", "promotion", "upd")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [GET] /union/promoter/promotion/list 接口。
+ /// REF: https://developers.weixin.qq.com/doc/ministore/union/access-guidelines/promoter/api/promotion.html#_4-%E8%8E%B7%E5%8F%96%E6%8E%A8%E5%B9%BF%E4%BD%8D%E5%88%97%E8%A1%A8
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteUnionPromoterPromotionListAsync(this WechatApiClient client, Models.UnionPromoterPromotionListRequest 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(HttpMethod.Get, "union", "promoter", "promotion", "list")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken)
+ .SetQueryParam("start", request.Offset)
+ .SetQueryParam("limit", request.Limit);
+
+ return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken);
+ }
+ #endregion
+
+ #region Product
+ ///
+ /// 异步调用 [GET] /union/promoter/product/category 接口。
+ /// REF: https://developers.weixin.qq.com/doc/ministore/union/access-guidelines/promoter/api/product/category.html#_1-%E8%8E%B7%E5%8F%96%E8%81%94%E7%9B%9F%E5%95%86%E5%93%81%E7%B1%BB%E7%9B%AE%E5%88%97%E8%A1%A8%E5%8F%8A%E7%B1%BB%E7%9B%AEID
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteUnionPromoterProductCategoryAsync(this WechatApiClient client, Models.UnionPromoterProductCategoryRequest 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(HttpMethod.Get, "union", "promoter", "product", "category")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [GET] /union/promoter/product/list 接口。
+ /// REF: https://developers.weixin.qq.com/doc/ministore/union/access-guidelines/promoter/api/product/category.html#_2-%E6%9F%A5%E8%AF%A2%E5%95%86%E5%93%81%E8%AF%A6%E6%83%85%E4%BF%A1%E6%81%AF
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteUnionPromoterProductListAsync(this WechatApiClient client, Models.UnionPromoterProductListRequest 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(HttpMethod.Get, "union", "promoter", "product", "list")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken)
+ .SetQueryParam("from", request.Offset)
+ .SetQueryParam("limit", request.Limit);
+
+ if (request.QueryType.HasValue)
+ flurlReq.SetQueryParam("queryType", request.QueryType.Value);
+
+ if (!string.IsNullOrEmpty(request.Query))
+ flurlReq.SetQueryParam("query", request.Query);
+
+ if (request.MaxPrice.HasValue)
+ flurlReq.SetQueryParam("maxPrice", request.MaxPrice.Value);
+
+ if (request.MinPrice.HasValue)
+ flurlReq.SetQueryParam("minPrice", request.MinPrice.Value);
+
+ if (request.MinCommissionValue.HasValue)
+ flurlReq.SetQueryParam("minCommissionValue", request.MinCommissionValue.Value);
+
+ if (request.MinCommissionRatio.HasValue)
+ flurlReq.SetQueryParam("minCommissionRatio", request.MinCommissionRatio.Value);
+
+ if (request.SortType.HasValue)
+ flurlReq.SetQueryParam("sortType", request.SortType.Value);
+
+ if (request.HasCoupon.HasValue)
+ flurlReq.SetQueryParam("hasCoupon", request.HasCoupon.Value ? 1 : 0);
+
+ if (request.ShopAppIdList != null && request.ShopAppIdList.Any())
+ flurlReq.SetQueryParam("shopAppIds", string.Join(",", request.ShopAppIdList));
+
+ if (request.CategoryId.HasValue)
+ flurlReq.SetQueryParam("categoryId", request.CategoryId);
+
+ if (request.CategoryIdList != null && request.CategoryIdList.Any())
+ flurlReq.SetQueryParam("category", string.Join(",", request.CategoryIdList));
+
+ if (request.CategoryIdBlackList != null && request.CategoryIdBlackList.Any())
+ flurlReq.SetQueryParam("noCategory", string.Join(",", request.CategoryIdBlackList));
+
+ if (request.ProductIdList != null && request.ProductIdList.Any())
+ flurlReq.SetQueryParam("productId", string.Join(",", request.ProductIdList));
+
+ return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /union/promoter/product/generate 接口。
+ /// REF: https://developers.weixin.qq.com/doc/ministore/union/access-guidelines/promoter/api/product/category.html#_3-%E8%8E%B7%E5%8F%96%E5%95%86%E5%93%81%E6%8E%A8%E5%B9%BF%E7%B4%A0%E6%9D%90
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteUnionPromoterProductGenerateAsync(this WechatApiClient client, Models.UnionPromoterProductGenerateRequest 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(HttpMethod.Post, "union", "promoter", "product", "generate")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+ #endregion
+
+ #region Order
+ ///
+ /// 异步调用 [POST] /union/promoter/order/info 接口。
+ /// REF: https://developers.weixin.qq.com/doc/ministore/union/access-guidelines/promoter/api/order/order-info.html#_1-%E6%A0%B9%E6%8D%AE%E8%AE%A2%E5%8D%95ID%E6%9F%A5%E8%AF%A2%E8%AE%A2%E5%8D%95%E8%AF%A6%E6%83%85
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteUnionPromoterOrderInfoAsync(this WechatApiClient client, Models.UnionPromoterOrderInfoRequest 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(HttpMethod.Post, "union", "promoter", "order", "info")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [GET] /union/promoter/order/search 接口。
+ /// REF: https://developers.weixin.qq.com/doc/ministore/union/access-guidelines/promoter/api/order/order-info.html#_2-%E6%A0%B9%E6%8D%AE%E8%AE%A2%E5%8D%95%E6%94%AF%E4%BB%98%E6%97%B6%E9%97%B4%E3%80%81%E8%AE%A2%E5%8D%95%E5%88%86%E4%BD%A3%E7%8A%B6%E6%80%81%E6%8B%89%E5%8F%96%E8%AE%A2%E5%8D%95%E8%AF%A6%E6%83%85
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteUnionPromoterOrderSearchAsync(this WechatApiClient client, Models.UnionPromoterOrderSearchRequest 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(HttpMethod.Get, "union", "promoter", "order", "search")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken)
+ .SetQueryParam("page", request.Page);
+
+ if (request.StartTimestamp.HasValue)
+ flurlReq.SetQueryParam("startTimestamp", request.StartTimestamp.Value);
+
+ if (request.EndTimestamp.HasValue)
+ flurlReq.SetQueryParam("endTimestamp", request.EndTimestamp.Value);
+
+ if (!string.IsNullOrEmpty(request.CommissionStatus))
+ flurlReq.SetQueryParam("commissionStatus", request.CommissionStatus);
+
+ return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken);
+ }
+ #endregion
+ }
+}
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 68d61d0f..21bb384f 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Product/SPU/ProductSPUAddRequest.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Product/SPU/ProductSPUAddRequest.cs
@@ -10,7 +10,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
public static class Types
{
- public class Description
+ public class Detail
{
///
/// 获取或设置商品详情图片 Url 列表。
@@ -164,7 +164,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models
///
[Newtonsoft.Json.JsonProperty("desc_info")]
[System.Text.Json.Serialization.JsonPropertyName("desc_info")]
- public Types.Description Description { get; set; } = new Types.Description();
+ public Types.Detail Detail { get; set; } = new Types.Detail();
///
/// 获取或设置品牌 ID。
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Product/SPU/ProductSPUGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Product/SPU/ProductSPUGetResponse.cs
index 2be0e928..68ce7ec8 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Product/SPU/ProductSPUGetResponse.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Product/SPU/ProductSPUGetResponse.cs
@@ -24,7 +24,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
public static class Types
{
- public class Description
+ public class Detail
{
///
/// 获取或设置商品详情图片 Url 列表。
@@ -129,7 +129,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models
///
[Newtonsoft.Json.JsonProperty("desc_info")]
[System.Text.Json.Serialization.JsonPropertyName("desc_info")]
- public Types.Description Description { get; set; } = default!;
+ public Types.Detail Detail { get; set; } = default!;
///
/// 获取或设置品牌 ID。
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Product/SPU/ProductSPUUpdateRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Product/SPU/ProductSPUUpdateRequest.cs
index e7b2a9aa..b4036158 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Product/SPU/ProductSPUUpdateRequest.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Product/SPU/ProductSPUUpdateRequest.cs
@@ -10,7 +10,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
public static class Types
{
- public class Description : ProductSPUAddRequest.Types.Description
+ public class Description : ProductSPUAddRequest.Types.Detail
{
}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Order/UnionPromoterOrderInfoRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Order/UnionPromoterOrderInfoRequest.cs
new file mode 100644
index 00000000..e0e1eda8
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Order/UnionPromoterOrderInfoRequest.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /union/promoter/order/info 接口的请求。
+ ///
+ public class UnionPromoterOrderInfoRequest : WechatApiRequest
+ {
+ ///
+ /// 获取或设置订单 ID 列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("orderIdList")]
+ [System.Text.Json.Serialization.JsonPropertyName("orderIdList")]
+ public IList OrderIdList { get; set; } = new List();
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Order/UnionPromoterOrderInfoResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Order/UnionPromoterOrderInfoResponse.cs
new file mode 100644
index 00000000..218aaf68
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Order/UnionPromoterOrderInfoResponse.cs
@@ -0,0 +1,245 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /union/promoter/order/info 接口的响应。
+ ///
+ public class UnionPromoterOrderInfoResponse : WechatApiResponse
+ {
+ public static class Types
+ {
+ public class Order
+ {
+ public static class Types
+ {
+ public class Product
+ {
+ ///
+ /// 获取或设置商品 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("productId")]
+ [System.Text.Json.Serialization.JsonPropertyName("productId")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ public long ProductId { get; set; }
+
+ ///
+ /// 获取或设置商品标题。
+ ///
+ [Newtonsoft.Json.JsonProperty("title")]
+ [System.Text.Json.Serialization.JsonPropertyName("title")]
+ public string Title { get; set; } = default!;
+
+ ///
+ /// 获取或设置商品缩略图 URL。
+ ///
+ [Newtonsoft.Json.JsonProperty("thumbImg")]
+ [System.Text.Json.Serialization.JsonPropertyName("thumbImg")]
+ public string ThumbnailImageUrl { get; set; } = default!;
+
+ ///
+ /// 获取或设置商品价格(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("price")]
+ [Newtonsoft.Json.JsonConverter(typeof(Converters.NewtonsoftJsonCurrencyConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("price")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(Converters.SystemTextJsonCurrencyConverter))]
+ public int Price { get; set; }
+
+ ///
+ /// 获取或设置佣金比例(单位:万分之一)。
+ ///
+ [Newtonsoft.Json.JsonProperty("ratio")]
+ [System.Text.Json.Serialization.JsonPropertyName("ratio")]
+ public int CommissionRatio { get; set; }
+
+ ///
+ /// 获取或设置佣金金额(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("commission")]
+ [Newtonsoft.Json.JsonConverter(typeof(Converters.NewtonsoftJsonCurrencyConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("commission")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(Converters.SystemTextJsonCurrencyConverter))]
+ public int CommissionValue { get; set; }
+
+ ///
+ /// 获取或设置分佣状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("commissionStatus")]
+ [System.Text.Json.Serialization.JsonPropertyName("commissionStatus")]
+ public string CommissionStatus { get; set; } = default!;
+
+ ///
+ /// 获取或设置商品类目名称,使用逗号分隔。
+ ///
+ [Newtonsoft.Json.JsonProperty("categoryStr")]
+ [System.Text.Json.Serialization.JsonPropertyName("categoryStr")]
+ public string CategoryNames { get; set; } = default!;
+
+ ///
+ /// 获取或设置推广信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("promotionInfo")]
+ [System.Text.Json.Serialization.JsonPropertyName("promotionInfo")]
+ public Promotion? Promotion { get; set; }
+
+ ///
+ /// 获取或设置自定义扩展参数。
+ ///
+ [Newtonsoft.Json.JsonProperty("customizeInfo")]
+ [System.Text.Json.Serialization.JsonPropertyName("customizeInfo")]
+ public string? CustomizeExtra { get; set; }
+ }
+
+ public class Promotion
+ {
+ ///
+ /// 获取或设置推广位 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("promotionSourcePid")]
+ [System.Text.Json.Serialization.JsonPropertyName("promotionSourcePid")]
+ public string PromotionId { get; set; } = default!;
+
+ ///
+ /// 获取或设置推广位 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("promotionSourceName")]
+ [System.Text.Json.Serialization.JsonPropertyName("promotionSourceName")]
+ public string SourceName { get; set; } = default!;
+ }
+ }
+
+ ///
+ /// 获取或设置订单 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("orderId")]
+ [System.Text.Json.Serialization.JsonPropertyName("orderId")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ public long OrderId { get; set; }
+
+ ///
+ /// 获取或设置商品列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("productList")]
+ [System.Text.Json.Serialization.JsonPropertyName("productList")]
+ public Types.Product[] ProductList { get; set; } = default!;
+
+ ///
+ /// 获取或设置小商店名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("shopAppid")]
+ [System.Text.Json.Serialization.JsonPropertyName("shopAppid")]
+ public string? ShopAppId { get; set; }
+
+ ///
+ /// 获取或设置小商店名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("shopName")]
+ [System.Text.Json.Serialization.JsonPropertyName("shopName")]
+ public string? ShopName { get; set; }
+
+ ///
+ /// 获取或设置付款时间。
+ ///
+ [Newtonsoft.Json.JsonProperty("payTime")]
+ [System.Text.Json.Serialization.JsonPropertyName("payTime")]
+ public long? PayTimestamp { get; set; }
+
+ ///
+ /// 获取或设置确认收货时间。
+ ///
+ [Newtonsoft.Json.JsonProperty("confirmReceiptTime")]
+ [System.Text.Json.Serialization.JsonPropertyName("confirmReceiptTime")]
+ public long? ConfirmReceiptTimestamp { get; set; }
+ }
+ }
+
+ internal static class Converters
+ {
+ internal class NewtonsoftJsonCurrencyConverter : Newtonsoft.Json.JsonConverter
+ {
+ public override bool CanRead
+ {
+ get { return true; }
+ }
+
+ public override bool CanWrite
+ {
+ get { return true; }
+ }
+
+ public override int ReadJson(Newtonsoft.Json.JsonReader reader, Type objectType, int existingValue, bool hasExistingValue, Newtonsoft.Json.JsonSerializer serializer)
+ {
+ if (reader.TokenType == Newtonsoft.Json.JsonToken.Null)
+ {
+ return existingValue;
+ }
+ else if (reader.TokenType == Newtonsoft.Json.JsonToken.String)
+ {
+ string? value = serializer.Deserialize(reader);
+ if (value == null)
+ return existingValue;
+
+ value = value.Replace("¥", string.Empty).Replace("-", string.Empty);
+ if (string.IsNullOrEmpty(value))
+ return existingValue;
+
+ if (double.TryParse(value, out double currency))
+ {
+ return (int)(currency * 100);
+ }
+ }
+
+ throw new Newtonsoft.Json.JsonReaderException();
+ }
+
+ public override void WriteJson(Newtonsoft.Json.JsonWriter writer, int value, Newtonsoft.Json.JsonSerializer serializer)
+ {
+ writer.WriteValue("¥" + ((double)value / 100).ToString("#.##"));
+ }
+ }
+
+ internal class SystemTextJsonCurrencyConverter : System.Text.Json.Serialization.JsonConverter
+ {
+ public override int Read(ref System.Text.Json.Utf8JsonReader reader, Type typeToConvert, System.Text.Json.JsonSerializerOptions options)
+ {
+ if (reader.TokenType == System.Text.Json.JsonTokenType.Null)
+ {
+ return default;
+ }
+ else if (reader.TokenType == System.Text.Json.JsonTokenType.String)
+ {
+ string? value = reader.GetString();
+ if (value == null)
+ return default;
+
+ value = value.Replace("¥", string.Empty).Replace("-", string.Empty);
+ if (string.IsNullOrEmpty(value))
+ return default;
+
+ if (double.TryParse(value, out double currency))
+ {
+ return (int)(currency * 100);
+ }
+ }
+
+ throw new System.Text.Json.JsonException();
+ }
+
+ public override void Write(System.Text.Json.Utf8JsonWriter writer, int value, System.Text.Json.JsonSerializerOptions options)
+ {
+ writer.WriteStringValue("¥" + ((double)value / 100).ToString("#.##"));
+ }
+ }
+ }
+
+ ///
+ /// 获取或设置订单列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("orderList")]
+ [System.Text.Json.Serialization.JsonPropertyName("orderList")]
+
+ public Types.Order[] OrderList { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Order/UnionPromoterOrderSearchRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Order/UnionPromoterOrderSearchRequest.cs
new file mode 100644
index 00000000..2286dfd1
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Order/UnionPromoterOrderSearchRequest.cs
@@ -0,0 +1,39 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [GET] /union/promoter/order/search 接口的请求。
+ ///
+ public class UnionPromoterOrderSearchRequest : WechatApiRequest
+ {
+ ///
+ /// 获取或设置分页页数(从 1 开始)。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int Page { get; set; } = 1;
+
+ ///
+ /// 获取或设置指定起始时间戳。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public long? StartTimestamp { get; set; }
+
+ ///
+ /// 获取或设置指定结束时间戳。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public long? EndTimestamp { get; set; }
+
+ ///
+ /// 获取或设置指定分佣状态。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string? CommissionStatus { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Order/UnionPromoterOrderSearchResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Order/UnionPromoterOrderSearchResponse.cs
new file mode 100644
index 00000000..80e011c9
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Order/UnionPromoterOrderSearchResponse.cs
@@ -0,0 +1,40 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [GET] /union/promoter/order/search 接口的响应。
+ ///
+ public class UnionPromoterOrderSearchResponse : WechatApiResponse
+ {
+ public static class Types
+ {
+ public class Order : UnionPromoterOrderInfoResponse.Types.Order
+ {
+ }
+ }
+
+ ///
+ /// 获取或设置订单列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("orderList")]
+ [System.Text.Json.Serialization.JsonPropertyName("orderList")]
+
+ public Types.Order[] OrderList { get; set; } = default!;
+
+ ///
+ /// 获取或设置订单总数量。
+ ///
+ [Newtonsoft.Json.JsonProperty("totalNum")]
+ [System.Text.Json.Serialization.JsonPropertyName("totalNum")]
+ public int Total { get; set; }
+
+ ///
+ /// 获取或设置分页每页数量。
+ ///
+ [Newtonsoft.Json.JsonProperty("pageSize")]
+ [System.Text.Json.Serialization.JsonPropertyName("pageSize")]
+ public int Limit { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Product/UnionPromoterProductCategoryRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Product/UnionPromoterProductCategoryRequest.cs
new file mode 100644
index 00000000..6d11d631
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Product/UnionPromoterProductCategoryRequest.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [GET] /union/promoter/product/category 接口的请求。
+ ///
+ public class UnionPromoterProductCategoryRequest : WechatApiRequest
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Product/UnionPromoterProductCategoryResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Product/UnionPromoterProductCategoryResponse.cs
new file mode 100644
index 00000000..9c58eae6
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Product/UnionPromoterProductCategoryResponse.cs
@@ -0,0 +1,40 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [GET] /union/promoter/product/category 接口的响应。
+ ///
+ public class UnionPromoterProductCategoryResponse : WechatApiResponse
+ {
+ public static class Types
+ {
+ public class Category
+ {
+ ///
+ /// 获取或设置类目 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("catId")]
+ [System.Text.Json.Serialization.JsonPropertyName("catId")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ public int CategoryId { get; set; } = default!;
+
+ ///
+ /// 获取或设置类目名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("name")]
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string Name { get; set; } = default!;
+ }
+ }
+
+ ///
+ /// 获取或设置商品类目列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("productCats")]
+ [System.Text.Json.Serialization.JsonPropertyName("productCats")]
+
+ public Types.Category[] CategoryList { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Product/UnionPromoterProductGenerateRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Product/UnionPromoterProductGenerateRequest.cs
new file mode 100644
index 00000000..d21861a4
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Product/UnionPromoterProductGenerateRequest.cs
@@ -0,0 +1,52 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /union/promoter/product/generate 接口的请求。
+ ///
+ public class UnionPromoterProductGenerateRequest : WechatApiRequest
+ {
+ public static class Types
+ {
+ public class Product
+ {
+ ///
+ /// 获取或设置商品 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("productId")]
+ [System.Text.Json.Serialization.JsonPropertyName("productId")]
+ public long ProductId { get; set; }
+
+ ///
+ /// 获取或设置所属小商店 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("appId")]
+ [System.Text.Json.Serialization.JsonPropertyName("appId")]
+ public string AppId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置自定义扩展参数。
+ ///
+ [Newtonsoft.Json.JsonProperty("customizeInfo")]
+ [System.Text.Json.Serialization.JsonPropertyName("customizeInfo")]
+ public string? CustomizeExtra { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置推广位 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("pid")]
+ [System.Text.Json.Serialization.JsonPropertyName("pid")]
+ public string PromotionId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置商品列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("productList")]
+ [System.Text.Json.Serialization.JsonPropertyName("productList")]
+ public IList ProductList { get; set; } = new List();
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Product/UnionPromoterProductGenerateResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Product/UnionPromoterProductGenerateResponse.cs
new file mode 100644
index 00000000..55460f42
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Product/UnionPromoterProductGenerateResponse.cs
@@ -0,0 +1,170 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /union/promoter/product/generate 接口的响应。
+ ///
+ public class UnionPromoterProductGenerateResponse : WechatApiResponse
+ {
+ public static class Types
+ {
+ public class ProductPromotion
+ {
+ public static class Types
+ {
+ public class Product
+ {
+ ///
+ /// 获取或设置商品 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("productId")]
+ [System.Text.Json.Serialization.JsonPropertyName("productId")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ public long ProductId { get; set; }
+
+ ///
+ /// 获取或设置商品标题。
+ ///
+ [Newtonsoft.Json.JsonProperty("title")]
+ [System.Text.Json.Serialization.JsonPropertyName("title")]
+ public string Title { get; set; } = default!;
+
+ ///
+ /// 获取或设置商品副标题。
+ ///
+ [Newtonsoft.Json.JsonProperty("subTitle")]
+ [System.Text.Json.Serialization.JsonPropertyName("subTitle")]
+ public string? SubTitle { get; set; }
+
+ ///
+ /// 获取或设置主图 Url 列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("headImg")]
+ [System.Text.Json.Serialization.JsonPropertyName("headImg")]
+ public string[] HeadImageUrlList { get; set; } = default!;
+
+ ///
+ /// 获取或设置 SKU 最低价格(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("minPrice")]
+ [System.Text.Json.Serialization.JsonPropertyName("minPrice")]
+ public int MinPrice { get; set; }
+
+ ///
+ /// 获取或设置商品库存。
+ ///
+ [Newtonsoft.Json.JsonProperty("totalStockNum")]
+ [System.Text.Json.Serialization.JsonPropertyName("totalStockNum")]
+ public int Stock { get; set; }
+
+ ///
+ /// 获取或设置小商店名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("shopAppid")]
+ [System.Text.Json.Serialization.JsonPropertyName("shopAppid")]
+ public string? ShopAppId { get; set; }
+
+ ///
+ /// 获取或设置小商店名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("shopName")]
+ [System.Text.Json.Serialization.JsonPropertyName("shopName")]
+ public string? ShopName { get; set; }
+
+ ///
+ /// 获取或设置是否引用小商店组件。
+ ///
+ [Newtonsoft.Json.JsonProperty("pluginResult")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.NumberTypedNullableBooleanConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("pluginResult")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.NumberTypedNullableBooleanConverter))]
+ public bool? UsePlugin { get; set; }
+ }
+
+ public class Share
+ {
+ ///
+ /// 获取或设置小程序 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("appId")]
+ [System.Text.Json.Serialization.JsonPropertyName("appId")]
+ public string AppId { get; set; } = default!;
+
+ ///
+ /// 获取或设置小程序页面路径。
+ ///
+ [Newtonsoft.Json.JsonProperty("path")]
+ [System.Text.Json.Serialization.JsonPropertyName("path")]
+ public string PagePath { get; set; } = default!;
+
+ ///
+ /// 获取或设置经过 Base64 编码的小程序码图片。
+ ///
+ [Newtonsoft.Json.JsonProperty("wxaCode")]
+ [System.Text.Json.Serialization.JsonPropertyName("wxaCode")]
+ public string EncodingWxaCode { get; set; } = default!;
+
+ ///
+ /// 获取或设置推广商品文案。
+ ///
+ [Newtonsoft.Json.JsonProperty("promotionWording")]
+ [System.Text.Json.Serialization.JsonPropertyName("promotionWording")]
+ public string? PromotionText { get; set; }
+
+ ///
+ /// 获取或设置推广商品链接。
+ ///
+ [Newtonsoft.Json.JsonProperty("promotionUrl")]
+ [System.Text.Json.Serialization.JsonPropertyName("promotionUrl")]
+ public string? PromotionUrl { get; set; } = default!;
+
+ ///
+ /// 获取或设置推广商品带券文案。
+ ///
+ [Newtonsoft.Json.JsonProperty("couponPromotionWording")]
+ [System.Text.Json.Serialization.JsonPropertyName("couponPromotionWording")]
+ public string? PromotionWithCouponText { get; set; }
+
+ ///
+ /// 获取或设置推广商品带券链接。
+ ///
+ [Newtonsoft.Json.JsonProperty("couponPromotionUrl")]
+ [System.Text.Json.Serialization.JsonPropertyName("couponPromotionUrl")]
+ public string? PromotionWithCouponUrl { get; set; } = default!;
+ }
+ }
+
+ ///
+ /// 获取或设置推广位 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("pid")]
+ [System.Text.Json.Serialization.JsonPropertyName("pid")]
+ public string PromotionId { get; set; } = default!;
+
+ ///
+ /// 获取或设置商品信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("productInfo")]
+ [System.Text.Json.Serialization.JsonPropertyName("productInfo")]
+ public Types.Product Product { get; set; } = default!;
+
+ ///
+ /// 获取或设置推广相关信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("shareInfo")]
+ [System.Text.Json.Serialization.JsonPropertyName("shareInfo")]
+ public Types.Share? Share { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置商品推广素材列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("list")]
+ [System.Text.Json.Serialization.JsonPropertyName("list")]
+
+ public Types.ProductPromotion[] ProductPromotionList { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Product/UnionPromoterProductListRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Product/UnionPromoterProductListRequest.cs
new file mode 100644
index 00000000..10860a57
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Product/UnionPromoterProductListRequest.cs
@@ -0,0 +1,116 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [GET] /union/promoter/product/list 接口的请求。
+ ///
+ public class UnionPromoterProductListRequest : WechatApiRequest
+ {
+ ///
+ /// 获取或设置分页起始位置。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int Offset { get; set; }
+
+ ///
+ /// 获取或设置分页每页数量。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int Limit { get; set; } = 20;
+
+ ///
+ /// 获取或设置搜索类型。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? QueryType { get; set; }
+
+ ///
+ /// 获取或设置搜索关键词。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string? Query { get; set; }
+
+ ///
+ /// 获取或设置商品最高价格(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? MaxPrice { get; set; }
+
+ ///
+ /// 获取或设置商品最低价格(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? MinPrice { get; set; }
+
+ ///
+ /// 获取或设置佣金金额下限(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? MinCommissionValue { get; set; }
+
+ ///
+ /// 获取或设置佣金比例下限(单位:万分之一)。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? MinCommissionRatio { get; set; }
+
+ ///
+ /// 获取或设置排序方式。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? SortType { get; set; }
+
+ ///
+ /// 获取或设置小商店 AppId 列表。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public IList? ShopAppIdList { get; set; }
+
+ ///
+ /// 获取或设置是否有联盟优惠券。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public bool? HasCoupon { get; set; }
+
+ ///
+ /// 获取或设置商品类目 ID。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? CategoryId { get; set; }
+
+ ///
+ /// 获取或设置商品类目 ID 列表。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public IList? CategoryIdList { get; set; }
+
+ ///
+ /// 获取或设置商品类目 ID 黑名单列表。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public IList? CategoryIdBlackList { get; set; }
+
+ ///
+ /// 获取或设置商品 ID 列表。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public IList? ProductIdList { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Product/UnionPromoterProductListResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Product/UnionPromoterProductListResponse.cs
new file mode 100644
index 00000000..fbf4423a
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Product/UnionPromoterProductListResponse.cs
@@ -0,0 +1,566 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [GET] /union/promoter/product/list 接口的响应。
+ ///
+ public class UnionPromoterProductListResponse : WechatApiResponse
+ {
+ public static class Types
+ {
+ public class Product
+ {
+ public static class Types
+ {
+ public class ProductDetail
+ {
+ public static class Types
+ {
+ public class Category
+ {
+ ///
+ /// 获取或设置商品类目 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("catId")]
+ [System.Text.Json.Serialization.JsonPropertyName("catId")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ public int CategoryId { get; set; }
+
+ ///
+ /// 获取或设置上级商品类目名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("name")]
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string Name { get; set; } = default!;
+ }
+
+ public class Attribute
+ {
+ ///
+ /// 获取或设置属性的 Key。
+ ///
+ [Newtonsoft.Json.JsonProperty("key")]
+ [System.Text.Json.Serialization.JsonPropertyName("key")]
+ public string Key { get; set; } = default!;
+
+ ///
+ /// 获取或设置属性的值。
+ ///
+ [Newtonsoft.Json.JsonProperty("value")]
+ [System.Text.Json.Serialization.JsonPropertyName("value")]
+ public string Value { get; set; } = default!;
+ }
+
+ public class Information
+ {
+ public static class Types
+ {
+ public class Detail
+ {
+ ///
+ /// 获取或设置商品详情图片 Url 列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("detailImg")]
+ [System.Text.Json.Serialization.JsonPropertyName("detailImg")]
+ public string[] ImageUrlList { get; set; } = default!;
+ }
+
+ public class Express
+ {
+ ///
+ /// 获取或设置运费模板 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("templateId")]
+ [System.Text.Json.Serialization.JsonPropertyName("templateId")]
+ public int TemplateId { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置商品标题。
+ ///
+ [Newtonsoft.Json.JsonProperty("title")]
+ [System.Text.Json.Serialization.JsonPropertyName("title")]
+ public string Title { get; set; } = default!;
+
+ ///
+ /// 获取或设置商品副标题。
+ ///
+ [Newtonsoft.Json.JsonProperty("subTitle")]
+ [System.Text.Json.Serialization.JsonPropertyName("subTitle")]
+ public string? SubTitle { get; set; }
+
+ ///
+ /// 获取或设置主图 Url 列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("headImg")]
+ [System.Text.Json.Serialization.JsonPropertyName("headImg")]
+ public string[] HeadImageUrlList { get; set; } = default!;
+
+ ///
+ /// 获取或设置商品详情信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("detail")]
+ [System.Text.Json.Serialization.JsonPropertyName("detail")]
+ public Types.Detail Detail { get; set; } = default!;
+
+ ///
+ /// 获取或设置品牌 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("brandId")]
+ [System.Text.Json.Serialization.JsonPropertyName("brandId")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ public int BrandId { get; set; }
+
+ ///
+ /// 获取或设置品牌名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("brand")]
+ [System.Text.Json.Serialization.JsonPropertyName("brand")]
+ public string? BrandName { get; set; }
+
+ ///
+ /// 获取或设置型号。
+ ///
+ [Newtonsoft.Json.JsonProperty("model")]
+ [System.Text.Json.Serialization.JsonPropertyName("model")]
+ public string? Model { get; set; }
+
+ ///
+ /// 获取或设置商品类目列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("category")]
+ [System.Text.Json.Serialization.JsonPropertyName("category")]
+ public Category[] CategoryList { get; set; } = default!;
+
+ ///
+ /// 获取或设置商品属性列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("param")]
+ [System.Text.Json.Serialization.JsonPropertyName("param")]
+ public Attribute[] AttributeList { get; set; } = default!;
+
+ ///
+ /// 获取或设置运费信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("expressInfo")]
+ [System.Text.Json.Serialization.JsonPropertyName("expressInfo")]
+ public Types.Express Express { get; set; } = default!;
+
+ ///
+ /// 获取或设置 SKU 最低价格(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("minPrice")]
+ [System.Text.Json.Serialization.JsonPropertyName("minPrice")]
+ public int MinPrice { get; set; }
+
+ ///
+ /// 获取或设置总库存。
+ ///
+ [Newtonsoft.Json.JsonProperty("totalStockNum")]
+ [System.Text.Json.Serialization.JsonPropertyName("totalStockNum")]
+ public int Stock { get; set; }
+ }
+
+ public class SKU
+ {
+ public static class Types
+ {
+ public class Information
+ {
+ public static class Types
+ {
+ public class Stock
+ {
+ ///
+ /// 获取或设置库存量。
+ ///
+ [Newtonsoft.Json.JsonProperty("stockNum")]
+ [System.Text.Json.Serialization.JsonPropertyName("stockNum")]
+ public int Value { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置缩略图 URL。
+ ///
+ [Newtonsoft.Json.JsonProperty("thumbImg")]
+ [System.Text.Json.Serialization.JsonPropertyName("thumbImg")]
+ public string ThumbnailUrl { get; set; } = default!;
+
+ ///
+ /// 获取或设置售价(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("salePrice")]
+ [System.Text.Json.Serialization.JsonPropertyName("salePrice")]
+ public int SalePrice { get; set; }
+
+ ///
+ /// 获取或设置市场价(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("marketPrice")]
+ [System.Text.Json.Serialization.JsonPropertyName("marketPrice")]
+ public int MarketPrice { get; set; }
+
+ ///
+ /// 获取或设置库存信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("stockInfo")]
+ [System.Text.Json.Serialization.JsonPropertyName("stockInfo")]
+ public Types.Stock Stock { get; set; } = default!;
+
+ ///
+ /// 获取或设置商品编码。
+ ///
+ [Newtonsoft.Json.JsonProperty("skuCode")]
+ [System.Text.Json.Serialization.JsonPropertyName("skuCode")]
+ public string? SKUCode { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置 SKU ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("skuId")]
+ [System.Text.Json.Serialization.JsonPropertyName("skuId")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ public long SKUId { get; set; }
+
+ ///
+ /// 获取或设置 SKU 上线状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("status")]
+ [System.Text.Json.Serialization.JsonPropertyName("status")]
+ public int Status { get; set; }
+
+ ///
+ /// 获取或设置 SKU 基本信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("productSkuInfo")]
+ [System.Text.Json.Serialization.JsonPropertyName("productSkuInfo")]
+ public Types.Information Information { get; set; } = default!;
+ }
+ }
+
+ ///
+ /// 获取或设置商品 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("productId")]
+ [System.Text.Json.Serialization.JsonPropertyName("productId")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ public long ProductId { get; set; }
+
+ ///
+ /// 获取或设置商品上线状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("status")]
+ [System.Text.Json.Serialization.JsonPropertyName("status")]
+ public int Status { get; set; }
+
+ ///
+ /// 获取或设置商品基本信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("info")]
+ [System.Text.Json.Serialization.JsonPropertyName("info")]
+ public Types.Information Information { get; set; } = default!;
+
+ ///
+ /// 获取或设置 SKU 列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("skus")]
+ [System.Text.Json.Serialization.JsonPropertyName("skus")]
+ public Types.SKU[] SKUList { get; set; } = default!;
+ }
+
+ public class League
+ {
+ ///
+ /// 获取或设置是否有佣金。
+ ///
+ [Newtonsoft.Json.JsonProperty("hasCommission")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.NumberTypedBooleanConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("hasCommission")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.NumberTypedBooleanConverter))]
+ public bool HasCommission { get; set; }
+
+ ///
+ /// 获取或设置佣金比例(单位:万分之一)。
+ ///
+ [Newtonsoft.Json.JsonProperty("commissionRatio")]
+ [System.Text.Json.Serialization.JsonPropertyName("commissionRatio")]
+ public int? CommissionRatio { get; set; }
+
+ ///
+ /// 获取或设置佣金金额(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("commissionValue")]
+ [System.Text.Json.Serialization.JsonPropertyName("commissionValue")]
+ public int? CommissionValue { get; set; }
+ }
+
+ public class Shop
+ {
+ ///
+ /// 获取或设置小商店 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("appId")]
+ [System.Text.Json.Serialization.JsonPropertyName("appId")]
+ public string AppId { get; set; } = default!;
+
+ ///
+ /// 获取或设置小商店名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("name")]
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string Name { get; set; } = default!;
+
+ ///
+ /// 获取或设置小商店头像 URL。
+ ///
+ [Newtonsoft.Json.JsonProperty("headImgUrl")]
+ [System.Text.Json.Serialization.JsonPropertyName("headImgUrl")]
+ public string HeadImageUrl { get; set; } = default!;
+ }
+
+ public class Coupon
+ {
+ public static class Types
+ {
+ public class CouponDetail
+ {
+ public static class Types
+ {
+ public class Discount
+ {
+ public static class Types
+ {
+ public class DiscountCondidtion
+ {
+ ///
+ /// 获取或设置商品数量。
+ ///
+ [Newtonsoft.Json.JsonProperty("productCnt")]
+ [System.Text.Json.Serialization.JsonPropertyName("productCnt")]
+ public int? ProductCount { get; set; }
+
+ ///
+ /// 获取或设置商品 ID 列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("productIds")]
+ [System.Text.Json.Serialization.JsonPropertyName("productIds")]
+ public long[]? ProductIdList { get; set; }
+
+ ///
+ /// 获取或设置商品价格(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("productPrice")]
+ [System.Text.Json.Serialization.JsonPropertyName("productPrice")]
+ public int? ProductPrice { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置优惠条件信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("discountCondition")]
+ [System.Text.Json.Serialization.JsonPropertyName("discountCondition")]
+ public Types.DiscountCondidtion? DiscountCondidtion { get; set; }
+
+ ///
+ /// 获取或设置满减金额(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("discountFee")]
+ [System.Text.Json.Serialization.JsonPropertyName("discountFee")]
+ public int? DiscountFee { get; set; }
+
+ ///
+ /// 获取或设置折扣数值(范围:1000~10000)。
+ ///
+ [Newtonsoft.Json.JsonProperty("discountNum")]
+ [System.Text.Json.Serialization.JsonPropertyName("discountNum")]
+ public int? DiscountNumber { get; set; }
+ }
+
+ public class Reception
+ {
+ ///
+ /// 获取或设置单人限领数量。
+ ///
+ [Newtonsoft.Json.JsonProperty("limitNumOnePerson")]
+ [System.Text.Json.Serialization.JsonPropertyName("limitNumOnePerson")]
+ public int LimitPerUser { get; set; }
+
+ ///
+ /// 获取或设置领取开始时间戳。
+ ///
+ [Newtonsoft.Json.JsonProperty("startTime")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.CommonNullableDateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("startTime")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.CommonNullableDateTimeOffsetConverter))]
+ public DateTimeOffset? StartTime { get; set; }
+
+ ///
+ /// 获取或设置领取结束时间戳。
+ ///
+ [Newtonsoft.Json.JsonProperty("endTime")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.CommonNullableDateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("endTime")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.CommonNullableDateTimeOffsetConverter))]
+ public DateTimeOffset? EndTime { get; set; }
+ }
+
+ public class Validity
+ {
+ ///
+ /// 获取或设置有效期类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("validType")]
+ [System.Text.Json.Serialization.JsonPropertyName("validType")]
+ public string ValidType { get; set; } = default!;
+
+ ///
+ /// 获取或设置相对生效天数。
+ ///
+ [Newtonsoft.Json.JsonProperty("validDayNum")]
+ [System.Text.Json.Serialization.JsonPropertyName("validDayNum")]
+ public int? ValidDays { get; set; }
+
+ ///
+ /// 获取或设置绝对生效开始时间戳。
+ ///
+ [Newtonsoft.Json.JsonProperty("startTime")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.CommonNullableDateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("startTime")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.CommonNullableDateTimeOffsetConverter))]
+ public DateTimeOffset? StartTime { get; set; }
+
+ ///
+ /// 获取或设置绝对生效结束时间戳。
+ ///
+ [Newtonsoft.Json.JsonProperty("endTime")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.CommonNullableDateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("endTime")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.CommonNullableDateTimeOffsetConverter))]
+ public DateTimeOffset? EndTime { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置优惠券类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("type")]
+ [System.Text.Json.Serialization.JsonPropertyName("type")]
+ public int Type { get; set; }
+
+ ///
+ /// 获取或设置优惠券库存。
+ ///
+ [Newtonsoft.Json.JsonProperty("restNum")]
+ [System.Text.Json.Serialization.JsonPropertyName("restNum")]
+ public int Stock { get; set; }
+
+ ///
+ /// 获取或设置优惠信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("discountInfo")]
+ [System.Text.Json.Serialization.JsonPropertyName("discountInfo")]
+ public Types.Discount Discount { get; set; } = default!;
+
+ ///
+ /// 获取或设置接收信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("receiveInfo")]
+ [System.Text.Json.Serialization.JsonPropertyName("receiveInfo")]
+ public Types.Reception? Reception { get; set; }
+
+ ///
+ /// 获取或设置有效期信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("validInfo")]
+ [System.Text.Json.Serialization.JsonPropertyName("validInfo")]
+ public Types.Validity Validity { get; set; } = default!;
+ }
+ }
+
+ ///
+ /// 获取或设置是否有联盟优惠券。
+ ///
+ [Newtonsoft.Json.JsonProperty("hasCoupon")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.NumberTypedBooleanConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("hasCoupon")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.NumberTypedBooleanConverter))]
+ public bool HasCommission { get; set; }
+
+ ///
+ /// 获取或设置优惠券 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("couponId")]
+ [System.Text.Json.Serialization.JsonPropertyName("couponId")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ public int? CouponId { get; set; }
+
+ ///
+ /// 获取或设置优惠券详细信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("couponInfo")]
+ [System.Text.Json.Serialization.JsonPropertyName("couponInfo")]
+ public Types.CouponDetail? CouponDetail { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置商品 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("productId")]
+ [System.Text.Json.Serialization.JsonPropertyName("productId")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ public long ProductId { get; set; }
+
+ ///
+ /// 获取或设置商品详细信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("product")]
+ [System.Text.Json.Serialization.JsonPropertyName("product")]
+ public Types.ProductDetail ProductDetail { get; set; } = default!;
+
+ ///
+ /// 获取或设置联盟佣金信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("leagueExInfo")]
+ [System.Text.Json.Serialization.JsonPropertyName("leagueExInfo")]
+ public Types.League League { get; set; } = default!;
+
+ ///
+ /// 获取或设置商品所属小商店信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("shopInfo")]
+ [System.Text.Json.Serialization.JsonPropertyName("shopInfo")]
+ public Types.Shop Shop { get; set; } = default!;
+
+ ///
+ /// 获取或设置联盟优惠券信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("couponInfo")]
+ [System.Text.Json.Serialization.JsonPropertyName("couponInfo")]
+ public Types.Coupon? Coupon { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置商品列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("productList")]
+ [System.Text.Json.Serialization.JsonPropertyName("productList")]
+
+ public Types.Product[] ProductList { get; set; } = default!;
+
+ ///
+ /// 获取或设置商品总数量。
+ ///
+ [Newtonsoft.Json.JsonProperty("total")]
+ [System.Text.Json.Serialization.JsonPropertyName("total")]
+ public int Total { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Promotion/UnionPromoterPromotionAddRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Promotion/UnionPromoterPromotionAddRequest.cs
new file mode 100644
index 00000000..dc13daf9
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Promotion/UnionPromoterPromotionAddRequest.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /union/promoter/promotion/add 接口的请求。
+ ///
+ public class UnionPromoterPromotionAddRequest : WechatApiRequest
+ {
+ ///
+ /// 获取或设置推广位名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("promotionSourceName")]
+ [System.Text.Json.Serialization.JsonPropertyName("promotionSourceName")]
+ public string SourceName { get; set; } = string.Empty;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Promotion/UnionPromoterPromotionAddResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Promotion/UnionPromoterPromotionAddResponse.cs
new file mode 100644
index 00000000..0ab387d0
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Promotion/UnionPromoterPromotionAddResponse.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /union/promoter/promotion/add 接口的响应。
+ ///
+ public class UnionPromoterPromotionAddResponse : WechatApiResponse
+ {
+ ///
+ /// 获取或设置推广位 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("pid")]
+ [System.Text.Json.Serialization.JsonPropertyName("pid")]
+ public string PromotionId { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Promotion/UnionPromoterPromotionDeleteRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Promotion/UnionPromoterPromotionDeleteRequest.cs
new file mode 100644
index 00000000..665e2c2d
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Promotion/UnionPromoterPromotionDeleteRequest.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /union/promoter/promotion/del 接口的请求。
+ ///
+ public class UnionPromoterPromotionDeleteRequest : WechatApiRequest
+ {
+ ///
+ /// 获取或设置推广位 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("promotionSourcePid")]
+ [System.Text.Json.Serialization.JsonPropertyName("promotionSourcePid")]
+ public string PromotionId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置推广位名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("promotionSourceName")]
+ [System.Text.Json.Serialization.JsonPropertyName("promotionSourceName")]
+ public string SourceName { get; set; } = string.Empty;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Promotion/UnionPromoterPromotionDeleteResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Promotion/UnionPromoterPromotionDeleteResponse.cs
new file mode 100644
index 00000000..d96062f4
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Promotion/UnionPromoterPromotionDeleteResponse.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /union/promoter/promotion/del 接口的响应。
+ ///
+ public class UnionPromoterPromotionDeleteResponse : WechatApiResponse
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Promotion/UnionPromoterPromotionListRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Promotion/UnionPromoterPromotionListRequest.cs
new file mode 100644
index 00000000..f7a2381a
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Promotion/UnionPromoterPromotionListRequest.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [GET] /union/promoter/promotion/list 接口的请求。
+ ///
+ public class UnionPromoterPromotionListRequest : WechatApiRequest
+ {
+ ///
+ /// 获取或设置分页起始位置。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int Offset { get; set; }
+
+ ///
+ /// 获取或设置分页每页数量。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int Limit { get; set; } = 20;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Promotion/UnionPromoterPromotionListResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Promotion/UnionPromoterPromotionListResponse.cs
new file mode 100644
index 00000000..49048f52
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Promotion/UnionPromoterPromotionListResponse.cs
@@ -0,0 +1,53 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [GET] /union/promoter/promotion/list 接口的响应。
+ ///
+ public class UnionPromoterPromotionListResponse : WechatApiResponse
+ {
+ public static class Types
+ {
+ public class Promotion
+ {
+ ///
+ /// 获取或设置推广位 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("promotionSourcePid")]
+ [System.Text.Json.Serialization.JsonPropertyName("promotionSourcePid")]
+ public string PromotionId { get; set; } = default!;
+
+ ///
+ /// 获取或设置推广位名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("promotionSourceName")]
+ [System.Text.Json.Serialization.JsonPropertyName("promotionSourceName")]
+ public string SourceName { get; set; } = default!;
+ }
+ }
+
+ ///
+ /// 获取或设置推广位列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("promotionSourceList")]
+ [System.Text.Json.Serialization.JsonPropertyName("promotionSourceList")]
+
+ public Types.Promotion[] PromotionList { get; set; } = default!;
+
+ ///
+ /// 获取或设置推广位总数量。
+ ///
+ [Newtonsoft.Json.JsonProperty("total")]
+ [System.Text.Json.Serialization.JsonPropertyName("total")]
+ public int Total { get; set; }
+
+ ///
+ /// 获取或设置允许创建的推广位最大数量。
+ ///
+ [Newtonsoft.Json.JsonProperty("promotionMaxCnt")]
+ [System.Text.Json.Serialization.JsonPropertyName("promotionMaxCnt")]
+ public int MaxPromotionCount { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Promotion/UnionPromoterPromotionUpdateRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Promotion/UnionPromoterPromotionUpdateRequest.cs
new file mode 100644
index 00000000..6a644a8e
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Promotion/UnionPromoterPromotionUpdateRequest.cs
@@ -0,0 +1,48 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /union/promoter/promotion/upd 接口的请求。
+ ///
+ public class UnionPromoterPromotionUpdateRequest : WechatApiRequest
+ {
+ public static class Types
+ {
+ public class Promotion
+ {
+ ///
+ /// 获取或设置推广位名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("promotionSourceName")]
+ [System.Text.Json.Serialization.JsonPropertyName("promotionSourceName")]
+ public string SourceName { get; set; } = string.Empty;
+ }
+
+ public class PreviousPromotion : Promotion
+ {
+ ///
+ /// 获取或设置推广位 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("promotionSourcePid")]
+ [System.Text.Json.Serialization.JsonPropertyName("promotionSourcePid")]
+ public string PromotionId { get; set; } = string.Empty;
+ }
+ }
+
+ ///
+ /// 获取或设置修改前的推广位信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("previousPromotionInfo")]
+ [System.Text.Json.Serialization.JsonPropertyName("previousPromotionInfo")]
+ public Types.PreviousPromotion PreviousPromotion { get; set; } = new Types.PreviousPromotion();
+
+ ///
+ /// 获取或设置修改后的推广位信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("promotionInfo")]
+ [System.Text.Json.Serialization.JsonPropertyName("promotionInfo")]
+ public Types.Promotion Promotion { get; set; } = new Types.Promotion();
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Promotion/UnionPromoterPromotionUpdateResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Promotion/UnionPromoterPromotionUpdateResponse.cs
new file mode 100644
index 00000000..9b51ca5a
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Promotion/UnionPromoterPromotionUpdateResponse.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /union/promoter/promotion/upd 接口的响应。
+ ///
+ public class UnionPromoterPromotionUpdateResponse : WechatApiResponse
+ {
+ }
+}