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