😎优化代码
This commit is contained in:
parent
7f4aee2465
commit
90468581fa
@ -9,7 +9,8 @@ namespace Admin.NET.Core;
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Http远程服务扩展
|
/// Http远程服务扩展
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static class HttpRemotesExtension {
|
public static class HttpRemotesExtension
|
||||||
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 添加Http远程服务
|
/// 添加Http远程服务
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -22,12 +23,13 @@ public static class HttpRemotesExtension {
|
|||||||
{
|
{
|
||||||
if (prop.GetValue(options) is not HttpRemoteItem opt) continue;
|
if (prop.GetValue(options) is not HttpRemoteItem opt) continue;
|
||||||
services.AddHttpClient(opt.HttpName, client =>
|
services.AddHttpClient(opt.HttpName, client =>
|
||||||
|
{
|
||||||
|
client.BaseAddress = new Uri(opt.BaseAddress);
|
||||||
|
client.Timeout = TimeSpan.FromSeconds(opt.Timeout);
|
||||||
|
foreach (var kv in opt.Headers) client.DefaultRequestHeaders.Add(kv.Key, kv.Value);
|
||||||
|
})
|
||||||
|
.ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler
|
||||||
{
|
{
|
||||||
client.BaseAddress = new Uri(opt.BaseAddress);
|
|
||||||
client.Timeout = TimeSpan.FromSeconds(opt.Timeout);
|
|
||||||
foreach (var kv in opt.Headers) client.DefaultRequestHeaders.Add(kv.Key, kv.Value);
|
|
||||||
})
|
|
||||||
.ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler {
|
|
||||||
UseCookies = opt.UseCookies
|
UseCookies = opt.UseCookies
|
||||||
})
|
})
|
||||||
.AddHttpMessageHandler<HttpLoggingHandler>();
|
.AddHttpMessageHandler<HttpLoggingHandler>();
|
||||||
|
|||||||
@ -12,7 +12,48 @@ namespace Admin.NET.Core;
|
|||||||
public sealed class HttpRemotesOptions : IConfigurableOptions
|
public sealed class HttpRemotesOptions : IConfigurableOptions
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 企业微信接口配置
|
/// 企业微信接
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public HttpRemoteItem WorkWeixin { get; set; }
|
public HttpRemoteItem WorkWeixin { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 远程请求配置项
|
||||||
|
/// </summary>
|
||||||
|
public sealed class HttpRemoteItem
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 是否启用日志
|
||||||
|
/// </summary>
|
||||||
|
public bool EnabledLog { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否启用代理
|
||||||
|
/// </summary>
|
||||||
|
public bool EnabledProxy { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 服务名称
|
||||||
|
/// </summary>
|
||||||
|
public string HttpName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 服务地址
|
||||||
|
/// </summary>
|
||||||
|
public string BaseAddress { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 请求超时时间
|
||||||
|
/// </summary>
|
||||||
|
public int Timeout { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否自动处理Cookie
|
||||||
|
/// </summary>
|
||||||
|
public bool UseCookies { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 请求头
|
||||||
|
/// </summary>
|
||||||
|
public Dictionary<string, string> Headers { get; set; }
|
||||||
|
}
|
||||||
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json",
|
||||||
|
|
||||||
|
"WorkWeixin": {
|
||||||
|
"CorpId": "xxxx", // 企业ID
|
||||||
|
"CorpSecret": "xxxx" // 企业微信凭证密钥
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -8,6 +8,11 @@ global using Admin.NET.Core;
|
|||||||
global using Admin.NET.Core.Service;
|
global using Admin.NET.Core.Service;
|
||||||
global using Furion;
|
global using Furion;
|
||||||
global using Furion.DependencyInjection;
|
global using Furion.DependencyInjection;
|
||||||
|
global using Furion.EventBus;
|
||||||
global using Furion.HttpRemote;
|
global using Furion.HttpRemote;
|
||||||
|
global using Lazy.Captcha.Core;
|
||||||
|
global using Microsoft.AspNetCore.Http;
|
||||||
|
global using Microsoft.AspNetCore.Mvc;
|
||||||
global using Newtonsoft.Json;
|
global using Newtonsoft.Json;
|
||||||
global using System.ComponentModel.DataAnnotations;
|
global using System.ComponentModel.DataAnnotations;
|
||||||
|
global using System.Text.Json.Serialization;
|
||||||
@ -0,0 +1,25 @@
|
|||||||
|
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
|
||||||
|
//
|
||||||
|
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
|
||||||
|
//
|
||||||
|
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
|
||||||
|
|
||||||
|
using Furion.ConfigurableOptions;
|
||||||
|
|
||||||
|
namespace Admin.NET.Plugin.WorkWeixin.Option;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 企业微信配置项
|
||||||
|
/// </summary>
|
||||||
|
public class WorkWeixinOptions : IConfigurableOptions
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 企业ID
|
||||||
|
/// </summary>
|
||||||
|
public string CorpId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 企业微信凭证密钥
|
||||||
|
/// </summary>
|
||||||
|
public string CorpSecret { get; set; }
|
||||||
|
}
|
||||||
@ -0,0 +1,425 @@
|
|||||||
|
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
|
||||||
|
//
|
||||||
|
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
|
||||||
|
//
|
||||||
|
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
|
||||||
|
|
||||||
|
namespace Admin.NET.Plugin.WorkWeixin.Proxy;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 创建群聊会话输入参数
|
||||||
|
/// </summary>
|
||||||
|
public class CreatAppChatInput
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 群名称
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("name")]
|
||||||
|
[JsonPropertyName("name")]
|
||||||
|
[Required(ErrorMessage = "群名称不能为空"), MaxLength(50, ErrorMessage = "群名称最多不能超过50个字符")]
|
||||||
|
public string Name { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 群主Id
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("owner")]
|
||||||
|
[JsonPropertyName("owner")]
|
||||||
|
[Required(ErrorMessage = "群主Id不能为空")]
|
||||||
|
public string Owner { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 群成员Id列表
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("userlist")]
|
||||||
|
[JsonPropertyName("userlist")]
|
||||||
|
[NotEmpty(ErrorMessage = "群成员列表不能为空")]
|
||||||
|
public List<string> UserList { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 群Id
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("chatid")]
|
||||||
|
[JsonPropertyName("chatid")]
|
||||||
|
[Required(ErrorMessage = "群Id不能为空"), MaxLength(32, ErrorMessage = "群Id最多不能超过32个字符")]
|
||||||
|
public string ChatId { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 修改群聊会话输入参数
|
||||||
|
/// </summary>
|
||||||
|
public class UpdateAppChatInput
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 群Id
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("chatid")]
|
||||||
|
[JsonPropertyName("chatid")]
|
||||||
|
[Required(ErrorMessage = "群Id不能为空"), MaxLength(32, ErrorMessage = "群Id最多不能超过32个字符")]
|
||||||
|
public string ChatId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 群名称
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("name")]
|
||||||
|
[JsonPropertyName("name")]
|
||||||
|
[Required(ErrorMessage = "群名称不能为空"), MaxLength(50, ErrorMessage = "群名称最多不能超过50个字符")]
|
||||||
|
public string Name { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 群主Id
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("owner")]
|
||||||
|
[JsonPropertyName("owner")]
|
||||||
|
[Required(ErrorMessage = "群主Id不能为空")]
|
||||||
|
public string Owner { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 添加成员的id列表
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("add_user_list")]
|
||||||
|
[JsonPropertyName("add_user_list")]
|
||||||
|
public List<string> AddUserList { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 踢出成员的id列表
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("del_user_list")]
|
||||||
|
[JsonPropertyName("del_user_list")]
|
||||||
|
public List<string> DelUserList { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 应用消息推送输入基类参数
|
||||||
|
/// </summary>
|
||||||
|
public class SendBaseAppChatInput
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 群Id
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("chatid")]
|
||||||
|
[JsonPropertyName("chatid")]
|
||||||
|
[Required(ErrorMessage = "群Id不能为空"), MaxLength(32, ErrorMessage = "群Id最多不能超过32个字符")]
|
||||||
|
public string ChatId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 消息类型
|
||||||
|
/// </summary>
|
||||||
|
/// <example>text:文本消息</example>
|
||||||
|
/// <example>image:图片消息</example>
|
||||||
|
/// <example>voice:图片消息</example>
|
||||||
|
/// <example>video:视频消息</example>
|
||||||
|
/// <example>file:文件消息</example>
|
||||||
|
/// <example>textcard:文本卡片</example>
|
||||||
|
/// <example>news:图文消息</example>
|
||||||
|
/// <example>mpnews:图文消息(存储在企业微信)</example>
|
||||||
|
/// <example>markdown:markdown消息</example>
|
||||||
|
[JsonProperty("msgtype")]
|
||||||
|
[JsonPropertyName("msgtype")]
|
||||||
|
[Required(ErrorMessage = "消息类型不能为空")]
|
||||||
|
protected string MsgType { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否是保密消息
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("safe")]
|
||||||
|
[JsonPropertyName("safe")]
|
||||||
|
[Required(ErrorMessage = "消息类型不能为空")]
|
||||||
|
public int Safe { get; set; }
|
||||||
|
|
||||||
|
public SendBaseAppChatInput(string chatId, string msgType, bool safe = false)
|
||||||
|
{
|
||||||
|
ChatId = chatId;
|
||||||
|
MsgType = msgType;
|
||||||
|
Safe = safe ? 1 : 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 推送文本消息输入参数
|
||||||
|
/// </summary>
|
||||||
|
public class SendTextAppChatInput : SendBaseAppChatInput
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 消息内容
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("text")]
|
||||||
|
[JsonPropertyName("text")]
|
||||||
|
public object Text { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 文本消息
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="chatId"></param>
|
||||||
|
/// <param name="content"></param>
|
||||||
|
/// <param name="safe"></param>
|
||||||
|
public SendTextAppChatInput(string chatId, string content, bool safe = false) : base(chatId, "text", safe)
|
||||||
|
{
|
||||||
|
Text = new { content };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 推送图片消息输入参数
|
||||||
|
/// </summary>
|
||||||
|
public class SendImageAppChatInput : SendBaseAppChatInput
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 消息内容
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("image")]
|
||||||
|
[JsonPropertyName("image")]
|
||||||
|
public object Image { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 图片消息
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="chatId"></param>
|
||||||
|
/// <param name="mediaId"></param>
|
||||||
|
/// <param name="safe"></param>
|
||||||
|
public SendImageAppChatInput(string chatId, string mediaId, bool safe = false) : base(chatId, "image", safe)
|
||||||
|
{
|
||||||
|
Image = new { media_id = mediaId };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 推送语音消息输入参数
|
||||||
|
/// </summary>
|
||||||
|
public class SendVoiceAppChatInput : SendBaseAppChatInput
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 消息内容
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("voice")]
|
||||||
|
[JsonPropertyName("voice")]
|
||||||
|
public object Voice { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 语音消息
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="chatId"></param>
|
||||||
|
/// <param name="mediaId"></param>
|
||||||
|
/// <param name="safe"></param>
|
||||||
|
public SendVoiceAppChatInput(string chatId, string mediaId, bool safe = false) : base(chatId, "voice", safe)
|
||||||
|
{
|
||||||
|
Voice = new { media_id = mediaId };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 推送视频消息输入参数
|
||||||
|
/// </summary>
|
||||||
|
public class SendVideoAppChatInput : SendBaseAppChatInput
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 消息内容
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("video")]
|
||||||
|
[JsonPropertyName("video")]
|
||||||
|
public object Video { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 视频消息
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="chatId"></param>
|
||||||
|
/// <param name="title"></param>
|
||||||
|
/// <param name="description"></param>
|
||||||
|
/// <param name="mediaId"></param>
|
||||||
|
/// <param name="safe"></param>
|
||||||
|
public SendVideoAppChatInput(string chatId, string title, string description, string mediaId, bool safe = false) : base(chatId, "video", safe)
|
||||||
|
{
|
||||||
|
Video = new
|
||||||
|
{
|
||||||
|
media_id = mediaId,
|
||||||
|
description,
|
||||||
|
title
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 推送视频消息输入参数
|
||||||
|
/// </summary>
|
||||||
|
public class SendFileAppChatInput : SendBaseAppChatInput
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 消息内容
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("file")]
|
||||||
|
[JsonPropertyName("file")]
|
||||||
|
public object File { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 文件消息
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="chatId"></param>
|
||||||
|
/// <param name="mediaId"></param>
|
||||||
|
/// <param name="safe"></param>
|
||||||
|
public SendFileAppChatInput(string chatId, string mediaId, bool safe = false) : base(chatId, "video", safe)
|
||||||
|
{
|
||||||
|
File = new { media_id = mediaId };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 推送文本卡片消息输入参数
|
||||||
|
/// </summary>
|
||||||
|
public class SendTextCardAppChatInput : SendBaseAppChatInput
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 消息内容
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("textcard")]
|
||||||
|
[JsonPropertyName("textcard")]
|
||||||
|
public object TextCard { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 文本卡片消息
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="chatId"></param>
|
||||||
|
/// <param name="title">标题</param>
|
||||||
|
/// <param name="description">描述</param>
|
||||||
|
/// <param name="url">点击后跳转的链接</param>
|
||||||
|
/// <param name="btnTxt">按钮文字</param>
|
||||||
|
/// <param name="safe"></param>
|
||||||
|
public SendTextCardAppChatInput(string chatId, string title, string description, string url, string btnTxt, bool safe = false) : base(chatId, "textcard", safe)
|
||||||
|
{
|
||||||
|
TextCard = new
|
||||||
|
{
|
||||||
|
title,
|
||||||
|
description,
|
||||||
|
url,
|
||||||
|
btntxt = btnTxt
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 图文消息项
|
||||||
|
/// </summary>
|
||||||
|
public class SendNewsItem
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 标题
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("title")]
|
||||||
|
[JsonPropertyName("title")]
|
||||||
|
public string Title { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 描述
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("description")]
|
||||||
|
[JsonPropertyName("description")]
|
||||||
|
public string Description { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 描述
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("url")]
|
||||||
|
[JsonPropertyName("url")]
|
||||||
|
public string Url { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 图文消息的图片链接(推荐大图1068 * 455,小图150 * 150)
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("picurl")]
|
||||||
|
[JsonPropertyName("picurl")]
|
||||||
|
public string PicUrl { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 推送图文消息输入参数
|
||||||
|
/// </summary>
|
||||||
|
public class SendNewsAppChatInput : SendBaseAppChatInput
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 消息内容
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("news")]
|
||||||
|
[JsonPropertyName("news")]
|
||||||
|
public object News { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 图文消息
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="chatId"></param>
|
||||||
|
/// <param name="newsList">图文消息列表</param>
|
||||||
|
/// <param name="safe"></param>
|
||||||
|
public SendNewsAppChatInput(string chatId, List<SendNewsItem> newsList, bool safe = false) : base(chatId, "news", safe)
|
||||||
|
{
|
||||||
|
News = new { articles = newsList };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 图文消息项
|
||||||
|
/// </summary>
|
||||||
|
public class SendMpNewsItem
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 标题
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("title")]
|
||||||
|
[JsonPropertyName("title")]
|
||||||
|
public string Title { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 缩略图media_id
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("thumb_media_id")]
|
||||||
|
[JsonPropertyName("thumb_media_id")]
|
||||||
|
public string ThumbMediaId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 作者
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("author")]
|
||||||
|
[JsonPropertyName("author")]
|
||||||
|
public string Author { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 点击“阅读原文”之后的页面链接
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("content_source_url")]
|
||||||
|
[JsonPropertyName("content_source_url")]
|
||||||
|
public string ContentSourceUrl { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 图文消息的内容
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("content")]
|
||||||
|
[JsonPropertyName("content")]
|
||||||
|
public string Content { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 图文消息的描述
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("digest")]
|
||||||
|
[JsonPropertyName("digest")]
|
||||||
|
public string Digest { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 推送图文消息(存储在企业微信)输入参数
|
||||||
|
/// </summary>
|
||||||
|
public class SendMpNewsAppChatInput : SendBaseAppChatInput
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 消息内容
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("mpnews")]
|
||||||
|
[JsonPropertyName("mpnews")]
|
||||||
|
public object MpNews { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 图文消息
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="chatId"></param>
|
||||||
|
/// <param name="mpNewsList">图文消息列表</param>
|
||||||
|
/// <param name="safe"></param>
|
||||||
|
public SendMpNewsAppChatInput(string chatId, List<SendMpNewsItem> mpNewsList, bool safe = false) : base(chatId, "mpnews", safe)
|
||||||
|
{
|
||||||
|
MpNews = new { articles = mpNewsList };
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,17 @@
|
|||||||
|
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
|
||||||
|
//
|
||||||
|
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
|
||||||
|
//
|
||||||
|
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
|
||||||
|
|
||||||
|
namespace Admin.NET.Plugin.WorkWeixin.Proxy;
|
||||||
|
|
||||||
|
public class CreatAppChatOutput : BaseWorkOutput
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 群聊的唯一标志
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("chatid")]
|
||||||
|
[JsonPropertyName("chatid")]
|
||||||
|
public string ChatId { get; set; }
|
||||||
|
}
|
||||||
@ -0,0 +1,53 @@
|
|||||||
|
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
|
||||||
|
//
|
||||||
|
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
|
||||||
|
//
|
||||||
|
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
|
||||||
|
|
||||||
|
namespace Admin.NET.Plugin.WorkWeixin.Proxy.AppChat;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 群聊会话远程调用服务
|
||||||
|
/// </summary>
|
||||||
|
public interface IWorkWeixinAppChatHttp : IHttpDeclarative
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 创建群聊会话
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="accessToken"></param>
|
||||||
|
/// <param name="body"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
/// <inheritdoc cref="https://developer.work.weixin.qq.com/document/path/90245"/>
|
||||||
|
[Post("https://qyapi.weixin.qq.com/cgi-bin/appchat/create")]
|
||||||
|
Task<CreatAppChatOutput> Create([Query("access_token")] string accessToken, [Body] CreatAppChatInput body);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 修改群聊会话
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="accessToken"></param>
|
||||||
|
/// <param name="body"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
/// <inheritdoc cref="https://developer.work.weixin.qq.com/document/path/98913"/>
|
||||||
|
[Post("https://qyapi.weixin.qq.com/cgi-bin/appchat/update")]
|
||||||
|
Task<CreatAppChatOutput> Update([Query("access_token")] string accessToken, [Body] UpdateAppChatInput body);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取群聊会话
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="accessToken"></param>
|
||||||
|
/// <param name="chatId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
/// <inheritdoc cref="https://developer.work.weixin.qq.com/document/path/98914"/>
|
||||||
|
[Get("https://qyapi.weixin.qq.com/cgi-bin/appchat/get")]
|
||||||
|
Task<CreatAppChatOutput> Get([Query("access_token")] string accessToken, [Query("chatid")] string chatId);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 应用推送消息
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="accessToken"></param>
|
||||||
|
/// <param name="body"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
/// <inheritdoc cref="https://developer.work.weixin.qq.com/document/path/90248"/>
|
||||||
|
[Post("https://qyapi.weixin.qq.com/cgi-bin/appchat/send")]
|
||||||
|
Task<BaseWorkOutput> Send([Query("access_token")] string accessToken, [Body] SendBaseAppChatInput body);
|
||||||
|
}
|
||||||
@ -0,0 +1,24 @@
|
|||||||
|
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
|
||||||
|
//
|
||||||
|
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
|
||||||
|
//
|
||||||
|
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
|
||||||
|
|
||||||
|
namespace Admin.NET.Plugin.WorkWeixin.Proxy;
|
||||||
|
|
||||||
|
public class AuthAccessTokenHttpOutput : BaseWorkOutput
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 获取到的凭证
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("access_token")]
|
||||||
|
[JsonPropertyName("access_token")]
|
||||||
|
public string AccessToken { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 凭证的有效时间(秒)
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("expires_in")]
|
||||||
|
[JsonPropertyName("expires_in")]
|
||||||
|
public int ExpiresIn { get; set; }
|
||||||
|
}
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
|
||||||
|
//
|
||||||
|
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
|
||||||
|
//
|
||||||
|
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
|
||||||
|
|
||||||
|
namespace Admin.NET.Plugin.WorkWeixin.Proxy.AppChat;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 授权会话远程服务
|
||||||
|
/// </summary>
|
||||||
|
public interface IWorkWeixinAuthHttp : IHttpDeclarative
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 获取接口凭证
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="corpId">企业ID</param>
|
||||||
|
/// <param name="corpSecret">应用的凭证密钥</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
/// <inheritdoc cref="https://developer.work.weixin.qq.com/document/path/91039"/>
|
||||||
|
[Post("https://qyapi.weixin.qq.com/cgi-bin/gettoken")]
|
||||||
|
Task<AuthAccessTokenHttpOutput> GetToken([Query("corpid")] string corpId, [Query("corpsecret")] string corpSecret);
|
||||||
|
}
|
||||||
@ -0,0 +1,48 @@
|
|||||||
|
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
|
||||||
|
//
|
||||||
|
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
|
||||||
|
//
|
||||||
|
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
|
||||||
|
|
||||||
|
namespace Admin.NET.Plugin.WorkWeixin.Proxy;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 创建部门输入参数
|
||||||
|
/// </summary>
|
||||||
|
public class DepartmentHttpInput
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 部门名称
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("id")]
|
||||||
|
[JsonPropertyName("id")]
|
||||||
|
public long? Id { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 父部门id
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("parentid")]
|
||||||
|
[JsonPropertyName("parentid")]
|
||||||
|
public long? ParentId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 部门名称
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("name")]
|
||||||
|
[JsonPropertyName("name")]
|
||||||
|
public string Name { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 英文名称
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("name_en")]
|
||||||
|
[JsonPropertyName("name_en")]
|
||||||
|
public string NameEn { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 序号
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("order")]
|
||||||
|
[JsonPropertyName("order")]
|
||||||
|
public int? Order { get; set; }
|
||||||
|
}
|
||||||
@ -0,0 +1,95 @@
|
|||||||
|
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
|
||||||
|
//
|
||||||
|
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
|
||||||
|
//
|
||||||
|
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
|
||||||
|
|
||||||
|
namespace Admin.NET.Plugin.WorkWeixin.Proxy;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 部门Id列表输出参数
|
||||||
|
/// </summary>
|
||||||
|
public class DepartmentIdOutput : BaseWorkOutput
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// id
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("department_id")]
|
||||||
|
[JsonPropertyName("department_id")]
|
||||||
|
public List<DepartmentItemOutput> DepartmentList { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 部门Id输出参数
|
||||||
|
/// </summary>
|
||||||
|
public class DepartmentItemOutput
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 部门名称
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("id")]
|
||||||
|
[JsonPropertyName("id")]
|
||||||
|
public long? Id { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 父部门id
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("parentid")]
|
||||||
|
[JsonPropertyName("parentid")]
|
||||||
|
public long? ParentId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 序号
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("order")]
|
||||||
|
[JsonPropertyName("order")]
|
||||||
|
public int? Order { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 部门输出参数
|
||||||
|
/// </summary>
|
||||||
|
public class DepartmentOutput
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 部门名称
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("id")]
|
||||||
|
[JsonPropertyName("id")]
|
||||||
|
public long? Id { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 父部门id
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("parentid")]
|
||||||
|
[JsonPropertyName("parentid")]
|
||||||
|
public long? ParentId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 部门名称
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("name")]
|
||||||
|
[JsonPropertyName("name")]
|
||||||
|
public string Name { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 英文名称
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("name_en")]
|
||||||
|
[JsonPropertyName("name_en")]
|
||||||
|
public string NameEn { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 部门负责人列表
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("department_leader")]
|
||||||
|
[JsonPropertyName("department_leader")]
|
||||||
|
public List<string> Leaders { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 序号
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("order")]
|
||||||
|
[JsonPropertyName("order")]
|
||||||
|
public int? Order { get; set; }
|
||||||
|
}
|
||||||
@ -0,0 +1,63 @@
|
|||||||
|
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
|
||||||
|
//
|
||||||
|
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
|
||||||
|
//
|
||||||
|
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
|
||||||
|
|
||||||
|
namespace Admin.NET.Plugin.WorkWeixin.Proxy.AppChat;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 部门远程调用服务
|
||||||
|
/// </summary>
|
||||||
|
public interface IDepartmentHttp : IHttpDeclarative
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 创建部门
|
||||||
|
/// https://developer.work.weixin.qq.com/document/path/90205
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="accessToken"></param>
|
||||||
|
/// <param name="body"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[Post("https://qyapi.weixin.qq.com/cgi-bin/department/create")]
|
||||||
|
Task<BaseWorkIdOutput> Create([Query("access_token")] string accessToken, [Body] DepartmentHttpInput body);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 修改部门
|
||||||
|
/// https://developer.work.weixin.qq.com/document/path/90206
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="accessToken"></param>
|
||||||
|
/// <param name="body"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[Post("https://qyapi.weixin.qq.com/cgi-bin/department/update")]
|
||||||
|
Task<BaseWorkOutput> Update([Query("access_token")] string accessToken, [Body] DepartmentHttpInput body);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 删除部门
|
||||||
|
/// https://developer.work.weixin.qq.com/document/path/90207
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="accessToken"></param>
|
||||||
|
/// <param name="id"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[Get("https://qyapi.weixin.qq.com/cgi-bin/department/delete")]
|
||||||
|
Task<BaseWorkOutput> Delete([Query("access_token")] string accessToken, [Query] long id);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取部门Id列表
|
||||||
|
/// https://developer.work.weixin.qq.com/document/path/90208
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="accessToken"></param>
|
||||||
|
/// <param name="id"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[Get("https://qyapi.weixin.qq.com/cgi-bin/department/simplelist")]
|
||||||
|
Task<DepartmentIdOutput> SimpleList([Query("access_token")] string accessToken, [Query] long id);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取部门详情
|
||||||
|
/// https://developer.work.weixin.qq.com/document/path/90208
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="accessToken"></param>
|
||||||
|
/// <param name="id"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[Get("https://qyapi.weixin.qq.com/cgi-bin/department/get")]
|
||||||
|
Task<DepartmentOutput> Get([Query("access_token")] string accessToken, [Query] long id);
|
||||||
|
}
|
||||||
@ -0,0 +1,54 @@
|
|||||||
|
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
|
||||||
|
//
|
||||||
|
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
|
||||||
|
//
|
||||||
|
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
|
||||||
|
|
||||||
|
namespace Admin.NET.Plugin.WorkWeixin.Proxy;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 标签输入参数
|
||||||
|
/// </summary>
|
||||||
|
public class TagHttpInput
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 标签id
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("tagid")]
|
||||||
|
[JsonPropertyName("tagid")]
|
||||||
|
public long? TagId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 标签名称
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("tagname")]
|
||||||
|
[JsonPropertyName("tagname")]
|
||||||
|
public string TagName { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 增加标签成员输入参数
|
||||||
|
/// </summary>
|
||||||
|
public class TagUsersTagInput
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 标签id
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("tagid")]
|
||||||
|
[JsonPropertyName("tagid")]
|
||||||
|
public long TagId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 企业成员ID列表
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("userlist")]
|
||||||
|
[JsonPropertyName("userlist")]
|
||||||
|
public List<string> UserList { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 企业部门ID列表
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("partylist")]
|
||||||
|
[JsonPropertyName("partylist")]
|
||||||
|
public List<long> PartyList { get; set; }
|
||||||
|
}
|
||||||
@ -0,0 +1,33 @@
|
|||||||
|
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
|
||||||
|
//
|
||||||
|
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
|
||||||
|
//
|
||||||
|
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
|
||||||
|
|
||||||
|
namespace Admin.NET.Plugin.WorkWeixin.Proxy;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 新增标签输出参数
|
||||||
|
/// </summary>
|
||||||
|
public class TagIdHttpOutput : BaseWorkOutput
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 标签Id
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("tagid")]
|
||||||
|
[JsonPropertyName("tagid")]
|
||||||
|
public long? TagId { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 标签列表输出参数
|
||||||
|
/// </summary>
|
||||||
|
public class TagListHttpOutput : BaseWorkOutput
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 标签Id
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("taglist")]
|
||||||
|
[JsonPropertyName("taglist")]
|
||||||
|
public List<TagHttpInput> TagList { get; set; }
|
||||||
|
}
|
||||||
@ -0,0 +1,82 @@
|
|||||||
|
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
|
||||||
|
//
|
||||||
|
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
|
||||||
|
//
|
||||||
|
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
|
||||||
|
|
||||||
|
namespace Admin.NET.Plugin.WorkWeixin.Proxy;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 标签远程调用服务
|
||||||
|
/// </summary>
|
||||||
|
public interface ITagHttp : IHttpDeclarative
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 创建标签
|
||||||
|
/// https://developer.work.weixin.qq.com/document/path/90210
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="accessToken"></param>
|
||||||
|
/// <param name="body"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[Post("https://qyapi.weixin.qq.com/cgi-bin/tag/create")]
|
||||||
|
Task<BaseWorkIdOutput> Create([Query("access_token")] string accessToken, [Body] TagHttpInput body);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 更新标签名字
|
||||||
|
/// https://developer.work.weixin.qq.com/document/path/90211
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="accessToken"></param>
|
||||||
|
/// <param name="body"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[Post("https://qyapi.weixin.qq.com/cgi-bin/tag/update")]
|
||||||
|
Task<TagIdHttpOutput> Update([Query("access_token")] string accessToken, [Body] TagHttpInput body);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 删除标签
|
||||||
|
/// https://developer.work.weixin.qq.com/document/path/90212
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="accessToken"></param>
|
||||||
|
/// <param name="tagId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[Get("https://qyapi.weixin.qq.com/cgi-bin/tag/delete")]
|
||||||
|
Task<BaseWorkOutput> Delete([Query("access_token")] string accessToken, [Query("tagid")] long tagId);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取标签详情
|
||||||
|
/// https://developer.work.weixin.qq.com/document/path/90213
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="accessToken"></param>
|
||||||
|
/// <param name="tagId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[Get("https://qyapi.weixin.qq.com/cgi-bin/tag/get")]
|
||||||
|
Task<DepartmentOutput> Get([Query("access_token")] string accessToken, [Query("tagid")] long tagId);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 增加标签成员
|
||||||
|
/// https://developer.work.weixin.qq.com/document/path/90214
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="accessToken"></param>
|
||||||
|
/// <param name="body"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[Post("https://qyapi.weixin.qq.com/cgi-bin/tag/addtagusers")]
|
||||||
|
Task<DepartmentOutput> AddTagUsers([Query("access_token")] string accessToken, [Body] TagUsersTagInput body);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 删除标签成员
|
||||||
|
/// https://developer.work.weixin.qq.com/document/path/90215
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="accessToken"></param>
|
||||||
|
/// <param name="body"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[Post("https://qyapi.weixin.qq.com/cgi-bin/tag/deltagusers")]
|
||||||
|
Task<DepartmentOutput> DelTagUsers([Query("access_token")] string accessToken, [Body] TagUsersTagInput body);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取标签列表
|
||||||
|
/// https://developer.work.weixin.qq.com/document/path/90216
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="accessToken"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[Get("https://qyapi.weixin.qq.com/cgi-bin/tag/list")]
|
||||||
|
Task<TagListHttpOutput> List([Query("access_token")] string accessToken);
|
||||||
|
}
|
||||||
@ -4,6 +4,7 @@
|
|||||||
//
|
//
|
||||||
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
|
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
|
||||||
|
|
||||||
|
|
||||||
namespace Admin.NET.Plugin.WorkWeixin;
|
namespace Admin.NET.Plugin.WorkWeixin;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@ -4,6 +4,7 @@
|
|||||||
//
|
//
|
||||||
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
|
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
|
||||||
|
|
||||||
|
|
||||||
namespace Admin.NET.Plugin.WorkWeixin;
|
namespace Admin.NET.Plugin.WorkWeixin;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@ -4,6 +4,7 @@
|
|||||||
//
|
//
|
||||||
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
|
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
|
||||||
|
|
||||||
|
|
||||||
namespace Admin.NET.Plugin.WorkWeixin;
|
namespace Admin.NET.Plugin.WorkWeixin;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -38,7 +39,7 @@ public class WorkWxTagService(WorkWxBaseService baseService) : ITransient
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public async Task<BaseWorkWxOutput> Delete(long id)
|
public async Task<BaseWorkWxOutput> Delete(long id)
|
||||||
{
|
{
|
||||||
return await baseService.SendAsync<DeleteTagWorkWxInput, BaseWorkWxOutput>(new() { TagId = id });
|
return await baseService.SendAsync<DeleteTagWorkWxInput, BaseWorkWxOutput>(new(){ TagId = id });
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -48,7 +49,7 @@ public class WorkWxTagService(WorkWxBaseService baseService) : ITransient
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public async Task<TagMembersWorkWxOutput> Get(long id)
|
public async Task<TagMembersWorkWxOutput> Get(long id)
|
||||||
{
|
{
|
||||||
return await baseService.SendAsync<TagMembersWorkWxInput, TagMembersWorkWxOutput>(new() { TagId = id });
|
return await baseService.SendAsync<TagMembersWorkWxInput, TagMembersWorkWxOutput>(new(){ TagId = id });
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@ -786,7 +786,7 @@ public class JoinQrcodeWorkWxOutput : BaseWorkWxOutput
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(JoinQrcode)) return null;
|
if (string.IsNullOrEmpty(JoinQrcode))return null;
|
||||||
var match = Regex.Match(JoinQrcode, @"qr_size=(\d)");
|
var match = Regex.Match(JoinQrcode, @"qr_size=(\d)");
|
||||||
return match.Success ? int.Parse(match.Groups[1].Value) : null;
|
return match.Success ? int.Parse(match.Groups[1].Value) : null;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,6 +4,7 @@
|
|||||||
//
|
//
|
||||||
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
|
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
|
||||||
|
|
||||||
|
|
||||||
namespace Admin.NET.Plugin.WorkWeixin;
|
namespace Admin.NET.Plugin.WorkWeixin;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -149,7 +150,7 @@ public class WorkWxUserService(WorkWxBaseService baseService) : ITransient
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public async Task<UserIdWorkWxOutput> GetUserIdByEmail(string email, int? emailType = 1)
|
public async Task<UserIdWorkWxOutput> GetUserIdByEmail(string email, int? emailType = 1)
|
||||||
{
|
{
|
||||||
return await baseService.SendAsync<UserIdByEmailWorkWxInput, UserIdWorkWxOutput>(new() { Email = email, EmailType = emailType });
|
return await baseService.SendAsync<UserIdByEmailWorkWxInput, UserIdWorkWxOutput>(new(){ Email = email, EmailType = emailType });
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -160,6 +161,6 @@ public class WorkWxUserService(WorkWxBaseService baseService) : ITransient
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public async Task<UserIdListWorkWxOutput> GetUserIdList(string cursor = null, int? limit = 20)
|
public async Task<UserIdListWorkWxOutput> GetUserIdList(string cursor = null, int? limit = 20)
|
||||||
{
|
{
|
||||||
return await baseService.SendAsync<UserIdListWorkWxInput, UserIdListWorkWxOutput>(new() { Cursor = cursor, Limit = limit });
|
return await baseService.SendAsync<UserIdListWorkWxInput, UserIdListWorkWxOutput>(new(){ Cursor = cursor, Limit = limit });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -4,6 +4,7 @@
|
|||||||
//
|
//
|
||||||
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
|
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
|
||||||
|
|
||||||
|
|
||||||
using Admin.NET.Plugin.WorkWeixin.Const;
|
using Admin.NET.Plugin.WorkWeixin.Const;
|
||||||
using Furion.FriendlyException;
|
using Furion.FriendlyException;
|
||||||
using Furion.JsonSerialization;
|
using Furion.JsonSerialization;
|
||||||
@ -21,7 +22,7 @@ public class WorkWxBaseService(
|
|||||||
SysConfigService sysConfigService,
|
SysConfigService sysConfigService,
|
||||||
IHttpRemoteService httpRemoteService) : ITransient
|
IHttpRemoteService httpRemoteService) : ITransient
|
||||||
{
|
{
|
||||||
private static readonly Lazy<HttpRemoteItem> _options = new(() => App.GetConfig<HttpRemoteItem>("HttpRemotes.WorkWeixin"));
|
private static readonly Lazy<HttpRemoteItem> _options = new(() => App.GetOptions<HttpRemotesOptions>().WorkWeixin);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取企业微信接口凭证
|
/// 获取企业微信接口凭证
|
||||||
@ -81,10 +82,10 @@ public class WorkWxBaseService(
|
|||||||
{
|
{
|
||||||
HttpMethodEnum.Get => await httpRemoteService.GetAsync(
|
HttpMethodEnum.Get => await httpRemoteService.GetAsync(
|
||||||
url + input.ToCustomJsonPropertyQueryString(),
|
url + input.ToCustomJsonPropertyQueryString(),
|
||||||
builder => builder.SetRemoteApiAttr(_options.Value.HttpName, attr)),
|
builder => builder.SetHttpClientName(_options.Value.HttpName).SetRemoteApiAttr(attr)),
|
||||||
HttpMethodEnum.Post => await httpRemoteService.PostAsync(url,
|
HttpMethodEnum.Post => await httpRemoteService.PostAsync(url,
|
||||||
builder => builder.SetRemoteApiAttr(_options.Value.HttpName, attr)
|
builder => builder.SetHttpClientName(_options.Value.HttpName).SetRemoteApiAttr(attr)
|
||||||
.SetContent(new StringContent(JSON.Serialize(input, CustomJsonPropertyConverter.Options), Encoding.UTF8, "application/json"))),
|
.SetContent(new StringContent(JSON.Serialize(input), Encoding.UTF8, "application/json"))),
|
||||||
_ => throw Oops.Oh($"[企业微信] 不支持的请求方式:{attr.HttpMethod.ToString()}:({typeof(T).FullName})"),
|
_ => throw Oops.Oh($"[企业微信] 不支持的请求方式:{attr.HttpMethod.ToString()}:({typeof(T).FullName})"),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -111,7 +112,7 @@ public class WorkWxBaseService(
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var resp = JSON.Deserialize<R>(responseContent, CustomJsonPropertyConverter.Options);
|
var resp = JSON.Deserialize<R>(responseContent);
|
||||||
if (resp?.ErrCode == 0) return resp;
|
if (resp?.ErrCode == 0) return resp;
|
||||||
throw Oops.Oh("[企业微信] 请求失败:" + resp?.ErrMsg);
|
throw Oops.Oh("[企业微信] 请求失败:" + resp?.ErrMsg);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,40 @@
|
|||||||
|
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
|
||||||
|
//
|
||||||
|
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
|
||||||
|
//
|
||||||
|
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
|
||||||
|
|
||||||
|
namespace Admin.NET.Plugin.WorkWeixin;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 企业微信接口输出基类
|
||||||
|
/// </summary>
|
||||||
|
public class BaseWorkOutput
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 返回码
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("errcode")]
|
||||||
|
[JsonPropertyName("errcode")]
|
||||||
|
public int ErrCode { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 对返回码的文本描述内容
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("errmsg")]
|
||||||
|
[JsonPropertyName("errmsg")]
|
||||||
|
public string ErrMsg { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 带id的输出参数
|
||||||
|
/// </summary>
|
||||||
|
public class BaseWorkIdOutput : BaseWorkOutput
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// id
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("id")]
|
||||||
|
[JsonPropertyName("id")]
|
||||||
|
public long? Id { get; set; }
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user