Нет описания

SmsHelper.cs 5.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net.Http;
  5. using System.Security.Cryptography;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. namespace CallCenter.Utility
  9. {
  10. /// <summary>
  11. /// 短信
  12. /// </summary>
  13. public static class SmsHelper
  14. {
  15. /// <summary>
  16. /// 发送短信
  17. /// </summary>
  18. /// <param name="phones">手机号、多个手机号英文逗号隔开</param>
  19. /// <param name="templateCode">模板编号</param>
  20. /// <param name="templateParam">[\"工单号\"]、[\"工单号\",\"工单号\",\"工单号\",...]</param>
  21. /// <returns></returns>
  22. public static string Send(string phones,string templateCode,string templateParam="")
  23. {
  24. string result = string.Empty;
  25. try
  26. {
  27. string apiKey = Configs.GetValue("SmsNewApiKey");
  28. string accessKey = Configs.GetValue("SmsNewSecretKey");
  29. string authHost = Configs.GetValue("SmsNewUrl");
  30. var ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
  31. var currentTime = Convert.ToInt64(ts.TotalMilliseconds).ToString();
  32. HttpClient client = new HttpClient();
  33. var requestHeaders = new Dictionary<string, string>();
  34. //签名算法。支持HmacSHA256、HmacMD5、HmacSHA224、HmacSHA384、HmacSHA512
  35. requestHeaders.Add("x-sign-method", "HmacSHA256");
  36. requestHeaders.Add("x-api-key", $"{apiKey}");
  37. //随机数。每次请求随机数建议不相同
  38. requestHeaders.Add("x-nonce", $"{GetRandom()}");
  39. //时间戳
  40. requestHeaders.Add("x-timestamp", $"{currentTime}");
  41. // client.DefaultRequestHeaders.Host = "recognition.image.myqcloud.com";
  42. //设置headers请求参数
  43. foreach (var item in requestHeaders)
  44. {
  45. client.DefaultRequestHeaders.Add(item.Key, item.Value);
  46. }
  47. //短信接口请求参数。参见接口规范
  48. var jsArr = new Dictionary<string, string>();
  49. jsArr.Add("phones", phones);
  50. jsArr.Add("templateCode", templateCode);
  51. if (!string.IsNullOrEmpty(templateParam))
  52. {
  53. jsArr.Add("templateParam", templateParam);
  54. }
  55. //将headers参与与接口报文参数合并、排序,并生成本次请求的签名信息
  56. var signDic = jsArr.Union(requestHeaders).ToDictionary(k => k.Key, v => v.Value);
  57. var dicStr = GetSignContent(signDic);
  58. var sign = Hmacsha256Encrypt(dicStr, accessKey);
  59. //在header中设置本次请求签名信息
  60. client.DefaultRequestHeaders.Add("x-sign", sign);
  61. HttpContent str = new StringContent(jsArr.ToJson());
  62. str.Headers.Remove("Content-Type");
  63. str.Headers.Add("Content-Type", "application/json");
  64. HttpResponseMessage response = client.PostAsync(authHost, str).Result;
  65. var result1 = response.Content.ReadAsStringAsync().Result;
  66. var objresult = result1.ToJObject();
  67. if (objresult["code"].ToString() != "200")
  68. {
  69. LogFactory.GetLogger("SmsHelper").Error(phones + "\r\n" + templateCode + "\r\n" + templateParam + "\r\n" + result1);
  70. }
  71. }
  72. catch (Exception ex)
  73. {
  74. LogFactory.GetLogger("SmsHelper").Error(phones + "\r\n" + templateCode + "\r\n" + templateParam + "\r\n" + ex.ToString());
  75. }
  76. return result;
  77. }
  78. /// <summary>
  79. /// Get Sign Content
  80. /// </summary>
  81. /// <param name="parameters"></param>
  82. /// <returns></returns>
  83. private static string GetSignContent(IDictionary<string, string> parameters)
  84. {
  85. // 第一步:把字典按Key的字母顺序排序
  86. IDictionary<string, string> sortedParams = new SortedDictionary<string, string>(parameters);
  87. IEnumerator<KeyValuePair<string, string>> dem = sortedParams.GetEnumerator();
  88. // 第二步:把所有参数名和参数值串在一起
  89. StringBuilder query = new StringBuilder("");
  90. while (dem.MoveNext())
  91. {
  92. string key = dem.Current.Key;
  93. string value = dem.Current.Value;
  94. if (!string.IsNullOrEmpty(key) && !string.IsNullOrEmpty(value))
  95. {
  96. query.Append(key).Append("=").Append(value).Append("&");
  97. }
  98. }
  99. string content = query.ToString().Substring(0, query.Length - 1);
  100. return content;
  101. }
  102. /// <summary>
  103. /// HMACSHA1算法加密
  104. /// </summary>
  105. private static string Hmacsha256Encrypt(string encryptText, string encryptKey)
  106. {
  107. var encoding = new System.Text.UTF8Encoding();
  108. StringBuilder builder = new StringBuilder();
  109. using (var hmacsha256 = new HMACSHA256(encoding.GetBytes(encryptKey)))
  110. {
  111. byte[] hashmessage = hmacsha256.ComputeHash(encoding.GetBytes(encryptText));
  112. for (int i = 0; i < hashmessage.Length; i++)
  113. {
  114. builder.Append(hashmessage[i].ToString("x2"));
  115. }
  116. }
  117. return builder.ToString();
  118. }
  119. /// <summary>
  120. /// 获取随机数
  121. /// </summary>
  122. private static int GetRandom()
  123. {
  124. var random = new Random();
  125. var rand = random.Next(10000, 999999999);
  126. return rand;
  127. }
  128. }
  129. }