webapi 用騰訊雲手機簡訊驗證碼

来源:https://www.cnblogs.com/provedl/archive/2018/07/19/9336192.html
-Advertisement-
Play Games

//使用時需要將配置里的內容換成自己的; ...


 1 #region 驗證碼相關
 2 public class SmsSDK
 3 {
 4 
 5 #region 簡訊發送的必要參數
 6 /// <summary>
 7 /// appId
 8 /// </summary>
 9 private static int appId =自己的;
10 
11 /// <summary>
12 /// appKey
13 /// </summary>
14 private static string appKey = "自己的";
15 
16 /// <summary>
17 /// 簡訊模板ID
18 /// </summary>
19 private static int tmplateId =自己的;
20 
21 #endregion
22 
23 #region 接收驗證碼的手機號
24 /// <summary>
25 /// 接受手機號
26 /// </summary>
27 private static string phoneNumber = "";
28 #endregion
29 
30 #region 獲取驗證碼
31 /// <summary>
32 /// 獲取驗證碼
33 /// </summary>
34 /// <param name="args"></param>
35 /// <param name="phone">手機號</param>
36 /// <returns></returns>
37 public bool GetMain(string phone)
38 {
39 var tel = phone;
40 phoneNumber = tel;
41 SmsSingleSenderResult singleResult;
42 List<string> templParams = new List<string>();
43 SmsSingleSender singleSender = new SmsSingleSender(appId, appKey);
44 //獲取隨機碼
45 var val = new SmsSenderUtil().GetRandom().ToString();
46 SixNums = val;
47 
48 templParams.Add(val);
49 templParams.Add("10");
50 singleResult = singleSender.SendWithParam(phoneNumber, tmplateId, templParams);
51 if (singleResult.result == 0)
52 {
53 return true;
54 } 
55 return false;
56 
57 }
58 #endregion

 

 

  1 #region 判斷驗證碼
  2 /// <summary>
  3 /// 隨機碼
  4 /// </summary>
  5 private static string SixNums = "";
  6 
  7 /// <summary>
  8 /// 判斷驗證碼
  9 /// </summary>
 10 /// <param name="IfgCode">返回填寫的驗證碼</param>
 11 /// <returns></returns>
 12 public bool JudgeIdentifyingCode(string IfgCode)
 13 {
 14 if (SixNums != IfgCode)
 15 {
 16 return false;
 17 }
 18 return true;
 19 }
 20 #endregion
 21 }
 22 #endregion
 23 
 24 #region 騰訊雲配置
 25 #region 簡訊類型枚舉
 26 /// <summary>
 27 /// 簡訊類型枚舉
 28 /// </summary>
 29 public enum SmsType
 30 {
 31 普通簡訊 = 0,
 32 營銷簡訊 = 1
 33 }
 34 #endregion
 35 
 36 #region 簡訊單發
 37 /// <summary>
 38 /// 單發
 39 /// </summary>
 40 class SmsSingleSender
 41 {
 42 #region 變數
 43 /// <summary>
 44 /// appId
 45 /// </summary>
 46 private int appId;
 47 /// <summary>
 48 /// appkey
 49 /// </summary>
 50 private string appkey;
 51 /// <summary>
 52 /// url
 53 /// </summary>
 54 private string url = "https://yun.tim.qq.com/v5/tlssmssvr/sendsms";
 55 /// <summary>
 56 /// util
 57 /// </summary>
 58 private SmsSenderUtil util = new SmsSenderUtil();
 59 #endregion
 60 
 61 #region 構造
 62 /// <summary>
 63 /// 構造函數
 64 /// </summary>
 65 /// <param name="sdkappid"></param>
 66 /// <param name="appkey"></param>
 67 public SmsSingleSender(int sdkappid, string appkey)
 68 {
 69 this.appId = sdkappid;
 70 this.appkey = appkey;
 71 }
 72 #endregion
 73 
 74 
 75 #region 指定模板單發
 76 /// <summary>
 77 /// 指定模板單發
 78 /// </summary>
 79 /// <param name="phoneNumber">不帶國家碼的手機號</param>
 80 /// <param name="templId">模板 id</param>
 81 /// <param name="templParams">模板參數列表,如模板 {1}...{2}...{3},那麼需要帶三個參數</param>
 82 /// <param name="sign">簡訊簽名,如果使用預設簽名,該欄位可預設</param>
 83 /// <param name="extend">擴展碼,可填空</param>
 84 /// <param name="ext">服務端原樣返回的參數,可填空</param>
 85 /// <returns>SmsSingleSenderResult</returns>
 86 public SmsSingleSenderResult SendWithParam(string phoneNumber, int templId, List<string> templParams, string sign= "", string extend = "", string ext = "")
 87 {
 88 long random = util.GetRandom();
 89 long curTime = util.GetCurTime();
 90 // 按照協議組織 post 請求包體
 91 JObject tel = new JObject();
 92 tel.Add("nationcode", SmsSenderUtil.nationCode);
 93 tel.Add("mobile", phoneNumber);
 94 JObject data = new JObject();
 95 data.Add("tel", tel);
 96 data.Add("sig", util.CalculateSigForTempl(appkey, random, curTime, phoneNumber));
 97 data.Add("tpl_id", templId);
 98 data.Add("params", util.SmsParamsToJSONArray(templParams));
 99 data.Add("sign", sign);
100 data.Add("time", curTime);
101 data.Add("extend", extend);
102 data.Add("ext", ext);
103 string wholeUrl = url + "?sdkappid=" + appId + "&random=" + random;
104 HttpWebRequest request = util.GetPostHttpConn(wholeUrl);
105 byte[] requestData = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(data));
106 request.ContentLength = requestData.Length;
107 Stream requestStream = request.GetRequestStream();
108 requestStream.Write(requestData, 0, requestData.Length);
109 requestStream.Close();
110 // 接收返回包
111 HttpWebResponse response = (HttpWebResponse)request.GetResponse();
112 Stream responseStream = response.GetResponseStream();
113 StreamReader streamReader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8"));
114 string responseStr = streamReader.ReadToEnd();
115 streamReader.Close();
116 responseStream.Close();
117 SmsSingleSenderResult result;
118 if (HttpStatusCode.OK == response.StatusCode)
119 {
120 result = util.ResponseStrToSingleSenderResult(responseStr);
121 }
122 else
123 {
124 result = new SmsSingleSenderResult();
125 result.result = -1;
126 result.errmsg = "http error " + response.StatusCode + " " + responseStr;
127 }
128 return result;
129 }
130 #endregion
131 }
132 #endregion

 

 1 #region 單髮結果
 2 /// <summary>
 3 /// 單髮結果
 4 /// </summary>
 5 public class SmsSingleSenderResult
 6 {
 7 /// <summary>
 8 /// 錯誤碼,0 表示成功(計費依據),非 0 表示失敗
 9 /// </summary>
10 public int result { set; get; }
11 /// <summary>
12 /// 錯誤消息,result 非 0 時的具體錯誤信息
13 /// </summary>
14 public string errmsg { set; get; }
15 /// <summary>
16 /// 用戶的 session 內容,騰訊 server 回包中會原樣返回
17 /// </summary>
18 public string ext { set; get; }
19 /// <summary>
20 /// 本次發送標識 id,標識一次簡訊下發記錄
21 /// </summary>
22 public string sid { set; get; }
23 /// <summary>
24 /// 簡訊計費的條數
25 /// </summary>
26 public int fee { set; get; }
27 /// <summary>
28 /// ToString()
29 /// </summary>
30 /// <returns></returns>
31 public override string ToString()
32 {
33 return string.Format("SmsSingleSenderResult\nresult {0}\nerrMsg {1}\next {2}\nsid {3}\nfee {4}", result, errmsg, ext, sid, fee);
34 }
35 }
36 #endregion
37 
38 #region 公共類
39 /// <summary>
40 /// 公共類
41 /// </summary>
42 class SmsSenderUtil
43 {
44 /// <summary>
45 /// 國家碼
46 /// </summary>
47 public static string nationCode = "86";
48 /// <summary>
49 /// 隨機數生成器
50 /// </summary>
51 private Random random = new Random();
52 
53 #region GetPostHttpConn
54 /// <summary>
55 /// GetPostHttpConn
56 /// </summary>
57 /// <param name="url"></param>
58 /// <returns></returns>
59 public HttpWebRequest GetPostHttpConn(string url)
60 {
61 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
62 request.Method = "POST";
63 request.ContentType = "application/x-www-form-urlencoded";
64 return request;
65 }
66 #endregion

 

  1 #region 生成隨機數
  2 /// <summary>
  3 /// 生成隨機數
  4 /// </summary>
  5 /// <returns></returns>
  6 public long GetRandom()
  7 {
  8 return random.Next(999999) % 900000 + 100000;
  9 }
 10 #endregion
 11 
 12 #region 獲取請求發起時間
 13 /// <summary>
 14 /// 獲取請求發起時間,
 15 /// unix 時間戳(單位:秒),如果和系統時間相差超過 10 分鐘則會返回失敗
 16 /// </summary>
 17 /// <returns></returns>
 18 public long GetCurTime()
 19 {
 20 Int32 unixTimestamp = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
 21 return unixTimestamp;
 22 }
 23 #endregion
 24 
 25 #region 字元串轉SHA256
 26 /// <summary>
 27 /// 字元串轉SHA256
 28 /// </summary>
 29 /// <param name="str"></param>
 30 /// <returns></returns>
 31 public string StrToHash(string str)
 32 {
 33 SHA256 sha256 = SHA256Managed.Create();
 34 byte[] resultByteArray = sha256.ComputeHash(System.Text.Encoding.UTF8.GetBytes(str));
 35 return ByteArrayToHex(resultByteArray);
 36 }
 37 
 38 /// <summary>
 39 /// 將二進位的數值轉換為 16 進位字元串,如 "abc" => "616263"
 40 /// </summary>
 41 /// <param name="byteArray"></param>
 42 /// <returns></returns>
 43 private static string ByteArrayToHex(byte[] byteArray)
 44 {
 45 string returnStr = "";
 46 if (byteArray != null)
 47 {
 48 for (int i = 0; i < byteArray.Length; i++)
 49 {
 50 returnStr += byteArray[i].ToString("x2");
 51 }
 52 }
 53 return returnStr;
 54 }
 55 #endregion
 56 
 57 #region 將單發回包解析成結果對象
 58 /// <summary>
 59 /// 將單發回包解析成結果對象
 60 /// </summary>
 61 /// <param name="str"></param>
 62 /// <returns></returns>
 63 public SmsSingleSenderResult ResponseStrToSingleSenderResult(string str)
 64 {
 65 SmsSingleSenderResult result = JsonConvert.DeserializeObject<SmsSingleSenderResult>(str);
 66 return result;
 67 }
 68 #endregion
 69 
 70 #region List<string>轉JArray
 71 /// <summary>
 72 /// List<string>轉JArray
 73 /// </summary>
 74 /// <param name="templParams"></param>
 75 /// <returns></returns>
 76 public JArray SmsParamsToJSONArray(List<string> templParams)
 77 {
 78 JArray smsParams = new JArray();
 79 foreach (string templParamsElement in templParams)
 80 {
 81 smsParams.Add(templParamsElement);
 82 }
 83 return smsParams;
 84 }
 85 #endregion
 86 
 87 #region PhoneNumbersToJSONArray
 88 /// <summary>
 89 /// PhoneNumbersToJSONArray
 90 /// </summary>
 91 /// <param name="nationCode"></param>
 92 /// <param name="phoneNumbers"></param>
 93 /// <returns></returns>
 94 public JArray PhoneNumbersToJSONArray(string nationCode, List<string> phoneNumbers)
 95 {
 96 JArray tel = new JArray();
 97 int i = 0;
 98 do
 99 {
100 JObject telElement = new JObject();
101 telElement.Add("nationcode", nationCode);
102 telElement.Add("mobile", phoneNumbers.ElementAt(i));
103 tel.Add(telElement);
104 } while (++i < phoneNumbers.Count);
105 return tel;
106 }
107 #endregion
108 
109 #region 計算App憑證
110 /*
111 "sig" 欄位根據公式 sha256(appkey=$appkey&random=$random&time=$time&mobile=$mobile)生成
112 */
113 public string CalculateSigForTempl(string appkey, long random, long curTime, List<string> phoneNumbers)
114 {
115 string phoneNumbersString = phoneNumbers.ElementAt(0);
116 for (int i = 1; i < phoneNumbers.Count; i++)
117 {
118 phoneNumbersString += "," + phoneNumbers.ElementAt(i);
119 }
120 return StrToHash(String.Format(
121 "appkey={0}&random={1}&time={2}&mobile={3}",
122 appkey, random, curTime, phoneNumbersString));
123 }
124 
125 public string CalculateSigForTempl(string appkey, long random, long curTime, string phoneNumber)
126 {
127 List<string> phoneNumbers = new List<string>();
128 phoneNumbers.Add(phoneNumber);
129 return CalculateSigForTempl(appkey, random, curTime, phoneNumbers);
130 }
131 
132 public string CalculateSig(string appkey, long random, long curTime, List<string> phoneNumbers)
133 {
134 string phoneNumbersString = phoneNumbers.ElementAt(0);
135 for (int i = 1; i < phoneNumbers.Count; i++)
136 {
137 phoneNumbersString += "," + phoneNumbers.ElementAt(i);
138 }
139 return StrToHash(String.Format(
140 "appkey={0}&random={1}&time={2}&mobile={3}",
141 appkey, random, curTime, phoneNumbersString));
142 }
143 #endregion
144 }
145 #endregion
146 #endregion

 

//使用時需要將配置里的內容換成自己的;


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • redis教程 http://www.runoob.com/redis/redis tutorial.html 下載地址:https://github.com/MSOpenTech/redis/releases。 將Redis發佈包解壓: 在目錄下,添加start.bat文件(內容如下),以管理員權 ...
  • 轉載請註明出處:http://www.cnblogs.com/zhiyong-ITNote/ 官方網站:https://docs.microsoft.com/zh-cn/aspnet/core/mvc/models/validation?view=aspnetcore-2.1 首先派生自Valida ...
  • 文本框顯示 文本框正常顯示: 文本框超出區域顯示: 實現方案 判斷文本框是否超出區域 請見《TextBlock IsTextTrimmed 判斷文本是否超出》 設置文本佈局顯示 1. FlowDirection 當文本超出顯示區域時,設置FlowDirection靠右顯示 下麵是封裝的附加屬性Scr ...
  • 工作中有這樣一個需求,有N張不同的報表,每張報表對應一個數據源,統計數據採用記憶體方式,首先在內在里定義了數據源對應實體。統計條件用lamdba表達式式實現,通過工具對單元格進行定義。在實現過程中針對每一張表來寫取數顯示是很Low的了,取數條件定義都是規則的,統計實現就是一段C#代碼,但是要針對不同的 ...
  • 起因:一臺伺服器中部署的程式,停電後未按照計劃任務正常啟動。 一、創建並配置Windows服務程式 開發工具VS2015 Framework版本2.0 1.新建Windows服務 2.在Service.cs中編寫服務程式所需要執行的操作 服務運行時會自動載入Service1中的代碼,亦有OnStar ...
  • 直接上乾貨簡單易懂 //磁碟監控(遠程/本地) //需要引用System.Management.dll public class RemoteMonitoring { private static string strMsg = ""; private static long freesize = ...
  • 在前文[基於.net core 微服務的另類實現]結尾處,提到瞭如何方便自動的生成微服務的客戶端代理,使對於調用方透明,同時將枯燥的東西使用框架集成,以提高使用便捷性。在嘗試了基於 Emit 中間語言後,最終決定使用生成代碼片段然後動態編譯的模式實現。背景:其一在前文中,我們通過框架實現了微服務面向... ...
  • 程式集版本 一個程式集會有三個版本,每個版本都是做什麼的呢,我們來看一下,每個版本號的用途及正確用法: 版本號 示例版本號: Major(主版本號)|Minor(次版本號)|Build(內部版本號)|Revision(修訂號) | | | 2 | 3 | 719 | 5 前兩個編號構成了公眾對版本的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...