DingDing.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. using Newtonsoft.Json.Linq;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.ComponentModel;
  5. using System.Net.Http;
  6. using System.Reflection;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Security.Cryptography;
  10. using TEAMModelOS.SDK.Extension;
  11. namespace TEAMModelOS.SDK.DI
  12. {
  13. public class DingDing
  14. {
  15. private const string url = "https://oapi.dingtalk.com/robot/send?access_token=";
  16. private readonly HttpClient _httpClient;
  17. public DingDing(HttpClient httpClient)
  18. {
  19. _httpClient = httpClient;
  20. }
  21. // <summary>
  22. /// 發送需要加簽驗證的Bot訊息(msgtype為text)
  23. /// </summary>
  24. /// <param name="robotUrl">釘釘Robot發送Url</param>
  25. /// <param name="secret">加簽密鑰</param>
  26. /// <param name="msg">發送訊息</param>
  27. /// <returns></returns>
  28. public async Task SendBotMsg(string msg, GroupNames groupkey)
  29. {
  30. JObject jObject = new JObject()
  31. {
  32. new JProperty("msgtype","text"),
  33. new JProperty("text",new JObject(
  34. new JProperty("content",msg)))
  35. };
  36. var content = new StringContent(jObject.ToString(), Encoding.UTF8, "application/json");
  37. var keys = groupkey.GetDescriptionText().Split(',');
  38. if (keys.Length == 1) await _httpClient.PostAsync($"{url}{keys[0]}", content);
  39. else
  40. {
  41. var timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  42. await _httpClient.PostAsync($"{url}{keys[0]}&timestamp={timestamp}&sign={BotAddSign(keys[1], timestamp)}", content);
  43. }
  44. }
  45. // <summary>
  46. /// 發送需要加簽驗證的Bot訊息(msgtype為text)
  47. /// </summary>
  48. /// <param name="robotUrl">釘釘Robot發送Url</param>
  49. /// <param name="secret">加簽密鑰</param>
  50. /// <param name="msg">發送訊息</param>
  51. /// <returns></returns>
  52. public async Task SendBotMsg(string msg, string accesstoken, string secret = null)
  53. {
  54. JObject jObject = new JObject()
  55. {
  56. new JProperty("msgtype","text"),
  57. new JProperty("text",new JObject(
  58. new JProperty("content",msg)))
  59. };
  60. var content = new StringContent(jObject.ToString(), Encoding.UTF8, "application/json");
  61. if (string.IsNullOrWhiteSpace(secret))
  62. await _httpClient.PostAsync($"{url}{accesstoken}", content);
  63. else
  64. {
  65. var timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  66. await _httpClient.PostAsync($"{url}{accesstoken}&timestamp={timestamp}&sign={BotAddSign(secret, timestamp)}", content);
  67. }
  68. }
  69. #region private
  70. /// <summary>
  71. /// 釘釘Bot簽名生成方法
  72. /// </summary>
  73. /// <param name="zTime"></param>
  74. /// <returns></returns>
  75. private static string BotAddSign(string secret, long zTime)
  76. {
  77. //"SEC6a6822db6567f79854a474002407cd9ac36da4d194b5fb79e073c35ef61119ed";
  78. string stringToSign = zTime + "\n" + secret;
  79. var encoding = new System.Text.ASCIIEncoding();
  80. byte[] keyByte = encoding.GetBytes(secret);
  81. byte[] messageBytes = encoding.GetBytes(stringToSign);
  82. using (var hmacsha256 = new HMACSHA256(keyByte))
  83. {
  84. byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
  85. return System.Web.HttpUtility.UrlEncode(Convert.ToBase64String(hashmessage), Encoding.UTF8);
  86. }
  87. }
  88. #endregion
  89. }
  90. public enum GroupNames
  91. {
  92. [Description("ce63217d9c734a92fd91c7c9ceaa9b25e109cce94615a7f75288dc43865a6e20,SEC6a6822db6567f79854a474002407cd9ac36da4d194b5fb79e073c35ef61119ed")]
  93. 研發C組,
  94. [Description("2c5ced0725b592b1a96f1fb800d6d9a15727986ef75923a838a4d24e6b8c9147,SEC66ff954306c1fd98b5b160e23c253649f22205e69a16fb26e18d136f49875a9e")]
  95. 客戶回饋群組,
  96. [Description("f8bf19c9363e3b288e018856014bcbf89708f19b3aae009e203edd68af25c9fe")]
  97. BB訂單群組,
  98. [Description("a27b099b15a054374da41b9f66f72e5fc6b378e98418859f7c0ef46408941808")]
  99. 測試群組,
  100. [Description("1a316ce4edc2db88231d40d80072b00f2751d7d9e2e5871c5dc061885b01c48d,SECff60201ac9b219943b9f8fc397fda1a617d0cbc140850f5ea9cb4f131479d39a")]
  101. 醍摩豆服務運維群組
  102. }
  103. }