feat(work): 新增管理商品图册相关接口

This commit is contained in:
Fu Diwei 2021-09-30 15:26:27 +08:00
parent eb54c25605
commit 8ea180cc7d
22 changed files with 531 additions and 1 deletions

View File

@ -1409,5 +1409,112 @@ namespace SKIT.FlurlHttpClient.Wechat.Work
return await client.SendRequestWithJsonAsync<Models.CgibinExternalContactMomentStrategyDeleteResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
}
#endregion
#region ProductAlbum
/// <summary>
/// <para>异步调用 [POST] /cgi-bin/externalcontact/add_product_album 接口。</para>
/// <para>REF: https://open.work.weixin.qq.com/api/doc/90000/90135/95096 </para>
/// <para>REF: https://open.work.weixin.qq.com/api/doc/90001/90143/95131 </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.CgibinExternalContactAddProductAlbumResponse> ExecuteCgibinExternalContactAddProductAlbumAsync(this WechatWorkClient client, Models.CgibinExternalContactAddProductAlbumRequest 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, "cgi-bin", "externalcontact", "add_product_album")
.SetQueryParam("access_token", request.AccessToken);
return await client.SendRequestWithJsonAsync<Models.CgibinExternalContactAddProductAlbumResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
}
/// <summary>
/// <para>异步调用 [POST] /cgi-bin/externalcontact/get_product_album_list 接口。</para>
/// <para>REF: https://open.work.weixin.qq.com/api/doc/90000/90135/95096 </para>
/// <para>REF: https://open.work.weixin.qq.com/api/doc/90001/90143/95131 </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.CgibinExternalContactGetProductAlbumListResponse> ExecuteCgibinExternalContactGetProductAlbumListAsync(this WechatWorkClient client, Models.CgibinExternalContactGetProductAlbumListRequest 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, "cgi-bin", "externalcontact", "get_product_album_list")
.SetQueryParam("access_token", request.AccessToken);
return await client.SendRequestWithJsonAsync<Models.CgibinExternalContactGetProductAlbumListResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
}
/// <summary>
/// <para>异步调用 [POST] /cgi-bin/externalcontact/get_product_album 接口。</para>
/// <para>REF: https://open.work.weixin.qq.com/api/doc/90000/90135/95096 </para>
/// <para>REF: https://open.work.weixin.qq.com/api/doc/90001/90143/95131 </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.CgibinExternalContactGetProductAlbumResponse> ExecuteCgibinExternalContactGetProductAlbumAsync(this WechatWorkClient client, Models.CgibinExternalContactGetProductAlbumRequest 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, "cgi-bin", "externalcontact", "get_product_album")
.SetQueryParam("access_token", request.AccessToken);
return await client.SendRequestWithJsonAsync<Models.CgibinExternalContactGetProductAlbumResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
}
/// <summary>
/// <para>异步调用 [POST] /cgi-bin/externalcontact/update_product_album 接口。</para>
/// <para>REF: https://open.work.weixin.qq.com/api/doc/90000/90135/95096 </para>
/// <para>REF: https://open.work.weixin.qq.com/api/doc/90001/90143/95131 </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.CgibinExternalContactUpdateProductAlbumResponse> ExecuteCgibinExternalContactUpdateProductAlbumAsync(this WechatWorkClient client, Models.CgibinExternalContactUpdateProductAlbumRequest 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, "cgi-bin", "externalcontact", "update_product_album")
.SetQueryParam("access_token", request.AccessToken);
return await client.SendRequestWithJsonAsync<Models.CgibinExternalContactUpdateProductAlbumResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
}
/// <summary>
/// <para>异步调用 [POST] /cgi-bin/externalcontact/delete_product_album 接口。</para>
/// <para>REF: https://open.work.weixin.qq.com/api/doc/90000/90135/95096 </para>
/// <para>REF: https://open.work.weixin.qq.com/api/doc/90001/90143/95131 </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.CgibinExternalContactDeleteProductAlbumResponse> ExecuteCgibinExternalContactDeleteProductAlbumAsync(this WechatWorkClient client, Models.CgibinExternalContactDeleteProductAlbumRequest 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, "cgi-bin", "externalcontact", "delete_product_album")
.SetQueryParam("access_token", request.AccessToken);
return await client.SendRequestWithJsonAsync<Models.CgibinExternalContactDeleteProductAlbumResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
}
#endregion
}
}

View File

@ -153,7 +153,8 @@ namespace SKIT.FlurlHttpClient.Wechat.Work
IFlurlRequest flurlReq = client
.CreateRequest(request, HttpMethod.Post, "cgi-bin", "media", "upload_attachment")
.SetQueryParam("access_token", request.AccessToken)
.SetQueryParam("type", request.Type);
.SetQueryParam("media_type", request.Type)
.SetQueryParam("attachment_type", request.AttachmentType);
string boundary = "--BOUNDARY--" + DateTimeOffset.Now.Ticks.ToString("x");
using var fileContent = new ByteArrayContent(request.FileBytes ?? new byte[0]);

View File

@ -0,0 +1,71 @@
using System.Collections.Generic;
namespace SKIT.FlurlHttpClient.Wechat.Work.Models
{
/// <summary>
/// <para>表示 [POST] /cgi-bin/externalcontact/add_product_album 接口的请求。</para>
/// </summary>
public class CgibinExternalContactAddProductAlbumRequest : WechatWorkRequest
{
public static class Types
{
public class Attachment
{
public static class Types
{
public class Image
{
/// <summary>
/// 获取或设置图片 MediaId。
/// </summary>
[Newtonsoft.Json.JsonProperty("media_id")]
[System.Text.Json.Serialization.JsonPropertyName("media_id")]
public string MediaId { get; set; } = string.Empty;
}
}
/// <summary>
/// 获取或设置附件类型。
/// </summary>
[Newtonsoft.Json.JsonProperty("type")]
[System.Text.Json.Serialization.JsonPropertyName("type")]
public string Type { get; set; } = string.Empty;
/// <summary>
/// 获取或设置图片附件信息。
/// </summary>
[Newtonsoft.Json.JsonProperty("image")]
[System.Text.Json.Serialization.JsonPropertyName("image")]
public Types.Image? Image { get; set; }
}
}
/// <summary>
/// 获取或设置商品描述。
/// </summary>
[Newtonsoft.Json.JsonProperty("description")]
[System.Text.Json.Serialization.JsonPropertyName("description")]
public string Description { get; set; } = string.Empty;
/// <summary>
/// 获取或设置商品价格(单位:分)。
/// </summary>
[Newtonsoft.Json.JsonProperty("price")]
[System.Text.Json.Serialization.JsonPropertyName("price")]
public int Price { get; set; }
/// <summary>
/// 获取或设置商品编码。
/// </summary>
[Newtonsoft.Json.JsonProperty("product_sn")]
[System.Text.Json.Serialization.JsonPropertyName("product_sn")]
public string? SerialNumber { get; set; }
/// <summary>
/// 获取或设置商品附件列表。
/// </summary>
[Newtonsoft.Json.JsonProperty("attachments")]
[System.Text.Json.Serialization.JsonPropertyName("attachments")]
public IList<Types.Attachment>? AttachmentList { get; set; }
}
}

View File

@ -0,0 +1,15 @@
namespace SKIT.FlurlHttpClient.Wechat.Work.Models
{
/// <summary>
/// <para>表示 [POST] /cgi-bin/externalcontact/add_product_album 接口的响应。</para>
/// </summary>
public class CgibinExternalContactAddProductAlbumResponse : WechatWorkResponse
{
/// <summary>
/// 获取或设置商品 ID。
/// </summary>
[Newtonsoft.Json.JsonProperty("product_id")]
[System.Text.Json.Serialization.JsonPropertyName("product_id")]
public string ProductId { get; set; } = default!;
}
}

View File

@ -0,0 +1,15 @@
namespace SKIT.FlurlHttpClient.Wechat.Work.Models
{
/// <summary>
/// <para>表示 [POST] /cgi-bin/externalcontact/delete_product_album 接口的请求。</para>
/// </summary>
public class CgibinExternalContactDeleteProductAlbumRequest : WechatWorkRequest
{
/// <summary>
/// 获取或设置商品 ID。
/// </summary>
[Newtonsoft.Json.JsonProperty("product_id")]
[System.Text.Json.Serialization.JsonPropertyName("product_id")]
public string ProductId { get; set; } = string.Empty;
}
}

View File

@ -0,0 +1,9 @@
namespace SKIT.FlurlHttpClient.Wechat.Work.Models
{
/// <summary>
/// <para>表示 [POST] /cgi-bin/externalcontact/delete_product_album 接口的响应。</para>
/// </summary>
public class CgibinExternalContactDeleteProductAlbumResponse : WechatWorkResponse
{
}
}

View File

@ -0,0 +1,22 @@
namespace SKIT.FlurlHttpClient.Wechat.Work.Models
{
/// <summary>
/// <para>表示 [POST] /cgi-bin/externalcontact/get_product_album_list 接口的请求。</para>
/// </summary>
public class CgibinExternalContactGetProductAlbumListRequest : WechatWorkRequest
{
/// <summary>
/// 获取或设置翻页标记。
/// </summary>
[Newtonsoft.Json.JsonProperty("cursor")]
[System.Text.Json.Serialization.JsonPropertyName("cursor")]
public string? NextCursor { get; set; }
/// <summary>
/// 获取或设置分页每页数量。
/// </summary>
[Newtonsoft.Json.JsonProperty("limit")]
[System.Text.Json.Serialization.JsonPropertyName("limit")]
public int? Limit { get; set; }
}
}

View File

@ -0,0 +1,96 @@
namespace SKIT.FlurlHttpClient.Wechat.Work.Models
{
/// <summary>
/// <para>表示 [POST] /cgi-bin/externalcontact/get_product_album_list 接口的响应。</para>
/// </summary>
public class CgibinExternalContactGetProductAlbumListResponse : WechatWorkResponse
{
public static class Types
{
public class Product
{
public static class Types
{
public class Attachment
{
public static class Types
{
public class Image
{
/// <summary>
/// 获取或设置图片 MediaId。
/// </summary>
[Newtonsoft.Json.JsonProperty("media_id")]
[System.Text.Json.Serialization.JsonPropertyName("media_id")]
public string MediaId { get; set; } = default!;
}
}
/// <summary>
/// 获取或设置附件类型。
/// </summary>
[Newtonsoft.Json.JsonProperty("type")]
[System.Text.Json.Serialization.JsonPropertyName("type")]
public string Type { get; set; } = default!;
/// <summary>
/// 获取或设置图片附件信息。
/// </summary>
[Newtonsoft.Json.JsonProperty("image")]
[System.Text.Json.Serialization.JsonPropertyName("image")]
public Types.Image? Image { get; set; }
}
}
/// <summary>
/// 获取或设置商品 ID。
/// </summary>
[Newtonsoft.Json.JsonProperty("product_id")]
[System.Text.Json.Serialization.JsonPropertyName("product_id")]
public string ProductId { get; set; } = default!;
/// <summary>
/// 获取或设置商品描述。
/// </summary>
[Newtonsoft.Json.JsonProperty("description")]
[System.Text.Json.Serialization.JsonPropertyName("description")]
public string Description { get; set; } = default!;
/// <summary>
/// 获取或设置商品价格(单位:分)。
/// </summary>
[Newtonsoft.Json.JsonProperty("price")]
[System.Text.Json.Serialization.JsonPropertyName("price")]
public int Price { get; set; }
/// <summary>
/// 获取或设置商品编码。
/// </summary>
[Newtonsoft.Json.JsonProperty("product_sn")]
[System.Text.Json.Serialization.JsonPropertyName("product_sn")]
public string? SerialNumber { get; set; }
/// <summary>
/// 获取或设置商品附件列表。
/// </summary>
[Newtonsoft.Json.JsonProperty("attachments")]
[System.Text.Json.Serialization.JsonPropertyName("attachments")]
public Types.Attachment[]? AttachmentList { get; set; }
}
}
/// <summary>
/// 获取或设置翻页标记。
/// </summary>
[Newtonsoft.Json.JsonProperty("next_cursor")]
[System.Text.Json.Serialization.JsonPropertyName("next_cursor")]
public string? NextCursor { get; set; }
/// <summary>
/// 获取或设置商品列表。
/// </summary>
[Newtonsoft.Json.JsonProperty("product_list")]
[System.Text.Json.Serialization.JsonPropertyName("product_list")]
public Types.Product[] ProductList { get; set; } = default!;
}
}

View File

@ -0,0 +1,15 @@
namespace SKIT.FlurlHttpClient.Wechat.Work.Models
{
/// <summary>
/// <para>表示 [POST] /cgi-bin/externalcontact/get_product_album 接口的请求。</para>
/// </summary>
public class CgibinExternalContactGetProductAlbumRequest : WechatWorkRequest
{
/// <summary>
/// 获取或设置商品 ID。
/// </summary>
[Newtonsoft.Json.JsonProperty("product_id")]
[System.Text.Json.Serialization.JsonPropertyName("product_id")]
public string ProductId { get; set; } = string.Empty;
}
}

View File

@ -0,0 +1,28 @@
namespace SKIT.FlurlHttpClient.Wechat.Work.Models
{
/// <summary>
/// <para>表示 [POST] /cgi-bin/externalcontact/get_product_album 接口的响应。</para>
/// </summary>
public class CgibinExternalContactGetProductAlbumResponse : WechatWorkResponse
{
public static class Types
{
public class Product : CgibinExternalContactGetProductAlbumListResponse.Types.Product
{
/// <summary>
/// 获取或设置创建时间戳。
/// </summary>
[Newtonsoft.Json.JsonProperty("create_time")]
[System.Text.Json.Serialization.JsonPropertyName("create_time")]
public long CreateTimetamp { get; set; }
}
}
/// <summary>
/// 获取或设置商品信息。
/// </summary>
[Newtonsoft.Json.JsonProperty("product")]
[System.Text.Json.Serialization.JsonPropertyName("product")]
public Types.Product Product { get; set; } = default!;
}
}

View File

@ -0,0 +1,52 @@
using System.Collections.Generic;
namespace SKIT.FlurlHttpClient.Wechat.Work.Models
{
/// <summary>
/// <para>表示 [POST] /cgi-bin/externalcontact/update_product_album 接口的请求。</para>
/// </summary>
public class CgibinExternalContactUpdateProductAlbumRequest : WechatWorkRequest
{
public static class Types
{
public class Attachment : CgibinExternalContactAddProductAlbumRequest.Types.Attachment
{
}
}
/// <summary>
/// 获取或设置商品 ID。
/// </summary>
[Newtonsoft.Json.JsonProperty("product_id")]
[System.Text.Json.Serialization.JsonPropertyName("product_id")]
public string ProductId { get; set; } = string.Empty;
/// <summary>
/// 获取或设置商品描述。
/// </summary>
[Newtonsoft.Json.JsonProperty("description")]
[System.Text.Json.Serialization.JsonPropertyName("description")]
public string Description { get; set; } = string.Empty;
/// <summary>
/// 获取或设置商品价格(单位:分)。
/// </summary>
[Newtonsoft.Json.JsonProperty("price")]
[System.Text.Json.Serialization.JsonPropertyName("price")]
public int Price { get; set; }
/// <summary>
/// 获取或设置商品编码。
/// </summary>
[Newtonsoft.Json.JsonProperty("product_sn")]
[System.Text.Json.Serialization.JsonPropertyName("product_sn")]
public string? SerialNumber { get; set; }
/// <summary>
/// 获取或设置商品附件列表。
/// </summary>
[Newtonsoft.Json.JsonProperty("attachments")]
[System.Text.Json.Serialization.JsonPropertyName("attachments")]
public IList<Types.Attachment>? AttachmentList { get; set; }
}
}

View File

@ -0,0 +1,9 @@
namespace SKIT.FlurlHttpClient.Wechat.Work.Models
{
/// <summary>
/// <para>表示 [POST] /cgi-bin/externalcontact/update_product_album 接口的响应。</para>
/// </summary>
public class CgibinExternalContactUpdateProductAlbumResponse : WechatWorkResponse
{
}
}

View File

@ -0,0 +1,13 @@
{
"description": "世界上最好的商品",
"price": 30000,
"product_sn": "xxxxxxxx",
"attachments": [
{
"type": "image",
"image": {
"media_id": "MEDIA_ID"
}
}
]
}

View File

@ -0,0 +1,5 @@
{
"errcode": 0,
"errmsg": "ok",
"product_id": "xxxxxxxxxx"
}

View File

@ -0,0 +1,21 @@
{
"errcode": 0,
"errmsg": "ok",
"next_cursor": "CURSOR",
"product_list": [
{
"product_id": "xxxxxxxxxx",
"description": "世界上最好的商品",
"price": 30000,
"product_sn": "xxxxxxxx",
"attachments": [
{
"type": "image",
"image": {
"media_id": "MEDIA_ID"
}
}
]
}
]
}

View File

@ -0,0 +1,19 @@
{
"errcode": 0,
"errmsg": "ok",
"product": {
"product_id": "xxxxxxxxxx",
"description": "世界上最好的商品",
"price": 30000,
"create_time": 1600000000,
"product_sn": "xxxxxxxx",
"attachments": [
{
"type": "image",
"image": {
"media_id": "MEDIA_ID"
}
}
]
}
}

View File

@ -0,0 +1,14 @@
{
"product_id": "xxxxxxxxxx",
"description": "世界上最好的商品",
"price": 30000,
"product_sn": "xxxxxx",
"attachments": [
{
"type": "image",
"image": {
"media_id": "MEDIA_ID"
}
}
]
}