diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteUnionPromoterExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteUnionPromoterExtensions.cs
index bb40be24..8ae5bf90 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteUnionPromoterExtensions.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteUnionPromoterExtensions.cs
@@ -260,6 +260,66 @@ namespace SKIT.FlurlHttpClient.Wechat.Api
}
#endregion
+ #region OpenProduct
+ ///
+ /// 异步调用 [GET] /union/promoter/open_product/list 接口。
+ /// REF: https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/business-capabilities/union/custom_component/api/promoter/openproduct.html
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteUnionPromoterOpenProductListAsync(this WechatApiClient client, Models.UnionPromoterOpenProductListRequest 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.Get, "union", "promoter", "open_product", "list")
+ .SetQueryParam("access_token", request.AccessToken)
+ .SetQueryParam("from", request.Offset)
+ .SetQueryParam("limit", request.Limit);
+
+ if (request.QueryType != null)
+ flurlReq.SetQueryParam("queryType", request.QueryType.Value);
+
+ if (request.Query != null)
+ flurlReq.SetQueryParam("query", request.Query);
+
+ if (request.MaxPrice != null)
+ flurlReq.SetQueryParam("maxPrice", request.MaxPrice.Value);
+
+ if (request.MinPrice != null)
+ flurlReq.SetQueryParam("minPrice", request.MinPrice.Value);
+
+ if (request.MinCommissionValue != null)
+ flurlReq.SetQueryParam("minCommissionValue", request.MinCommissionValue.Value);
+
+ if (request.MinCommissionRatio != null)
+ flurlReq.SetQueryParam("minCommissionRatio", request.MinCommissionRatio.Value);
+
+ if (request.SortType != null)
+ flurlReq.SetQueryParam("sortType", request.SortType.Value);
+
+ if (request.ShopAppIdList != null)
+ flurlReq.SetQueryParam("shopAppIds", string.Join(",", request.ShopAppIdList));
+
+ if (request.CategoryId != null)
+ flurlReq.SetQueryParam("categoryId", request.CategoryId);
+
+ if (request.CategoryIdList != null)
+ flurlReq.SetQueryParam("category", string.Join(",", request.CategoryIdList));
+
+ if (request.CategoryIdBlackList != null)
+ flurlReq.SetQueryParam("noCategory", string.Join(",", request.CategoryIdBlackList));
+
+ if (request.ProductIdList != null)
+ flurlReq.SetQueryParam("productId", string.Join(",", request.ProductIdList));
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+ #endregion
+
#region Order
///
/// 异步调用 [POST] /union/promoter/order/info 接口。
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/OpenProduct/UnionPromoterOpenProductListRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/OpenProduct/UnionPromoterOpenProductListRequest.cs
new file mode 100644
index 00000000..5ab480ed
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/OpenProduct/UnionPromoterOpenProductListRequest.cs
@@ -0,0 +1,110 @@
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [GET] /union/promoter/open_product/list 接口的请求。
+ ///
+ public class UnionPromoterOpenProductListRequest : WechatApiRequest, IInferable
+ {
+ ///
+ /// 获取或设置分页起始位置。
+ /// 默认值:0
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int Offset { get; set; } = 0;
+
+ ///
+ /// 获取或设置分页起始位置。
+ /// 默认值:30
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int Limit { get; set; } = 10;
+
+ ///
+ /// 获取或设置搜索类型。
+ ///
+ [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; }
+
+ ///
+ /// 获取或设置类目 ID。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? CategoryId { get; set; }
+
+ ///
+ /// 获取或设置小程序 AppId 列表。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public IList? ShopAppIdList { 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/OpenProduct/UnionPromoterOpenProductListResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/OpenProduct/UnionPromoterOpenProductListResponse.cs
new file mode 100644
index 00000000..8148138f
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/OpenProduct/UnionPromoterOpenProductListResponse.cs
@@ -0,0 +1,223 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [GET] /union/promoter/open_product/list 接口的响应。
+ ///
+ public class UnionPromoterOpenProductListResponse : WechatApiResponse
+ {
+ public static class Types
+ {
+ public class Product
+ {
+ public static class Types
+ {
+ public class ProductDetail
+ {
+ public static class Types
+ {
+ 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!;
+ }
+ }
+
+ ///
+ /// 获取或设置商品标题。
+ ///
+ [Newtonsoft.Json.JsonProperty("title")]
+ [System.Text.Json.Serialization.JsonPropertyName("title")]
+ public string Title { get; set; } = default!;
+
+ ///
+ /// 获取或设置商品主图 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; }
+
+ ///
+ /// 获取或设置 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 TotalStock { get; set; }
+
+ ///
+ /// 获取或设置小程序页面路径。
+ ///
+ [Newtonsoft.Json.JsonProperty("path")]
+ [System.Text.Json.Serialization.JsonPropertyName("path")]
+ public string? PagePath { get; set; }
+ }
+
+ public class SKU
+ {
+ public static class Types
+ {
+ public class Information
+ {
+ ///
+ /// 获取或设置缩略图 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("stockNum")]
+ [System.Text.Json.Serialization.JsonPropertyName("stockNum")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ public int Stock { 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("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("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 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!;
+
+ ///
+ /// 获取或设置小程序原始 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("username")]
+ [System.Text.Json.Serialization.JsonPropertyName("username")]
+ public string Username { get; set; } = default!;
+
+ ///
+ /// 获取或设置小程序头像 URL。
+ ///
+ [Newtonsoft.Json.JsonProperty("headImgUrl")]
+ [System.Text.Json.Serialization.JsonPropertyName("headImgUrl")]
+ public string HeadImageUrl { get; set; } = default!;
+ }
+ }
+
+ ///
+ /// 获取或设置商品详细信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("product")]
+ [System.Text.Json.Serialization.JsonPropertyName("product")]
+ public Types.ProductDetail ProductDetail { get; set; } = default!;
+
+ ///
+ /// 获取或设置商品所属小商店信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("shopInfo")]
+ [System.Text.Json.Serialization.JsonPropertyName("shopInfo")]
+ public Types.Shop Shop { get; set; } = default!;
+ }
+ }
+
+ ///
+ /// 获取或设置商品列表。
+ ///
+ [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/Product/UnionPromoterProductListResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Product/UnionPromoterProductListResponse.cs
index da2a21ec..aebcd0d0 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Product/UnionPromoterProductListResponse.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Product/UnionPromoterProductListResponse.cs
@@ -566,7 +566,6 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models
///
[Newtonsoft.Json.JsonProperty("productList")]
[System.Text.Json.Serialization.JsonPropertyName("productList")]
-
public Types.Product[] ProductList { get; set; } = default!;
///
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/UnionPromoter/OpenProduct/UnionPromoterOpenProductListResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/UnionPromoter/OpenProduct/UnionPromoterOpenProductListResponse.json
new file mode 100644
index 00000000..0b2349e7
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/UnionPromoter/OpenProduct/UnionPromoterOpenProductListResponse.json
@@ -0,0 +1,40 @@
+{
+ "errcode": 0,
+ "errmsg": "ok",
+ "total": 59,
+ "productList": [
+ {
+ "shopInfo": {
+ "name": "医保非税小测试",
+ "appId": "wx539e0b4872f196d1",
+ "username": "gh_6e10896a3e3c",
+ "headImgUrl": "http://wx.qlogo.cn/mmhead/Q3auHgzwzM6PxkhYKuFL3Xy6ibu3lJAhosuicqM92GLDdBRHySZuVibiag"
+ },
+ "product": {
+ "productId": "411668902",
+ "info": {
+ "title": "金幼小儿米茶膏11.8g*抑菌霜(限时送好产品)(1625192914000)",
+ "headImg": [
+ "https://snsdy.tc.qq.com/161/20304/snscosdownload/SZ/reserved/5fc36818000f255f00000000d0785609000000a000004f50?imageView2/3/w/750"
+ ],
+ "brandId": "2100000000",
+ "detail": {},
+ "minPrice": 1,
+ "totalStockNum": 100,
+ "path": "pages/productDetail/productDetail?productId=1625192914000"
+ },
+ "skus": [
+ {
+ "skuId": "350377364",
+ "productSkuInfo": {
+ "thumbImg": "https://store.mp.video.tencent-cloud.com/161/20304/snscosdownload/SH/reserved/60de79d30007ec2000000000c7e04f09000000a100004f50",
+ "salePrice": 1,
+ "marketPrice": 1,
+ "stockNum": "100"
+ }
+ }
+ ]
+ }
+ }
+ ]
+}