diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteUnionPromoterExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteUnionPromoterExtensions.cs
index 8ae5bf90..48b1ad0a 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteUnionPromoterExtensions.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteUnionPromoterExtensions.cs
@@ -97,7 +97,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api
///
/// 异步调用 [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
- /// REF: https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/business-capabilities/union/access-guidelines/promoter/api/product/category.html
+ /// REF: https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/business-capabilities/union/access-guidelines/promoter/api/product/category.html
///
///
///
@@ -118,7 +118,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api
///
/// 异步调用 [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
- /// REF: https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/business-capabilities/union/access-guidelines/promoter/api/product/category.html
+ /// REF: https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/business-capabilities/union/access-guidelines/promoter/api/product/category.html
///
///
///
@@ -241,7 +241,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api
///
/// 异步调用 [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
- /// REF: https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/business-capabilities/union/access-guidelines/promoter/api/product/category.html
+ /// REF: https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/business-capabilities/union/access-guidelines/promoter/api/product/category.html
///
///
///
@@ -263,7 +263,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api
#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
+ /// REF: https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/business-capabilities/union/custom_component/api/promoter/openproduct.html
///
///
///
@@ -318,6 +318,26 @@ namespace SKIT.FlurlHttpClient.Wechat.Api
return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
}
+
+ ///
+ /// 异步调用 [POST] /union/promoter/open_product/generate 接口。
+ /// REF: https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/business-capabilities/union/custom_component/api/promoter/openpromotion.html
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteUnionPromoterOpenProductGenerateAsync(this WechatApiClient client, Models.UnionPromoterOpenProductGenerateRequest 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, "union", "promoter", "open_product", "generate")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
#endregion
#region Order
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/OpenProduct/UnionPromoterOpenProductGenerateRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/OpenProduct/UnionPromoterOpenProductGenerateRequest.cs
new file mode 100644
index 00000000..537fbb19
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/OpenProduct/UnionPromoterOpenProductGenerateRequest.cs
@@ -0,0 +1,65 @@
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /union/promoter/open_product/generate 接口的请求。
+ ///
+ public class UnionPromoterOpenProductGenerateRequest : WechatApiRequest, IInferable
+ {
+ 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("getShortUrl")]
+ [System.Text.Json.Serialization.JsonPropertyName("getShortUrl")]
+ public bool? RequireGetShortUrl { get; set; }
+
+ ///
+ /// 获取或设置是否拉取商品信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("getInfo")]
+ [System.Text.Json.Serialization.JsonPropertyName("getInfo")]
+ public bool? RequireGetInfo { get; set; }
+
+ ///
+ /// 获取或设置商品列表。
+ ///
+ [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/OpenProduct/UnionPromoterOpenProductGenerateResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/OpenProduct/UnionPromoterOpenProductGenerateResponse.cs
new file mode 100644
index 00000000..1b68b0af
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/OpenProduct/UnionPromoterOpenProductGenerateResponse.cs
@@ -0,0 +1,157 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /union/promoter/open_product/generate 接口的响应。
+ ///
+ public class UnionPromoterOpenProductGenerateResponse : 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("shopName")]
+ [System.Text.Json.Serialization.JsonPropertyName("shopName")]
+ public string? ShopName { get; set; }
+
+ ///
+ /// 获取或设置店铺状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("shopStatus")]
+ [System.Text.Json.Serialization.JsonPropertyName("shopStatus")]
+ public int? ShopStatus { get; set; }
+ }
+
+ public class Share
+ {
+ ///
+ /// 获取或设置小程序 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("appId")]
+ [System.Text.Json.Serialization.JsonPropertyName("appId")]
+ public string AppId { get; set; } = default!;
+
+ ///
+ /// 获取或设置小程序原始 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("username")]
+ [System.Text.Json.Serialization.JsonPropertyName("username")]
+ public string Username { get; set; } = default!;
+
+ ///
+ /// 获取或设置小程序页面路径。
+ ///
+ [Newtonsoft.Json.JsonProperty("path")]
+ [System.Text.Json.Serialization.JsonPropertyName("path")]
+ public string PagePath { 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; }
+
+ ///
+ /// 获取或设置推广商品 Tag。
+ ///
+ [Newtonsoft.Json.JsonProperty("promotionTag")]
+ [System.Text.Json.Serialization.JsonPropertyName("promotionTag")]
+ public string? PromotionTag { get; set; }
+
+ ///
+ /// 获取或设置获取素材状态码。
+ ///
+ [Newtonsoft.Json.JsonProperty("code")]
+ [System.Text.Json.Serialization.JsonPropertyName("code")]
+ public int Code { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置推广位 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/UnionPromoterProductGenerateResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Product/UnionPromoterProductGenerateResponse.cs
index a462cb75..0bebc2e0 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Product/UnionPromoterProductGenerateResponse.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Product/UnionPromoterProductGenerateResponse.cs
@@ -161,7 +161,6 @@
///
[Newtonsoft.Json.JsonProperty("list")]
[System.Text.Json.Serialization.JsonPropertyName("list")]
-
public Types.ProductPromotion[] ProductPromotionList { get; set; } = default!;
}
}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/UnionPromoter/OpenProduct/UnionPromoterOpenProductGenerateRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/UnionPromoter/OpenProduct/UnionPromoterOpenProductGenerateRequest.json
new file mode 100644
index 00000000..2731e074
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/UnionPromoter/OpenProduct/UnionPromoterOpenProductGenerateRequest.json
@@ -0,0 +1,9 @@
+{
+ "pid": "oUnIc49zinb1mtlfB5K-NfGJxxNE_341161518",
+ "productList": [
+ {
+ "productId": "14495788",
+ "appId": "wxb82530c28"
+ }
+ ]
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/UnionPromoter/OpenProduct/UnionPromoterOpenProductGenerateResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/UnionPromoter/OpenProduct/UnionPromoterOpenProductGenerateResponse.json
new file mode 100644
index 00000000..b73f06b1
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/UnionPromoter/OpenProduct/UnionPromoterOpenProductGenerateResponse.json
@@ -0,0 +1,22 @@
+{
+ "errcode": 0,
+ "errmsg": "ok",
+ "list": [
+ {
+ "pid": "oJtf15NzExNvQ8UnT9SNOWQpyOpw_466373468",
+ "productInfo": {
+ "productId": "413063159",
+ "shopName": "测试商品精品商城",
+ "totalStockNum": 100
+ },
+ "shareInfo": {
+ "appId": "wxd5246f9e9041f745",
+ "username": "gh_760d082de91f",
+ "path": "pages/detail/detail?productId=3354&open_league_ticket=bGVhZ3VldGlja2V0OjE1NjAzOTc5NzU1MDA2MjU1Mjg0NDM5OTg2",
+ "promotionWording": "😨大家都在等这款,每次都巨抢手👑把它带回家!❗️售完即止💰\n————\n测试礼盒\n\n优惠价:62元\n\n下单:https://mmbizurl.cn/u/Kr1xRsVy",
+ "promotionUrl": "https://mmbizurl.cn/u/Kr1xRsV",
+ "promotionTag": "#小程序://测试商品精品商城/【佳琦会员专享测试商品/gRDKwkGQYkTc"
+ }
+ }
+ ]
+}