feat(wxapi): 新增客服子商户能力相关接口

This commit is contained in:
Fu Diwei 2022-07-01 19:45:48 +08:00
parent 2804ebdbda
commit ab1a8dbd92
31 changed files with 489 additions and 0 deletions

View File

@ -45,5 +45,13 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Events
[System.Text.Json.Serialization.JsonPropertyName("Idx")]
[System.Xml.Serialization.XmlElement("Idx", IsNullable = true)]
public int? Index { get; set; }
/// <summary>
/// 获取或设置客服子商户 ID。
/// </summary>
[Newtonsoft.Json.JsonProperty("BusinessId")]
[System.Text.Json.Serialization.JsonPropertyName("BusinessId")]
[System.Xml.Serialization.XmlElement("BusinessId", IsNullable = true)]
public long? BusinessId { get; set; }
}
}

View File

@ -61,5 +61,13 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Events
[System.Text.Json.Serialization.JsonPropertyName("Idx")]
[System.Xml.Serialization.XmlElement("Idx", IsNullable = true)]
public int? Index { get; set; }
/// <summary>
/// 获取或设置客服子商户 ID。
/// </summary>
[Newtonsoft.Json.JsonProperty("BusinessId")]
[System.Text.Json.Serialization.JsonPropertyName("BusinessId")]
[System.Xml.Serialization.XmlElement("BusinessId", IsNullable = true)]
public long? BusinessId { get; set; }
}
}

View File

@ -37,5 +37,13 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Events
[System.Text.Json.Serialization.JsonPropertyName("Idx")]
[System.Xml.Serialization.XmlElement("Idx", IsNullable = true)]
public int? Index { get; set; }
/// <summary>
/// 获取或设置客服子商户 ID。
/// </summary>
[Newtonsoft.Json.JsonProperty("BusinessId")]
[System.Text.Json.Serialization.JsonPropertyName("BusinessId")]
[System.Xml.Serialization.XmlElement("BusinessId", IsNullable = true)]
public long? BusinessId { get; set; }
}
}

View File

@ -45,5 +45,13 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Events
[System.Text.Json.Serialization.JsonPropertyName("Idx")]
[System.Xml.Serialization.XmlElement("Idx", IsNullable = true)]
public int? Index { get; set; }
/// <summary>
/// 获取或设置客服子商户 ID。
/// </summary>
[Newtonsoft.Json.JsonProperty("BusinessId")]
[System.Text.Json.Serialization.JsonPropertyName("BusinessId")]
[System.Xml.Serialization.XmlElement("BusinessId", IsNullable = true)]
public long? BusinessId { get; set; }
}
}

View File

@ -45,5 +45,13 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Events
[System.Text.Json.Serialization.JsonPropertyName("Idx")]
[System.Xml.Serialization.XmlElement("Idx", IsNullable = true)]
public int? Index { get; set; }
/// <summary>
/// 获取或设置客服子商户 ID。
/// </summary>
[Newtonsoft.Json.JsonProperty("BusinessId")]
[System.Text.Json.Serialization.JsonPropertyName("BusinessId")]
[System.Xml.Serialization.XmlElement("BusinessId", IsNullable = true)]
public long? BusinessId { get; set; }
}
}

View File

@ -3,6 +3,7 @@
/// <summary>
/// <para>表示被动回复转发消息的数据。</para>
/// <para>REF: https://developers.weixin.qq.com/doc/offiaccount/Customer_Service/Forwarding_of_messages_to_service_center.html </para>
/// <para>REF: https://developers.weixin.qq.com/miniprogram/introduction/custom.html#%E5%B0%86%E6%B6%88%E6%81%AF%E8%BD%AC%E5%8F%91%E5%88%B0%E5%AE%A2%E6%9C%8D </para>
/// </summary>
public class TransferCustomerServiceReply : WechatApiEvent, WechatApiEvent.Serialization.IXmlSerializable
{

View File

@ -0,0 +1,92 @@
using System;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using Flurl;
using Flurl.Http;
namespace SKIT.FlurlHttpClient.Wechat.Api
{
public static class WechatApiClientExecuteCgibinBusinessExtensions
{
/// <summary>
/// <para>异步调用 [POST] /cgi-bin/business/register 接口。</para>
/// <para>REF: https://developers.weixin.qq.com/miniprogram/introduction/custom.html#%E5%88%9B%E5%BB%BA%E5%95%86%E6%88%B7 </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.CgibinBusinessRegisterResponse> ExecuteCgibinBusinessRegisterAsync(this WechatApiClient client, Models.CgibinBusinessRegisterRequest 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", "business", "register")
.SetQueryParam("access_token", request.AccessToken);
return await client.SendRequestWithJsonAsync<Models.CgibinBusinessRegisterResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
}
/// <summary>
/// <para>异步调用 [POST] /cgi-bin/business/update 接口。</para>
/// <para>REF: https://developers.weixin.qq.com/miniprogram/introduction/custom.html#%E6%9B%B4%E6%96%B0%E5%95%86%E6%88%B7%E4%BF%A1%E6%81%AF </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.CgibinBusinessUpdateResponse> ExecuteCgibinBusinessUpdateAsync(this WechatApiClient client, Models.CgibinBusinessUpdateRequest 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", "business", "update")
.SetQueryParam("access_token", request.AccessToken);
return await client.SendRequestWithJsonAsync<Models.CgibinBusinessUpdateResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
}
/// <summary>
/// <para>异步调用 [POST] /cgi-bin/business/get 接口。</para>
/// <para>REF: https://developers.weixin.qq.com/miniprogram/introduction/custom.html#%E6%8B%89%E5%8F%96%E5%8D%95%E4%B8%AA%E5%95%86%E6%88%B7%E4%BF%A1%E6%81%AF </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.CgibinBusinessGetResponse> ExecuteCgibinBusinessGetAsync(this WechatApiClient client, Models.CgibinBusinessGetRequest 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", "business", "get")
.SetQueryParam("access_token", request.AccessToken);
return await client.SendRequestWithJsonAsync<Models.CgibinBusinessGetResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
}
/// <summary>
/// <para>异步调用 [POST] /cgi-bin/business/list 接口。</para>
/// <para>REF: https://developers.weixin.qq.com/miniprogram/introduction/custom.html#%E6%8B%89%E5%8F%96%E5%A4%9A%E4%B8%AA%E5%95%86%E6%88%B7%E4%BF%A1%E6%81%AF </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.CgibinBusinessListResponse> ExecuteCgibinBusinessListAsync(this WechatApiClient client, Models.CgibinBusinessListRequest 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", "business", "list")
.SetQueryParam("access_token", request.AccessToken);
return await client.SendRequestWithJsonAsync<Models.CgibinBusinessListResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
}
}
}

View File

@ -50,5 +50,47 @@ namespace SKIT.FlurlHttpClient.Wechat.Api
return await client.SendRequestWithJsonAsync<Models.CgibinMessageCustomTypingResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
}
#region Business
/// <summary>
/// <para>异步调用 [POST] /cgi-bin/message/custom/business/send 接口。</para>
/// <para>REF: https://developers.weixin.qq.com/miniprogram/introduction/custom.html#%E5%8F%91%E9%80%81%E5%AE%A2%E6%9C%8D%E6%B6%88%E6%81%AF </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.CgibinMessageCustomBusinessSendResponse> ExecuteCgibinMessageCustomBusinessSendAsync(this WechatApiClient client, Models.CgibinMessageCustomBusinessSendRequest 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", "message", "custom", "business", "send")
.SetQueryParam("access_token", request.AccessToken);
return await client.SendRequestWithJsonAsync<Models.CgibinMessageCustomBusinessSendResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
}
/// <summary>
/// <para>异步调用 [POST] /cgi-bin/message/custom/business/typing 接口。</para>
/// <para>REF: https://developers.weixin.qq.com/miniprogram/introduction/custom.html#%E5%AE%A2%E6%9C%8D%E8%BE%93%E5%85%A5%E7%8A%B6%E6%80%81 </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.CgibinMessageCustomBusinessTypingResponse> ExecuteCgibinMessageCustomBusinessTypingAsync(this WechatApiClient client, Models.CgibinMessageCustomBusinessTypingRequest 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", "message", "custom", "business", "typing")
.SetQueryParam("access_token", request.AccessToken);
return await client.SendRequestWithJsonAsync<Models.CgibinMessageCustomBusinessTypingResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
}
#endregion
}
}

View File

@ -0,0 +1,22 @@
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
/// <summary>
/// <para>表示 [POST] /cgi-bin/business/get 接口的请求。</para>
/// </summary>
public class CgibinBusinessGetRequest : WechatApiRequest, IInferable<CgibinBusinessGetRequest, CgibinBusinessGetResponse>
{
/// <summary>
/// 获取或设置商户 ID。与字段 <see cref="AccountName"/> 二选一。
/// </summary>
[Newtonsoft.Json.JsonProperty("business_id")]
[System.Text.Json.Serialization.JsonPropertyName("business_id")]
public long? BusinessId { get; set; }
/// <summary>
/// 获取或设置商户账号。与字段 <see cref="BusinessId"/> 二选一。
/// </summary>
[Newtonsoft.Json.JsonProperty("account_name")]
[System.Text.Json.Serialization.JsonPropertyName("account_name")]
public string? AccountName { get; set; }
}
}

View File

@ -0,0 +1,49 @@
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
/// <summary>
/// <para>表示 [POST] /cgi-bin/business/get 接口的响应。</para>
/// </summary>
public class CgibinBusinessGetResponse : WechatApiResponse
{
public static class Types
{
public class BusinessInfo
{
/// <summary>
/// 获取或设置商户 ID。
/// </summary>
[Newtonsoft.Json.JsonProperty("business_id")]
[System.Text.Json.Serialization.JsonPropertyName("business_id")]
public long BusinessId { get; set; }
/// <summary>
/// 获取或设置商户账号。
/// </summary>
[Newtonsoft.Json.JsonProperty("account_name")]
[System.Text.Json.Serialization.JsonPropertyName("account_name")]
public string AccountName { get; set; } = default!;
/// <summary>
/// 获取或设置商户昵称。
/// </summary>
[Newtonsoft.Json.JsonProperty("nickname")]
[System.Text.Json.Serialization.JsonPropertyName("nickname")]
public string Nickname { get; set; } = default!;
/// <summary>
/// 获取或设置商户头像 URL。
/// </summary>
[Newtonsoft.Json.JsonProperty("icon_url")]
[System.Text.Json.Serialization.JsonPropertyName("icon_url")]
public string IconUrl { get; set; } = default!;
}
}
/// <summary>
/// 获取或设置商户信息。
/// </summary>
[Newtonsoft.Json.JsonProperty("business_info")]
[System.Text.Json.Serialization.JsonPropertyName("business_info")]
public Types.BusinessInfo BusinessInfo { get; set; } = default!;
}
}

View File

@ -0,0 +1,23 @@
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
/// <summary>
/// <para>表示 [POST] /cgi-bin/business/list 接口的请求。</para>
/// </summary>
public class CgibinBusinessListRequest : WechatApiRequest, IInferable<CgibinBusinessListRequest, CgibinBusinessListResponse>
{
/// <summary>
/// 获取或设置分页起始位置。
/// </summary>
[Newtonsoft.Json.JsonProperty("offset")]
[System.Text.Json.Serialization.JsonPropertyName("offset")]
public int Offset { get; set; }
/// <summary>
/// 获取或设置分页每页数量。
/// <para>默认值10</para>
/// </summary>
[Newtonsoft.Json.JsonProperty("count")]
[System.Text.Json.Serialization.JsonPropertyName("count")]
public int Limit { get; set; } = 10;
}
}

View File

@ -0,0 +1,22 @@
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
/// <summary>
/// <para>表示 [POST] /cgi-bin/business/list 接口的响应。</para>
/// </summary>
public class CgibinBusinessListResponse : WechatApiResponse
{
public static class Types
{
public class BusinessInfo : CgibinBusinessGetResponse.Types.BusinessInfo
{
}
}
/// <summary>
/// 获取或设置商户列表。
/// </summary>
[Newtonsoft.Json.JsonProperty("list")]
[System.Text.Json.Serialization.JsonPropertyName("list")]
public Types.BusinessInfo[] BusinessList { get; set; } = default!;
}
}

View File

@ -0,0 +1,29 @@
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
/// <summary>
/// <para>表示 [POST] /cgi-bin/business/register 接口的请求。</para>
/// </summary>
public class CgibinBusinessRegisterRequest : WechatApiRequest, IInferable<CgibinBusinessRegisterRequest, CgibinBusinessRegisterResponse>
{
/// <summary>
/// 获取或设置商户账号。
/// </summary>
[Newtonsoft.Json.JsonProperty("account_name")]
[System.Text.Json.Serialization.JsonPropertyName("account_name")]
public string AccountName { get; set; } = string.Empty;
/// <summary>
/// 获取或设置商户昵称。
/// </summary>
[Newtonsoft.Json.JsonProperty("nickname")]
[System.Text.Json.Serialization.JsonPropertyName("nickname")]
public string Nickname { get; set; } = string.Empty;
/// <summary>
/// 获取或设置商户头像 MediaId。
/// </summary>
[Newtonsoft.Json.JsonProperty("icon_media_id")]
[System.Text.Json.Serialization.JsonPropertyName("icon_media_id")]
public string IconMediaId { get; set; } = string.Empty;
}
}

View File

@ -0,0 +1,15 @@
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
/// <summary>
/// <para>表示 [POST] /cgi-bin/business/register 接口的响应。</para>
/// </summary>
public class CgibinBusinessRegisterResponse : WechatApiResponse
{
/// <summary>
/// 获取或设置商户 ID。
/// </summary>
[Newtonsoft.Json.JsonProperty("business_id")]
[System.Text.Json.Serialization.JsonPropertyName("business_id")]
public long BusinessId { get; set; }
}
}

View File

@ -0,0 +1,29 @@
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
/// <summary>
/// <para>表示 [POST] /cgi-bin/business/update 接口的请求。</para>
/// </summary>
public class CgibinBusinessUpdateRequest : WechatApiRequest, IInferable<CgibinBusinessUpdateRequest, CgibinBusinessUpdateResponse>
{
/// <summary>
/// 获取或设置商户 ID。
/// </summary>
[Newtonsoft.Json.JsonProperty("business_id")]
[System.Text.Json.Serialization.JsonPropertyName("business_id")]
public long BusinessId { get; set; }
/// <summary>
/// 获取或设置商户昵称。
/// </summary>
[Newtonsoft.Json.JsonProperty("nickname")]
[System.Text.Json.Serialization.JsonPropertyName("nickname")]
public string? Nickname { get; set; }
/// <summary>
/// 获取或设置商户头像 MediaId。
/// </summary>
[Newtonsoft.Json.JsonProperty("icon_media_id")]
[System.Text.Json.Serialization.JsonPropertyName("icon_media_id")]
public string? IconMediaId { get; set; }
}
}

View File

@ -0,0 +1,9 @@
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
/// <summary>
/// <para>表示 [POST] /cgi-bin/business/update 接口的响应。</para>
/// </summary>
public class CgibinBusinessUpdateResponse : WechatApiResponse
{
}
}

View File

@ -0,0 +1,15 @@
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
/// <summary>
/// <para>表示 [POST] /cgi-bin/message/custom/business/send 接口的请求。</para>
/// </summary>
public class CgibinMessageCustomBusinessSendRequest : CgibinMessageCustomSendRequest, IInferable<CgibinMessageCustomBusinessSendRequest, CgibinMessageCustomBusinessSendResponse>
{
/// <summary>
/// 获取或设置客服子商户 ID。
/// </summary>
[Newtonsoft.Json.JsonProperty("businessid")]
[System.Text.Json.Serialization.JsonPropertyName("businessid")]
public long BusinessId { get; set; }
}
}

View File

@ -0,0 +1,9 @@
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
/// <summary>
/// <para>表示 [POST] /cgi-bin/message/custom/business/send 接口的响应。</para>
/// </summary>
public class CgibinMessageCustomBusinessSendResponse : WechatApiResponse
{
}
}

View File

@ -0,0 +1,15 @@
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
/// <summary>
/// <para>表示 [POST] /cgi-bin/message/custom/business/typing 接口的请求。</para>
/// </summary>
public class CgibinMessageCustomBusinessTypingRequest : CgibinMessageCustomTypingRequest, IInferable<CgibinMessageCustomBusinessTypingRequest, CgibinMessageCustomBusinessTypingResponse>
{
/// <summary>
/// 获取或设置客服子商户 ID。
/// </summary>
[Newtonsoft.Json.JsonProperty("businessid")]
[System.Text.Json.Serialization.JsonPropertyName("businessid")]
public long BusinessId { get; set; }
}
}

View File

@ -0,0 +1,9 @@
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
/// <summary>
/// <para>表示 [POST] /cgi-bin/message/custom/business/typing 接口的响应。</para>
/// </summary>
public class CgibinMessageCustomBusinessTypingResponse : WechatApiResponse
{
}
}

View File

@ -0,0 +1,9 @@
{
"ToUserName": "toUser",
"FromUserName": "fromUser",
"CreateTime": 1482048670,
"MsgType": "text",
"Content": "this is a test",
"MsgId": 1234567890123456,
"BusinessId": 1
}

View File

@ -5,4 +5,5 @@
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[this is a test]]></Content>
<MsgId>1234567890123456</MsgId>
<BusinessId>1</BusinessId>
</xml>

View File

@ -0,0 +1,4 @@
{
"business_id": 1,
"account_name": "apple"
}

View File

@ -0,0 +1,8 @@
{
"business_info": {
"business_id": 1,
"account_name": "apple",
"nickname": "苹果",
"icon_url": "icon_url"
}
}

View File

@ -0,0 +1,4 @@
{
"offset": 0,
"count": 100
}

View File

@ -0,0 +1,16 @@
{
"list": [
{
"business_id": 1,
"account_name": "apple",
"nickname": "苹果",
"icon_url": "icon_url"
},
{
"business_id": 2,
"account_name": "apple",
"nickname": "苹果",
"icon_url": "icon_url"
}
]
}

View File

@ -0,0 +1,5 @@
{
"account_name": "apple",
"nickname": "苹果",
"icon_media_id": "media_id"
}

View File

@ -0,0 +1,5 @@
{
"business_id": 1,
"nickname": "苹果",
"icon_media_id": ""
}

View File

@ -0,0 +1,8 @@
{
"touser": "OPENID",
"businessid": 1,
"msgtype": "text",
"text": {
"content": "Hello World"
}
}

View File

@ -0,0 +1,5 @@
{
"businessid": 1,
"touser": "OPENID",
"command": "Typing"
}