C#使用融合通信API發(fā)送手機(jī)短信功能
功能實現(xiàn)
融合云通信服務(wù)平臺,為企業(yè)提供全方位通信服務(wù),發(fā)送手機(jī)短信是其一項核心功能,本文將講述如何使用融合云服務(wù)API為終端手機(jī)用戶發(fā)送短信信息,并使用 C# 進(jìn)行實現(xiàn)。
范例運(yùn)行環(huán)境
操作系統(tǒng): Windows Server 2019 DataCenter
.net版本: .netFramework4.7.2 或以上
開發(fā)工具:VS2019 C#
實現(xiàn)范例
類設(shè)計
設(shè)計UTC(融合通信)類,子類SMS類實現(xiàn)發(fā)送短信功能,SMS類設(shè)計見下表:
序號 | 成員類型 | 名稱 | 類型 | 說明 |
---|---|---|---|---|
1 | 屬性 | ErrorMessage | string | 此值代表調(diào)用API時發(fā)生的任何錯誤信息 |
2 | 屬性 | ResultJson | string | 返回調(diào)用API成功后返回的結(jié)果(并不代表一定發(fā)送成功) |
3 | 屬性 | errcode | string | 成功調(diào)用API后返回的錯誤碼:0代表發(fā)送成功,其它值請參照 errmsg 值提示 |
4 | 屬性 | errmsg | string | 請參照 errcode屬性的解釋 |
5 | 屬性 | cType | string | 默認(rèn)值為xml(小寫值),還可選擇 json(小寫值),這是云平臺提供的兩種 POST 消息體的類型 |
6 | 屬性 | sign | string | 申請云API開發(fā)者,被授權(quán)提供的簽名,如【XX公司】 |
7 | 屬性 | uid | string | 申請云API開發(fā)者,被授權(quán)提供的用戶名 |
8 | 屬性 | pwd | string | 申請云API開發(fā)者,被授權(quán)提供的密碼 |
9 | 屬性 | desttype | string | 目標(biāo)手機(jī)用戶運(yùn)營商類型:1 移動,2 聯(lián)通,3電信 ,默認(rèn)為 0 (通用) |
10 | 屬性 | sendUrl | string | 申請云API開發(fā)者,被授權(quán)提供的可調(diào)用API地址,一般會有兩個地址: POST XML 消息體的請調(diào)用例如: http://api.uctyun.cn:0000/adc_posthandler_new POST JSON 消息體的請調(diào)用例如: |
11 | 屬性 | postInfo | string | 這是一個調(diào)試信息,返回生成的 POST 消息體信息 |
12 | 方法 | send | void | send方法有兩個參數(shù): 1:string phoneNumber (手機(jī)號) 2:string msgContent (要發(fā)送的消息) 本方法無返回類型,返回值均返寫到 ErrorMessage / ResultJson / errcode / errmsg / postInfo 屬性值上 |
類代碼實現(xiàn)
實現(xiàn)代碼如下:
public class UTC { public class SMS { public string ErrorMessage = ""; public string ResultJson = ""; public string errcode = ""; public string errmsg = ""; public string cType = "xml"; public string sign { get; set; } public string uid { get; set; } public string pwd { get; set; } public string desttype { get; set; } public string sendUrl { get; set; } public string postInfo = ""; public SMS() { desttype = "0"; } public void send(string phoneNumber, string msgContent) { byte[] bytes = System.Text.Encoding.UTF8.GetBytes(msgContent + sign); string base64msg = System.Convert.ToBase64String(bytes); string[] headers = new string[3]; headers[0] = "Connection:close"; headers[1] = "Content-Type:text/" + cType + ";charset=utf-8"; headers[2] = "Action:\"submitreq\""; string postData = "{\"user\":\"" + uid + "\",\"password\":\"" + pwd + "\",\"submit\":[" + "{\"srctermid\":\"\"," + "\"desttermid\":\"" + phoneNumber + "\",\"msgcontent\":\"" + base64msg + "\"," + "\"usermsgid\":\"" + msgid + "\"," + "\"desttype\":\"" + desttype + "\"}]}"; if (cType == "xml") { string xmlData = "<?xml version=\"1.0\" encoding=\"utf-8\"?><Body>" + "<user>" + uid + "</user><password>" + pwd + "</password>" + "<version>1.2</version><submit><usermsgid>" + msgid + "</usermsgid><desttermid>" + phoneNumber + "</desttermid><srctermid></srctermid><msgcontent>" + base64msg + "</msgcontent><signid>0</signid><desttype>" + desttype + "</desttype><needreply>1</needreply>" + "</submit></Body> "; postData = xmlData; } postInfo = postData; ErrorMessage = ""; ResultJson = ""; errcode = ""; errmsg = ""; string rs=GetResponseResult(sendUrl, Encoding.UTF8, "POST", postData, headers); ErrorMessage = ws.ErrorMessage; ResultJson = rs; if (ErrorMessage == "" && ResultJson != "") { if (cType == "xml") { string[] rv_xml = GetBetweenStr(rs, "<result>", "</result>").Split(':'); errcode = rv_xml[0]; if (rv_xml.Length>1) { errmsg = rv_xml[1]; } } else if (cType == "json") { try { Newtonsoft.Json.Linq.JObject jsonObj = Newtonsoft.Json.Linq.JObject.Parse(rs); string[] rv = jsonObj["result"].ToString().Split(':'); errcode = rv[0]; if (rv.Length > 1) { errmsg = rv[1]; } } catch (Exception e) { ErrorMessage += "\r\n" + e.Message; ResultJson = rs; } } } } public string GetBetweenStr(string wholestr,string beginstr,string endstr) { string _temp=""; if (beginstr == null && endstr == null) return ""; int _start=(beginstr==null?0:wholestr.IndexOf(beginstr,0)); if (_start == -1) { return ""; } if (beginstr == null) { beginstr = ""; if (wholestr.IndexOf(endstr, 0) == -1) { return ""; } } if (endstr != null) { int _end = wholestr.IndexOf(endstr,_start+beginstr.Length); if ((_end - _start - beginstr.Length > 0) && (_end > _start)) { _temp = wholestr.Substring(_start + beginstr.Length, _end - _start - beginstr.Length); } } else { if (wholestr.IndexOf(beginstr, 0) == -1) { return ""; } int _end = wholestr.Length; if ((_end - _start - beginstr.Length > 0) && (_end > _start)) { _temp = wholestr.Substring(_start + beginstr.Length, _end - _start - beginstr.Length); } } return _temp; } } }
調(diào)用范例
示例代碼如下:
UTC.SMS utcsms = new UTC.SMS(); utcsms.cType = "xml"; //設(shè)置為 POST XML 消息體類型 utcsms.uid = "888888"; utcsms.pwd = "TJ999999"; utcsms.sign = "【XX公司】"; utcsms.sendUrl = "http://api.uctyun.cn:0000/adc_posthandler_new"; //utcsms.sendUrl = "http://api.uctyun.cn:0000/adc_posthandler_json"; //如果是JSON請訪問這個類型的API 地址 //發(fā)送短信,提供手機(jī)號和短信息內(nèi)容 utcsms.send("13899999999", "融合通信提醒您,您正在執(zhí)行登錄操作,驗證碼:12345678"); string debug = string.Format("API:errcode:{4}\r\nerrmsg:{5}\r\n{3}\r\nErrMessage:{0}\r\nResultJson:{1}\r\nPostInfo:{2}", utcsms.ErrorMessage, utcsms.ResultJson, utcsms.postInfo, utcsms.sendUrl,utcsms.errcode,utcsms.errmsg);
總結(jié)
GetResponseResult 方法本次得到了更新,主要包括消息頭的 Connection 名稱,在 C#中使用 request.KeepAlive= Value == "close"?false : true; 的寫法來實現(xiàn)。更新后的代碼如下:
public string GetResponseResult(string url, System.Text.Encoding encoding, string method, string postData,string[] headers,string ContentType= "application/x-www-form-urlencoded",bool secValid=true) { method = method.ToUpper(); if (secValid == false) { ServicePointManager.ServerCertificateValidationCallback = validSecurity; } System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls | System.Net.SecurityProtocolType.Tls11 | System.Net.SecurityProtocolType.Tls12; if (method == "GET") { try { WebRequest request2 = WebRequest.Create(@url); request2.Method = method; WebResponse response2 = request2.GetResponse(); Stream stream = response2.GetResponseStream(); StreamReader reader = new StreamReader(stream, encoding); string content = reader.ReadToEnd(); return content; } catch (Exception ex) { ErrorMessage = ex.Message; return ""; } } Stream outstream = null; Stream instream = null; StreamReader sr = null; HttpWebResponse response = null; HttpWebRequest request = null; byte[] data = encoding.GetBytes(postData); // 準(zhǔn)備請求... try { // 設(shè)置參數(shù) request = WebRequest.Create(url) as HttpWebRequest; CookieContainer cookieContainer = new CookieContainer(); request.CookieContainer = cookieContainer; request.AllowAutoRedirect = true; request.Method = method; request.Timeout = 1000000; if (headers != null) { for(int i = 0; i < headers.GetLength(0); i++) { if (headers[i].Split(':').Length <2) { continue; } if (headers[i].Split(':').Length > 1) { if (headers[i].Split(':')[0] == "Host") { request.Host = headers[i].Split(':')[1]; continue; }else if (headers[i].Split(':')[0] == "Content-Type") { request.ContentType = headers[i].Split(':')[1]; continue; } else if (headers[i].Split(':')[0] == "Connection") { request.KeepAlive= headers[i].Split(':')[1]== "close"?false : true; continue; } } request.Headers.Add(headers[i]); } } request.ContentType = ContentType; request.ContentLength = data.Length; outstream = request.GetRequestStream(); outstream.Write(data, 0, data.Length); outstream.Close(); //發(fā)送請求并獲取相應(yīng)回應(yīng)數(shù)據(jù) response = request.GetResponse() as HttpWebResponse; //直到request.GetResponse()程序才開始向目標(biāo)網(wǎng)頁發(fā)送Post請求 instream = response.GetResponseStream(); sr = new StreamReader(instream, encoding); //返回結(jié)果網(wǎng)頁(html)代碼 string content = sr.ReadToEnd(); sr.Close(); sr.Dispose(); return content; } catch (Exception ex) { ErrorMessage = ex.Message; return ""; } }//get response result
更多介紹請參閱我的文章:《C# 實現(xiàn)訪問 Web API Url 提交數(shù)據(jù)并獲取處理結(jié)果》
融合通信官網(wǎng)首頁請訪問:https://www.uctyun.cn/
技術(shù)開發(fā)文檔請訪問:https://www.uctyun.cn/jswd.html
到此這篇關(guān)于C#使用融合通信API發(fā)送手機(jī)短信息的文章就介紹到這了,更多相關(guān)C#API發(fā)送短信息內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C# 靜態(tài)構(gòu)造函數(shù)使用總結(jié)
今天花了一些時間把靜態(tài)構(gòu)造函數(shù)的用法總結(jié)了一下,希望高手們指點。謝謝2013-03-03C#在Windows窗體控件實現(xiàn)內(nèi)容拖放(DragDrop)功能
這篇文章介紹了C#在Windows窗體控件實現(xiàn)內(nèi)容拖放(DragDrop)的功能,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05Unity Shader實現(xiàn)玻璃材質(zhì)效果
這篇文章主要為大家詳細(xì)介紹了Unity Shader實現(xiàn)玻璃材質(zhì)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-04-04C#調(diào)用Python程序傳參數(shù)獲得返回值
C# 調(diào)用 Python 程序有多種方式,本文主要介紹了4種方式,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02C# 根據(jù)表格偶數(shù)、奇數(shù)加載不同顏色
這篇文章主要介紹了C# 根據(jù)表格偶數(shù)、奇數(shù)加載不同顏色,需要的朋友可以參考下2017-09-09