diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Events/MpMessage/ImageMessageEvent.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/MpMessage/ImageMessageEvent.cs
index 07c733a6..5ddbfb27 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Api/Events/MpMessage/ImageMessageEvent.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/MpMessage/ImageMessageEvent.cs
@@ -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; }
+
+ ///
+ /// 获取或设置客服子商户 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("BusinessId")]
+ [System.Text.Json.Serialization.JsonPropertyName("BusinessId")]
+ [System.Xml.Serialization.XmlElement("BusinessId", IsNullable = true)]
+ public long? BusinessId { get; set; }
}
}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Events/MpMessage/LocationMessageEvent.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/MpMessage/LocationMessageEvent.cs
index 6bec6ae6..d5f2ac5a 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Api/Events/MpMessage/LocationMessageEvent.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/MpMessage/LocationMessageEvent.cs
@@ -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; }
+
+ ///
+ /// 获取或设置客服子商户 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("BusinessId")]
+ [System.Text.Json.Serialization.JsonPropertyName("BusinessId")]
+ [System.Xml.Serialization.XmlElement("BusinessId", IsNullable = true)]
+ public long? BusinessId { get; set; }
}
}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Events/MpMessage/TextMessageEvent.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/MpMessage/TextMessageEvent.cs
index c6848fe3..7b8925cd 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Api/Events/MpMessage/TextMessageEvent.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/MpMessage/TextMessageEvent.cs
@@ -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; }
+
+ ///
+ /// 获取或设置客服子商户 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("BusinessId")]
+ [System.Text.Json.Serialization.JsonPropertyName("BusinessId")]
+ [System.Xml.Serialization.XmlElement("BusinessId", IsNullable = true)]
+ public long? BusinessId { get; set; }
}
}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Events/MpMessage/VideoMessageEvent.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/MpMessage/VideoMessageEvent.cs
index ee9ccfb1..2908adfc 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Api/Events/MpMessage/VideoMessageEvent.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/MpMessage/VideoMessageEvent.cs
@@ -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; }
+
+ ///
+ /// 获取或设置客服子商户 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("BusinessId")]
+ [System.Text.Json.Serialization.JsonPropertyName("BusinessId")]
+ [System.Xml.Serialization.XmlElement("BusinessId", IsNullable = true)]
+ public long? BusinessId { get; set; }
}
}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Events/MpMessage/VoiceMessageEvent.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/MpMessage/VoiceMessageEvent.cs
index 3aa0b411..71e1599c 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Api/Events/MpMessage/VoiceMessageEvent.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/MpMessage/VoiceMessageEvent.cs
@@ -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; }
+
+ ///
+ /// 获取或设置客服子商户 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("BusinessId")]
+ [System.Text.Json.Serialization.JsonPropertyName("BusinessId")]
+ [System.Xml.Serialization.XmlElement("BusinessId", IsNullable = true)]
+ public long? BusinessId { get; set; }
}
}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Events/MpReply/TransferCustomerServiceReply.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/MpReply/TransferCustomerServiceReply.cs
index 372b0c4b..1be16184 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Api/Events/MpReply/TransferCustomerServiceReply.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/MpReply/TransferCustomerServiceReply.cs
@@ -3,6 +3,7 @@
///
/// 表示被动回复转发消息的数据。
/// REF: https://developers.weixin.qq.com/doc/offiaccount/Customer_Service/Forwarding_of_messages_to_service_center.html
+ /// 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
///
public class TransferCustomerServiceReply : WechatApiEvent, WechatApiEvent.Serialization.IXmlSerializable
{
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteCgibinBusinessExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteCgibinBusinessExtensions.cs
new file mode 100644
index 00000000..9f9703a2
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteCgibinBusinessExtensions.cs
@@ -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
+ {
+ ///
+ /// 异步调用 [POST] /cgi-bin/business/register 接口。
+ /// REF: https://developers.weixin.qq.com/miniprogram/introduction/custom.html#%E5%88%9B%E5%BB%BA%E5%95%86%E6%88%B7
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task 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(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /cgi-bin/business/update 接口。
+ /// 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
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task 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(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /cgi-bin/business/get 接口。
+ /// 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
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task 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(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /cgi-bin/business/list 接口。
+ /// 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
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task 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(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteCgibinMessageCustomExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteCgibinMessageCustomExtensions.cs
index 2bbd583b..44f3051a 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteCgibinMessageCustomExtensions.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteCgibinMessageCustomExtensions.cs
@@ -50,5 +50,47 @@ namespace SKIT.FlurlHttpClient.Wechat.Api
return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
}
+
+ #region Business
+ ///
+ /// 异步调用 [POST] /cgi-bin/message/custom/business/send 接口。
+ /// 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
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task 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(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /cgi-bin/message/custom/business/typing 接口。
+ /// 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
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task 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(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+ #endregion
}
}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinBusiness/CgibinBusinessGetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinBusiness/CgibinBusinessGetRequest.cs
new file mode 100644
index 00000000..528c00b1
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinBusiness/CgibinBusinessGetRequest.cs
@@ -0,0 +1,22 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/business/get 接口的请求。
+ ///
+ public class CgibinBusinessGetRequest : WechatApiRequest, IInferable
+ {
+ ///
+ /// 获取或设置商户 ID。与字段 二选一。
+ ///
+ [Newtonsoft.Json.JsonProperty("business_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("business_id")]
+ public long? BusinessId { get; set; }
+
+ ///
+ /// 获取或设置商户账号。与字段 二选一。
+ ///
+ [Newtonsoft.Json.JsonProperty("account_name")]
+ [System.Text.Json.Serialization.JsonPropertyName("account_name")]
+ public string? AccountName { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinBusiness/CgibinBusinessGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinBusiness/CgibinBusinessGetResponse.cs
new file mode 100644
index 00000000..6e33f366
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinBusiness/CgibinBusinessGetResponse.cs
@@ -0,0 +1,49 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/business/get 接口的响应。
+ ///
+ public class CgibinBusinessGetResponse : WechatApiResponse
+ {
+ public static class Types
+ {
+ public class BusinessInfo
+ {
+ ///
+ /// 获取或设置商户 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("business_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("business_id")]
+ public long BusinessId { get; set; }
+
+ ///
+ /// 获取或设置商户账号。
+ ///
+ [Newtonsoft.Json.JsonProperty("account_name")]
+ [System.Text.Json.Serialization.JsonPropertyName("account_name")]
+ public string AccountName { get; set; } = default!;
+
+ ///
+ /// 获取或设置商户昵称。
+ ///
+ [Newtonsoft.Json.JsonProperty("nickname")]
+ [System.Text.Json.Serialization.JsonPropertyName("nickname")]
+ public string Nickname { get; set; } = default!;
+
+ ///
+ /// 获取或设置商户头像 URL。
+ ///
+ [Newtonsoft.Json.JsonProperty("icon_url")]
+ [System.Text.Json.Serialization.JsonPropertyName("icon_url")]
+ public string IconUrl { get; set; } = default!;
+ }
+ }
+
+ ///
+ /// 获取或设置商户信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("business_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("business_info")]
+ public Types.BusinessInfo BusinessInfo { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinBusiness/CgibinBusinessListRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinBusiness/CgibinBusinessListRequest.cs
new file mode 100644
index 00000000..07a7507d
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinBusiness/CgibinBusinessListRequest.cs
@@ -0,0 +1,23 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/business/list 接口的请求。
+ ///
+ public class CgibinBusinessListRequest : WechatApiRequest, IInferable
+ {
+ ///
+ /// 获取或设置分页起始位置。
+ ///
+ [Newtonsoft.Json.JsonProperty("offset")]
+ [System.Text.Json.Serialization.JsonPropertyName("offset")]
+ public int Offset { get; set; }
+
+ ///
+ /// 获取或设置分页每页数量。
+ /// 默认值:10
+ ///
+ [Newtonsoft.Json.JsonProperty("count")]
+ [System.Text.Json.Serialization.JsonPropertyName("count")]
+ public int Limit { get; set; } = 10;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinBusiness/CgibinBusinessListResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinBusiness/CgibinBusinessListResponse.cs
new file mode 100644
index 00000000..4ea96e20
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinBusiness/CgibinBusinessListResponse.cs
@@ -0,0 +1,22 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/business/list 接口的响应。
+ ///
+ public class CgibinBusinessListResponse : WechatApiResponse
+ {
+ public static class Types
+ {
+ public class BusinessInfo : CgibinBusinessGetResponse.Types.BusinessInfo
+ {
+ }
+ }
+
+ ///
+ /// 获取或设置商户列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("list")]
+ [System.Text.Json.Serialization.JsonPropertyName("list")]
+ public Types.BusinessInfo[] BusinessList { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinBusiness/CgibinBusinessRegisterRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinBusiness/CgibinBusinessRegisterRequest.cs
new file mode 100644
index 00000000..fd5845dc
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinBusiness/CgibinBusinessRegisterRequest.cs
@@ -0,0 +1,29 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/business/register 接口的请求。
+ ///
+ public class CgibinBusinessRegisterRequest : WechatApiRequest, IInferable
+ {
+ ///
+ /// 获取或设置商户账号。
+ ///
+ [Newtonsoft.Json.JsonProperty("account_name")]
+ [System.Text.Json.Serialization.JsonPropertyName("account_name")]
+ public string AccountName { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置商户昵称。
+ ///
+ [Newtonsoft.Json.JsonProperty("nickname")]
+ [System.Text.Json.Serialization.JsonPropertyName("nickname")]
+ public string Nickname { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置商户头像 MediaId。
+ ///
+ [Newtonsoft.Json.JsonProperty("icon_media_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("icon_media_id")]
+ public string IconMediaId { get; set; } = string.Empty;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinBusiness/CgibinBusinessRegisterResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinBusiness/CgibinBusinessRegisterResponse.cs
new file mode 100644
index 00000000..5c129e88
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinBusiness/CgibinBusinessRegisterResponse.cs
@@ -0,0 +1,15 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/business/register 接口的响应。
+ ///
+ public class CgibinBusinessRegisterResponse : WechatApiResponse
+ {
+ ///
+ /// 获取或设置商户 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("business_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("business_id")]
+ public long BusinessId { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinBusiness/CgibinBusinessUpdateRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinBusiness/CgibinBusinessUpdateRequest.cs
new file mode 100644
index 00000000..df75a587
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinBusiness/CgibinBusinessUpdateRequest.cs
@@ -0,0 +1,29 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/business/update 接口的请求。
+ ///
+ public class CgibinBusinessUpdateRequest : WechatApiRequest, IInferable
+ {
+ ///
+ /// 获取或设置商户 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("business_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("business_id")]
+ public long BusinessId { get; set; }
+
+ ///
+ /// 获取或设置商户昵称。
+ ///
+ [Newtonsoft.Json.JsonProperty("nickname")]
+ [System.Text.Json.Serialization.JsonPropertyName("nickname")]
+ public string? Nickname { get; set; }
+
+ ///
+ /// 获取或设置商户头像 MediaId。
+ ///
+ [Newtonsoft.Json.JsonProperty("icon_media_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("icon_media_id")]
+ public string? IconMediaId { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinBusiness/CgibinBusinessUpdateResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinBusiness/CgibinBusinessUpdateResponse.cs
new file mode 100644
index 00000000..93564e18
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinBusiness/CgibinBusinessUpdateResponse.cs
@@ -0,0 +1,9 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/business/update 接口的响应。
+ ///
+ public class CgibinBusinessUpdateResponse : WechatApiResponse
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinMessageCustom/Business/CgibinMessageCustomBusinessSendRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinMessageCustom/Business/CgibinMessageCustomBusinessSendRequest.cs
new file mode 100644
index 00000000..c80b4bb3
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinMessageCustom/Business/CgibinMessageCustomBusinessSendRequest.cs
@@ -0,0 +1,15 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/message/custom/business/send 接口的请求。
+ ///
+ public class CgibinMessageCustomBusinessSendRequest : CgibinMessageCustomSendRequest, IInferable
+ {
+ ///
+ /// 获取或设置客服子商户 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("businessid")]
+ [System.Text.Json.Serialization.JsonPropertyName("businessid")]
+ public long BusinessId { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinMessageCustom/Business/CgibinMessageCustomBusinessSendResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinMessageCustom/Business/CgibinMessageCustomBusinessSendResponse.cs
new file mode 100644
index 00000000..71e5f109
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinMessageCustom/Business/CgibinMessageCustomBusinessSendResponse.cs
@@ -0,0 +1,9 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/message/custom/business/send 接口的响应。
+ ///
+ public class CgibinMessageCustomBusinessSendResponse : WechatApiResponse
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinMessageCustom/Business/CgibinMessageCustomBusinessTypingRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinMessageCustom/Business/CgibinMessageCustomBusinessTypingRequest.cs
new file mode 100644
index 00000000..fc8b70fa
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinMessageCustom/Business/CgibinMessageCustomBusinessTypingRequest.cs
@@ -0,0 +1,15 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/message/custom/business/typing 接口的请求。
+ ///
+ public class CgibinMessageCustomBusinessTypingRequest : CgibinMessageCustomTypingRequest, IInferable
+ {
+ ///
+ /// 获取或设置客服子商户 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("businessid")]
+ [System.Text.Json.Serialization.JsonPropertyName("businessid")]
+ public long BusinessId { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinMessageCustom/Business/CgibinMessageCustomBusinessTypingResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinMessageCustom/Business/CgibinMessageCustomBusinessTypingResponse.cs
new file mode 100644
index 00000000..c008ad2a
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinMessageCustom/Business/CgibinMessageCustomBusinessTypingResponse.cs
@@ -0,0 +1,9 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/message/custom/business/typing 接口的响应。
+ ///
+ public class CgibinMessageCustomBusinessTypingResponse : WechatApiResponse
+ {
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/MpMessage/TextMessageEvent.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/MpMessage/TextMessageEvent.json
new file mode 100644
index 00000000..b544c0b0
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/MpMessage/TextMessageEvent.json
@@ -0,0 +1,9 @@
+{
+ "ToUserName": "toUser",
+ "FromUserName": "fromUser",
+ "CreateTime": 1482048670,
+ "MsgType": "text",
+ "Content": "this is a test",
+ "MsgId": 1234567890123456,
+ "BusinessId": 1
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/MpMessage/TextMessageEvent.xml b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/MpMessage/TextMessageEvent.xml
index 6a1a2e8a..66314ae8 100644
--- a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/MpMessage/TextMessageEvent.xml
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/MpMessage/TextMessageEvent.xml
@@ -5,4 +5,5 @@
1234567890123456
+ 1
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinBusiness/CgibinBusinessGetRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinBusiness/CgibinBusinessGetRequest.json
new file mode 100644
index 00000000..51bb9849
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinBusiness/CgibinBusinessGetRequest.json
@@ -0,0 +1,4 @@
+{
+ "business_id": 1,
+ "account_name": "apple"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinBusiness/CgibinBusinessGetResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinBusiness/CgibinBusinessGetResponse.json
new file mode 100644
index 00000000..ec83d614
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinBusiness/CgibinBusinessGetResponse.json
@@ -0,0 +1,8 @@
+{
+ "business_info": {
+ "business_id": 1,
+ "account_name": "apple",
+ "nickname": "苹果",
+ "icon_url": "icon_url"
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinBusiness/CgibinBusinessListRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinBusiness/CgibinBusinessListRequest.json
new file mode 100644
index 00000000..eca139b1
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinBusiness/CgibinBusinessListRequest.json
@@ -0,0 +1,4 @@
+{
+ "offset": 0,
+ "count": 100
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinBusiness/CgibinBusinessListResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinBusiness/CgibinBusinessListResponse.json
new file mode 100644
index 00000000..76fdf30d
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinBusiness/CgibinBusinessListResponse.json
@@ -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"
+ }
+ ]
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinBusiness/CgibinBusinessRegisterRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinBusiness/CgibinBusinessRegisterRequest.json
new file mode 100644
index 00000000..d5aad0ff
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinBusiness/CgibinBusinessRegisterRequest.json
@@ -0,0 +1,5 @@
+{
+ "account_name": "apple",
+ "nickname": "苹果",
+ "icon_media_id": "media_id"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinBusiness/CgibinBusinessRegisterResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinBusiness/CgibinBusinessRegisterResponse.json
new file mode 100644
index 00000000..bf78df57
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinBusiness/CgibinBusinessRegisterResponse.json
@@ -0,0 +1,3 @@
+{
+ "business_id": 1
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinBusiness/CgibinBusinessUpdateRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinBusiness/CgibinBusinessUpdateRequest.json
new file mode 100644
index 00000000..e3f2b7d6
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinBusiness/CgibinBusinessUpdateRequest.json
@@ -0,0 +1,5 @@
+{
+ "business_id": 1,
+ "nickname": "苹果",
+ "icon_media_id": ""
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinMessageCustom/Business/CgibinMessageCustomBusinessSendRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinMessageCustom/Business/CgibinMessageCustomBusinessSendRequest.json
new file mode 100644
index 00000000..c4062ed6
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinMessageCustom/Business/CgibinMessageCustomBusinessSendRequest.json
@@ -0,0 +1,8 @@
+{
+ "touser": "OPENID",
+ "businessid": 1,
+ "msgtype": "text",
+ "text": {
+ "content": "Hello World"
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinMessageCustom/Business/CgibinMessageCustomBusinessTypingRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinMessageCustom/Business/CgibinMessageCustomBusinessTypingRequest.json
new file mode 100644
index 00000000..8d664333
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinMessageCustom/Business/CgibinMessageCustomBusinessTypingRequest.json
@@ -0,0 +1,5 @@
+{
+ "businessid": 1,
+ "touser": "OPENID",
+ "command": "Typing"
+}