<address id="xpjh9"><listing id="xpjh9"><meter id="xpjh9"></meter></listing></address>

<address id="xpjh9"><address id="xpjh9"><listing id="xpjh9"></listing></address></address>
<noframes id="xpjh9">
<noframes id="xpjh9">

<address id="xpjh9"><address id="xpjh9"><listing id="xpjh9"></listing></address></address>
    <form id="xpjh9"></form><address id="xpjh9"><listing id="xpjh9"><menuitem id="xpjh9"></menuitem></listing></address>

      <noframes id="xpjh9">
      VB.net 2010 視頻教程 VB.net 2010 視頻教程 VB.net 2010 視頻教程
      SQL Server 2008 視頻教程 c#入門經典教程 Visual Basic從門到精通視頻教程
      當前位置:
      首頁 > 編程開發 > c#教程 >
      • C#教程之使用阿里云的短信服務發送短信

      • 2019-04-13 21:47 來源:未知

      在給客戶開發一個信息發送功能的時候,需要涉及到短信的發送,短信發送一般不同的廠商提供的接口不同,處理方式也不太一樣,之前用的一個廠商的,提供了一個封裝類就很容易發送短息,因此都是基于HTTP協議做的一個數據發送而已,接觸阿里云的短信服務器后,發現阿里云還增加了非常多的參數,其中包括一些秘鑰和簽名的內容。短信發送由于比較敏感原因,大多數應用場景是驗證碼或者一些固定的信息提醒,因此廠商都要求客戶按預定的模板來發送,這樣限制了短信的應用場景,只能根據業務進行消息定制了。本篇隨筆主要介紹阿里云的短信服務的發送處理。

      1、短信發送的處理介紹

      在短信發送中,阿里云提供自己的SDK封裝,以降低使用的難度,不過需要引入它提供的SDK類庫;本篇隨筆主要介紹基于HTTP方式進行自行的封裝處理,這部分代碼我從網上摘錄并進行一定的調整,測試成功。

      使用阿里云的短信服務,需要注冊登錄自己的阿里云控制臺,然后進入AccessKeys的處理界面

      然后系統會提示需要創建一個新的Key(如果沒有的話就創建,否則使用已有的即可)

      這里我們獲取到AccessKey ID 和Access Key Secret兩個關鍵信息,需要用在數據簽名的里面的。

      另外我們需要創建一個SignName,也就是簽名,一般為我們短信提示的公司名稱,如【廣州愛奇迪】這樣的字樣。

      短信是基于模板的,阿里云不能發送隨意的內容,因此只能基于模板發送,如驗證碼或者業務消息,有點類似微信的模板消息了,因此里面可以添加變量發送的。

      記得我以前寫過一個關于動態變量的信息發送的文章《一個包含動態變量的短信模板設計分析》,就是介紹如何處理變量模板消息的。

      阿里云默認提供了一些基礎模板,如下所示。

      一般我們業務可能還需要定制一些業務消息,那么需要審核通過才可以使用新增的模板消息。

      短信的發送可以利用API接口進行發送,如下所示是它的API說明

      如果需要采集用戶的回復信息,如一些隨訪記錄,那么需要做一個接口的處理,如下所示。

      發送短信的API接口詳細說明如下所示。

      其實請求信息比上面列出的信息多很多,包括秘鑰和數據加密信息等的處理,下面詳細給出代碼說明。 

       

      2、模板消息發送

       有了上面的信息介紹,我們大概了解了短信消息發送的處理規則了。

      實際上,發送信息的時候,我們可能需要添加很多參數信息,如下代碼所示。

      復制代碼
                  Dictionary<string, string> keyValues = new Dictionary<string, string>();//聲明一個字典
                  //1.系統參數
                  keyValues.Add("SignatureMethod", "HMAC-SHA1");
                  keyValues.Add("SignatureNonce", Guid.NewGuid().ToString());
                  keyValues.Add("AccessKeyId", AccessKeyId);
                  keyValues.Add("SignatureVersion", "1.0");
                  keyValues.Add("Timestamp", nowDate);
                  keyValues.Add("Format", "Json");//可換成xml
      
                  //2.業務api參數
                  keyValues.Add("Action", "SendSms");
                  keyValues.Add("Version", "2017-05-25");
                  keyValues.Add("RegionId", "cn-hangzhou");
                  keyValues.Add("PhoneNumbers", mobile);
                  keyValues.Add("SignName", SignName);
                  keyValues.Add("TemplateParam", "{\"code\":\"" + code + "\"}");
                  keyValues.Add("TemplateCode", templateCode);
                  keyValues.Add("OutId", "123");
      復制代碼

      具體我們來貼出不用SDK的短信發送輔助類,如下代碼所示。

      復制代碼
          /// <summary>
          /// 阿里短信發送
          /// </summary>
          public class SmsHelper
          {
              private const string endpoint = "dysmsapi.aliyuncs.com";
              private const string AccessKeyId = "你的秘鑰鍵";
              private const string AccessKeySecret = "你的秘鑰值";
              private const string SignName = "廣州愛奇迪";
      
              /// <summary>
              /// 短信驗證碼
              /// </summary>
              /// <param name="mobile"></param>
              /// <param name="code"></param>
              /// <returns></returns>
              public static string SendSms(string mobile, int code, string templateCode = "SMS_126645400")
              {
                  string nowDate = DateTime.Now.ToUniversalTime().ToString("yyyy-MM-dd'T'HH:mm:ss'Z'");//GTM時間
                  Dictionary<string, string> keyValues = new Dictionary<string, string>();//聲明一個字典
                  //1.系統參數
                  keyValues.Add("SignatureMethod", "HMAC-SHA1");
                  keyValues.Add("SignatureNonce", Guid.NewGuid().ToString());
                  keyValues.Add("AccessKeyId", AccessKeyId);
                  keyValues.Add("SignatureVersion", "1.0");
                  keyValues.Add("Timestamp", nowDate);
                  keyValues.Add("Format", "Json");//可換成xml
      
                  //2.業務api參數
                  keyValues.Add("Action", "SendSms");
                  keyValues.Add("Version", "2017-05-25");
                  keyValues.Add("RegionId", "cn-hangzhou");
                  keyValues.Add("PhoneNumbers", mobile);
                  keyValues.Add("SignName", SignName);
                  keyValues.Add("TemplateParam", "{\"code\":\"" + code + "\"}");
                  keyValues.Add("TemplateCode", templateCode);
                  keyValues.Add("OutId", "123");
      
                  //3.去除簽名關鍵字key
                  if (keyValues.ContainsKey("Signature"))
                  {
                      keyValues.Remove("Signature");
                  }
      
                  //4.參數key排序
                  Dictionary<string, string> ascDic = keyValues.OrderBy(o => o.Key).ToDictionary(o => o.Key, p => p.Value.ToString());
                  //5.構造待簽名的字符串
                  StringBuilder builder = new StringBuilder();
                  foreach (var item in ascDic)
                  {
                      if (item.Key == "SignName")
                      {
                      }
                      else
                      {
                          builder.Append("&").Append(specialUrlEncode(item.Key)).Append("=").Append(specialUrlEncode(item.Value));
                      }
                      if (item.Key == "RegionId")
                      {
                          builder.Append("&").Append(specialUrlEncode("SignName")).Append("=").Append(specialUrlEncode(keyValues["SignName"]));
                      }
                  }
                  string sorteQueryString = builder.ToString().Substring(1);
      
                  StringBuilder stringToSign = new StringBuilder();
                  stringToSign.Append("GET").Append("&");
                  stringToSign.Append(specialUrlEncode("/")).Append("&");
                  stringToSign.Append(specialUrlEncode(sorteQueryString));
      
                  string Sign = MySign(AccessKeySecret + "&", stringToSign.ToString());
                  //6.簽名最后也要做特殊URL編碼
                  string signture = specialUrlEncode(Sign);
      
                  //最終打印出合法GET請求的URL
                  string url = string.Format("http://{0}/?Signature={1}{2}", endpoint, signture, builder);
                  string result = GetHtmlFormUrl(url);
                  return result;
              }
      
      
              /// <summary>
              /// 短信接口C#調用方法
              /// </summary>
              /// <param name="url"></param>
              /// <returns></returns>
              private static string GetHtmlFormUrl(string url)
              {
                  string strRet = null;
                  if (url == null || url.Trim().ToString() == "")
                  {
                      return strRet;
                  }
                  string targeturl = url.Trim().ToString();
                  try
                  {
                      HttpWebRequest hr = (HttpWebRequest)WebRequest.Create(targeturl);
                      hr.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
                      hr.Method = "GET";
                      hr.Timeout = 30 * 60 * 1000;
                      WebResponse hs = hr.GetResponse();
                      Stream sr = hs.GetResponseStream();
                      StreamReader ser = new StreamReader(sr, Encoding.UTF8);
      
                      strRet = MessageHandle(ser.ReadToEnd());
                  }
                  catch (Exception ex)
                  {
                      strRet = "短信發送失敗!" + ex.Message;
                  }
                  return strRet;
              }
      
              /// <summary>
              /// 驗證手機號碼是否合法
              /// </summary>
              /// <param name="mobile">電話號碼</param>
              /// <returns></returns>
              public static bool IsMobile(string mobile)
              {
                  return System.Text.RegularExpressions.Regex.IsMatch(mobile, @"^1[3|4|5|7|8][0-9]\d{8}$");
              }
      
              /// <summary>
              /// URL編碼
              /// </summary>
              /// <param name="value"></param>
              /// <returns></returns>
              private static string specialUrlEncode(string temp)
              {
                  StringBuilder stringBuilder = new StringBuilder();
                  for (int i = 0; i < temp.Length; i++)
                  {
                      string t = temp[i].ToString();
                      string k = HttpUtility.UrlEncode(t, Encoding.UTF8);
                      if (t == k)
                      {
                          stringBuilder.Append(t);
                      }
                      else
                      {
                          stringBuilder.Append(k.ToUpper());
                      }
                  }
                  return stringBuilder.ToString().Replace("+", "%20").Replace("*", "%2A").Replace("%7E", "~");
              }
      
              /// <summary>
              /// HMACSHA1簽名
              /// </summary>
              /// <param name="accessSecret"></param>
              /// <param name="stringToSign"></param>
              /// <returns></returns>
              private static string MySign(string accessSecret, string stringToSign)
              {
                  try
                  {
                      var hmacsha1 = new HMACSHA1(Encoding.UTF8.GetBytes(accessSecret));
                      var dataBuffer = Encoding.UTF8.GetBytes(stringToSign);
                      var hashBytes = hmacsha1.ComputeHash(dataBuffer);
                      string stringbyte = BitConverter.ToString(hashBytes, 0).Replace("-", string.Empty).ToLower();
                      byte[] bytes = strToToHexByte(stringbyte);
                      return Convert.ToBase64String(bytes);
                  }
                  catch (Exception ex)
                  {
      
                      throw ex;
                  }
              }
              /// <summary>
              /// 字符串轉16進制字節數組
              /// </summary>
              /// <param name="hexString"></param>
              /// <returns></returns>
              private static byte[] strToToHexByte(string hexString)
              {
                  hexString = hexString.Replace(" ", "");
                  if ((hexString.Length % 2) != 0)
                      hexString += " ";
                  byte[] returnBytes = new byte[hexString.Length / 2];
                  for (int i = 0; i < returnBytes.Length; i++)
                      returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
                  return returnBytes;
              }
      
              /// <summary>
              /// 消息處理機制
              /// </summary>
              /// <param name="str"></param>
              /// <returns></returns>
              private static string MessageHandle(string str)
              {
                  MessageModel message = JsonConvert.DeserializeObject<MessageModel>(str);
                  string result = "";
                  switch (message.Code)
                  {
                      case "OK":
                          result = "短信發送成功!";
                          break;
                      case "isp.RAM_PERMISSION_DENY":
                          result = "RAM權限DENY";
                          break;
                      case "isv.OUT_OF_SERVICE":
                          result = "業務停機";
                          break;
                      case "isv.PRODUCT_UN_SUBSCRIPT":
                          result = "未開通云通信產品的阿里云客戶";
                          break;
                      case "isv.PRODUCT_UNSUBSCRIBE":
                          result = "產品未開通";
                          break;
                      case "isv.ACCOUNT_NOT_EXISTS":
                          result = "賬戶不存在";
                          break;
                      case "isv.ACCOUNT_ABNORMAL":
                          result = "賬戶異常    ";
                          break;
                      case "isv.SMS_TEMPLATE_ILLEGAL":
                          result = "短信模板不合法";
                          break;
                      case "isv.SMS_SIGNATURE_ILLEGAL":
                          result = "短信簽名不合法";
                          break;
                      case "isv.INVALID_PARAMETERS":
                          result = "參數異常";
                          break;
                      case "isv.MOBILE_NUMBER_ILLEGAL":
                          result = "非法手機號";
                          break;
                      case "isv.MOBILE_COUNT_OVER_LIMIT":
                          result = "手機號碼數量超過限制";
                          break;
                      case "isv.TEMPLATE_MISSING_PARAMETERS":
                          result = "模板缺少變量";
                          break;
                      case "isv.BUSINESS_LIMIT_CONTROL":
                          result = "業務限流";
                          break;
                      case "isv.INVALID_JSON_PARAM":
                          result = "JSON參數不合法,只接受字符串值";
                          break;
                      case "isv.PARAM_LENGTH_LIMIT":
                          result = "參數超出長度限制";
                          break;
                      case "isv.PARAM_NOT_SUPPORT_URL":
                          result = "不支持URL";
                          break;
                      case "isv.AMOUNT_NOT_ENOUGH":
                          result = "賬戶余額不足";
                          break;
                      case "isv.TEMPLATE_PARAMS_ILLEGAL":
                          result = "模板變量里包含非法關鍵字";
                          break;
                  }
                  return result;
              }
      
          }
      
          internal class MessageModel
          {
              public string RequestId { get; set; }
              public string Code { get; set; }
              public string Message { get; set; }
          }
      復制代碼

      上面代碼不是我原創,聲明一下,我做了一些修改調整而已,方便輔助類的使用,我們輸入我們的企業的秘鑰鍵值,然后發送測試短信即可。

                  string tel = "18620292076";
                  string result = SmsHelper.SendSms(tel, 123456);
                  Console.WriteLine(result);

      發送測試,3~5秒就可以收到驗證碼信息的提示了,如下所示。

       以上就是短信消息的發送,希望對使用阿里云短信服務的開發人員有所幫助,輔助類直接就可以使用了。

      主要研究技術:代碼生成工具、會員管理系統、客戶關系管理軟件、病人資料管理軟件、Visio二次開發、酒店管理系統、倉庫管理系統等共享軟件開發
      專注于Winform開發框架/混合式開發框架、Web開發框架、Bootstrap開發框架、微信門戶開發框架的研究及應用。
        轉載請注明出處:
      撰寫人:伍華聰  http://www.iqidi.com 
          

      相關教程
      江苏快3 四平 | 白山 | 甘肃兰州 | 宝鸡 | 鄂州 | 舟山 | 滨州 | 绥化 | 三沙 | 神木 | 梧州 | 舟山 | 遵义 | 龙口 | 果洛 | 阿坝 | 晋城 | 兴化 | 灌云 | 黄石 | 乌兰察布 | 百色 | 宁夏银川 | 明港 | 儋州 | 顺德 | 兴化 | 玉环 | 株洲 | 哈密 | 醴陵 | 琼海 | 渭南 | 上饶 | 和田 | 铜陵 | 西藏拉萨 | 白银 | 大连 | 阳泉 | 伊犁 | 南充 | 内蒙古呼和浩特 | 本溪 | 大兴安岭 | 钦州 | 钦州 | 龙口 | 怒江 | 广汉 | 株洲 | 保山 | 日照 | 湛江 | 巢湖 | 漳州 | 昭通 | 嘉善 | 台湾台湾 | 十堰 | 青海西宁 | 改则 | 德阳 | 肇庆 | 南通 | 内江 | 余姚 | 台州 | 三河 | 遵义 | 清徐 | 新疆乌鲁木齐 | 玉环 | 遵义 | 湖州 | 金华 | 丽江 | 天水 | 保山 | 基隆 | 包头 | 琼海 | 营口 | 淮安 | 鄂州 | 常德 | 兴安盟 | 云南昆明 | 安岳 | 和田 | 龙岩 | 自贡 | 日喀则 | 自贡 | 巴中 | 潍坊 | 靖江 | 大庆 | 福建福州 | 琼中 | 台北 | 阿拉善盟 | 博尔塔拉 | 玉环 | 天长 | 阳春 | 临沧 | 伊犁 | 和田 | 石河子 | 泉州 | 绍兴 | 抚州 |