.NET Core实现企业微信消息推送
作者:微风吹过~
这篇文章介绍了.NET Core实现企业微信消息推送的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
接口定义
应用支持推送文本、图片、视频、文件、图文等类型。
请求方式:POST(HTTPS)
请求地址: https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN
参数说明: 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列表(多个接收者用‘|’分隔,最多支持1000个)。 特殊情况:指定为"@all",则向该企业应用的全部成员发送 |
toparty | 否 | 指定接收消息的部门,部门ID列表,多个接收者用‘|’分隔,最多支持100个。 当touser为"@all"时忽略本参数 |
totag | 否 | 指定接收消息的标签,标签ID列表,多个接收者用‘|’分隔,最多支持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);
截图
企业微信文档链接 https://developer.work.weixin.qq.com/document/path/90236
到此这篇关于.NET Core实现企业微信消息推送的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。