diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinCorpGroupExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinCorpGroupExtensions.cs index d908ba9f..5b254e9b 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinCorpGroupExtensions.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinCorpGroupExtensions.cs @@ -52,5 +52,92 @@ namespace SKIT.FlurlHttpClient.Wechat.Work return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); } + + /// + /// 异步调用 [GET] /cgi-bin/corpgroup/corp/get_chain_list 接口。 + /// REF: https://developer.work.weixin.qq.com/document/path/95315 + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinCorpGroupCropGetChainListAsync(this WechatWorkClient client, Models.CgibinCorpGroupCropGetChainListRequest 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", "corp", "get_chain_list") + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /cgi-bin/corpgroup/corp/get_chain_group 接口。 + /// REF: https://developer.work.weixin.qq.com/document/path/95315 + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinCorpGroupCropGetChainGroupAsync(this WechatWorkClient client, Models.CgibinCorpGroupCropGetChainGroupRequest 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", "corp", "get_chain_group") + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /cgi-bin/corpgroup/corp/get_chain_corpinfo_list 接口。 + /// REF: https://developer.work.weixin.qq.com/document/path/95315 + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinCorpGroupCropGetChainCorpInfoListAsync(this WechatWorkClient client, Models.CgibinCorpGroupCropGetChainCorpInfoListRequest 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", "corp", "get_chain_corpinfo_list") + .SetQueryParam("access_token", request.AccessToken) + .SetQueryParam("chain_id", request.ChainId); + + if (request.GroupId != null) + flurlReq.SetQueryParam("groupid", request.GroupId.Value); + + if (request.RequireFetchChild != null) + flurlReq.SetQueryParam("fetch_child", request.RequireFetchChild.Value ? 1 : 0); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /cgi-bin/corpgroup/unionid_to_external_userid 接口。 + /// REF: https://developer.work.weixin.qq.com/document/path/95342 + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinCorpGroupUnionidToExternalUserIdAsync(this WechatWorkClient client, Models.CgibinCorpGroupUnionidToExternalUserIdRequest 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", "unionid_to_external_userid") + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } } } diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinCorpGroup/CgibinCorpGroupCropGetChainCorpInfoListRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinCorpGroup/CgibinCorpGroupCropGetChainCorpInfoListRequest.cs new file mode 100644 index 00000000..f057da3f --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinCorpGroup/CgibinCorpGroupCropGetChainCorpInfoListRequest.cs @@ -0,0 +1,29 @@ +namespace SKIT.FlurlHttpClient.Wechat.Work.Models +{ + /// + /// 表示 [GET] /cgi-bin/corpgroup/corp/get_chain_corpinfo_list 接口的请求。 + /// + public class CgibinCorpGroupCropGetChainCorpInfoListRequest : WechatWorkRequest + { + /// + /// 获取或设置上下游 ID。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string ChainId { get; set; } = string.Empty; + + /// + /// 获取或设置分组 ID。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public int? GroupId { get; set; } + + /// + /// 获取或设置是否递归获取子分组企业。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public bool? RequireFetchChild { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinCorpGroup/CgibinCorpGroupCropGetChainCorpInfoListResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinCorpGroup/CgibinCorpGroupCropGetChainCorpInfoListResponse.cs new file mode 100644 index 00000000..a98967b2 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinCorpGroup/CgibinCorpGroupCropGetChainCorpInfoListResponse.cs @@ -0,0 +1,49 @@ +namespace SKIT.FlurlHttpClient.Wechat.Work.Models +{ + /// + /// 表示 [GET] /cgi-bin/corpgroup/corp/get_chain_corpinfo_list 接口的响应。 + /// + public class CgibinCorpGroupCropGetChainCorpInfoListResponse : WechatWorkResponse + { + public static class Types + { + public class GroupCorp + { + /// + /// 获取或设置分组 ID。 + /// + [Newtonsoft.Json.JsonProperty("groupid")] + [System.Text.Json.Serialization.JsonPropertyName("groupid")] + public int GroupId { get; set; } + + /// + /// 获取或设置企业 CorpId。 + /// + [Newtonsoft.Json.JsonProperty("corpid")] + [System.Text.Json.Serialization.JsonPropertyName("corpid")] + public string CorpId { get; set; } = default!; + + /// + /// 获取或设置企业名称。 + /// + [Newtonsoft.Json.JsonProperty("corp_name")] + [System.Text.Json.Serialization.JsonPropertyName("corp_name")] + public string CorpName { get; set; } = default!; + + /// + /// 获取或设置自定义 ID。 + /// + [Newtonsoft.Json.JsonProperty("custom_id")] + [System.Text.Json.Serialization.JsonPropertyName("custom_id")] + public string? CustomId { get; set; } + } + } + + /// + /// 获取或设置企业上下游通讯录分组下的企业详情列表。 + /// + [Newtonsoft.Json.JsonProperty("group_corps")] + [System.Text.Json.Serialization.JsonPropertyName("group_corps")] + public Types.GroupCorp[] GroupCorpList { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinCorpGroup/CgibinCorpGroupCropGetChainGroupRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinCorpGroup/CgibinCorpGroupCropGetChainGroupRequest.cs new file mode 100644 index 00000000..d01b054d --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinCorpGroup/CgibinCorpGroupCropGetChainGroupRequest.cs @@ -0,0 +1,15 @@ +namespace SKIT.FlurlHttpClient.Wechat.Work.Models +{ + /// + /// 表示 [POST] /cgi-bin/corpgroup/corp/get_chain_group 接口的请求。 + /// + public class CgibinCorpGroupCropGetChainGroupRequest : WechatWorkRequest + { + /// + /// 获取或设置上下游 ID。 + /// + [Newtonsoft.Json.JsonProperty("chain_id")] + [System.Text.Json.Serialization.JsonPropertyName("chain_id")] + public string ChainId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinCorpGroup/CgibinCorpGroupCropGetChainGroupResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinCorpGroup/CgibinCorpGroupCropGetChainGroupResponse.cs new file mode 100644 index 00000000..738134b0 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinCorpGroup/CgibinCorpGroupCropGetChainGroupResponse.cs @@ -0,0 +1,49 @@ +namespace SKIT.FlurlHttpClient.Wechat.Work.Models +{ + /// + /// 表示 [POST] /cgi-bin/corpgroup/corp/get_chain_group 接口的响应。 + /// + public class CgibinCorpGroupCropGetChainGroupResponse : WechatWorkResponse + { + public static class Types + { + public class Group + { + /// + /// 获取或设置分组 ID。 + /// + [Newtonsoft.Json.JsonProperty("groupid")] + [System.Text.Json.Serialization.JsonPropertyName("groupid")] + public int GroupId { get; set; } + + /// + /// 获取或设置分组名称。 + /// + [Newtonsoft.Json.JsonProperty("group_name")] + [System.Text.Json.Serialization.JsonPropertyName("group_name")] + public string GroupName { get; set; } = default!; + + /// + /// 获取或设置上级分组名称。 + /// + [Newtonsoft.Json.JsonProperty("parentid")] + [System.Text.Json.Serialization.JsonPropertyName("parentid")] + public int ParentGroupId { get; set; } + + /// + /// 获取或设置在上级分组中的次序值。 + /// + [Newtonsoft.Json.JsonProperty("order")] + [System.Text.Json.Serialization.JsonPropertyName("order")] + public long GroupOrder { get; set; } + } + } + + /// + /// 获取或设置企业上下游通讯录分组列表。 + /// + [Newtonsoft.Json.JsonProperty("groups")] + [System.Text.Json.Serialization.JsonPropertyName("groups")] + public Types.Group[] GroupList { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinCorpGroup/CgibinCorpGroupCropGetChainListRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinCorpGroup/CgibinCorpGroupCropGetChainListRequest.cs new file mode 100644 index 00000000..72dc37be --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinCorpGroup/CgibinCorpGroupCropGetChainListRequest.cs @@ -0,0 +1,9 @@ +namespace SKIT.FlurlHttpClient.Wechat.Work.Models +{ + /// + /// 表示 [GET] /cgi-bin/corpgroup/corp/get_chain_list 接口的请求。 + /// + public class CgibinCorpGroupCropGetChainListRequest : WechatWorkRequest + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinCorpGroup/CgibinCorpGroupCropGetChainListResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinCorpGroup/CgibinCorpGroupCropGetChainListResponse.cs new file mode 100644 index 00000000..04d9cd77 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinCorpGroup/CgibinCorpGroupCropGetChainListResponse.cs @@ -0,0 +1,35 @@ +namespace SKIT.FlurlHttpClient.Wechat.Work.Models +{ + /// + /// 表示 [GET] /cgi-bin/corpgroup/corp/get_chain_list 接口的响应。 + /// + public class CgibinCorpGroupCropGetChainListResponse : WechatWorkResponse + { + public static class Types + { + public class Chain + { + /// + /// 获取或设置上下游 ID。 + /// + [Newtonsoft.Json.JsonProperty("chain_id")] + [System.Text.Json.Serialization.JsonPropertyName("chain_id")] + public string ChainId { get; set; } = default!; + + /// + /// 获取或设置上下游名称。 + /// + [Newtonsoft.Json.JsonProperty("chain_name")] + [System.Text.Json.Serialization.JsonPropertyName("chain_name")] + public string ChainName { get; set; } = default!; + } + } + + /// + /// 获取或设置企业上下游列表。 + /// + [Newtonsoft.Json.JsonProperty("chains")] + [System.Text.Json.Serialization.JsonPropertyName("chains")] + public Types.Chain[] ChainList { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinCorpGroup/CgibinCorpGroupUnionidToExternalUserIdRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinCorpGroup/CgibinCorpGroupUnionidToExternalUserIdRequest.cs new file mode 100644 index 00000000..36063863 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinCorpGroup/CgibinCorpGroupUnionidToExternalUserIdRequest.cs @@ -0,0 +1,29 @@ +namespace SKIT.FlurlHttpClient.Wechat.Work.Models +{ + /// + /// 表示 [POST] /cgi-bin/corpgroup/unionid_to_external_userid 接口的请求。 + /// + public class CgibinCorpGroupUnionidToExternalUserIdRequest : WechatWorkRequest + { + /// + /// 获取或设置用户 UnionId。 + /// + [Newtonsoft.Json.JsonProperty("unionid")] + [System.Text.Json.Serialization.JsonPropertyName("unionid")] + public string? UnionId { get; set; } + + /// + /// 获取或设置用户 OpenId。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string? OpenId { get; set; } + + /// + /// 获取或设置需要换取的企业 CorpId。 + /// + [Newtonsoft.Json.JsonProperty("corpid")] + [System.Text.Json.Serialization.JsonPropertyName("corpid")] + public string? CorpId { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinCorpGroup/CgibinCorpGroupUnionidToExternalUserIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinCorpGroup/CgibinCorpGroupUnionidToExternalUserIdResponse.cs new file mode 100644 index 00000000..e327a5cb --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinCorpGroup/CgibinCorpGroupUnionidToExternalUserIdResponse.cs @@ -0,0 +1,35 @@ +namespace SKIT.FlurlHttpClient.Wechat.Work.Models +{ + /// + /// 表示 [POST] /cgi-bin/corpgroup/unionid_to_external_userid 接口的响应。 + /// + public class CgibinCorpGroupUnionidToExternalUserIdResponse : WechatWorkResponse + { + public static class Types + { + public class ExternalUser + { + /// + /// 获取或设置企业 CorpId。 + /// + [Newtonsoft.Json.JsonProperty("corpid")] + [System.Text.Json.Serialization.JsonPropertyName("corpid")] + public string CorpId { get; set; } = default!; + + /// + /// 获取或设置外部联系人账号。 + /// + [Newtonsoft.Json.JsonProperty("external_userid")] + [System.Text.Json.Serialization.JsonPropertyName("external_userid")] + public string ExternalUserId { get; set; } = default!; + } + } + + /// + /// 获取或设置外部联系人列表。 + /// + [Newtonsoft.Json.JsonProperty("external_userid_info")] + [System.Text.Json.Serialization.JsonPropertyName("external_userid_info")] + public Types.ExternalUser[] ExternalUserList { get; set; } = default!; + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinCorpGroup/CgibinCorpGroupCropGetChainCorpInfoListResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinCorpGroup/CgibinCorpGroupCropGetChainCorpInfoListResponse.json new file mode 100644 index 00000000..fbe6bebc --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinCorpGroup/CgibinCorpGroupCropGetChainCorpInfoListResponse.json @@ -0,0 +1,12 @@ +{ + "errcode": 0, + "errmsg": "ok", + "group_corps": [ + { + "groupid": 2, + "corpid": "wwxxxx", + "corp_name": "美馨粮油公司", + "custom_id": "wof3du51quo5sl1is" + } + ] +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinCorpGroup/CgibinCorpGroupCropGetChainGroupRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinCorpGroup/CgibinCorpGroupCropGetChainGroupRequest.json new file mode 100644 index 00000000..27f6648a --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinCorpGroup/CgibinCorpGroupCropGetChainGroupRequest.json @@ -0,0 +1,3 @@ +{ + "chain_id": "Chxxxxxx" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinCorpGroup/CgibinCorpGroupCropGetChainGroupResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinCorpGroup/CgibinCorpGroupCropGetChainGroupResponse.json new file mode 100644 index 00000000..2e0a1ddc --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinCorpGroup/CgibinCorpGroupCropGetChainGroupResponse.json @@ -0,0 +1,18 @@ +{ + "errcode": 0, + "errmsg": "ok", + "groups": [ + { + "groupid": 2, + "group_name": "一级经销商", + "parentid": 1, + "order": 1 + }, + { + "groupid": 3, + "group_name": "二级经销商", + "parentid": 2, + "order": 3 + } + ] +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinCorpGroup/CgibinCorpGroupCropGetChainListResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinCorpGroup/CgibinCorpGroupCropGetChainListResponse.json new file mode 100644 index 00000000..28f6d465 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinCorpGroup/CgibinCorpGroupCropGetChainListResponse.json @@ -0,0 +1,14 @@ +{ + "errcode": 0, + "errmsg": "ok", + "chains": [ + { + "chain_id": "chainid1", + "chain_name": "能源供应链" + }, + { + "chain_id": "chainid2", + "chain_name": "原材料供应链" + } + ] +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinCorpGroup/CgibinCorpGroupUnionidToExternalUserIdRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinCorpGroup/CgibinCorpGroupUnionidToExternalUserIdRequest.json new file mode 100644 index 00000000..a303a938 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinCorpGroup/CgibinCorpGroupUnionidToExternalUserIdRequest.json @@ -0,0 +1,5 @@ +{ + "unionid": "xxxxx", + "openid": "xxxxx", + "corpid": "xxxxx" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinCorpGroup/CgibinCorpGroupUnionidToExternalUserIdResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinCorpGroup/CgibinCorpGroupUnionidToExternalUserIdResponse.json new file mode 100644 index 00000000..86f68139 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinCorpGroup/CgibinCorpGroupUnionidToExternalUserIdResponse.json @@ -0,0 +1,14 @@ +{ + "errcode": 0, + "errmsg": "ok", + "external_userid_info": [ + { + "corpid": "AAAAA", + "external_userid": "BBBB" + }, + { + "corpid": "CCCCC", + "external_userid": "DDDDD" + } + ] +} \ No newline at end of file