diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Events/Device/AddDeviceEvent.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Events/Device/AddDeviceEvent.cs
new file mode 100644
index 00000000..b7322368
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Events/Device/AddDeviceEvent.cs
@@ -0,0 +1,30 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Work.Events
+{
+ ///
+ /// 表示 INFO.add_device 事件的数据。
+ /// REF: https://open.work.weixin.qq.com/api/doc/90002/90151/90751
+ ///
+ public class AddDeviceEvent : WechatWorkEvent, WechatWorkEvent.Types.IXmlSerializable
+ {
+ ///
+ /// 获取或设置服务商 CorpId。
+ ///
+ [System.Xml.Serialization.XmlElement("ServiceCorpId")]
+ public string ServiceCorpId { get; set; } = default!;
+
+ ///
+ /// 获取或设置设备型号 ID。
+ ///
+ [System.Xml.Serialization.XmlElement("ModelId")]
+ public string ModelId { get; set; } = default!;
+
+ ///
+ /// 获取或设置设备备注名称。
+ ///
+ [System.Xml.Serialization.XmlElement("RemarkName")]
+ public string? RemarkName { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Events/Device/ConnectInfoEvent.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Events/Device/ConnectInfoEvent.cs
new file mode 100644
index 00000000..36681f29
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Events/Device/ConnectInfoEvent.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Work.Events
+{
+ ///
+ /// 表示 INFO.connect_info 事件的数据。
+ /// REF: https://open.work.weixin.qq.com/api/doc/90002/90151/90751
+ ///
+ public class ConnectInfoEvent : WechatWorkEvent, WechatWorkEvent.Types.IXmlSerializable
+ {
+ ///
+ /// 获取或设置服务商 CorpId。
+ ///
+ [System.Xml.Serialization.XmlElement("ServiceCorpId")]
+ public string ServiceCorpId { get; set; } = default!;
+
+ ///
+ /// 获取或设置设备成功连接企业微信后台时的时间戳。
+ ///
+ [System.Xml.Serialization.XmlElement("ConnectTime")]
+ public long ConnectTimestamp { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Events/Device/DeleteDeviceEvent.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Events/Device/DeleteDeviceEvent.cs
new file mode 100644
index 00000000..8040fbdf
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Events/Device/DeleteDeviceEvent.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Work.Events
+{
+ ///
+ /// 表示 INFO.del_device 事件的数据。
+ /// REF: https://open.work.weixin.qq.com/api/doc/90002/90151/90751
+ ///
+ public class DeleteDeviceEvent : WechatWorkEvent, WechatWorkEvent.Types.IXmlSerializable
+ {
+ ///
+ /// 获取或设置服务商 CorpId。
+ ///
+ [System.Xml.Serialization.XmlElement("ServiceCorpId")]
+ public string ServiceCorpId { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Events/Device/DeviceFeatureChangeEvent.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Events/Device/DeviceFeatureChangeEvent.cs
new file mode 100644
index 00000000..27a68f9c
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Events/Device/DeviceFeatureChangeEvent.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Work.Events
+{
+ ///
+ /// 表示 INFO.device_feature_change 事件的数据。
+ /// REF: https://open.work.weixin.qq.com/api/doc/90002/90151/90751
+ ///
+ public class DeviceFeatureChangeEvent : WechatWorkEvent, WechatWorkEvent.Types.IXmlSerializable
+ {
+ ///
+ /// 获取或设置服务商 CorpId。
+ ///
+ [System.Xml.Serialization.XmlElement("ServiceCorpId")]
+ public string ServiceCorpId { get; set; } = default!;
+
+ ///
+ /// 获取或设置设备序列号。
+ ///
+ [System.Xml.Serialization.XmlElement("DeviceSn")]
+ public string DeviceSerialNumber { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Events/Device/DisconnectInfoEvent.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Events/Device/DisconnectInfoEvent.cs
new file mode 100644
index 00000000..3a93777c
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Events/Device/DisconnectInfoEvent.cs
@@ -0,0 +1,30 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Work.Events
+{
+ ///
+ /// 表示 INFO.disconnect_info 事件的数据。
+ /// REF: https://open.work.weixin.qq.com/api/doc/90002/90151/90751
+ ///
+ public class DisconnectInfoEvent : WechatWorkEvent, WechatWorkEvent.Types.IXmlSerializable
+ {
+ ///
+ /// 获取或设置服务商 CorpId。
+ ///
+ [System.Xml.Serialization.XmlElement("ServiceCorpId")]
+ public string ServiceCorpId { get; set; } = default!;
+
+ ///
+ /// 获取或设置设备与企业微信后台网络连接断开时的时间戳。
+ ///
+ [System.Xml.Serialization.XmlElement("DisconnectTime")]
+ public long DiconnectTimestamp { get; set; }
+
+ ///
+ /// 获取或设置设备连接断开原因。
+ ///
+ [System.Xml.Serialization.XmlElement("Reason")]
+ public string DisconnectReason { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Events/Device/ErrorReportEvent.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Events/Device/ErrorReportEvent.cs
new file mode 100644
index 00000000..c8339c81
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Events/Device/ErrorReportEvent.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Work.Events
+{
+ ///
+ /// 表示 INFO.error_report 事件的数据。
+ /// REF: https://open.work.weixin.qq.com/api/doc/90002/90151/90751
+ ///
+ public class ErrorReportEvent : WechatWorkEvent, WechatWorkEvent.Types.IXmlSerializable
+ {
+ ///
+ /// 获取或设置设备上报的错误码。
+ ///
+ [System.Xml.Serialization.XmlElement("ErrCode")]
+ public int ErrorCode { get; set; }
+
+ ///
+ /// 获取或设置设备上报的错误信息。
+ ///
+ [System.Xml.Serialization.XmlElement("ErrMsg")]
+ public string? ErrorMessage { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Events/Device/FetchLogFinishEvent.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Events/Device/FetchLogFinishEvent.cs
new file mode 100644
index 00000000..840f5532
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Events/Device/FetchLogFinishEvent.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Work.Events
+{
+ ///
+ /// 表示 INFO.fetch_log_finish 事件的数据。
+ /// REF: https://open.work.weixin.qq.com/api/doc/90002/90151/90751
+ ///
+ public class FetchLogFinishEvent : WechatWorkEvent, WechatWorkEvent.Types.IXmlSerializable
+ {
+ ///
+ /// 获取或设置服务商 CorpId。
+ ///
+ [System.Xml.Serialization.XmlElement("ServiceCorpId")]
+ public string ServiceCorpId { get; set; } = default!;
+
+ ///
+ /// 获取或设置日志文件的 MediaId。
+ ///
+ [System.Xml.Serialization.XmlElement("MediaId")]
+ public string MediaId { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Events/Device/RemarkDeviceNameEvent.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Events/Device/RemarkDeviceNameEvent.cs
new file mode 100644
index 00000000..49de6487
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Events/Device/RemarkDeviceNameEvent.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Work.Events
+{
+ ///
+ /// 表示 INFO.remark_device_name 事件的数据。
+ /// REF: https://open.work.weixin.qq.com/api/doc/90002/90151/90751
+ ///
+ public class RemarkDeviceNameEvent : WechatWorkEvent, WechatWorkEvent.Types.IXmlSerializable
+ {
+ ///
+ /// 获取或设置服务商 CorpId。
+ ///
+ [System.Xml.Serialization.XmlElement("ServiceCorpId")]
+ public string ServiceCorpId { get; set; } = default!;
+
+ ///
+ /// 获取或设置设备备注名称。
+ ///
+ [System.Xml.Serialization.XmlElement("RemarkName")]
+ public string RemarkName { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinServiceExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinServiceExtensions.cs
index 1da85bc6..a608dbe0 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinServiceExtensions.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinServiceExtensions.cs
@@ -193,73 +193,6 @@ namespace SKIT.FlurlHttpClient.Wechat.Work
return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
}
- ///
- /// 异步调用 [GET] /cgi-bin/service/getuserinfo3rd 接口。
- /// REF: https://open.work.weixin.qq.com/api/doc/90001/90143/91121
- /// REF: https://open.work.weixin.qq.com/api/doc/90002/90151/91155
- ///
- ///
- ///
- ///
- ///
- public static async Task ExecuteCgibinServiceUserInfo3rdAsync(this WechatWorkClient client, Models.CgibinServiceUserInfo3rdRequest 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(HttpMethod.Get, "cgi-bin", "service", "getuserinfo3rd")
- .SetOptions(request)
- .SetQueryParam("suite_access_token", request.AccessToken)
- .SetQueryParam("code", request.Code);
-
- return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken);
- }
-
- ///
- /// 异步调用 [POST] /cgi-bin/service/getuserdetail3rd 接口。
- /// REF: https://open.work.weixin.qq.com/api/doc/90001/90143/91122
- /// REF: https://open.work.weixin.qq.com/api/doc/90002/90151/91156
- ///
- ///
- ///
- ///
- ///
- public static async Task ExecuteCgibinServiceUserDetail3rdAsync(this WechatWorkClient client, Models.CgibinServiceUserDetail3rdRequest 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(HttpMethod.Post, "cgi-bin", "service", "getuserdetail3rd")
- .SetOptions(request)
- .SetQueryParam("suite_access_token", request.AccessToken);
-
- return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
- }
-
- ///
- /// 异步调用 [POST] /cgi-bin/service/get_login_info 接口。
- /// REF: https://open.work.weixin.qq.com/api/doc/90001/90143/91125
- /// REF: https://open.work.weixin.qq.com/api/doc/90002/90151/91158
- ///
- ///
- ///
- ///
- ///
- public static async Task ExecuteCgibinServiceGetLoginInfoAsync(this WechatWorkClient client, Models.CgibinServiceGetLoginInfoRequest 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(HttpMethod.Post, "cgi-bin", "service", "get_login_info")
- .SetOptions(request)
- .SetQueryParam("access_token", request.AccessToken);
-
- return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
- }
-
#region Register
///
/// 异步调用 [POST] /cgi-bin/service/get_register_code 接口。
@@ -370,6 +303,75 @@ namespace SKIT.FlurlHttpClient.Wechat.Work
}
#endregion
+ #region OAuth
+ ///
+ /// 异步调用 [GET] /cgi-bin/service/getuserinfo3rd 接口。
+ /// REF: https://open.work.weixin.qq.com/api/doc/90001/90143/91121
+ /// REF: https://open.work.weixin.qq.com/api/doc/90002/90151/91155
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteCgibinServiceUserInfo3rdAsync(this WechatWorkClient client, Models.CgibinServiceUserInfo3rdRequest 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(HttpMethod.Get, "cgi-bin", "service", "getuserinfo3rd")
+ .SetOptions(request)
+ .SetQueryParam("suite_access_token", request.AccessToken)
+ .SetQueryParam("code", request.Code);
+
+ return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /cgi-bin/service/getuserdetail3rd 接口。
+ /// REF: https://open.work.weixin.qq.com/api/doc/90001/90143/91122
+ /// REF: https://open.work.weixin.qq.com/api/doc/90002/90151/91156
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteCgibinServiceUserDetail3rdAsync(this WechatWorkClient client, Models.CgibinServiceUserDetail3rdRequest 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(HttpMethod.Post, "cgi-bin", "service", "getuserdetail3rd")
+ .SetOptions(request)
+ .SetQueryParam("suite_access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /cgi-bin/service/get_login_info 接口。
+ /// REF: https://open.work.weixin.qq.com/api/doc/90001/90143/91125
+ /// REF: https://open.work.weixin.qq.com/api/doc/90002/90151/91158
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteCgibinServiceGetLoginInfoAsync(this WechatWorkClient client, Models.CgibinServiceGetLoginInfoRequest 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(HttpMethod.Post, "cgi-bin", "service", "get_login_info")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+ #endregion
+
#region Contact
///
/// 异步调用 [POST] /cgi-bin/service/contact/id_translate 接口。
@@ -437,5 +439,175 @@ namespace SKIT.FlurlHttpClient.Wechat.Work
return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken);
}
#endregion
+
+ #region Device
+ ///
+ /// 异步调用 [POST] /cgi-bin/service/add_device 接口。
+ /// REF: https://open.work.weixin.qq.com/api/doc/90002/90151/90626
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteCgibinServiceAddDeviceAsync(this WechatWorkClient client, Models.CgibinServiceAddDeviceRequest 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(HttpMethod.Post, "cgi-bin", "service", "add_device")
+ .SetOptions(request)
+ .SetQueryParam("provider_access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /cgi-bin/service/get_device_auth_info 接口。
+ /// REF: https://open.work.weixin.qq.com/api/doc/90002/90151/90753
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteCgibinServiceGetDeviceAuthInfoAsync(this WechatWorkClient client, Models.CgibinServiceGetDeviceAuthInfoRequest 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(HttpMethod.Post, "cgi-bin", "service", "get_device_auth_info")
+ .SetOptions(request)
+ .SetQueryParam("provider_access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /cgi-bin/service/reset_secret_no 接口。
+ /// REF: https://open.work.weixin.qq.com/api/doc/90002/90151/90753
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteCgibinServiceResetSecretNumberAsync(this WechatWorkClient client, Models.CgibinServiceResetSecretNumberRequest 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(HttpMethod.Post, "cgi-bin", "service", "reset_secret_no")
+ .SetOptions(request)
+ .SetQueryParam("provider_access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /cgi-bin/service/list_device 接口。
+ /// REF: https://open.work.weixin.qq.com/api/doc/90002/90151/91346
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteCgibinServiceListDeviceAsync(this WechatWorkClient client, Models.CgibinServiceListDeviceRequest 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(HttpMethod.Post, "cgi-bin", "service", "list_device")
+ .SetOptions(request)
+ .SetQueryParam("provider_access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /cgi-bin/service/fetch_device_log 接口。
+ /// REF: https://open.work.weixin.qq.com/api/doc/90002/90151/91475
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteCgibinServiceFetchDeviceLogAsync(this WechatWorkClient client, Models.CgibinServiceFetchDeviceLogRequest 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(HttpMethod.Post, "cgi-bin", "service", "fetch_device_log")
+ .SetOptions(request)
+ .SetQueryParam("provider_access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /cgi-bin/hardware/get_device_feature 接口。
+ /// REF: https://open.work.weixin.qq.com/api/doc/90002/90151/92739
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteCgibinHardwareGetDeviceFeatureAsync(this WechatWorkClient client, Models.CgibinHardwareGetDeviceFeatureRequest 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(HttpMethod.Post, "cgi-bin", "hardware", "get_device_feature")
+ .SetOptions(request)
+ .SetQueryParam("provider_access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /cgi-bin/service/del_device 接口。
+ /// REF: https://open.work.weixin.qq.com/api/doc/90002/90151/92770
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteCgibinServiceDeleteDeviceAsync(this WechatWorkClient client, Models.CgibinServiceDeleteDeviceRequest 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(HttpMethod.Post, "cgi-bin", "service", "del_device")
+ .SetOptions(request)
+ .SetQueryParam("provider_access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /cgi-bin/service/set_printer_support_state 接口。
+ /// REF: https://open.work.weixin.qq.com/api/doc/90002/90151/92782
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteCgibinServiceSetPrinterSupportStateAsync(this WechatWorkClient client, Models.CgibinServiceSetPrinterSupportStateRequest 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(HttpMethod.Post, "cgi-bin", "service", "set_printer_support_state")
+ .SetOptions(request)
+ .SetQueryParam("provider_access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+ #endregion
}
}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinHardwareGetDeviceFeatureRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinHardwareGetDeviceFeatureRequest.cs
new file mode 100644
index 00000000..45860ea0
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinHardwareGetDeviceFeatureRequest.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Work.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/hardware/get_device_feature 接口的请求。
+ ///
+ public class CgibinHardwareGetDeviceFeatureRequest : WechatWorkRequest
+ {
+ ///
+ /// 获取或设置服务商 AccessToken。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public override string? AccessToken { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置设备序列号。
+ ///
+ [Newtonsoft.Json.JsonProperty("device_sn")]
+ [System.Text.Json.Serialization.JsonPropertyName("device_sn")]
+ public string DeviceSerialNumber { get; set; } = string.Empty;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinHardwareGetDeviceFeatureResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinHardwareGetDeviceFeatureResponse.cs
new file mode 100644
index 00000000..84891dd8
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinHardwareGetDeviceFeatureResponse.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Work.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/hardware/get_device_feature 接口的响应。
+ ///
+ public class CgibinHardwareGetDeviceFeatureResponse : WechatWorkResponse
+ {
+ ///
+ /// 获取或设置设备反馈的自定义标识串。
+ ///
+ [Newtonsoft.Json.JsonProperty("device_feature")]
+ [System.Text.Json.Serialization.JsonPropertyName("device_feature")]
+ public string DeviceFeature { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceAddDeviceRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceAddDeviceRequest.cs
new file mode 100644
index 00000000..50ff8a4e
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceAddDeviceRequest.cs
@@ -0,0 +1,39 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Work.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/service/add_device 接口的请求。
+ ///
+ public class CgibinServiceAddDeviceRequest : WechatWorkRequest
+ {
+ ///
+ /// 获取或设置服务商 AccessToken。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public override string? AccessToken { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置设备型号 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("model_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("model_id")]
+ public string ModelId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置设备序列号。
+ ///
+ [Newtonsoft.Json.JsonProperty("device_sn")]
+ [System.Text.Json.Serialization.JsonPropertyName("device_sn")]
+ public string DeviceSerialNumber { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置备注名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("remark_name")]
+ [System.Text.Json.Serialization.JsonPropertyName("remark_name")]
+ public string? RemarkName { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceAddDeviceResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceAddDeviceResponse.cs
new file mode 100644
index 00000000..209b3e6f
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceAddDeviceResponse.cs
@@ -0,0 +1,66 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Work.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/service/add_device 接口的响应。
+ ///
+ public class CgibinServiceAddDeviceResponse : WechatWorkResponse
+ {
+ public static class Types
+ {
+ public class Device
+ {
+ ///
+ /// 获取或设置设备型号 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("model_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("model_id")]
+ public string ModelId { get; set; } = default!;
+
+ ///
+ /// 获取或设置设备 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("device_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("device_id")]
+ public long DeviceId { get; set; }
+
+ ///
+ /// 获取或设置设备序列号。
+ ///
+ [Newtonsoft.Json.JsonProperty("device_sn")]
+ [System.Text.Json.Serialization.JsonPropertyName("device_sn")]
+ public string DeviceSerialNumber { get; set; } = default!;
+
+ ///
+ /// 获取或设置设备密钥。
+ ///
+ [Newtonsoft.Json.JsonProperty("secret_no")]
+ [System.Text.Json.Serialization.JsonPropertyName("secret_no")]
+ public string? SecretNumber { get; set; }
+
+ ///
+ /// 获取或设置设备二维码数据。
+ ///
+ [Newtonsoft.Json.JsonProperty("qr_code")]
+ [System.Text.Json.Serialization.JsonPropertyName("qr_code")]
+ public string? QrcodeData { get; set; }
+
+ ///
+ /// 获取或设置创建时间戳。
+ ///
+ [Newtonsoft.Json.JsonProperty("create_time")]
+ [System.Text.Json.Serialization.JsonPropertyName("create_time")]
+ public long CreateTimestamp { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置设备信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("device_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("device_info")]
+ public Types.Device Device { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceDeleteDeviceRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceDeleteDeviceRequest.cs
new file mode 100644
index 00000000..d3bf5cef
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceDeleteDeviceRequest.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Work.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/service/del_device 接口的请求。
+ ///
+ public class CgibinServiceDeleteDeviceRequest : WechatWorkRequest
+ {
+ ///
+ /// 获取或设置服务商 AccessToken。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public override string? AccessToken { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置设备序列号。
+ ///
+ [Newtonsoft.Json.JsonProperty("device_sn")]
+ [System.Text.Json.Serialization.JsonPropertyName("device_sn")]
+ public string DeviceSerialNumber { get; set; } = string.Empty;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceDeleteDeviceResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceDeleteDeviceResponse.cs
new file mode 100644
index 00000000..160501eb
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceDeleteDeviceResponse.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Work.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/service/del_device 接口的响应。
+ ///
+ public class CgibinServiceDeleteDeviceResponse : WechatWorkResponse
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceFetchDeviceLogRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceFetchDeviceLogRequest.cs
new file mode 100644
index 00000000..45774db6
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceFetchDeviceLogRequest.cs
@@ -0,0 +1,32 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Work.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/service/fetch_device_log 接口的请求。
+ ///
+ public class CgibinServiceFetchDeviceLogRequest : WechatWorkRequest
+ {
+ ///
+ /// 获取或设置服务商 AccessToken。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public override string? AccessToken { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置设备序列号。
+ ///
+ [Newtonsoft.Json.JsonProperty("device_sn")]
+ [System.Text.Json.Serialization.JsonPropertyName("device_sn")]
+ public string DeviceSerialNumber { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置提示参数。
+ ///
+ [Newtonsoft.Json.JsonProperty("hint")]
+ [System.Text.Json.Serialization.JsonPropertyName("hint")]
+ public string? Hint { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceFetchDeviceLogResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceFetchDeviceLogResponse.cs
new file mode 100644
index 00000000..ccce4e1a
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceFetchDeviceLogResponse.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Work.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/service/fetch_device_log 接口的响应。
+ ///
+ public class CgibinServiceFetchDeviceLogResponse : WechatWorkResponse
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceGetDeviceAuthInfoRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceGetDeviceAuthInfoRequest.cs
new file mode 100644
index 00000000..6f679bab
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceGetDeviceAuthInfoRequest.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Work.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/service/get_device_auth_info 接口的请求。
+ ///
+ public class CgibinServiceGetDeviceAuthInfoRequest : WechatWorkRequest
+ {
+ ///
+ /// 获取或设置服务商 AccessToken。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public override string? AccessToken { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置设备序列号。
+ ///
+ [Newtonsoft.Json.JsonProperty("device_sn")]
+ [System.Text.Json.Serialization.JsonPropertyName("device_sn")]
+ public string DeviceSerialNumber { get; set; } = string.Empty;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceGetDeviceAuthInfoResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceGetDeviceAuthInfoResponse.cs
new file mode 100644
index 00000000..fba02abe
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceGetDeviceAuthInfoResponse.cs
@@ -0,0 +1,49 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Work.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/service/get_device_auth_info 接口的响应。
+ ///
+ public class CgibinServiceGetDeviceAuthInfoResponse : WechatWorkResponse
+ {
+ public static class Types
+ {
+ public class AuthorizerCorp : CgibinServiceGetAuthInfoResponse.Types.DealerCorp
+ {
+ }
+
+ public class Device
+ {
+ ///
+ /// 获取或设置设备型号 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("model_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("model_id")]
+ public string ModelId { get; set; } = default!;
+
+ ///
+ /// 获取或设置备注名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("remark_name")]
+ [System.Text.Json.Serialization.JsonPropertyName("remark_name")]
+ public string? RemarkName { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置授权方企业信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("auth_corp_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("auth_corp_info")]
+ public Types.AuthorizerCorp AuthorizerCorp { get; set; } = default!;
+
+ ///
+ /// 获取或设置设备信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("device_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("device_info")]
+ public Types.Device Device { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceListDeviceRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceListDeviceRequest.cs
new file mode 100644
index 00000000..98fa8bbe
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceListDeviceRequest.cs
@@ -0,0 +1,32 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Work.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/service/list_device 接口的请求。
+ ///
+ public class CgibinServiceListDeviceRequest : WechatWorkRequest
+ {
+ ///
+ /// 获取或设置服务商 AccessToken。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public override string? AccessToken { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置分页起始位置。
+ ///
+ [Newtonsoft.Json.JsonProperty("offset")]
+ [System.Text.Json.Serialization.JsonPropertyName("offset")]
+ public int? Offset { get; set; }
+
+ ///
+ /// 获取或设置分页每页数量。
+ ///
+ [Newtonsoft.Json.JsonProperty("limit")]
+ [System.Text.Json.Serialization.JsonPropertyName("limit")]
+ public int? Limit { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceListDeviceResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceListDeviceResponse.cs
new file mode 100644
index 00000000..914b0123
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceListDeviceResponse.cs
@@ -0,0 +1,38 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Work.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/service/list_device 接口的响应。
+ ///
+ public class CgibinServiceListDeviceResponse : WechatWorkResponse
+ {
+ public static class Types
+ {
+ public class Device
+ {
+ ///
+ /// 获取或设置设备型号 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("model_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("model_id")]
+ public string ModelId { get; set; } = default!;
+
+ ///
+ /// 获取或设置设备序列号。
+ ///
+ [Newtonsoft.Json.JsonProperty("device_sn")]
+ [System.Text.Json.Serialization.JsonPropertyName("device_sn")]
+ public string DeviceSerialNumber { get; set; } = default!;
+ }
+ }
+
+ ///
+ /// 获取或设置设备列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("device_list")]
+ [System.Text.Json.Serialization.JsonPropertyName("device_list")]
+ public Types.Device[] DeviceList { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceResetSecretNumberRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceResetSecretNumberRequest.cs
new file mode 100644
index 00000000..058165eb
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceResetSecretNumberRequest.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Work.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/service/reset_secret_no 接口的请求。
+ ///
+ public class CgibinServiceResetSecretNumberRequest : WechatWorkRequest
+ {
+ ///
+ /// 获取或设置服务商 AccessToken。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public override string? AccessToken { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置设备序列号。
+ ///
+ [Newtonsoft.Json.JsonProperty("device_sn")]
+ [System.Text.Json.Serialization.JsonPropertyName("device_sn")]
+ public string DeviceSerialNumber { get; set; } = string.Empty;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceResetSecretNumberResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceResetSecretNumberResponse.cs
new file mode 100644
index 00000000..3630bc5c
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceResetSecretNumberResponse.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Work.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/service/reset_secret_no 接口的响应。
+ ///
+ public class CgibinServiceResetSecretNumberResponse : WechatWorkResponse
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceSetPrinterSupportStateRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceSetPrinterSupportStateRequest.cs
new file mode 100644
index 00000000..fe67d325
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceSetPrinterSupportStateRequest.cs
@@ -0,0 +1,32 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Work.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/service/set_printer_support_state 接口的请求。
+ ///
+ public class CgibinServiceSetPrinterSupportStateRequest : WechatWorkRequest
+ {
+ ///
+ /// 获取或设置服务商 AccessToken。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public override string? AccessToken { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置设备序列号。
+ ///
+ [Newtonsoft.Json.JsonProperty("device_sn")]
+ [System.Text.Json.Serialization.JsonPropertyName("device_sn")]
+ public string DeviceSerialNumber { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置是否不支持打印机。
+ ///
+ [Newtonsoft.Json.JsonProperty("not_supported_printer")]
+ [System.Text.Json.Serialization.JsonPropertyName("not_supported_printer")]
+ public bool IsUnsupportedPrinter { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceSetPrinterSupportStateResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceSetPrinterSupportStateResponse.cs
new file mode 100644
index 00000000..2c2068ad
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinServiceSetPrinterSupportStateResponse.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Work.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/service/set_printer_support_state 接口的响应。
+ ///
+ public class CgibinServiceSetPrinterSupportStateResponse : WechatWorkResponse
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/CgibinServiceGetLoginInfoRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/OAuth/CgibinServiceGetLoginInfoRequest.cs
similarity index 100%
rename from src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/CgibinServiceGetLoginInfoRequest.cs
rename to src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/OAuth/CgibinServiceGetLoginInfoRequest.cs
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/CgibinServiceGetLoginInfoResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/OAuth/CgibinServiceGetLoginInfoResponse.cs
similarity index 100%
rename from src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/CgibinServiceGetLoginInfoResponse.cs
rename to src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/OAuth/CgibinServiceGetLoginInfoResponse.cs
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/CgibinServiceUserDetail3rdRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/OAuth/CgibinServiceUserDetail3rdRequest.cs
similarity index 100%
rename from src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/CgibinServiceUserDetail3rdRequest.cs
rename to src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/OAuth/CgibinServiceUserDetail3rdRequest.cs
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/CgibinServiceUserDetail3rdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/OAuth/CgibinServiceUserDetail3rdResponse.cs
similarity index 100%
rename from src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/CgibinServiceUserDetail3rdResponse.cs
rename to src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/OAuth/CgibinServiceUserDetail3rdResponse.cs
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/CgibinServiceUserInfo3rdRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/OAuth/CgibinServiceUserInfo3rdRequest.cs
similarity index 100%
rename from src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/CgibinServiceUserInfo3rdRequest.cs
rename to src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/OAuth/CgibinServiceUserInfo3rdRequest.cs
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/CgibinServiceUserInfo3rdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/OAuth/CgibinServiceUserInfo3rdResponse.cs
similarity index 100%
rename from src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/CgibinServiceUserInfo3rdResponse.cs
rename to src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/OAuth/CgibinServiceUserInfo3rdResponse.cs