diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinCorpGroupExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinCorpGroupExtensions.cs index 2beda78d..5ef707f6 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinCorpGroupExtensions.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinCorpGroupExtensions.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Net.Http; using System.Threading; using System.Threading.Tasks; @@ -9,7 +9,6 @@ namespace SKIT.FlurlHttpClient.Wechat.Work { public static class WechatWorkClientExecuteCgibinCorpGroupExtensions { - /// /// 异步调用 [POST] /cgi-bin/corpgroup/unionid_to_external_userid 接口。 /// REF: https://developer.work.weixin.qq.com/document/path/95342 @@ -29,7 +28,48 @@ namespace SKIT.FlurlHttpClient.Wechat.Work return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); } - + + /// + /// 异步调用 [POST] /cgi-bin/corpgroup/import_chain_contact 接口。 + /// REF: https://developer.work.weixin.qq.com/document/path/95821 + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinCorpGroupImportChainContactAsync(this WechatWorkClient client, Models.CgibinCorpGroupImportChainContactRequest 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", "corpgroup", "import_chain_contact") + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /cgi-bin/corpgroup/getresult 接口。 + /// REF: https://developer.work.weixin.qq.com/document/path/95823 + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinCorpGroupGetResultAsync(this WechatWorkClient client, Models.CgibinCorpGroupGetResultRequest 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.Get, "cgi-bin", "corpgroup", "getresult") + .SetQueryParam("access_token", request.AccessToken) + .SetQueryParam("jobid", request.JobId); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + #region Corp /// /// 异步调用 [POST] /cgi-bin/corpgroup/corp/list_app_share_info 接口。 diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinCorpGroup/CgibinCorpGroupGetResultRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinCorpGroup/CgibinCorpGroupGetResultRequest.cs new file mode 100644 index 00000000..87faf173 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinCorpGroup/CgibinCorpGroupGetResultRequest.cs @@ -0,0 +1,17 @@ +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Work.Models +{ + /// + /// 表示 [GET] /cgi-bin/corpgroup/getresult 接口的请求。 + /// + public class CgibinCorpGroupGetResultRequest : WechatWorkRequest + { + /// + /// 获取或设置异步任务 ID。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string JobId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinCorpGroup/CgibinCorpGroupGetResultResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinCorpGroup/CgibinCorpGroupGetResultResponse.cs new file mode 100644 index 00000000..388ddee2 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinCorpGroup/CgibinCorpGroupGetResultResponse.cs @@ -0,0 +1,117 @@ +namespace SKIT.FlurlHttpClient.Wechat.Work.Models +{ + /// + /// 表示 [GET] /cgi-bin/corpgroup/getresult 接口的响应。 + /// + public class CgibinCorpGroupGetResultResponse : WechatWorkResponse + { + public static class Types + { + public class Result + { + public static class Types + { + public class ChainContact + { + public static class Types + { + public class Contact + { + /// + /// 获取或设置错误码。 + /// + [Newtonsoft.Json.JsonProperty("errcode")] + [System.Text.Json.Serialization.JsonPropertyName("errcode")] + public int ErrorCode { get; set; } + + /// + /// 获取或设置错误描述。 + /// + [Newtonsoft.Json.JsonProperty("errmsg")] + [System.Text.Json.Serialization.JsonPropertyName("errmsg")] + public string? ErrorMessage { get; set; } + + /// + /// 获取或设置联系人手机号码。 + /// + [Newtonsoft.Json.JsonProperty("mobile")] + [System.Text.Json.Serialization.JsonPropertyName("mobile")] + public string? MobileNumber { get; set; } + } + } + + /// + /// 获取或设置错误码。 + /// + [Newtonsoft.Json.JsonProperty("errcode")] + [System.Text.Json.Serialization.JsonPropertyName("errcode")] + public int ErrorCode { get; set; } + + /// + /// 获取或设置错误描述。 + /// + [Newtonsoft.Json.JsonProperty("errmsg")] + [System.Text.Json.Serialization.JsonPropertyName("errmsg")] + public string? ErrorMessage { get; set; } + + /// + /// 获取或设置企业名称。 + /// + [Newtonsoft.Json.JsonProperty("corp_name")] + [System.Text.Json.Serialization.JsonPropertyName("corp_name")] + public string CorpName { get; set; } = string.Empty; + + /// + /// 获取或设置自定义 ID。 + /// + [Newtonsoft.Json.JsonProperty("custom_id")] + [System.Text.Json.Serialization.JsonPropertyName("custom_id")] + public string? CustomId { get; set; } + + /// + /// 获取或设置联系人列表。 + /// + [Newtonsoft.Json.JsonProperty("contact_info_list")] + [System.Text.Json.Serialization.JsonPropertyName("contact_info_list")] + public Types.Contact[]? ContactList { get; set; } + } + } + + /// + /// 获取或设置上下游 ID。 + /// + [Newtonsoft.Json.JsonProperty("chain_id")] + [System.Text.Json.Serialization.JsonPropertyName("chain_id")] + public string ChainId { get; set; } = default!; + + /// + /// 获取或设置导入状态。 + /// + [Newtonsoft.Json.JsonProperty("import_status")] + [System.Text.Json.Serialization.JsonPropertyName("import_status")] + public int ImportStatus { get; set; } + + /// + /// 获取或设置导入失败的联系人列表。 + /// + [Newtonsoft.Json.JsonProperty("fail_list")] + [System.Text.Json.Serialization.JsonPropertyName("fail_list")] + public Types.ChainContact[]? FailedChainContactList { get; set; } + } + } + + /// + /// 获取或设置任务状态。 + /// + [Newtonsoft.Json.JsonProperty("status")] + [System.Text.Json.Serialization.JsonPropertyName("status")] + public int Status { get; set; } + + /// + /// 获取或设置结果信息。 + /// + [Newtonsoft.Json.JsonProperty("result")] + [System.Text.Json.Serialization.JsonPropertyName("result")] + public Types.Result? Result { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinCorpGroup/CgibinCorpGroupImportChainContactRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinCorpGroup/CgibinCorpGroupImportChainContactRequest.cs new file mode 100644 index 00000000..bc5f78e5 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinCorpGroup/CgibinCorpGroupImportChainContactRequest.cs @@ -0,0 +1,85 @@ +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Work.Models +{ + /// + /// 表示 [POST] /cgi-bin/corpgroup/import_chain_contact 接口的请求。 + /// + public class CgibinCorpGroupImportChainContactRequest : WechatWorkRequest + { + public static class Types + { + public class ChainContact + { + public static class Types + { + public class Contact + { + /// + /// 获取或设置联系人姓名。 + /// + [Newtonsoft.Json.JsonProperty("name")] + [System.Text.Json.Serialization.JsonPropertyName("name")] + public string Name { get; set; } = string.Empty; + + /// + /// 获取或设置联系人身份类型。 + /// + [Newtonsoft.Json.JsonProperty("identity_type")] + [System.Text.Json.Serialization.JsonPropertyName("identity_type")] + public int IdentityType { get; set; } + + /// + /// 获取或设置联系人手机号码。 + /// + [Newtonsoft.Json.JsonProperty("mobile")] + [System.Text.Json.Serialization.JsonPropertyName("mobile")] + public string? MobileNumber { get; set; } + } + } + + /// + /// 获取或设置企业名称。 + /// + [Newtonsoft.Json.JsonProperty("corp_name")] + [System.Text.Json.Serialization.JsonPropertyName("corp_name")] + public string CorpName { get; set; } = string.Empty; + + /// + /// 获取或设置导入后企业所在分组。 + /// + [Newtonsoft.Json.JsonProperty("group_path")] + [System.Text.Json.Serialization.JsonPropertyName("group_path")] + public string? GroupPath { get; set; } + + /// + /// 获取或设置自定义 ID。 + /// + [Newtonsoft.Json.JsonProperty("custom_id")] + [System.Text.Json.Serialization.JsonPropertyName("custom_id")] + public string? CustomId { get; set; } + + /// + /// 获取或设置联系人列表。 + /// + [Newtonsoft.Json.JsonProperty("contact_info_list")] + [System.Text.Json.Serialization.JsonPropertyName("contact_info_list")] + public IList ContactList { get; set; } = new List(); + } + } + + /// + /// 获取或设置上下游 ID。 + /// + [Newtonsoft.Json.JsonProperty("chain_id")] + [System.Text.Json.Serialization.JsonPropertyName("chain_id")] + public string ChainId { get; set; } = string.Empty; + + /// + /// 获取或设置联系人列表。 + /// + [Newtonsoft.Json.JsonProperty("contact_list")] + [System.Text.Json.Serialization.JsonPropertyName("contact_list")] + public IList ChainContactList { get; set; } = new List(); + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinCorpGroup/CgibinCorpGroupImportChainContactResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinCorpGroup/CgibinCorpGroupImportChainContactResponse.cs new file mode 100644 index 00000000..7252ec26 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinCorpGroup/CgibinCorpGroupImportChainContactResponse.cs @@ -0,0 +1,15 @@ +namespace SKIT.FlurlHttpClient.Wechat.Work.Models +{ + /// + /// 表示 [POST] /cgi-bin/corpgroup/import_chain_contact 接口的响应。 + /// + public class CgibinCorpGroupImportChainContactResponse : WechatWorkResponse + { + /// + /// 获取或设置导入任务 ID。 + /// + [Newtonsoft.Json.JsonProperty("jobid")] + [System.Text.Json.Serialization.JsonPropertyName("jobid")] + public string JobId { get; set; } = default!; + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinCorp/CgibinCorpGroupCropGetTokenRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinCorp/CgibinCorpGroupCorpGetTokenRequest.json similarity index 100% rename from test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinCorp/CgibinCorpGroupCropGetTokenRequest.json rename to test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinCorp/CgibinCorpGroupCorpGetTokenRequest.json diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinCorp/CgibinCorpGroupCropGetTokenResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinCorp/CgibinCorpGroupCorpGetTokenResponse.json similarity index 100% rename from test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinCorp/CgibinCorpGroupCropGetTokenResponse.json rename to test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinCorp/CgibinCorpGroupCorpGetTokenResponse.json diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinCorpGroup/CgibinCorpGroupGetResultResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinCorpGroup/CgibinCorpGroupGetResultResponse.json new file mode 100644 index 00000000..860c8ea7 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinCorpGroup/CgibinCorpGroupGetResultResponse.json @@ -0,0 +1,24 @@ +{ + "errcode": 0, + "errmsg": "ok", + "status": 3, + "result": { + "chain_id": "xxxx", + "import_status": 2, + "fail_list": [ + { + "corp_name": "飞飞培训学校2入2222", + "custom_id": "", + "errcode": 670016, + "errmsg": "invalid contact identity", + "contact_info_list": [ + { + "mobile": "13000000001", + "errcode": 670016, + "errmsg": "invalid contact identity" + } + ] + } + ] + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinCorpGroup/CgibinCorpGroupImportChainContactRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinCorpGroup/CgibinCorpGroupImportChainContactRequest.json new file mode 100644 index 00000000..603f24a2 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinCorpGroup/CgibinCorpGroupImportChainContactRequest.json @@ -0,0 +1,22 @@ +{ + "chain_id": "xxxxxx", + "contact_list": [ + { + "corp_name": "飞飞培训学校", + "group_path": "华北区/北京市/海淀区", + "custom_id": "wof3du51quo5sl1is", + "contact_info_list": [ + { + "name": "张三", + "identity_type": 1, + "mobile": "13000000001" + }, + { + "name": "李四", + "identity_type": 2, + "mobile": "13000000001" + } + ] + } + ] +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinCorpGroup/CgibinCorpGroupImportChainContactResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinCorpGroup/CgibinCorpGroupImportChainContactResponse.json new file mode 100644 index 00000000..632ea228 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinCorpGroup/CgibinCorpGroupImportChainContactResponse.json @@ -0,0 +1,5 @@ +{ + "errcode": 0, + "errmsg": "ok", + "jobid": "xxxxx" +}