文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

.NET Core如何实现企业微信消息推送

2023-07-02 10:53

关注

这篇文章主要介绍了.NET Core如何实现企业微信消息推送的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇.NET Core如何实现企业微信消息推送文章都会有所收获,下面我们一起来看看吧。

接口定义

应用支持推送文本、图片、视频、文件、图文等类型。
请求方式:POST(HTTPS

参数说明: ACCESS_TOKEN 必填

- 各个消息类型的具体POST格式请阅后续“消息类型”部分。
- 如果有在管理端对应用设置“在微工作台中始终进入主页”,应用在微信端只能接收到文本消息,并且文本消息的长度限制为20字节,超过20字节会被截断。同时其他消息类型也会转换为文本消息,提示用户到企业微信查看。
- 支持id转译,将userid/部门id转成对应的用户名/部门名,目前仅文本/文本卡片/图文/图文(mpnews)/任务卡片/小程序通知/模版消息/模板卡片消息这八种消息类型的部分字段支持。仅第三方应用需要用到,企业自建应用可以忽略。。
- 支持重复消息检查,当指定 "enable_duplicate_check": 1开启: 表示在一定时间间隔内,同样内容(请求json)的消息,不会重复收到;时间间隔可通过duplicate_check_interval指定,默认1800秒
- 从2021年2月4日开始,企业关联添加的「小程序」应用,也可以发送文本、图片、视频、文件、图文等各种类型的消息了。
调用建议:大部分企业应用在每小时的0分或30分触发推送消息,容易造成资源挤占,从而投递不够及时,建议尽量避开这两个时间点进行调用。

返回示例:

{  "errcode" : 0,  "errmsg" : "ok",  "invaliduser" : "userid1|userid2",  "invalidparty" : "partyid1|partyid2",  "invalidtag": "tagid1|tagid2",  "msgid": "xxxx",  "response_code": "xyzxyz"}

如果部分接收人无权限或不存在,发送仍然执行,但会返回无效的部分(即invaliduser或invalidparty或invalidtag),常见的原因是接收人不在应用的可见范围内
如果全部接收人无权限或不存在,则本次调用返回失败,errcode为81013。
返回包中的userid,不区分大小写,统一转为小写

参数说明:

参数说明
errcode返回码
errmsg对返回码的文本描述内容
invaliduser不合法的userid,不区分大小写,统一转为小写
invalidparty不合法的partyid
invalidtag不合法的标签id
msgid消息id,用于撤回应用消息
response_code仅消息类型为“按钮交互型”,“投票选择型”和“多项选择型”的模板卡片消息返回,应用可使用response_code调用更新模版卡片消息接口,24小时内有效,且只能使用一次

消息类型

文本消息

请求示例:

{   "touser" : "UserID1|UserID2|UserID3",   "toparty" : "PartyID1|PartyID2",   "totag" : "TagID1 | TagID2",   "msgtype" : "text",   "agentid" : 1,   "text" : {       "content" : "你的快递已到,请携带工卡前往邮件中心领取。\n出发前可查看<a href=\"http://work.weixin.qq.com\">邮件中心视频实况</a>,聪明避开排队。"   },   "safe":0,   "enable_id_trans": 0,   "enable_duplicate_check": 0,   "duplicate_check_interval": 1800}

参数说明:

参数是否必须说明
touser指定接收消息的成员,成员ID列表(多个接收者用&lsquo;|&rsquo;分隔,最多支持1000个)。
特殊情况:指定为"@all",则向该企业应用的全部成员发送
toparty指定接收消息的部门,部门ID列表,多个接收者用&lsquo;|&rsquo;分隔,最多支持100个。
当touser为"@all"时忽略本参数
totag指定接收消息的标签,标签ID列表,多个接收者用&lsquo;|&rsquo;分隔,最多支持100个。
当touser为"@all"时忽略本参数
msgtype消息类型,此时固定为:text
agentid企业应用的id,整型。企业内部开发,可在应用的设置页面查看;第三方服务商,可通过接口 获取企业授权信息 获取该参数值
content消息内容,最长不超过2048个字节,超过将截断(支持id转译)
safe表示是否是保密消息,0表示可对外分享,1表示不能分享且内容显示水印,默认为0
enable_id_trans表示是否开启id转译,0表示否,1表示是,默认0。仅第三方应用需要用到,企业自建应用可以忽略。
enable_duplicate_check表示是否开启重复消息检查,0表示否,1表示是,默认0
duplicate_check_interval表示是否重复消息检查的时间间隔,默认1800s,最大不超过4小时

代码示例

配置Settings

其中corpid为企业id  corpsecret为应用的凭证密钥

 "Wx": {    "Baseurl": "https://qyapi.weixin.qq.com/cgi-bin/",    "TokenUrl": "gettoken?corpid=xx&corpsecret=xx",    "PushUrl": "message/send?access_token={0}"  },

Startup设置

        public void ConfigureServices(IServiceCollection services)        {              services.AddHttpClient("WxClient", config =>              {                 config.BaseAddress = new Uri(Configuration["Wx:baseurl"]);                 config.DefaultRequestHeaders.Add("Accept", "application/json");              });            GlobalContext.Configuration = Configuration;        }        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)        {            GlobalContext.HttpClientFactory = app.ApplicationServices.GetService<IHttpClientFactory>();        }

Token返回实体

    public class GetTokenResult    {        /// <summary>        /// 错误编号        /// </summary>        public int errcode { get; set; }        /// <summary>        /// 错误信息        /// </summary>        public string errmsg { get; set; }        /// <summary>        /// Token        /// </summary>        public string access_token { get; set; }        /// <summary>        /// 过期时间        /// </summary>        public int expires_in { get; set; }    }

推送方法

GlobalContext提供了获取Token方法,微信推送方法,获取内容序列号字符串方法。GetContent中agentid 为应用id 按实际情况调整。

using Microsoft.Extensions.Configuration;using Newtonsoft.Json;using System;using System.Collections.Generic;using System.Linq;using System.Net.Http;using System.Text;using System.Threading.Tasks;namespace TaskScheduling.Wx{    public class GlobalContext    {        public static IConfiguration Configuration { get; set; }        public static IHttpClientFactory HttpClientFactory { get; set; }        /// <summary>        /// 过期时间        /// </summary>        public static DateTime TimeOutDate { get; set; }        /// <summary>        /// Token        /// </summary>        public static string Token { get; set; }        /// <summary>        /// 获取Token        /// </summary>        /// <returns>Item1 Token;Item2 是否成功</returns>        public static Tuple<string, bool> GetToken()        {            //判断Token是否存在 以及Token是否在有效期内            if (string.IsNullOrEmpty(Token) || TimeOutDate > DateTime.Now)            {                //构造请求链接                var requestBuild = Configuration["Wx:TokenUrl"];                using (var wxClient = HttpClientFactory.CreateClient("WxClient"))                {                    var httpResponse = wxClient.GetAsync(requestBuild).Result;                    var dynamic = JsonConvert.DeserializeObject<GetTokenResult>(                                          httpResponse.Content.ReadAsStringAsync().Result                                          );                    if (dynamic.errcode == 0)                    {                        Token = dynamic.access_token;                        //过期5分钟前刷新Token                        var expires_in = Convert.ToDouble(dynamic.expires_in - 5 * 60);                        TimeOutDate = DateTime.Now.AddSeconds(expires_in);                        return Tuple.Create(Token, true);                    }                    else                    {                        return Tuple.Create($"获取Token失败,错误:{ dynamic.errmsg}", false);                    }                }            }            else            {                return Tuple.Create(Token, true);            }        }        /// <summary>        /// 推送MES        /// </summary>        /// <returns>Item1 Token;Item2 是否成功</returns>        public static string WxPush(string content)        {            //构造请求链接            var requestBuild = Configuration["Wx:PushUrl"];            var (token, issuccess) = GetToken();            if (!issuccess)                throw new Exception(token);            requestBuild = string.Format(requestBuild, token);            //建立HttpClient            using (var wxClient = HttpClientFactory.CreateClient("WxClient"))            {                byte[] data = Encoding.UTF8.GetBytes(content);                var bytearray = new ByteArrayContent(data);                var httpResponse = wxClient.PostAsync(requestBuild, bytearray).Result;                var dynamic = JsonConvert.DeserializeObject<dynamic>(                                     httpResponse.Content.ReadAsStringAsync().Result                                     );                if (dynamic.errcode == 0)                    return "推送成功!";                else                    throw new Exception($"推送失败,原因:{JsonConvert.SerializeObject(dynamic) }");            }        }        /// <summary>        /// 获取发送内容        /// </summary>        /// <param name="userId"></param>        /// <param name="Msg"></param>        /// <returns></returns>        public static string GetContent(string userId, string msg)        {            var objText = new { content = msg };            string text = JsonConvert.SerializeObject(objText);            var obj = new            {                touser = userId,                toparty = "",                totag = "",                msgtype = "text",                agentid = 1000051,//应用id                text = objText,                safe = 0,                enable_id_trans = 0,                enable_duplicate_check = 0,                duplicate_check_interval = 1800            };            string strJson = JsonConvert.SerializeObject(obj);            return strJson;        }    }}

调用

string userid = "userid";var content1 = GlobalContext.GetContent(userid, "推送测试");return GlobalContext.WxPush(content1);

截图

.NET Core如何实现企业微信消息推送

关于“.NET Core如何实现企业微信消息推送”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“.NET Core如何实现企业微信消息推送”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯