diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinExternalContactExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinExternalContactExtensions.cs index e43b4b0b..4f06addb 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinExternalContactExtensions.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinExternalContactExtensions.cs @@ -1,7 +1,5 @@ using System; -using System.Collections.Generic; using System.Net.Http; -using System.Text; using System.Threading; using System.Threading.Tasks; using Flurl; @@ -674,6 +672,27 @@ namespace SKIT.FlurlHttpClient.Wechat.Work return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); } + /// + /// 异步调用 [POST] /cgi-bin/externalcontact/add_moment_task 接口。 + /// REF: https://open.work.weixin.qq.com/api/doc/90000/90135/95094 + /// REF: https://open.work.weixin.qq.com/api/doc/90001/90143/95095 + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinExternalContactAddMomentTaskAsync(this WechatWorkClient client, Models.CgibinExternalContactAddMomentTaskRequest 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", "externalcontact", "add_moment_task") + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + /// /// 异步调用 [POST] /cgi-bin/externalcontact/get_moment_task 接口。 /// REF: https://open.work.weixin.qq.com/api/doc/90000/90135/93333 @@ -695,6 +714,27 @@ namespace SKIT.FlurlHttpClient.Wechat.Work return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); } + /// + /// 异步调用 [POST] /cgi-bin/externalcontact/get_moment_task_result 接口。 + /// REF: https://open.work.weixin.qq.com/api/doc/90000/90135/95094 + /// REF: https://open.work.weixin.qq.com/api/doc/90001/90143/95095 + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinExternalContactGetMomentTaskResultAsync(this WechatWorkClient client, Models.CgibinExternalContactGetMomentTaskResultRequest 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", "externalcontact", "get_moment_task_result") + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + /// /// 异步调用 [POST] /cgi-bin/externalcontact/get_moment_customer_list 接口。 /// REF: https://open.work.weixin.qq.com/api/doc/90000/90135/93333 diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinExternalContact/Moment/CgibinExternalContactAddMomentTaskRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinExternalContact/Moment/CgibinExternalContactAddMomentTaskRequest.cs new file mode 100644 index 00000000..b6703a7e --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinExternalContact/Moment/CgibinExternalContactAddMomentTaskRequest.cs @@ -0,0 +1,169 @@ +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Work.Models +{ + /// + /// 表示 [POST] /cgi-bin/externalcontact/add_moment_task 接口的请求。 + /// + public class CgibinExternalContactAddMomentTaskRequest : WechatWorkRequest + { + public static class Types + { + public class Text + { + /// + /// 获取或设置文本消息内容。 + /// + [Newtonsoft.Json.JsonProperty("content")] + [System.Text.Json.Serialization.JsonPropertyName("content")] + public string Content { get; set; } = string.Empty; + } + + public class Attachment + { + public static class Types + { + public class Image + { + /// + /// 获取或设置图片 MediaId。 + /// + [Newtonsoft.Json.JsonProperty("media_id")] + [System.Text.Json.Serialization.JsonPropertyName("media_id")] + public string MediaId { get; set; } = string.Empty; + } + + public class Link + { + /// + /// 获取或设置图文消息标题。 + /// + [Newtonsoft.Json.JsonProperty("title")] + [System.Text.Json.Serialization.JsonPropertyName("title")] + public string Title { get; set; } = string.Empty; + + /// + /// 获取或设置图文消息 URL。 + /// + [Newtonsoft.Json.JsonProperty("url")] + [System.Text.Json.Serialization.JsonPropertyName("url")] + public string Url { get; set; } = string.Empty; + + /// + /// 获取或设置图文消息封面 MediaId。。 + /// + [Newtonsoft.Json.JsonProperty("media_id")] + [System.Text.Json.Serialization.JsonPropertyName("media_id")] + public string? PictureMediaId { get; set; } + } + + public class Video + { + /// + /// 获取或设置视频 MediaId。 + /// + [Newtonsoft.Json.JsonProperty("media_id")] + [System.Text.Json.Serialization.JsonPropertyName("media_id")] + public string MediaId { get; set; } = string.Empty; + } + } + + /// + /// 获取或设置附件类型。 + /// + [Newtonsoft.Json.JsonProperty("msgtype")] + [System.Text.Json.Serialization.JsonPropertyName("msgtype")] + public string Type { get; set; } = string.Empty; + + /// + /// 获取或设置图片附件信息。 + /// + [Newtonsoft.Json.JsonProperty("image")] + [System.Text.Json.Serialization.JsonPropertyName("image")] + public Types.Image? Image { get; set; } + + /// + /// 获取或设置图文消息附件信息。 + /// + [Newtonsoft.Json.JsonProperty("link")] + [System.Text.Json.Serialization.JsonPropertyName("link")] + public Types.Link? Link { get; set; } + + /// + /// 获取或设置视频附件信息。 + /// + [Newtonsoft.Json.JsonProperty("video")] + [System.Text.Json.Serialization.JsonPropertyName("video")] + public Types.Video? Video { get; set; } + } + + public class VisibleRange + { + public static class Types + { + public class Sender + { + /// + /// 获取或设置发表任务的执行者用户 ID 列表。 + /// + [Newtonsoft.Json.JsonProperty("user_list")] + [System.Text.Json.Serialization.JsonPropertyName("user_list")] + public IList? UserIdList { get; set; } + + /// + /// 获取或设置发表任务的执行者部门 ID 列表。 + /// + [Newtonsoft.Json.JsonProperty("department_list")] + [System.Text.Json.Serialization.JsonPropertyName("department_list")] + public IList? DepartmentIdList { get; set; } + } + + public class ExternalContact + { + /// + /// 获取或设置可见到该朋友圈的客户标签 ID 列表。 + /// + [Newtonsoft.Json.JsonProperty("tag_list")] + [System.Text.Json.Serialization.JsonPropertyName("tag_list")] + public IList? TagIdList { get; set; } + } + } + + /// + /// 获取或设置发表任务的执行者信息。 + /// + [Newtonsoft.Json.JsonProperty("sender_list")] + [System.Text.Json.Serialization.JsonPropertyName("sender_list")] + public Types.Sender? Sender { get; set; } + + /// + /// 获取或设置可见到该朋友圈的客户信息。 + /// + [Newtonsoft.Json.JsonProperty("external_contact_list")] + [System.Text.Json.Serialization.JsonPropertyName("external_contact_list")] + public Types.ExternalContact? ExternalContact { get; set; } + } + } + + /// + /// 获取或设置文本消息信息。 + /// + [Newtonsoft.Json.JsonProperty("text")] + [System.Text.Json.Serialization.JsonPropertyName("text")] + public Types.Text? Text { get; set; } + + /// + /// 获取或设置附件列表。 + /// + [Newtonsoft.Json.JsonProperty("attachments")] + [System.Text.Json.Serialization.JsonPropertyName("attachments")] + public IList? AttachmentList { get; set; } + + /// + /// 获取或设置发表范围信息。 + /// + [Newtonsoft.Json.JsonProperty("visible_range")] + [System.Text.Json.Serialization.JsonPropertyName("visible_range")] + public Types.VisibleRange? VisibleRange { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinExternalContact/Moment/CgibinExternalContactAddMomentTaskResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinExternalContact/Moment/CgibinExternalContactAddMomentTaskResponse.cs new file mode 100644 index 00000000..2f46d2f0 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinExternalContact/Moment/CgibinExternalContactAddMomentTaskResponse.cs @@ -0,0 +1,15 @@ +namespace SKIT.FlurlHttpClient.Wechat.Work.Models +{ + /// + /// 表示 [POST] /cgi-bin/externalcontact/add_moment_task 接口的响应。 + /// + public class CgibinExternalContactAddMomentTaskResponse : WechatWorkResponse + { + /// + /// 获取或设置异步任务 ID。 + /// + [Newtonsoft.Json.JsonProperty("jobid")] + [System.Text.Json.Serialization.JsonPropertyName("jobid")] + public string JobId { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinExternalContact/Moment/CgibinExternalContactGetMomentTaskResultRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinExternalContact/Moment/CgibinExternalContactGetMomentTaskResultRequest.cs new file mode 100644 index 00000000..64da889d --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinExternalContact/Moment/CgibinExternalContactGetMomentTaskResultRequest.cs @@ -0,0 +1,15 @@ +namespace SKIT.FlurlHttpClient.Wechat.Work.Models +{ + /// + /// 表示 [POST] /cgi-bin/externalcontact/get_moment_task_result 接口的请求。 + /// + public class CgibinExternalContactGetMomentTaskResultRequest : WechatWorkRequest + { + /// + /// 获取或设置异步任务 ID。 + /// + [Newtonsoft.Json.JsonProperty("jobid")] + [System.Text.Json.Serialization.JsonPropertyName("jobid")] + public string JobId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinExternalContact/Moment/CgibinExternalContactGetMomentTaskResultResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinExternalContact/Moment/CgibinExternalContactGetMomentTaskResultResponse.cs new file mode 100644 index 00000000..6f05a69c --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinExternalContact/Moment/CgibinExternalContactGetMomentTaskResultResponse.cs @@ -0,0 +1,100 @@ +namespace SKIT.FlurlHttpClient.Wechat.Work.Models +{ + /// + /// 表示 [POST] /cgi-bin/externalcontact/get_moment_task_result 接口的响应。 + /// + public class CgibinExternalContactGetMomentTaskResultResponse : WechatWorkResponse + { + public static class Types + { + public class Result + { + public static class Types + { + public class Sender + { + /// + /// 获取或设置发表任务的执行者用户 ID 列表。 + /// + [Newtonsoft.Json.JsonProperty("user_list")] + [System.Text.Json.Serialization.JsonPropertyName("user_list")] + public string[]? UserIdList { get; set; } + + /// + /// 获取或设置发表任务的执行者部门 ID 列表。 + /// + [Newtonsoft.Json.JsonProperty("department_list")] + [System.Text.Json.Serialization.JsonPropertyName("department_list")] + public int[]? DepartmentIdList { get; set; } + } + + public class ExternalContact + { + /// + /// 获取或设置可见到该朋友圈的客户标签 ID 列表。 + /// + [Newtonsoft.Json.JsonProperty("tag_list")] + [System.Text.Json.Serialization.JsonPropertyName("tag_list")] + public int[]? TagIdList { 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; } = default!; + + /// + /// 获取或设置朋友圈 ID。 + /// + [Newtonsoft.Json.JsonProperty("moment_id")] + [System.Text.Json.Serialization.JsonPropertyName("moment_id")] + public string MomentId { get; set; } = default!; + + /// + /// 获取或设置不合法的执行者信息。 + /// + [Newtonsoft.Json.JsonProperty("invalid_sender_list")] + [System.Text.Json.Serialization.JsonPropertyName("invalid_sender_list")] + public Types.Sender? InvalidSender { get; set; } + + /// + /// 获取或设置不合法的客户信息。 + /// + [Newtonsoft.Json.JsonProperty("invalid_external_contact_list")] + [System.Text.Json.Serialization.JsonPropertyName("invalid_external_contact_list")] + public Types.ExternalContact? InvalidExternalContact { get; set; } + } + } + + /// + /// 获取或设置操作类型。 + /// + [Newtonsoft.Json.JsonProperty("type")] + [System.Text.Json.Serialization.JsonPropertyName("type")] + public string Type { get; set; } = default!; + + /// + /// 获取或设置任务状态。 + /// + [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; } = default!; + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinExternalContact/Moment/CgibinExternalContactAddMomentTaskRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinExternalContact/Moment/CgibinExternalContactAddMomentTaskRequest.json new file mode 100644 index 00000000..536e8244 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinExternalContact/Moment/CgibinExternalContactAddMomentTaskRequest.json @@ -0,0 +1,45 @@ +{ + "text": { + "content": "文本消息内容" + }, + "attachments": [ + { + "msgtype": "image", + "image": { + "media_id": "MEDIA_ID" + } + }, + { + "msgtype": "video", + "video": { + "media_id": "MEDIA_ID" + } + }, + { + "msgtype": "link", + "link": { + "title": "消息标题", + "url": "https://example.link.com/path", + "media_id": "MEDIA_ID" + } + } + ], + "visible_range": { + "sender_list": { + "user_list": [ + "zhangshan", + "lisi" + ], + "department_list": [ + 2, + 3 + ] + }, + "external_contact_list": { + "tag_list": [ + 1, + 2 + ] + } + } +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinExternalContact/Moment/CgibinExternalContactAddMomentTaskResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinExternalContact/Moment/CgibinExternalContactAddMomentTaskResponse.json new file mode 100644 index 00000000..ebb5da8e --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinExternalContact/Moment/CgibinExternalContactAddMomentTaskResponse.json @@ -0,0 +1,5 @@ +{ + "errcode":0, + "errmsg":"ok", + "jobid":"xxxx" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinExternalContact/Moment/CgibinExternalContactGetMomentTaskResultRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinExternalContact/Moment/CgibinExternalContactGetMomentTaskResultRequest.json new file mode 100644 index 00000000..de64de48 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinExternalContact/Moment/CgibinExternalContactGetMomentTaskResultRequest.json @@ -0,0 +1,3 @@ +{ + "jobid": "xxxx" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinExternalContact/Moment/CgibinExternalContactGetMomentTaskResultResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinExternalContact/Moment/CgibinExternalContactGetMomentTaskResultResponse.json new file mode 100644 index 00000000..5d216200 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinExternalContact/Moment/CgibinExternalContactGetMomentTaskResultResponse.json @@ -0,0 +1,26 @@ +{ + "errcode": 0, + "errmsg": "ok", + "status": 1, + "type": "add_moment_task", + "result": { + "errcode": 0, + "errmsg": "ok", + "moment_id": "xxxx", + "invalid_sender_list": { + "user_list": [ + "zhangshan", + "lisi" + ], + "department_list": [ + 2, + 3 + ] + }, + "invalid_external_contact_list": { + "tag_list": [ + 1 + ] + } + } +} \ No newline at end of file