.net core发送钉钉消息_消息加签模式
这是一篇纯记录代码文章,完整运行需要自己调整:
钉钉发送消息后台进行了改版,这里介绍加签模式的代码:
1-.net framework版本:
/// <summary> /// 钉钉机器人 /// </summary> public class DingdingHelper { private static DingdingGroupConfig _DingdingGroupConfig; static DingdingHelper() { DingdingHelper._DingdingGroupConfig = new DingdingGroupConfig { AtPhones = "156xxxxxxxx", Secret = "钉钉签名", WebHookUrl = "https://oapi.dingtalk.com/robot/send?access_token=xxx" }; } /// <summary> /// 发送钉钉消息内容 /// </summary> /// <param name="groupName"></param> /// <param name="content"></param> /// <returns></returns> public static void SendDingdingMessage(string content) { string sign = null; TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0); string timeStamp = Convert.ToInt64(ts.TotalMilliseconds).ToString(); var encoding = new UTF8Encoding(); byte[] signBytes = encoding.GetBytes($"{timeStamp}\n{_DingdingGroupConfig.Secret}"); byte[] secretByte = encoding.GetBytes(_DingdingGroupConfig.Secret); using (var hmacsha256 = new HMACSHA256(secretByte)) { byte[] hashmessage = hmacsha256.ComputeHash(signBytes); sign = HttpUtility.UrlEncode(Convert.ToBase64String(hashmessage)); } string messageUrl = $"{_DingdingGroupConfig.WebHookUrl}×tamp={timeStamp}&sign={sign}"; List<string> atPhoneList = null; if (!string.IsNullOrEmpty(_DingdingGroupConfig.AtPhones)) { atPhoneList = _DingdingGroupConfig.AtPhones.Split(',').ToList(); atPhoneList.RemoveAll(m => string.IsNullOrEmpty(m)); } DingDingText dingDingText = new DingDingText { msgtype = "text", text = new DingDingText.textObj { content = content }, at = new DingDingText.atObj { isAtAll = false, atMobiles = atPhoneList } }; var client = new RestClient(messageUrl); var request = new RestRequest(Method.POST); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", JsonHelp.SerializeObject(dingDingText), ParameterType.RequestBody); IRestResponse response = client.Execute(request); } private class DingDingText { public string msgtype { get; set; } public textObj text { get; set; } public class textObj { public string content { get; set; } } public atObj at { get; set; } public class atObj { public List<string> atMobiles { get; set; } public bool isAtAll { get; set; } } } /// <summary> /// 钉钉配置 /// </summary> public class DingdingGroupConfig { /// <summary> /// 群组Webhook地址 /// </summary> public string WebHookUrl { get; set; } /// <summary> /// 安全秘钥 /// </summary> public string Secret { get; set; } /// <summary> /// @人的手机号(多个以逗号分隔) /// </summary> public string AtPhones { get; set; } } }
2-.net core版本:
using Newtonsoft.Json; using RestSharp; using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Web; namespace MyPaymentHelper.Helper { /// <summary> /// 钉钉机器人 /// </summary> public class DingdingHelper { private static DingdingGroupConfig _DingdingGroupConfig; static DingdingHelper() { DingdingHelper._DingdingGroupConfig = new DingdingGroupConfig { AtPhones = "156xxxxxxxx", Secret = "钉钉签名", WebHookUrl = "https://oapi.dingtalk.com/robot/send?access_token=xxx" }; } /// <summary> /// 发送钉钉消息内容 /// </summary> /// <param name="groupName"></param> /// <param name="content"></param> /// <returns></returns> public static void SendDingdingMessage(string content) { string sign = null; TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0); string timeStamp = Convert.ToInt64(ts.TotalMilliseconds).ToString(); var encoding = new UTF8Encoding(); byte[] signBytes = encoding.GetBytes($"{timeStamp}\n{_DingdingGroupConfig.Secret}"); byte[] secretByte = encoding.GetBytes(_DingdingGroupConfig.Secret); using (var hmacsha256 = new HMACSHA256(secretByte)) { byte[] hashmessage = hmacsha256.ComputeHash(signBytes); sign = HttpUtility.UrlEncode(Convert.ToBase64String(hashmessage)); } string messageUrl = $"{_DingdingGroupConfig.WebHookUrl}×tamp={timeStamp}&sign={sign}"; List<string> atPhoneList = null; if (!string.IsNullOrEmpty(_DingdingGroupConfig.AtPhones)) { atPhoneList = _DingdingGroupConfig.AtPhones.Split(',').ToList(); atPhoneList.RemoveAll(m => string.IsNullOrEmpty(m)); } DingDingText dingDingText = new DingDingText { msgtype = "text", text = new DingDingText.textObj { content = content }, at = new DingDingText.atObj { isAtAll = false, atMobiles = atPhoneList } }; var client = new RestClient(messageUrl); var request = new RestRequest("", Method.Post); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", JsonConvert.SerializeObject(dingDingText), ParameterType.RequestBody); RestResponse response = client.Execute(request); } private class DingDingText { public string msgtype { get; set; } public textObj text { get; set; } public class textObj { public string content { get; set; } } public atObj at { get; set; } public class atObj { public List<string> atMobiles { get; set; } public bool isAtAll { get; set; } } } /// <summary> /// 钉钉配置 /// </summary> public class DingdingGroupConfig { /// <summary> /// 群组Webhook地址 /// </summary> public string WebHookUrl { get; set; } /// <summary> /// 安全秘钥 /// </summary> public string Secret { get; set; } /// <summary> /// @人的手机号(多个以逗号分隔) /// </summary> public string AtPhones { get; set; } } } }
*感谢您的阅读。喜欢的、有用的就请大哥大嫂们高抬贵手“推荐一下”吧!你的精神 支持是博主强大的写作动力。欢迎转载!
*博主的文章是自己平时开发总结的经验,由于博主的水平不高,不足和错误之处在所难免,希望大家能够批评指出。
*我的博客: http://www.cnblogs.com/lxhbky/
*博主的文章是自己平时开发总结的经验,由于博主的水平不高,不足和错误之处在所难免,希望大家能够批评指出。
*我的博客: http://www.cnblogs.com/lxhbky/
浙公网安备 33010602011771号