C#使用融合通信API發(fā)送手機短信息
功能實現(xiàn)
融合云通信服務平臺,為企業(yè)提供全方位通信服務,發(fā)送手機短信是其一項核心功能,本文將講述如何使用融合云服務API為終端手機用戶發(fā)送短信信息,并使用 C# 進行實現(xiàn)。

范例運行環(huán)境
操作系統(tǒng): Windows Server 2019 DataCenter
.net版本: .netFramework4.7.2 或以上
開發(fā)工具:VS2019 C#
實現(xiàn)范例
類設計
設計UTC(融合通信)類,子類SMS類實現(xiàn)發(fā)送短信功能,SMS類設計見下表:
| 序號 | 成員類型 | 名稱 | 類型 | 說明 |
|---|---|---|---|---|
| 1 | 屬性 | ErrorMessage | string | 此值代表調用API時發(fā)生的任何錯誤信息 |
| 2 | 屬性 | ResultJson | string | 返回調用API成功后返回的結果(并不代表一定發(fā)送成功) |
| 3 | 屬性 | errcode | string | 成功調用API后返回的錯誤碼:0代表發(fā)送成功,其它值請參照 errmsg 值提示 |
| 4 | 屬性 | errmsg | string | 請參照 errcode屬性的解釋 |
| 5 | 屬性 | cType | string | 默認值為xml(小寫值),還可選擇 json(小寫值),這是云平臺提供的兩種 POST 消息體的類型 |
| 6 | 屬性 | sign | string | 申請云API開發(fā)者,被授權提供的簽名,如【XX公司】 |
| 7 | 屬性 | uid | string | 申請云API開發(fā)者,被授權提供的用戶名 |
| 8 | 屬性 | pwd | string | 申請云API開發(fā)者,被授權提供的密碼 |
| 9 | 屬性 | desttype | string | 目標手機用戶運營商類型:1 移動,2 聯(lián)通,3電信 ,默認為 0 (通用) |
| 10 | 屬性 | sendUrl | string | 申請云API開發(fā)者,被授權提供的可調用API地址,一般會有兩個地址: POST XML 消息體的請調用例如: http://api.uctyun.cn:0000/adc_posthandler_new POST JSON 消息體的請調用例如: http://api.uctyun.cn:0000/adc_posthandler_json |
| 11 | 屬性 | postInfo | string | 這是一個調試信息,返回生成的 POST 消息體信息 |
| 12 | 方法 | send | void | send方法有兩個參數(shù): 1:string phoneNumber (手機號) 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;
}
}
}調用范例
示例代碼如下:
UTC.SMS utcsms = new UTC.SMS();
utcsms.cType = "xml"; //設置為 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ā)送短信,提供手機號和短信息內容
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);總結
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);
// 準備請求...
try
{
// 設置參數(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ā)送請求并獲取相應回應數(shù)據(jù)
response = request.GetResponse() as HttpWebResponse;
//直到request.GetResponse()程序才開始向目標網(wǎng)頁發(fā)送Post請求
instream = response.GetResponseStream();
sr = new StreamReader(instream, encoding);
//返回結果網(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ù)并獲取處理結果》
到此這篇關于C#使用融合通信API發(fā)送手機短信息的文章就介紹到這了,更多相關C#發(fā)送手機短信息內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C#算法函數(shù):獲取一個字符串中的最大長度的數(shù)字
這篇文章介紹了使用C#獲取一個字符串中最大長度的數(shù)字的實例代碼,有需要的朋友可以參考一下。2016-06-06
使用C#將Markdown轉換為Word或PDF的實現(xiàn)方法
在現(xiàn)代軟件開發(fā)和內容創(chuàng)作中,我們經常需要在不同的文檔格式之間進行轉換,Markdown以其簡潔、易讀寫和版本控制友好的特性,越來越受到開發(fā)者的青睞,本文將深入探討如何利用C#和強大的Spire.Doc for .NET庫,輕松實現(xiàn)Markdown到Word和PDF的高效、可靠轉換2025-09-09
C#/VB.NET?實現(xiàn)彩色PDF轉為灰度PDF
本文以C#代碼為例介紹如何實現(xiàn)將彩色PDF文件轉為灰度(黑白)的PDF文件,即將PDF文檔里面的彩色圖片或者文字等通過調用方法轉為文檔頁面為灰色調、無彩色效果的文檔??靵砀S小編一起學習吧2021-11-11
C#設置PDF表單不可編輯以及提取表單數(shù)據(jù)的操作
PDF表單是PDF中的可編輯區(qū)域,允許用戶填寫指定信息,當表單填寫完成后,有時候我們可能需要將其設置為不可編輯,以保護表單內容的完整性和可靠性,本文將給大家介紹C#設置PDF表單不可編輯以及提取表單數(shù)據(jù)的操作,需要的朋友可以參考下2024-06-06
C#使用ODBC與OLEDB連接數(shù)據(jù)庫的方法示例
這篇文章主要介紹了C#使用ODBC與OLEDB連接數(shù)據(jù)庫的方法,結合實例形式分析了C#基于ODBC與OLEDB實現(xiàn)數(shù)據(jù)庫連接操作簡單操作技巧,需要的朋友可以參考下2017-05-05

