feat(wxapi): 新增视频号小店商品限时抢购相关接口

This commit is contained in:
Fu Diwei 2022-11-03 16:50:10 +08:00
parent 8c970b5076
commit cdd2ca258f
15 changed files with 416 additions and 6 deletions

View File

@ -117,8 +117,8 @@ namespace SKIT.FlurlHttpClient.Wechat.Api
}
#endregion
#region Merchant
#region Merchant/FreightTemplate
#region ECMerchant
#region ECMerchant/FreightTemplate
/// <summary>
/// <para>异步调用 [POST] /channels/ec/merchant/getfreighttemplatelist 接口。</para>
/// <para>REF: https://developers.weixin.qq.com/doc/channels/API/order/deliverycompanylist_get.html </para>
@ -200,7 +200,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api
}
#endregion
#region Merchant/Address
#region ECMerchant/Address
/// <summary>
/// <para>异步调用 [POST] /channels/ec/merchant/address/list 接口。</para>
/// <para>REF: https://developers.weixin.qq.com/doc/channels/API/merchant/address/list.html </para>
@ -303,7 +303,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api
#endregion
#endregion
#region Product
#region ECProduct
/// <summary>
/// <para>异步调用 [POST] /channels/ec/product/add 接口。</para>
/// <para>REF: https://developers.weixin.qq.com/doc/channels/API/product/add.html </para>
@ -483,10 +483,92 @@ namespace SKIT.FlurlHttpClient.Wechat.Api
return await client.SendRequestWithJsonAsync<Models.ChannelsECProductStockUpdateResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
}
#region ECProduct/LimitedDiscountTask
/// <summary>
/// <para>异步调用 [POST] /channels/ec/product/limiteddiscounttask/add 接口。</para>
/// <para>REF: https://developers.weixin.qq.com/doc/channels/API/product/limiteddiscounttask/add.html </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.ChannelsECProductLimitedDiscountTaskAddResponse> ExecuteChannelsECProductLimitedDiscountTaskAddAsync(this WechatApiClient client, Models.ChannelsECProductLimitedDiscountTaskAddRequest request, CancellationToken cancellationToken = default)
{
if (client is null) throw new ArgumentNullException(nameof(client));
if (request is null) throw new ArgumentNullException(nameof(request));
IFlurlRequest flurlReq = client
.CreateRequest(request, HttpMethod.Post, "channels", "ec", "product", "limiteddiscounttask", "add")
.SetQueryParam("access_token", request.AccessToken);
return await client.SendRequestWithJsonAsync<Models.ChannelsECProductLimitedDiscountTaskAddResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
}
/// <summary>
/// <para>异步调用 [POST] /channels/ec/product/limiteddiscounttask/list/get 接口。</para>
/// <para>REF: https://developers.weixin.qq.com/doc/channels/API/product/limiteddiscounttask/list_get.html </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.ChannelsECProductLimitedDiscountTaskListGetResponse> ExecuteChannelsECProductLimitedDiscountTaskListGetAsync(this WechatApiClient client, Models.ChannelsECProductLimitedDiscountTaskListGetRequest request, CancellationToken cancellationToken = default)
{
if (client is null) throw new ArgumentNullException(nameof(client));
if (request is null) throw new ArgumentNullException(nameof(request));
IFlurlRequest flurlReq = client
.CreateRequest(request, HttpMethod.Post, "channels", "ec", "product", "limiteddiscounttask", "list", "get")
.SetQueryParam("access_token", request.AccessToken);
return await client.SendRequestWithJsonAsync<Models.ChannelsECProductLimitedDiscountTaskListGetResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
}
/// <summary>
/// <para>异步调用 [POST] /channels/ec/product/limiteddiscounttask/stop 接口。</para>
/// <para>REF: https://developers.weixin.qq.com/doc/channels/API/product/limiteddiscounttask/stop.html </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.ChannelsECProductLimitedDiscountTaskStopResponse> ExecuteChannelsECProductLimitedDiscountTaskStopAsync(this WechatApiClient client, Models.ChannelsECProductLimitedDiscountTaskStopRequest request, CancellationToken cancellationToken = default)
{
if (client is null) throw new ArgumentNullException(nameof(client));
if (request is null) throw new ArgumentNullException(nameof(request));
IFlurlRequest flurlReq = client
.CreateRequest(request, HttpMethod.Post, "channels", "ec", "product", "limiteddiscounttask", "stop")
.SetQueryParam("access_token", request.AccessToken);
return await client.SendRequestWithJsonAsync<Models.ChannelsECProductLimitedDiscountTaskStopResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
}
/// <summary>
/// <para>异步调用 [POST] /channels/ec/product/limiteddiscounttask/delete 接口。</para>
/// <para>REF: https://developers.weixin.qq.com/doc/channels/API/product/limiteddiscounttask/delete.html </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.ChannelsECProductLimitedDiscountTaskDeleteResponse> ExecuteChannelsECProductLimitedDiscountTaskDeleteAsync(this WechatApiClient client, Models.ChannelsECProductLimitedDiscountTaskDeleteRequest request, CancellationToken cancellationToken = default)
{
if (client is null) throw new ArgumentNullException(nameof(client));
if (request is null) throw new ArgumentNullException(nameof(request));
IFlurlRequest flurlReq = client
.CreateRequest(request, HttpMethod.Post, "channels", "ec", "product", "limiteddiscounttask", "delete")
.SetQueryParam("access_token", request.AccessToken);
return await client.SendRequestWithJsonAsync<Models.ChannelsECProductLimitedDiscountTaskDeleteResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
}
#endregion
#endregion
#region Order
#region Order/Delivery
#region ECOrder
#region ECOrder/Delivery
/// <summary>
/// <para>异步调用 [POST] /channels/ec/order/deliverycompanylist/get 接口。</para>
/// <para>REF: https://developers.weixin.qq.com/doc/channels/API/order/deliverycompanylist_get.html </para>

View File

@ -0,0 +1,65 @@
using System.Collections.Generic;
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
/// <summary>
/// <para>表示 [POST] /channels/ec/product/limiteddiscounttask/add 接口的请求。</para>
/// </summary>
public class ChannelsECProductLimitedDiscountTaskAddRequest : WechatApiRequest, IInferable<ChannelsECProductLimitedDiscountTaskAddRequest, ChannelsECProductLimitedDiscountTaskAddResponse>
{
public static class Types
{
public class SKU
{
/// <summary>
/// 获取或设置 SKU ID。
/// </summary>
[Newtonsoft.Json.JsonProperty("sku_id")]
[System.Text.Json.Serialization.JsonPropertyName("sku_id")]
public long SKUId { get; set; }
/// <summary>
/// 获取或设置抢购价格(单位:分)。
/// </summary>
[Newtonsoft.Json.JsonProperty("sale_price")]
[System.Text.Json.Serialization.JsonPropertyName("sale_price")]
public int SalePrice { get; set; }
/// <summary>
/// 获取或设置抢购库存。
/// </summary>
[Newtonsoft.Json.JsonProperty("sale_stock")]
[System.Text.Json.Serialization.JsonPropertyName("sale_stock")]
public int SaleStock { get; set; }
}
}
/// <summary>
/// 获取或设置商品 ID。
/// </summary>
[Newtonsoft.Json.JsonProperty("product_id")]
[System.Text.Json.Serialization.JsonPropertyName("product_id")]
public long ProductId { get; set; }
/// <summary>
/// 获取或设置抢购任务开始时间戳。
/// </summary>
[Newtonsoft.Json.JsonProperty("start_time")]
[System.Text.Json.Serialization.JsonPropertyName("start_time")]
public long StartTimestamp { get; set; }
/// <summary>
/// 获取或设置抢购任务开始时间戳。
/// </summary>
[Newtonsoft.Json.JsonProperty("end_time")]
[System.Text.Json.Serialization.JsonPropertyName("end_time")]
public long EndTimestamp { get; set; }
/// <summary>
/// 获取或设置 SKU 列表。
/// </summary>
[Newtonsoft.Json.JsonProperty("limited_discount_skus")]
[System.Text.Json.Serialization.JsonPropertyName("limited_discount_skus")]
public IList<Types.SKU> SKUList { get; set; } = new List<Types.SKU>();
}
}

View File

@ -0,0 +1,16 @@
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
/// <summary>
/// <para>表示 [POST] /channels/ec/product/limiteddiscounttask/add 接口的响应。</para>
/// </summary>
public class ChannelsECProductLimitedDiscountTaskAddResponse : WechatApiResponse
{
/// <summary>
/// 获取或设置抢购任务 ID。
/// </summary>
[Newtonsoft.Json.JsonProperty("task_id")]
[System.Text.Json.Serialization.JsonPropertyName("task_id")]
[System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
public long TaskId { get; set; }
}
}

View File

@ -0,0 +1,15 @@
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
/// <summary>
/// <para>表示 [POST] /channels/ec/product/limiteddiscounttask/delete 接口的请求。</para>
/// </summary>
public class ChannelsECProductLimitedDiscountTaskDeleteRequest : WechatApiRequest, IInferable<ChannelsECProductLimitedDiscountTaskDeleteRequest, ChannelsECProductLimitedDiscountTaskDeleteResponse>
{
/// <summary>
/// 获取或设置抢购任务 ID。
/// </summary>
[Newtonsoft.Json.JsonProperty("task_id")]
[System.Text.Json.Serialization.JsonPropertyName("task_id")]
public long TaskId { get; set; }
}
}

View File

@ -0,0 +1,9 @@
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
/// <summary>
/// <para>表示 [POST] /channels/ec/product/limiteddiscounttask/delete 接口的响应。</para>
/// </summary>
public class ChannelsECProductLimitedDiscountTaskDeleteResponse : WechatApiResponse
{
}
}

View File

@ -0,0 +1,30 @@
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
/// <summary>
/// <para>表示 [POST] /channels/ec/product/limiteddiscounttask/list/get 接口的请求。</para>
/// </summary>
public class ChannelsECProductLimitedDiscountTaskListGetRequest : WechatApiRequest, IInferable<ChannelsECProductLimitedDiscountTaskListGetRequest, ChannelsECProductLimitedDiscountTaskListGetResponse>
{
/// <summary>
/// 获取或设置指定抢购任务状态。
/// </summary>
[Newtonsoft.Json.JsonProperty("status")]
[System.Text.Json.Serialization.JsonPropertyName("status")]
public int? Status { get; set; }
/// <summary>
/// 获取或设置翻页标记。
/// </summary>
[Newtonsoft.Json.JsonProperty("next_key")]
[System.Text.Json.Serialization.JsonPropertyName("next_key")]
public string? Cursor { get; set; }
/// <summary>
/// 获取或设置分页每页数量。
/// <para>默认值10</para>
/// </summary>
[Newtonsoft.Json.JsonProperty("page_size")]
[System.Text.Json.Serialization.JsonPropertyName("page_size")]
public int Limit { get; set; } = 10;
}
}

View File

@ -0,0 +1,93 @@
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
/// <summary>
/// <para>表示 [POST] /channels/ec/product/limiteddiscounttask/list/get 接口的响应。</para>
/// </summary>
public class ChannelsECProductLimitedDiscountTaskListGetResponse : WechatApiResponse
{
public static class Types
{
public class LimitedDiscountTask
{
public static class Types
{
public class SKU : ProductLimitedDiscountAddRequest.Types.SKU
{
}
}
/// <summary>
/// 获取或设置抢购任务 ID。
/// </summary>
[Newtonsoft.Json.JsonProperty("task_id")]
[System.Text.Json.Serialization.JsonPropertyName("task_id")]
[System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
public long TaskId { get; set; }
/// <summary>
/// 获取或设置商品 ID。
/// </summary>
[Newtonsoft.Json.JsonProperty("product_id")]
[System.Text.Json.Serialization.JsonPropertyName("product_id")]
[System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
public long ProductId { get; set; }
/// <summary>
/// 获取或设置抢购任务开始时间戳。
/// </summary>
[Newtonsoft.Json.JsonProperty("start_time")]
[System.Text.Json.Serialization.JsonPropertyName("start_time")]
public long StartTimestamp { get; set; }
/// <summary>
/// 获取或设置抢购任务开始时间戳。
/// </summary>
[Newtonsoft.Json.JsonProperty("end_time")]
[System.Text.Json.Serialization.JsonPropertyName("end_time")]
public long EndTimestamp { get; set; }
/// <summary>
/// 获取或设置 SKU 列表。
/// </summary>
[Newtonsoft.Json.JsonProperty("limited_discount_skus")]
[System.Text.Json.Serialization.JsonPropertyName("limited_discount_skus")]
public Types.SKU[] SKUList { get; set; } = default!;
/// <summary>
/// 获取或设置抢购任务状态。
/// </summary>
[Newtonsoft.Json.JsonProperty("status")]
[System.Text.Json.Serialization.JsonPropertyName("status")]
public int Status { get; set; }
/// <summary>
/// 获取或设置创建时间戳。
/// </summary>
[Newtonsoft.Json.JsonProperty("create_time")]
[System.Text.Json.Serialization.JsonPropertyName("create_time")]
public long CreateTimestamp { get; set; }
}
}
/// <summary>
/// 获取或设置抢购任务列表。
/// </summary>
[Newtonsoft.Json.JsonProperty("limited_discount_tasks")]
[System.Text.Json.Serialization.JsonPropertyName("limited_discount_tasks")]
public Types.LimitedDiscountTask[] LimitedDiscountTaskList { get; set; } = default!;
/// <summary>
/// 获取或设置翻页标记。
/// </summary>
[Newtonsoft.Json.JsonProperty("next_key")]
[System.Text.Json.Serialization.JsonPropertyName("next_key")]
public string? NextCursor { get; set; }
/// <summary>
/// 获取或设置总数量。
/// </summary>
[Newtonsoft.Json.JsonProperty("total_num")]
[System.Text.Json.Serialization.JsonPropertyName("total_num")]
public int TotalCount { get; set; }
}
}

View File

@ -0,0 +1,15 @@
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
/// <summary>
/// <para>表示 [POST] /channels/ec/product/limiteddiscounttask/stop 接口的请求。</para>
/// </summary>
public class ChannelsECProductLimitedDiscountTaskStopRequest : WechatApiRequest, IInferable<ChannelsECProductLimitedDiscountTaskStopRequest, ChannelsECProductLimitedDiscountTaskStopResponse>
{
/// <summary>
/// 获取或设置抢购任务 ID。
/// </summary>
[Newtonsoft.Json.JsonProperty("task_id")]
[System.Text.Json.Serialization.JsonPropertyName("task_id")]
public long TaskId { get; set; }
}
}

View File

@ -0,0 +1,9 @@
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
/// <summary>
/// <para>表示 [POST] /channels/ec/product/limiteddiscounttask/stop 接口的响应。</para>
/// </summary>
public class ChannelsECProductLimitedDiscountTaskStopResponse : WechatApiResponse
{
}
}

View File

@ -0,0 +1,17 @@
{
"product_id": "1234567001",
"start_time": 1614863822,
"end_time": 1614873822,
"limited_discount_skus": [
{
"sku_id": "12345678901",
"sale_price": 2888,
"sale_stock": 3
},
{
"sku_id": "12345678902",
"sale_price": 2600,
"sale_stock": 50
}
]
}

View File

@ -0,0 +1,5 @@
{
"errcode": 0,
"errmsg": "ok",
"task_id": "12345678"
}

View File

@ -0,0 +1,5 @@
{
"status": 0,
"page_size": 10,
"next_key": "THE_NEXT_KEY"
}

View File

@ -0,0 +1,43 @@
{
"errcode": 0,
"errmsg": "ok",
"limited_discount_tasks": [
{
"task_id": "12345677",
"product_id": "12345678001",
"status": 0,
"create_time": 1660047026,
"start_time": 1660046940,
"end_time": 1662293399,
"limited_discount_skus": [
{
"sku_id": "1234567890001",
"sale_price": 200,
"sale_stock": 10
},
{
"sku_id": "1234567890002",
"sale_price": 300,
"sale_stock": 10
}
]
},
{
"task_id": "12345688",
"product_id": "12345678002",
"status": 0,
"create_time": 1659516539,
"start_time": 1659516420,
"end_time": 1662022079,
"limited_discount_skus": [
{
"sku_id": "12345678900013",
"sale_price": 20,
"sale_stock": 6
}
]
}
],
"next_key": "THE_NEXT_KEY_NEW",
"total_num": 2
}