From e6c76b1eab0e45454670ee030ecbc1099a240520 Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Tue, 20 Jun 2023 19:54:56 +0800 Subject: [PATCH] =?UTF-8?q?feat(work):=20=E6=96=B0=E5=A2=9E=E4=BC=9A?= =?UTF-8?q?=E8=AE=AE=E9=AB=98=E7=BA=A7=E5=B8=83=E5=B1=80=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Utilities/Internal/WxMsgCryptor.cs | 12 +- .../WechatWorkClientEventExtensions.cs | 4 +- ...orkClientExecuteCgibinMeetingExtensions.cs | 104 ++++++++++- .../CgibinMeetingAdvancedLayoutAddRequest.cs | 170 ++++++++++++++++++ .../CgibinMeetingAdvancedLayoutAddResponse.cs | 72 ++++++++ ...CgibinMeetingAdvancedLayoutApplyRequest.cs | 44 +++++ ...gibinMeetingAdvancedLayoutApplyResponse.cs | 9 + ...eetingAdvancedLayoutBatchDeleteRequest.cs} | 2 +- ...etingAdvancedLayoutBatchDeleteResponse.cs} | 2 +- ...etingAdvancedLayoutGetUserLayoutRequest.cs | 31 ++++ ...tingAdvancedLayoutGetUserLayoutResponse.cs | 80 +++++++++ .../CgibinMeetingAdvancedLayoutListRequest.cs | 15 ++ ...CgibinMeetingAdvancedLayoutListResponse.cs | 128 +++++++++++++ ...gibinMeetingAdvancedLayoutUpdateRequest.cs | 82 +++++++++ ...ibinMeetingAdvancedLayoutUpdateResponse.cs | 9 + .../Utilities/Internal/WxMsgCryptor.cs | 14 +- ...CgibinMeetingAdvancedLayoutAddRequest.json | 34 ++++ ...gibinMeetingAdvancedLayoutAddResponse.json | 36 ++++ ...ibinMeetingAdvancedLayoutApplyRequest.json | 9 + ...tingAdvancedLayoutBatchDeleteRequest.json} | 0 ...ingAdvancedLayoutGetUserLayoutRequest.json | 5 + ...ngAdvancedLayoutGetUserLayoutResponse.json | 31 ++++ ...gibinMeetingAdvancedLayoutListRequest.json | 3 + ...ibinMeetingAdvancedLayoutListResponse.json | 37 ++++ ...binMeetingAdvancedLayoutUpdateRequest.json | 30 ++++ 25 files changed, 944 insertions(+), 19 deletions(-) create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutAddRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutAddResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutApplyRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutApplyResponse.cs rename src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/{CgibinMeetingLayoutBatchDeleteRequest.cs => CgibinMeetingAdvancedLayoutBatchDeleteRequest.cs} (90%) rename src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/{CgibinMeetingLayoutBatchDeleteResponse.cs => CgibinMeetingAdvancedLayoutBatchDeleteResponse.cs} (70%) create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutGetUserLayoutRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutGetUserLayoutResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutListRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutListResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutUpdateRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutUpdateResponse.cs create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutAddRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutAddResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutApplyRequest.json rename test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/Layout/{CgibinMeetingLayoutBatchDeleteRequest.json => CgibinMeetingAdvancedLayoutBatchDeleteRequest.json} (100%) create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutGetUserLayoutRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutGetUserLayoutResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutListRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutListResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutUpdateRequest.json diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Utilities/Internal/WxMsgCryptor.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Utilities/Internal/WxMsgCryptor.cs index ae0a520e..64f8ab75 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/Utilities/Internal/WxMsgCryptor.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Utilities/Internal/WxMsgCryptor.cs @@ -153,11 +153,11 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Utilities len = IPAddress.NetworkToHostOrder(len); byte[] bMsg = new byte[len]; - byte[] bCorpId = new byte[btmpMsg.Length - 20 - len]; + byte[] bAppId = new byte[btmpMsg.Length - 20 - len]; Array.Copy(btmpMsg, 20, bMsg, 0, len); - Array.Copy(btmpMsg, 20 + len, bCorpId, 0, btmpMsg.Length - 20 - len); + Array.Copy(btmpMsg, 20 + len, bAppId, 0, btmpMsg.Length - 20 - len); - appId = Encoding.UTF8.GetString(bCorpId); + appId = Encoding.UTF8.GetString(bAppId); return Encoding.UTF8.GetString(bMsg); } @@ -180,15 +180,15 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Utilities string randCode = CreateRandCode(16); byte[] bRand = Encoding.UTF8.GetBytes(randCode); - byte[] bCorpId = Encoding.UTF8.GetBytes(appId); + byte[] bAppId = Encoding.UTF8.GetBytes(appId); byte[] bMsgTmp = Encoding.UTF8.GetBytes(plainText); byte[] bMsgLen = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(bMsgTmp.Length)); - byte[] bMsg = new byte[bRand.Length + bMsgLen.Length + bCorpId.Length + bMsgTmp.Length]; + byte[] bMsg = new byte[bRand.Length + bMsgLen.Length + bAppId.Length + bMsgTmp.Length]; Array.Copy(bRand, bMsg, bRand.Length); Array.Copy(bMsgLen, 0, bMsg, bRand.Length, bMsgLen.Length); Array.Copy(bMsgTmp, 0, bMsg, bRand.Length + bMsgLen.Length, bMsgTmp.Length); - Array.Copy(bCorpId, 0, bMsg, bRand.Length + bMsgLen.Length + bMsgTmp.Length, bCorpId.Length); + Array.Copy(bAppId, 0, bMsg, bRand.Length + bMsgLen.Length + bMsgTmp.Length, bAppId.Length); return AESEncrypt(keyBytes: keyBytes, ivBytes: ivBytes, plainBytes: bMsg); } diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientEventExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientEventExtensions.cs index 8bc6b211..07831261 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientEventExtensions.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientEventExtensions.cs @@ -159,7 +159,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Work string cipher = Utilities.WxMsgCryptor.AESEncrypt( plainText: json, encodingAESKey: client.Credentials.PushEncodingAESKey!, - corpOrSuiteId: string.IsNullOrEmpty(client.Credentials.SuiteId) ? client.Credentials.CorpId : client.Credentials.SuiteId! + corpId: string.IsNullOrEmpty(client.Credentials.SuiteId) ? client.Credentials.CorpId : client.Credentials.SuiteId! ); string sign = Utilities.WxMsgCryptor.GenerateSignature( sToken: client.Credentials.PushToken!, @@ -215,7 +215,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Work string cipher = Utilities.WxMsgCryptor.AESEncrypt( plainText: xml, encodingAESKey: client.Credentials.PushEncodingAESKey!, - corpOrSuiteId: string.IsNullOrEmpty(client.Credentials.SuiteId) ? client.Credentials.CorpId : client.Credentials.SuiteId! + corpId: string.IsNullOrEmpty(client.Credentials.SuiteId) ? client.Credentials.CorpId : client.Credentials.SuiteId! ); xml = Utilities.WxMsgCryptor.WrapXml(sToken: client.Credentials.PushToken!, sMsgEncrypt: cipher); diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinMeetingExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinMeetingExtensions.cs index 6b3f0a4d..a0e4fc7c 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinMeetingExtensions.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinMeetingExtensions.cs @@ -577,6 +577,106 @@ namespace SKIT.FlurlHttpClient.Wechat.Work return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); } + /// + /// 异步调用 [POST] /cgi-bin/meeting/advanced_layout/add 接口。 + /// REF: https://developer.work.weixin.qq.com/document/path/98861 + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinMeetingAdvancedLayoutAddAsync(this WechatWorkClient client, Models.CgibinMeetingAdvancedLayoutAddRequest 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", "meeting", "advanced_layout", "add") + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /cgi-bin/meeting/advanced_layout/update 接口。 + /// REF: https://developer.work.weixin.qq.com/document/path/98868 + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinMeetingAdvancedLayoutUpdateAsync(this WechatWorkClient client, Models.CgibinMeetingAdvancedLayoutUpdateRequest 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", "meeting", "advanced_layout", "update") + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /cgi-bin/meeting/advanced_layout/apply 接口。 + /// REF: https://developer.work.weixin.qq.com/document/path/98869 + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinMeetingAdvancedLayoutApplyAsync(this WechatWorkClient client, Models.CgibinMeetingAdvancedLayoutApplyRequest 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", "meeting", "advanced_layout", "apply") + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /cgi-bin/meeting/advanced_layout/list 接口。 + /// REF: https://developer.work.weixin.qq.com/document/path/98862 + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinMeetingAdvancedLayoutListAsync(this WechatWorkClient client, Models.CgibinMeetingAdvancedLayoutListRequest 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", "meeting", "advanced_layout", "list") + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /cgi-bin/meeting/advanced_layout/get_user_layout 接口。 + /// REF: https://developer.work.weixin.qq.com/document/path/98865 + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinMeetingAdvancedLayoutGetUserLayoutAsync(this WechatWorkClient client, Models.CgibinMeetingAdvancedLayoutGetUserLayoutRequest 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", "meeting", "advanced_layout", "get_user_layout") + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + /// /// 异步调用 [POST] /cgi-bin/meeting/advanced_layout/batch_delete 接口。 /// REF: https://developer.work.weixin.qq.com/document/path/98866 @@ -585,7 +685,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Work /// /// /// - public static async Task ExecuteCgibinMeetingLayoutBatchDeleteAsync(this WechatWorkClient client, Models.CgibinMeetingLayoutBatchDeleteRequest request, CancellationToken cancellationToken = default) + public static async Task ExecuteCgibinMeetingAdvancedLayoutBatchDeleteAsync(this WechatWorkClient client, Models.CgibinMeetingAdvancedLayoutBatchDeleteRequest request, CancellationToken cancellationToken = default) { if (client is null) throw new ArgumentNullException(nameof(client)); if (request is null) throw new ArgumentNullException(nameof(request)); @@ -594,7 +694,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Work .CreateRequest(request, HttpMethod.Post, "cgi-bin", "meeting", "advanced_layout", "batch_delete") .SetQueryParam("access_token", request.AccessToken); - return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); } /// diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutAddRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutAddRequest.cs new file mode 100644 index 00000000..d6face4b --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutAddRequest.cs @@ -0,0 +1,170 @@ +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Work.Models +{ + /// + /// 表示 [POST] /cgi-bin/meeting/advanced_layout/add 接口的请求。 + /// + public class CgibinMeetingAdvancedLayoutAddRequest : WechatWorkRequest + { + public static class Types + { + public class Layout + { + public static class Types + { + public class Page + { + public static class Types + { + public class PollingSettings + { + /// + /// 获取或设置轮询间隔时间类型。 + /// + [Newtonsoft.Json.JsonProperty("polling_interval_unit")] + [System.Text.Json.Serialization.JsonPropertyName("polling_interval_unit")] + public int PollingIntervalUnitType { get; set; } + + /// + /// 获取或设置轮询间隔时间。 + /// + [Newtonsoft.Json.JsonProperty("polling_interval")] + [System.Text.Json.Serialization.JsonPropertyName("polling_interval")] + public int PollingInterval { get; set; } + + /// + /// 获取或设置是否忽略没开启视频成员。 + /// + [Newtonsoft.Json.JsonProperty("ignore_user_novideo")] + [System.Text.Json.Serialization.JsonPropertyName("ignore_user_novideo")] + public bool IsIgnoreUserNoVideo { get; set; } + + /// + /// 获取或设置设置是否忽略未入会成员。 + /// + [Newtonsoft.Json.JsonProperty("ignore_user_absence")] + [System.Text.Json.Serialization.JsonPropertyName("ignore_user_absence")] + public bool IsIgnoreUserAbsence { get; set; } + } + + public class UserSeat + { + public static class Types + { + public class User + { + /// + /// 获取或设置参会的成员账号。 + /// + [Newtonsoft.Json.JsonProperty("userid")] + [System.Text.Json.Serialization.JsonPropertyName("userid")] + public string? UserId { get; set; } + + /// + /// 获取或设置参会的成员临时 ID。 + /// + [Newtonsoft.Json.JsonProperty("tmp_openid")] + [System.Text.Json.Serialization.JsonPropertyName("tmp_openid")] + public string? TempOpenId { get; set; } + + /// + /// 获取或设置昵称。 + /// + [Newtonsoft.Json.JsonProperty("nick_name")] + [System.Text.Json.Serialization.JsonPropertyName("nick_name")] + public string? Nickname { get; set; } + } + } + + /// + /// 获取或设置宫格 ID。 + /// + [Newtonsoft.Json.JsonProperty("grid_id")] + [System.Text.Json.Serialization.JsonPropertyName("grid_id")] + public string GridId { get; set; } = string.Empty; + + /// + /// 获取或设置宫格类型。 + /// + [Newtonsoft.Json.JsonProperty("grid_type")] + [System.Text.Json.Serialization.JsonPropertyName("grid_type")] + public int GridType { get; set; } + + /// + /// 获取或设置视频画面来源。 + /// + [Newtonsoft.Json.JsonProperty("video_type")] + [System.Text.Json.Serialization.JsonPropertyName("video_type")] + public int? VideoType { get; set; } + + /// + /// 获取或设置用户列表。 + /// + [Newtonsoft.Json.JsonProperty("user_list")] + [System.Text.Json.Serialization.JsonPropertyName("user_list")] + public IList? UserList { get; set; } + } + } + + /// + /// 获取或设置布局模板 ID。 + /// + [Newtonsoft.Json.JsonProperty("layout_template_id")] + [System.Text.Json.Serialization.JsonPropertyName("layout_template_id")] + public string LayoutTemplateId { get; set; } = string.Empty; + + /// + /// 获取或设置是否开启轮询。 + /// + [Newtonsoft.Json.JsonProperty("enable_polling")] + [System.Text.Json.Serialization.JsonPropertyName("enable_polling")] + public bool? EnablePolling { get; set; } + + /// + /// 获取或设置轮询配置信息。 + /// + [Newtonsoft.Json.JsonProperty("polling_setting")] + [System.Text.Json.Serialization.JsonPropertyName("polling_setting")] + public Types.PollingSettings? PollingSettings { get; set; } + + /// + /// 获取或设置用户座次列表。 + /// + [Newtonsoft.Json.JsonProperty("user_seat_list")] + [System.Text.Json.Serialization.JsonPropertyName("user_seat_list")] + public IList UserSeatList { get; set; } = new List(); + } + } + + /// + /// 获取或设置布局名称。 + /// + [Newtonsoft.Json.JsonProperty("layout_name")] + [System.Text.Json.Serialization.JsonPropertyName("layout_name")] + public string? LayoutName { get; set; } + + /// + /// 获取或设置布局单页列表。 + /// + [Newtonsoft.Json.JsonProperty("page_list")] + [System.Text.Json.Serialization.JsonPropertyName("page_list")] + public IList PageList { get; set; } = new List(); + } + } + + /// + /// 获取或设置会议 ID。 + /// + [Newtonsoft.Json.JsonProperty("meetingid")] + [System.Text.Json.Serialization.JsonPropertyName("meetingid")] + public string MeetingId { get; set; } = string.Empty; + + /// + /// 获取或设置布局列表。 + /// + [Newtonsoft.Json.JsonProperty("layout_list")] + [System.Text.Json.Serialization.JsonPropertyName("layout_list")] + public IList LayoutList { get; set; } = new List(); + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutAddResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutAddResponse.cs new file mode 100644 index 00000000..efdb12f5 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutAddResponse.cs @@ -0,0 +1,72 @@ +namespace SKIT.FlurlHttpClient.Wechat.Work.Models +{ + /// + /// 表示 [POST] /cgi-bin/meeting/advanced_layout/add 接口的响应。 + /// + public class CgibinMeetingAdvancedLayoutAddResponse : WechatWorkResponse + { + public static class Types + { + public class Layout : CgibinMeetingAdvancedLayoutListResponse.Types.Layout + { + public static new class Types + { + public class Page : CgibinMeetingAdvancedLayoutListResponse.Types.Layout.Types.Page + { + public static new class Types + { + public class PollingSettings : CgibinMeetingAdvancedLayoutListResponse.Types.Layout.Types.Page.Types.PollingSettings + { + } + + public class UserSeat : CgibinMeetingAdvancedLayoutListResponse.Types.Layout.Types.Page.Types.UserSeat + { + public static new class Types + { + public class User : CgibinMeetingAdvancedLayoutListResponse.Types.Layout.Types.Page.Types.UserSeat.Types.User + { + } + } + + /// + /// 获取或设置用户列表。 + /// + [Newtonsoft.Json.JsonProperty("user_list")] + [System.Text.Json.Serialization.JsonPropertyName("user_list")] + public new Types.User[] UserList { get; set; } = default!; + } + } + + /// + /// 获取或设置轮询配置信息。 + /// + [Newtonsoft.Json.JsonProperty("polling_setting")] + [System.Text.Json.Serialization.JsonPropertyName("polling_setting")] + public new Types.PollingSettings? PollingSettings { get; set; } + + /// + /// 获取或设置用户座次列表。 + /// + [Newtonsoft.Json.JsonProperty("user_seat_list")] + [System.Text.Json.Serialization.JsonPropertyName("user_seat_list")] + public new Types.UserSeat[] UserSeatList { get; set; } = default!; + } + } + + /// + /// 获取或设置布局单页列表。 + /// + [Newtonsoft.Json.JsonProperty("page_list")] + [System.Text.Json.Serialization.JsonPropertyName("page_list")] + public new Types.Page[] PageList { get; set; } = default!; + } + } + + /// + /// 获取或设置布局列表。 + /// + [Newtonsoft.Json.JsonProperty("layout_list")] + [System.Text.Json.Serialization.JsonPropertyName("layout_list")] + public Types.Layout[] LayoutList { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutApplyRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutApplyRequest.cs new file mode 100644 index 00000000..a12324f6 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutApplyRequest.cs @@ -0,0 +1,44 @@ +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Work.Models +{ + /// + /// 表示 [POST] /cgi-bin/meeting/advanced_layout/apply 接口的请求。 + /// + public class CgibinMeetingAdvancedLayoutApplyRequest : WechatWorkRequest + { + public static class Types + { + public class User + { + /// + /// 获取或设置参会的成员临时 ID。 + /// + [Newtonsoft.Json.JsonProperty("tmp_openid")] + [System.Text.Json.Serialization.JsonPropertyName("tmp_openid")] + public string TempOpenId { get; set; } = string.Empty; + } + } + + /// + /// 获取或设置会议 ID。 + /// + [Newtonsoft.Json.JsonProperty("meetingid")] + [System.Text.Json.Serialization.JsonPropertyName("meetingid")] + public string MeetingId { get; set; } = string.Empty; + + /// + /// 获取或设置布局 ID。 + /// + [Newtonsoft.Json.JsonProperty("layout_id")] + [System.Text.Json.Serialization.JsonPropertyName("layout_id")] + public string LayoutId { get; set; } = string.Empty; + + /// + /// 获取或设置用户列表。 + /// + [Newtonsoft.Json.JsonProperty("user_list")] + [System.Text.Json.Serialization.JsonPropertyName("user_list")] + public IList UserList { get; set; } = new List(); + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutApplyResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutApplyResponse.cs new file mode 100644 index 00000000..db776fad --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutApplyResponse.cs @@ -0,0 +1,9 @@ +namespace SKIT.FlurlHttpClient.Wechat.Work.Models +{ + /// + /// 表示 [POST] /cgi-bin/meeting/advanced_layout/apply 接口的响应。 + /// + public class CgibinMeetingAdvancedLayoutApplyResponse : WechatWorkResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingLayoutBatchDeleteRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutBatchDeleteRequest.cs similarity index 90% rename from src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingLayoutBatchDeleteRequest.cs rename to src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutBatchDeleteRequest.cs index 1bb1217c..c52588a1 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingLayoutBatchDeleteRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutBatchDeleteRequest.cs @@ -5,7 +5,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Work.Models /// /// 表示 [POST] /cgi-bin/meeting/advanced_layout/batch_delete 接口的请求。 /// - public class CgibinMeetingLayoutBatchDeleteRequest : WechatWorkRequest + public class CgibinMeetingAdvancedLayoutBatchDeleteRequest : WechatWorkRequest { /// /// 获取或设置会议 ID。 diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingLayoutBatchDeleteResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutBatchDeleteResponse.cs similarity index 70% rename from src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingLayoutBatchDeleteResponse.cs rename to src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutBatchDeleteResponse.cs index 19040618..43b26bee 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingLayoutBatchDeleteResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutBatchDeleteResponse.cs @@ -3,7 +3,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Work.Models /// /// 表示 [POST] /cgi-bin/meeting/advanced_layout/batch_delete 接口的响应。 /// - public class CgibinMeetingLayoutBatchDeleteResponse : WechatWorkResponse + public class CgibinMeetingAdvancedLayoutBatchDeleteResponse : WechatWorkResponse { } } diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutGetUserLayoutRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutGetUserLayoutRequest.cs new file mode 100644 index 00000000..6b3fd1fd --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutGetUserLayoutRequest.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Work.Models +{ + /// + /// 表示 [POST] /cgi-bin/meeting/advanced_layout/get_user_layout 接口的请求。 + /// + public class CgibinMeetingAdvancedLayoutGetUserLayoutRequest : WechatWorkRequest + { + /// + /// 获取或设置会议 ID。 + /// + [Newtonsoft.Json.JsonProperty("meetingid")] + [System.Text.Json.Serialization.JsonPropertyName("meetingid")] + public string MeetingId { get; set; } = string.Empty; + + /// + /// 获取或设置参会的成员临时 ID。 + /// + [Newtonsoft.Json.JsonProperty("tmp_openid")] + [System.Text.Json.Serialization.JsonPropertyName("tmp_openid")] + public string TempOpenId { get; set; } = string.Empty; + + /// + /// 获取或设置终端设备类型。 + /// + [Newtonsoft.Json.JsonProperty("instance_id")] + [System.Text.Json.Serialization.JsonPropertyName("instance_id")] + public int InstanceId { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutGetUserLayoutResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutGetUserLayoutResponse.cs new file mode 100644 index 00000000..c3cebbf4 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutGetUserLayoutResponse.cs @@ -0,0 +1,80 @@ +namespace SKIT.FlurlHttpClient.Wechat.Work.Models +{ + /// + /// 表示 [POST] /cgi-bin/meeting/advanced_layout/get_user_layout 接口的响应。 + /// + public class CgibinMeetingAdvancedLayoutGetUserLayoutResponse : WechatWorkResponse + { + public static class Types + { + public class Page : CgibinMeetingAdvancedLayoutListResponse.Types.Layout.Types.Page + { + public static new class Types + { + public class PollingSettings : CgibinMeetingAdvancedLayoutListResponse.Types.Layout.Types.Page.Types.PollingSettings + { + } + + public class UserSeat : CgibinMeetingAdvancedLayoutListResponse.Types.Layout.Types.Page.Types.UserSeat + { + public static new class Types + { + public class User : CgibinMeetingAdvancedLayoutListResponse.Types.Layout.Types.Page.Types.UserSeat.Types.User + { + } + } + + /// + /// 获取或设置用户列表。 + /// + [Newtonsoft.Json.JsonProperty("user_list")] + [System.Text.Json.Serialization.JsonPropertyName("user_list")] + public new Types.User[] UserList { get; set; } = default!; + } + } + + /// + /// 获取或设置轮询配置信息。 + /// + [Newtonsoft.Json.JsonProperty("polling_setting")] + [System.Text.Json.Serialization.JsonPropertyName("polling_setting")] + public new Types.PollingSettings? PollingSettings { get; set; } + + /// + /// 获取或设置用户座次列表。 + /// + [Newtonsoft.Json.JsonProperty("user_seat_list")] + [System.Text.Json.Serialization.JsonPropertyName("user_seat_list")] + public new Types.UserSeat[] UserSeatList { get; set; } = default!; + } + } + + /// + /// 获取或设置布局 ID。 + /// + [Newtonsoft.Json.JsonProperty("selected_layout_id")] + [System.Text.Json.Serialization.JsonPropertyName("selected_layout_id")] + public string LayoutId { get; set; } = default!; + + /// + /// 获取或设置布局名称。 + /// + [Newtonsoft.Json.JsonProperty("layout_name")] + [System.Text.Json.Serialization.JsonPropertyName("layout_name")] + public string LayoutName { get; set; } = default!; + + /// + /// 获取或设置布局类型。 + /// + [Newtonsoft.Json.JsonProperty("layout_type")] + [System.Text.Json.Serialization.JsonPropertyName("layout_type")] + public int LayoutType { get; set; } + + /// + /// 获取或设置布局单页列表。 + /// + [Newtonsoft.Json.JsonProperty("page_list")] + [System.Text.Json.Serialization.JsonPropertyName("page_list")] + public Types.Page[]? PageList { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutListRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutListRequest.cs new file mode 100644 index 00000000..5d690b5d --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutListRequest.cs @@ -0,0 +1,15 @@ +namespace SKIT.FlurlHttpClient.Wechat.Work.Models +{ + /// + /// 表示 [POST] /cgi-bin/meeting/advanced_layout/list 接口的请求。 + /// + public class CgibinMeetingAdvancedLayoutListRequest : WechatWorkRequest + { + /// + /// 获取或设置会议 ID。 + /// + [Newtonsoft.Json.JsonProperty("meetingid")] + [System.Text.Json.Serialization.JsonPropertyName("meetingid")] + public string MeetingId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutListResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutListResponse.cs new file mode 100644 index 00000000..373eca16 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutListResponse.cs @@ -0,0 +1,128 @@ +namespace SKIT.FlurlHttpClient.Wechat.Work.Models +{ + /// + /// 表示 [POST] /cgi-bin/meeting/advanced_layout/list 接口的响应。 + /// + public class CgibinMeetingAdvancedLayoutListResponse : WechatWorkResponse + { + public static class Types + { + public class Layout + { + public static class Types + { + public class Page + { + public static class Types + { + public class PollingSettings : CgibinMeetingAdvancedLayoutAddRequest.Types.Layout.Types.Page.Types.PollingSettings + { + } + + public class UserSeat + { + public static class Types + { + public class User : CgibinMeetingAdvancedLayoutAddRequest.Types.Layout.Types.Page.Types.UserSeat.Types.User + { + } + } + + /// + /// 获取或设置宫格 ID。 + /// + [Newtonsoft.Json.JsonProperty("grid_id")] + [System.Text.Json.Serialization.JsonPropertyName("grid_id")] + public string GridId { get; set; } = default!; + + /// + /// 获取或设置宫格类型。 + /// + [Newtonsoft.Json.JsonProperty("grid_type")] + [System.Text.Json.Serialization.JsonPropertyName("grid_type")] + public int GridType { get; set; } + + /// + /// 获取或设置视频画面来源。 + /// + [Newtonsoft.Json.JsonProperty("video_type")] + [System.Text.Json.Serialization.JsonPropertyName("video_type")] + public int VideoType { get; set; } + + /// + /// 获取或设置用户列表。 + /// + [Newtonsoft.Json.JsonProperty("user_list")] + [System.Text.Json.Serialization.JsonPropertyName("user_list")] + public Types.User[] UserList { get; set; } = default!; + } + } + + /// + /// 获取或设置布局模板 ID。 + /// + [Newtonsoft.Json.JsonProperty("layout_template_id")] + [System.Text.Json.Serialization.JsonPropertyName("layout_template_id")] + public string LayoutTemplateId { get; set; } = default!; + + /// + /// 获取或设置是否开启轮询。 + /// + [Newtonsoft.Json.JsonProperty("enable_polling")] + [System.Text.Json.Serialization.JsonPropertyName("enable_polling")] + public bool EnablePolling { get; set; } + + /// + /// 获取或设置轮询配置信息。 + /// + [Newtonsoft.Json.JsonProperty("polling_setting")] + [System.Text.Json.Serialization.JsonPropertyName("polling_setting")] + public Types.PollingSettings? PollingSettings { get; set; } + + /// + /// 获取或设置用户座次列表。 + /// + [Newtonsoft.Json.JsonProperty("user_seat_list")] + [System.Text.Json.Serialization.JsonPropertyName("user_seat_list")] + public Types.UserSeat[] UserSeatList { get; set; } = default!; + } + } + + /// + /// 获取或设置布局 ID。 + /// + [Newtonsoft.Json.JsonProperty("layout_id")] + [System.Text.Json.Serialization.JsonPropertyName("layout_id")] + public string LayoutId { get; set; } = default!; + + /// + /// 获取或设置布局名称。 + /// + [Newtonsoft.Json.JsonProperty("layout_name")] + [System.Text.Json.Serialization.JsonPropertyName("layout_name")] + public string LayoutName { get; set; } = default!; + + /// + /// 获取或设置布局单页列表。 + /// + [Newtonsoft.Json.JsonProperty("page_list")] + [System.Text.Json.Serialization.JsonPropertyName("page_list")] + public Types.Page[] PageList { get; set; } = default!; + } + } + + /// + /// 获取或设置会议应用的布局 ID。 + /// + [Newtonsoft.Json.JsonProperty("selected_layout_id")] + [System.Text.Json.Serialization.JsonPropertyName("selected_layout_id")] + public string SelectedLayoutId { get; set; } = default!; + + /// + /// 获取或设置布局列表。 + /// + [Newtonsoft.Json.JsonProperty("layout_list")] + [System.Text.Json.Serialization.JsonPropertyName("layout_list")] + public Types.Layout[] LayoutList { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutUpdateRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutUpdateRequest.cs new file mode 100644 index 00000000..6d02bf91 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutUpdateRequest.cs @@ -0,0 +1,82 @@ +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Work.Models +{ + /// + /// 表示 [POST] /cgi-bin/meeting/advanced_layout/update 接口的请求。 + /// + public class CgibinMeetingAdvancedLayoutUpdateRequest : WechatWorkRequest + { + public static class Types + { + public class Page : CgibinMeetingAdvancedLayoutAddRequest.Types.Layout.Types.Page + { + public static new class Types + { + public class PollingSettings : CgibinMeetingAdvancedLayoutAddRequest.Types.Layout.Types.Page.Types.PollingSettings + { + } + + public class UserSeat : CgibinMeetingAdvancedLayoutAddRequest.Types.Layout.Types.Page.Types.UserSeat + { + public static new class Types + { + public class User : CgibinMeetingAdvancedLayoutAddRequest.Types.Layout.Types.Page.Types.UserSeat.Types.User + { + } + } + + /// + /// 获取或设置用户列表。 + /// + [Newtonsoft.Json.JsonProperty("user_list")] + [System.Text.Json.Serialization.JsonPropertyName("user_list")] + public new IList? UserList { get; set; } + } + } + + /// + /// 获取或设置轮询配置信息。 + /// + [Newtonsoft.Json.JsonProperty("polling_setting")] + [System.Text.Json.Serialization.JsonPropertyName("polling_setting")] + public new Types.PollingSettings? PollingSettings { get; set; } + + /// + /// 获取或设置用户座次列表。 + /// + [Newtonsoft.Json.JsonProperty("user_seat_list")] + [System.Text.Json.Serialization.JsonPropertyName("user_seat_list")] + public new IList UserSeatList { get; set; } = new List(); + } + } + + /// + /// 获取或设置会议 ID。 + /// + [Newtonsoft.Json.JsonProperty("meetingid")] + [System.Text.Json.Serialization.JsonPropertyName("meetingid")] + public string MeetingId { get; set; } = string.Empty; + + /// + /// 获取或设置布局 ID。 + /// + [Newtonsoft.Json.JsonProperty("layout_id")] + [System.Text.Json.Serialization.JsonPropertyName("layout_id")] + public string LayoutId { get; set; } = string.Empty; + + /// + /// 获取或设置布局名称。 + /// + [Newtonsoft.Json.JsonProperty("layout_name")] + [System.Text.Json.Serialization.JsonPropertyName("layout_name")] + public string? LayoutName { get; set; } + + /// + /// 获取或设置布局单页列表。 + /// + [Newtonsoft.Json.JsonProperty("page_list")] + [System.Text.Json.Serialization.JsonPropertyName("page_list")] + public IList PageList { get; set; } = new List(); + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutUpdateResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutUpdateResponse.cs new file mode 100644 index 00000000..c4fc7255 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutUpdateResponse.cs @@ -0,0 +1,9 @@ +namespace SKIT.FlurlHttpClient.Wechat.Work.Models +{ + /// + /// 表示 [POST] /cgi-bin/meeting/advanced_layout/update 接口的响应。 + /// + public class CgibinMeetingAdvancedLayoutUpdateResponse : WechatWorkResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Utilities/Internal/WxMsgCryptor.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Utilities/Internal/WxMsgCryptor.cs index 9c99e685..6e8827eb 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Work/Utilities/Internal/WxMsgCryptor.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Utilities/Internal/WxMsgCryptor.cs @@ -136,9 +136,9 @@ namespace SKIT.FlurlHttpClient.Wechat.Work.Utilities /// /// 企业微信推送来的加密文本内容(即 `Encrypt` 字段的值)。 /// 企业微信后台设置的 EncodingAESKey。 - /// 企业微信 CorpId 或第三方应用的 SuiteId。 + /// 企业微信 CorpId 或第三方应用的 SuiteId。 /// 解密后的文本内容。 - public static string AESDecrypt(string cipherText, string encodingAESKey, out string corpOrSuiteId) + public static string AESDecrypt(string cipherText, string encodingAESKey, out string corpId) { if (cipherText == null) throw new ArgumentNullException(nameof(cipherText)); if (encodingAESKey == null) throw new ArgumentNullException(nameof(encodingAESKey)); @@ -157,7 +157,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Work.Utilities Array.Copy(btmpMsg, 20, bMsg, 0, len); Array.Copy(btmpMsg, 20 + len, bCorpId, 0, btmpMsg.Length - 20 - len); - corpOrSuiteId = Encoding.UTF8.GetString(bCorpId); + corpId = Encoding.UTF8.GetString(bCorpId); return Encoding.UTF8.GetString(bMsg); } @@ -166,13 +166,13 @@ namespace SKIT.FlurlHttpClient.Wechat.Work.Utilities /// /// 返回给企业微信的原始文本内容。 /// 企业微信后台设置的 EncodingAESKey。 - /// 企业微信 CorpId 或第三方应用的 SuiteId。 + /// 企业微信 CorpId 或第三方应用的 SuiteId。 /// 加密后的文本内容。 - public static string AESEncrypt(string plainText, string encodingAESKey, string corpOrSuiteId) + public static string AESEncrypt(string plainText, string encodingAESKey, string corpId) { if (plainText == null) throw new ArgumentNullException(nameof(plainText)); if (encodingAESKey == null) throw new ArgumentNullException(nameof(encodingAESKey)); - if (corpOrSuiteId == null) throw new ArgumentNullException(nameof(corpOrSuiteId)); + if (corpId == null) throw new ArgumentNullException(nameof(corpId)); byte[] keyBytes = Convert.FromBase64String(encodingAESKey + "="); byte[] ivBytes = new byte[16]; @@ -180,7 +180,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Work.Utilities string randCode = CreateRandCode(16); byte[] bRand = Encoding.UTF8.GetBytes(randCode); - byte[] bCorpId = Encoding.UTF8.GetBytes(corpOrSuiteId); + byte[] bCorpId = Encoding.UTF8.GetBytes(corpId); byte[] bMsgTmp = Encoding.UTF8.GetBytes(plainText); byte[] bMsgLen = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(bMsgTmp.Length)); byte[] bMsg = new byte[bRand.Length + bMsgLen.Length + bCorpId.Length + bMsgTmp.Length]; diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutAddRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutAddRequest.json new file mode 100644 index 00000000..22ff870c --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutAddRequest.json @@ -0,0 +1,34 @@ +{ + "meetingid": "MEETINGID", + "layout_list": [ + { + "layout_name": "testmictest", + "page_list": [ + { + "layout_template_id": "3", + "enable_polling": true, + "polling_setting": { + "polling_interval_unit": 1, + "polling_interval": 10, + "ignore_user_novideo": false, + "ignore_user_absence": false + }, + "user_seat_list": [ + { + "grid_id": "1", + "grid_type": 1, + "video_type": 3, + "user_list": [ + { + "userid": "USERID", + "tmp_openid": "TMPOPENID1", + "nick_name": "bmlja25hbWUK" + } + ] + } + ] + } + ] + } + ] +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutAddResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutAddResponse.json new file mode 100644 index 00000000..43867b14 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutAddResponse.json @@ -0,0 +1,36 @@ +{ + "errcode": 0, + "errmsg": "ok", + "layout_list": [ + { + "layout_id": "LAYOUTID1", + "layout_name": "testmictest", + "page_list": [ + { + "layout_template_id": "3", + "enable_polling": true, + "polling_setting": { + "polling_interval_unit": 1, + "polling_interval": 10, + "ignore_user_absence": false, + "ignore_user_novideo": false + }, + "user_seat_list": [ + { + "grid_id": "1", + "grid_type": 1, + "video_type": 3, + "user_list": [ + { + "userid": "USERID", + "tmp_openid": "TMPOPENID1", + "nick_name": "bmlja25hbWUK" + } + ] + } + ] + } + ] + } + ] +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutApplyRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutApplyRequest.json new file mode 100644 index 00000000..c5dd5aa8 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutApplyRequest.json @@ -0,0 +1,9 @@ +{ + "meetingid": "MEETINGID", + "layout_id": "LAYOUTID1", + "user_list": [ + { + "tmp_openid": "TMPOPENID1" + } + ] +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/Layout/CgibinMeetingLayoutBatchDeleteRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutBatchDeleteRequest.json similarity index 100% rename from test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/Layout/CgibinMeetingLayoutBatchDeleteRequest.json rename to test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutBatchDeleteRequest.json diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutGetUserLayoutRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutGetUserLayoutRequest.json new file mode 100644 index 00000000..4597874b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutGetUserLayoutRequest.json @@ -0,0 +1,5 @@ +{ + "meetingid": "MEETINGID", + "tmp_openid": "TMPOPENID1", + "instance_id": 1 +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutGetUserLayoutResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutGetUserLayoutResponse.json new file mode 100644 index 00000000..415fcf44 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutGetUserLayoutResponse.json @@ -0,0 +1,31 @@ +{ + "errcode": 0, + "errmsg": "ok", + "selected_layout_id": "LAYOUTID1", + "layout_name": "testmictest", + "layout_type": 2, + "page_list": [ + { + "layout_template_id": "3", + "enable_polling": true, + "polling_setting": { + "polling_interval_unit": 1, + "polling_interval": 10, + "ignore_user_absence": false, + "ignore_user_novideo": false + }, + "user_seat_list": [ + { + "grid_id": "1", + "grid_type": 1, + "video_type": 3, + "user_list": [ + { + "tmp_openid": "TMPOPENID1" + } + ] + } + ] + } + ] +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutListRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutListRequest.json new file mode 100644 index 00000000..d0e8505d --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutListRequest.json @@ -0,0 +1,3 @@ +{ + "meetingid": "MEETINGID" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutListResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutListResponse.json new file mode 100644 index 00000000..03cd5a84 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutListResponse.json @@ -0,0 +1,37 @@ +{ + "errcode": 0, + "errmsg": "ok", + "selected_layout_id": "LAYOUTID1", + "layout_list": [ + { + "layout_id": "LAYOUTID1", + "layout_name": "testmictest", + "page_list": [ + { + "layout_template_id": "3", + "enable_polling": true, + "polling_setting": { + "polling_interval_unit": 1, + "polling_interval": 10, + "ignore_user_absence": false, + "ignore_user_novideo": false + }, + "user_seat_list": [ + { + "grid_id": "1", + "grid_type": 1, + "video_type": 3, + "user_list": [ + { + "userid": "USERID", + "tmp_openid": "TMPOPENID1", + "nick_name": "dGVzdF9uaWNr" + } + ] + } + ] + } + ] + } + ] +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutUpdateRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutUpdateRequest.json new file mode 100644 index 00000000..d7e5953e --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/Layout/CgibinMeetingAdvancedLayoutUpdateRequest.json @@ -0,0 +1,30 @@ +{ + "meetingid": "MEETINGID", + "layout_id": "LAYOUTID1", + "layout_name": "testmictest", + "page_list": [ + { + "layout_template_id": "3", + "enable_polling": true, + "polling_setting": { + "polling_interval_unit": 1, + "polling_interval": 10, + "ignore_user_novideo": false, + "ignore_user_absence": false + }, + "user_seat_list": [ + { + "grid_id": "1", + "grid_type": 1, + "video_type": 3, + "user_list": [ + { + "userid": "USERID", + "tmp_openid": "TMPOPENID1" + } + ] + } + ] + } + ] +}