C#發送手機驗證碼,平台有很多,我就說說其中的1個平台
測試環境:.net2.0
測試效果:速度還可以,10秒內接收短信
1、去http://www.yuntongxun.com注冊,會送8元測試金額;正式使用必須充值500元以上才行
2、部署代碼
另一個平台感覺也不錯,注冊送100條短信,認證再送500條短信http://www.etuocloud.com
核心測試代碼,紅色為你需要改下的參數
using System; using System.Collections.Generic; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.IO; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.Reflection; public partial class ceshi : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { string ret = null; CCPRestSDK.CCPRestSDK api = new CCPRestSDK.CCPRestSDK(); //ip格式如下,不帶https:// bool isInit = api.init("app.cloopen.com", "8883");//sandboxapp.cloopen.com api.setAccount("816da7878745458787545878", "7bbd1891jkdjfjaksldfjk054bd54f6");//主賬號,主賬號令牌 api.setAppId("jkdsjfkdjfkdsfjlsjueorun");//AppID try { if (isInit) { string[] data = { "1234", "30" };//驗證碼,時間 Dictionary<string, object> retData = api.SendTemplateSMS("18000000456", "1", data);//短信接收號碼, 短信模板id, 內容數據 ret = getDictionaryData(retData); string statusCode = retData["statusCode"].ToString(); string statusMsg = retData["statusMsg"].ToString(); Response.Write(statusCode + "==" + statusMsg + "<br><br><br><br>"); } else { ret = "初始化失敗"; } } catch (Exception exc) { ret = exc.Message; } finally { Response.Write(ret); } } private string getDictionaryData(Dictionary<string, object> data) { string ret = null; foreach (KeyValuePair<string, object> item in data) { if (item.Value != null && item.Value.GetType() == typeof(Dictionary<string, object>)) { ret += item.Key.ToString() + "={"; ret += getDictionaryData((Dictionary<string, object>)item.Value); ret += "};"; } else { ret += item.Key.ToString() + "=" + (item.Value == null ? "null" : item.Value.ToString()) + ";"; } } return ret; } }
CCPRestSDK類,經改良支持.net2.0
/* * Copyright (c) 2014 The CCP project authors. All Rights Reserved. * * Use of this source code is governed by a Beijing Speedtong Information Technology Co.,Ltd license * that can be found in the LICENSE file in the root of the web site. * * http://www.114390.com * * An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Reflection; using System.Text; using System.Xml; namespace CCPRestSDK { enum EBodyType:uint { EType_XML = 0, EType_JSON }; public class CCPRestSDK { private string m_restAddress = null; private string m_restPort = null; private string m_mainAccount = null; private string m_mainToken = null; private string m_subAccount = null; private string m_subToken = null; private string m_voipAccount = null; private string m_voipPwd = null; private string m_appId = null; private bool m_isWriteLog = false; private EBodyType m_bodyType = EBodyType.EType_XML; /// <summary> /// 服務器api版本 /// </summary> const string softVer = "2013-12-26"; /// <summary> /// 初始化函數 /// </summary> /// <param name="serverIP">服務器地址</param> /// <param name="serverPort">服務器端口</param> /// <returns></returns> public bool init(string restAddress, string restPort) { this.m_restAddress = restAddress; this.m_restPort = restPort; if (m_restAddress == null || m_restAddress.Length < 0 || m_restPort == null || m_restPort.Length < 0 || Convert.ToInt32(m_restPort) < 0) return false; return true; } /// <summary> /// 設置主帳號信息 /// </summary> /// <param name="accountSid">主帳號</param> /// <param name="accountToken">主帳號令牌</param> public void setAccount(string accountSid, string accountToken) { this.m_mainAccount = accountSid; this.m_mainToken = accountToken; } /// <summary> /// 設置子帳號信息 /// </summary> /// <param name="subAccountSid">子帳號</param> /// <param name="subAccountToken">子帳號令牌</param> /// <param name="voipAccount">VoIP帳號</param> /// <param name="voipPassword">VoIP密碼</param> public void setSubAccount(string subAccountSid, string subAccountToken, string voipAccount, string voipPassword) { this.m_subAccount = subAccountSid; this.m_subToken = subAccountToken; this.m_voipAccount = voipAccount; this.m_voipPwd = voipPassword; } /// <summary> /// 設置應用ID /// </summary> /// <param name="appId">應用ID</param> public void setAppId(string appId) { this.m_appId = appId; } /// <summary> /// 日志開關 /// </summary> /// <param name="enable">日志開關</param> public void enabeLog(bool enable) { this.m_isWriteLog = enable; } /// <summary> /// 獲取日志路徑 /// </summary> /// <returns>日志路徑</returns> public string GetLogPath() { string dllpath = System.Reflection.Assembly.GetExecutingAssembly().CodeBase; dllpath = dllpath.Substring(8, dllpath.Length - 8); // 8是 file:// 的長度 return System.IO.Path.GetDirectoryName(dllpath)+"\\log.txt"; } /// <summary> /// 主帳號信息查詢 /// </summary> /// <exception cref="Exception"></exception> /// <returns>包體內容</returns> public Dictionary<string,object> QueryAccountInfo() { Dictionary<string, object> initError = paramCheckRest(); if (initError != null) { return initError; } initError = paramCheckMainAccount(); if (initError != null) { return initError; } try { string date = DateTime.Now.ToString("yyyyMMddhhmmss"); // 構建URL內容 string sigstr = MD5Encrypt(m_mainAccount + m_mainToken + date); string uriStr = string.Format("https://{0}:{1}/{2}/Accounts/{3}/AccountInfo?sig={4}", m_restAddress, m_restPort, softVer, m_mainAccount, sigstr); Uri address = new Uri(uriStr); WriteLog("QueryAccountInfo url = "+uriStr); // 創建網絡請求 HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest; setCertificateValidationCallBack(); // 構建Head request.Method = "GET"; Encoding myEncoding = Encoding.GetEncoding("utf-8"); byte[] myByte = myEncoding.GetBytes(m_mainAccount + ":" + date); string authStr = Convert.ToBase64String(myByte); request.Headers.Add("Authorization", authStr); if (m_bodyType == EBodyType.EType_XML) { request.Accept = "application/xml"; request.ContentType = "application/xml;charset=utf-8"; using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) { // Get the response stream StreamReader reader = new StreamReader(response.GetResponseStream()); string responseStr = reader.ReadToEnd(); WriteLog("QueryAccountInfo responseBody = " + responseStr); if (responseStr != null && responseStr.Length > 0) { //Dictionary<string, object> responseResult = new Dictionary<string, object> { { "statusCode", "0" }, { "statusMsg", "成功" }, { "data", null } }; Dictionary<string, object> responseResult = new Dictionary<string, object>(); responseResult.Add("statusCode", "0"); responseResult.Add("statusMsg", "成功"); responseResult.Add("data", null); XmlDocument resultXml = new XmlDocument(); resultXml.LoadXml(responseStr); XmlNodeList nodeList = resultXml.SelectSingleNode("Response").ChildNodes; foreach (XmlNode item in nodeList) { if (item.Name == "statusCode") { responseResult["statusCode"] = item.InnerText; } else if (item.Name == "statusMsg") { responseResult["statusMsg"] = item.InnerText; } else if (item.Name == "Account") { Dictionary<string, object> data = new Dictionary<string, object>(); foreach (XmlNode subItem in item.ChildNodes) { data.Add(subItem.Name, subItem.InnerText); } //responseResult["data"] = new Dictionary<string, object> {{item.Name,data}}; Dictionary<string, object> data1 = new Dictionary<string, object>(); data1.Add(item.Name, data); responseResult["data"] = data1; } } return responseResult; } //return new Dictionary<string, object> { { "statusCode", 172002 }, { "statusMsg", "無返回" }, { "data", null } }; Dictionary<string, object> data2 = new Dictionary<string, object>(); data2.Add("statusCode", 172002); data2.Add("statusMsg", "無返回"); data2.Add("data", null); return data2; } } else { request.Accept = "application/json"; request.ContentType = "application/json;charset=utf-8"; using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) { StreamReader reader = new StreamReader(response.GetResponseStream()); string responseStr = reader.ReadToEnd(); WriteLog("QueryAccountInfo responseBody = " + responseStr); if (responseStr != null && responseStr.Length > 0) { Dictionary<string, object> responseResult = new Dictionary<string, object> (); responseResult["resposeBody"] = responseStr; return responseResult; } //return new Dictionary<string, object> { { "statusCode", 172002 }, { "statusMsg", "無返回" }, { "data", null } }; Dictionary<string, object> data2 = new Dictionary<string, object>(); data2.Add("statusCode", 172002); data2.Add("statusMsg", "無返回"); data2.Add("data", null); return data2; } } // 獲取請求 } catch (Exception e) { throw e; } } /// <summary> /// 創建子帳號 /// </summary> /// <param name="friendlyName">子帳號名稱。可由英文字母和阿拉伯數字組成子帳號唯一名稱,推薦使用電子郵箱地址</param> /// <exception cref="ArgumentNullException">參數不能為空</exception> /// <exception cref="Exception"></exception> /// <returns>包體內容</returns> public Dictionary<string, object> CreateSubAccount(string friendlyName) { Dictionary<string, object> initError = paramCheckRest(); if (initError != null) { return initError; } initError = paramCheckMainAccount(); if (initError != null) { return initError; } initError = paramCheckAppId(); if (initError != null) { return initError; } if(friendlyName == null) throw new ArgumentNullException("friendlyName"); try { string date = DateTime.Now.ToString("yyyyMMddhhmmss"); // 構建URL內容 string sigstr = MD5Encrypt(m_mainAccount + m_mainToken + date); string uriStr = string.Format("https://{0}:{1}/{2}/Accounts/{3}/SubAccounts?sig={4}", m_restAddress, m_restPort, softVer, m_mainAccount, sigstr); Uri address = new Uri(uriStr); WriteLog("CreateSubAccount url = " +uriStr); // 創建網絡請求 HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest; setCertificateValidationCallBack(); // 構建Head request.Method = "POST"; Encoding myEncoding = Encoding.GetEncoding("utf-8"); byte[] myByte = myEncoding.GetBytes(m_mainAccount + ":" + date); string authStr = Convert.ToBase64String(myByte); request.Headers.Add("Authorization", authStr); // 構建Body StringBuilder data = new StringBuilder(); if (m_bodyType == EBodyType.EType_XML) { request.Accept = "application/xml"; request.ContentType = "application/xml;charset=utf-8"; data.Append("<?xml version='1.0' encoding='utf-8'?><SubAccount>"); data.Append("<appId>").Append(m_appId).Append("</appId>"); data.Append("<friendlyName>").Append(friendlyName).Append("</friendlyName>"); data.Append("</SubAccount>"); } else { request.Accept = "application/json"; request.ContentType = "application/json;charset=utf-8"; data.Append("{"); data.Append("\"appId\":\"").Append(m_appId).Append("\""); data.Append(",\"friendlyName\":\"").Append(friendlyName).Append("\""); data.Append("}"); } byte[] byteData = UTF8Encoding.UTF8.GetBytes(data.ToString()); WriteLog("CreateSubAccount requestBody = " +data.ToString()); // 開始請求 using (Stream postStream = request.GetRequestStream()) { postStream.Write(byteData, 0, byteData.Length); } // 獲取請求 using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) { // Get the response stream StreamReader reader = new StreamReader(response.GetResponseStream()); string responseStr = reader.ReadToEnd(); WriteLog("CreateSubAccount responseBody = " + responseStr); if (responseStr != null && responseStr.Length > 0) { //Dictionary<string, object> responseResult = new Dictionary<string, object> { { "statusCode", "0" }, { "statusMsg", "成功" }, { "data", null } }; Dictionary<string, object> responseResult = new Dictionary<string, object>(); responseResult.Add("statusCode", "0"); responseResult.Add("statusMsg", "成功"); responseResult.Add("data", null); if (m_bodyType == EBodyType.EType_XML) { XmlDocument resultXml = new XmlDocument(); resultXml.LoadXml(responseStr); XmlNodeList nodeList = resultXml.SelectSingleNode("Response").ChildNodes; foreach (XmlNode item in nodeList) { if (item.Name == "statusCode") { responseResult["statusCode"] = item.InnerText; } else if (item.Name == "statusMsg") { responseResult["statusMsg"] = item.InnerText; } else if (item.Name == "SubAccount") { Dictionary<string, object> retData = new Dictionary<string, object>(); foreach (XmlNode subItem in item.ChildNodes) { retData.Add(subItem.Name, subItem.InnerText); } //responseResult["data"] = new Dictionary<string, object> { { item.Name, retData } }; Dictionary<string, object> data1 = new Dictionary<string, object>(); data1.Add(item.Name, retData); responseResult["data"] = data1; } } } else { responseResult.Clear(); responseResult["resposeBody"] = responseStr; } return responseResult; } //return new Dictionary<string, object> { { "statusCode", 172002 }, { "statusMsg", "無返回" }, { "data", null } }; Dictionary<string, object> data2 = new Dictionary<string, object>(); data2.Add("statusCode", 172002); data2.Add("statusMsg", "無返回"); data2.Add("data", null); return data2; } } catch (Exception e) { throw e; } } /// <summary> /// 獲取應用下子帳號 /// </summary> /// <param name="startNo">開始的序號,默認從0開始</param> /// <param name="offset">一次查詢的最大條數,最小是1條,最大是100條</param> /// <exception cref="ArgumentOutOfRangeException">參數超出范圍</exception> /// <exception cref="Exception"></exception> /// <returns></returns> public Dictionary<string, object> GetSubAccounts(uint startNo, uint offset) { Dictionary<string, object> initError = paramCheckRest(); if (initError != null) { return initError; } initError = paramCheckMainAccount(); if (initError != null) { return initError; } initError = paramCheckAppId(); if (initError != null) { return initError; } if (offset < 1 || offset > 100) { throw new ArgumentOutOfRangeException("offset超出范圍"); } try { string date = DateTime.Now.ToString("yyyyMMddhhmmss"); // 構建URL內容 string sigstr = MD5Encrypt(m_mainAccount + m_mainToken + date); string uriStr = string.Format("https://{0}:{1}/{2}/Accounts/{3}/GetSubAccounts?sig={4}", m_restAddress, m_restPort, softVer, m_mainAccount, sigstr); Uri address = new Uri(uriStr); WriteLog("GetSubAccounts url = "+uriStr); // 創建網絡請求 HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest; setCertificateValidationCallBack(); // 構建Head request.Method = "POST"; Encoding myEncoding = Encoding.GetEncoding("utf-8"); byte[] myByte = myEncoding.GetBytes(m_mainAccount + ":" + date); string authStr = Convert.ToBase64String(myByte); request.Headers.Add("Authorization", authStr); // 構建Body StringBuilder data = new StringBuilder(); if (m_bodyType == EBodyType.EType_XML) { request.Accept = "application/xml"; request.ContentType = "application/xml;charset=utf-8"; data.Append("<?xml version='1.0' encoding='utf-8'?><SubAccount>"); data.Append("<appId>").Append(m_appId).Append("</appId>"); data.Append("<startNo>").Append(startNo).Append("</startNo>"); data.Append("<offset>").Append(offset).Append("</offset>"); data.Append("</SubAccount>"); } else { request.Accept = "application/json"; request.ContentType = "application/json;charset=utf-8"; data.Append("{"); data.Append("\"appId\":\"").Append(m_appId).Append("\""); data.Append(",\"startNo\":\"").Append(startNo).Append("\""); data.Append(",\"offset\":\"").Append(offset).Append("\""); data.Append("}"); } byte[] byteData = UTF8Encoding.UTF8.GetBytes(data.ToString()); WriteLog("GetSubAccounts requestBody = " + data.ToString()); // 開始請求 using (Stream postStream = request.GetRequestStream()) { postStream.Write(byteData, 0, byteData.Length); } // 獲取請求 using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) { // Get the response stream StreamReader reader = new StreamReader(response.GetResponseStream()); string responseStr = reader.ReadToEnd(); WriteLog("GetSubAccounts responseBody = "+responseStr); if (responseStr != null && responseStr.Length > 0) { //Dictionary<string, object> responseResult = new Dictionary<string, object> { { "statusCode", "0" }, { "statusMsg", "成功" }, { "data", null } }; Dictionary<string, object> responseResult = new Dictionary<string, object>(); responseResult.Add("statusCode", "0"); responseResult.Add("statusMsg", "成功"); responseResult.Add("data", null); Dictionary<string, object> retData = new Dictionary<string, object>(); List<object> subAccountList = new List<object>(); if (m_bodyType == EBodyType.EType_XML) { XmlDocument resultXml = new XmlDocument(); resultXml.LoadXml(responseStr); XmlNodeList nodeList = resultXml.SelectSingleNode("Response").ChildNodes; foreach (XmlNode item in nodeList) { if (item.Name == "statusCode") { responseResult["statusCode"] = item.InnerText; } else if (item.Name == "statusMsg") { responseResult["statusMsg"] = item.InnerText; } else if (item.Name == "totalCount") { retData.Add(item.Name, item.InnerText); } else if (item.Name == "SubAccount") { Dictionary<string, object> SubAccount = new Dictionary<string, object>(); foreach (XmlNode subItem in item.ChildNodes) { SubAccount.Add(subItem.Name, subItem.InnerText); } subAccountList.Add(SubAccount); } } } else { responseResult.Clear(); responseResult["resposeBody"] = responseStr; } if (retData.Count > 0) { if (subAccountList.Count > 0) { retData.Add("SubAccount", subAccountList); } responseResult["data"] = retData; } return responseResult; } //return new Dictionary<string, object> { { "statusCode", 172002 }, { "statusMsg", "無返回" }, { "data", null } }; Dictionary<string, object> data2 = new Dictionary<string, object>(); data2.Add("statusCode", 172002); data2.Add("statusMsg", "無返回"); data2.Add("data", null); return data2; } } catch (Exception e) { throw e; } } /// <summary> /// 查詢子帳號信息 /// </summary> /// <param name="friendlyName">子帳號名稱</param> /// <exception cref="ArgumentNullException">參數不能為空</exception> /// <exception cref="Exception"></exception> /// <returns>包體內容</returns> public Dictionary<string, object> QuerySubAccount(string friendlyName) { Dictionary<string, object> initError = paramCheckRest(); if (initError != null) { return initError; } initError = paramCheckMainAccount(); if (initError != null) { return initError; } initError = paramCheckAppId(); if (initError != null) { return initError; } if (friendlyName == null) throw new ArgumentNullException("friendlyName"); try { string date = DateTime.Now.ToString("yyyyMMddhhmmss"); // 構建URL內容 string sigstr = MD5Encrypt(m_mainAccount + m_mainToken + date); string uriStr = string.Format("https://{0}:{1}/{2}/Accounts/{3}/QuerySubAccountByName?sig={4}", m_restAddress, m_restPort, softVer, m_mainAccount, sigstr); Uri address = new Uri(uriStr); WriteLog("QuerySubAccount url = " + uriStr); // 創建網絡請求 HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest; setCertificateValidationCallBack(); // 構建Head request.Method = "POST"; Encoding myEncoding = Encoding.GetEncoding("utf-8"); byte[] myByte = myEncoding.GetBytes(m_mainAccount + ":" + date); string authStr = Convert.ToBase64String(myByte); request.Headers.Add("Authorization", authStr); // 構建Body StringBuilder data = new StringBuilder(); if (m_bodyType == EBodyType.EType_XML) { request.Accept = "application/xml"; request.ContentType = "application/xml;charset=utf-8"; data.Append("<?xml version='1.0' encoding='utf-8'?><SubAccount>"); data.Append("<appId>").Append(m_appId).Append("</appId>"); data.Append("<friendlyName>").Append(friendlyName).Append("</friendlyName>"); data.Append("</SubAccount>"); } else { request.Accept = "application/json"; request.ContentType = "application/json;charset=utf-8"; data.Append("{"); data.Append("\"appId\":\"").Append(m_appId).Append("\""); data.Append(",\"friendlyName\":\"").Append(friendlyName).Append("\""); data.Append("}"); } byte[] byteData = UTF8Encoding.UTF8.GetBytes(data.ToString()); WriteLog("QuerySubAccount requestBody = "+data.ToString()); // 開始請求 using (Stream postStream = request.GetRequestStream()) { postStream.Write(byteData, 0, byteData.Length); } // 獲取請求 using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) { // Get the response stream StreamReader reader = new StreamReader(response.GetResponseStream()); string responseStr = reader.ReadToEnd(); WriteLog("QuerySubAccount responseBody = " + responseStr); if (responseStr != null && responseStr.Length > 0) { //Dictionary<string, object> responseResult = new Dictionary<string, object> { { "statusCode", "0" }, { "statusMsg", "成功" }, { "data", null } }; Dictionary<string, object> responseResult = new Dictionary<string, object>(); responseResult.Add("statusCode", "0"); responseResult.Add("statusMsg", "成功"); responseResult.Add("data", null); if (m_bodyType == EBodyType.EType_XML) { XmlDocument resultXml = new XmlDocument(); resultXml.LoadXml(responseStr); XmlNodeList nodeList = resultXml.SelectSingleNode("Response").ChildNodes; foreach (XmlNode item in nodeList) { if (item.Name == "statusCode") { responseResult["statusCode"] = item.InnerText; } else if (item.Name == "statusMsg") { responseResult["statusMsg"] = item.InnerText; } else if (item.Name == "SubAccount") { Dictionary<string, object> retData = new Dictionary<string, object>(); foreach (XmlNode subItem in item.ChildNodes) { retData.Add(subItem.Name, subItem.InnerText); } //responseResult["data"] = new Dictionary<string, object> { { item.Name, retData } }; Dictionary<string, object> data1 = new Dictionary<string, object>(); data1.Add(item.Name, retData); responseResult["data"] = data1; } } } else { responseResult.Clear(); responseResult["resposeBody"] = responseStr; } return responseResult; } //return new Dictionary<string, object> { { "statusCode", 172002 }, { "statusMsg", "無返回" }, { "data", null } }; Dictionary<string, object> data2 = new Dictionary<string, object>(); data2.Add("statusCode", 172002); data2.Add("statusMsg", "無返回"); data2.Add("data", null); return data2; } } catch (Exception e) { throw e; } } /// <summary> /// 發送短信 /// </summary> /// <param name="to">短信接收端手機號碼集合,用英文逗號分開,每批發送的手機號數量不得超過100個</param> /// <param name="body">短信內容</param> /// <exception cref="ArgumentNullException">參數不能為空</exception> /// <exception cref="ArgumentOutOfRangeException">參數超出范圍</exception> /// <exception cref="Exception"></exception> /// <returns>包體內容</returns> public Dictionary<string, object> SendSMS(string to, string body) { Dictionary<string, object> initError = paramCheckRest(); if (initError != null) { return initError; } initError = paramCheckMainAccount(); if (initError != null) { return initError; } initError = paramCheckAppId(); if (initError != null) { return initError; } if (to == null) { throw new ArgumentNullException("to"); } if (body == null) { throw new ArgumentNullException("body"); } try { string date = DateTime.Now.ToString("yyyyMMddhhmmss"); // 構建URL內容 string sigstr = MD5Encrypt(m_mainAccount + m_mainToken + date); string uriStr = string.Format("https://{0}:{1}/{2}/Accounts/{3}/SMS/Messages?sig={4}", m_restAddress, m_restPort, softVer, m_mainAccount, sigstr); Uri address = new Uri(uriStr); WriteLog("SendSMS url = " + uriStr); // 創建網絡請求 HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest; setCertificateValidationCallBack(); // 構建Head request.Method = "POST"; Encoding myEncoding = Encoding.GetEncoding("utf-8"); byte[] myByte = myEncoding.GetBytes(m_mainAccount + ":" + date); string authStr = Convert.ToBase64String(myByte); request.Headers.Add("Authorization", authStr); // 構建Body StringBuilder data = new StringBuilder(); if (m_bodyType == EBodyType.EType_XML) { request.Accept = "application/xml"; request.ContentType = "application/xml;charset=utf-8"; data.Append("<?xml version='1.0' encoding='utf-8'?><SMSMessage>"); data.Append("<to>").Append(to).Append("</to>"); data.Append("<body>").Append(body).Append("</body>"); data.Append("<appId>").Append(m_appId).Append("</appId>"); data.Append("</SMSMessage>"); } else { request.Accept = "application/json"; request.ContentType = "application/json;charset=utf-8"; data.Append("{"); data.Append("\"to\":\"").Append(to).Append("\""); data.Append(",\"body\":\"").Append(body).Append("\""); data.Append(",\"appId\":\"").Append(m_appId).Append("\""); data.Append("}"); } byte[] byteData = UTF8Encoding.UTF8.GetBytes(data.ToString()); WriteLog("SendSMS requestBody = "+data.ToString()); // 開始請求 using (Stream postStream = request.GetRequestStream()) { postStream.Write(byteData, 0, byteData.Length); } // 獲取請求 using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) { // Get the response stream StreamReader reader = new StreamReader(response.GetResponseStream()); string responseStr = reader.ReadToEnd(); WriteLog("SendSMS responseBody = "+responseStr); if (responseStr != null && responseStr.Length > 0) { //Dictionary<string, object> responseResult = new Dictionary<string, object> { { "statusCode", "0" }, { "statusMsg", "成功" }, { "data", null } }; Dictionary<string, object> responseResult = new Dictionary<string, object>(); responseResult.Add("statusCode", "0"); responseResult.Add("statusMsg", "成功"); responseResult.Add("data", null); if (m_bodyType == EBodyType.EType_XML) { XmlDocument resultXml = new XmlDocument(); resultXml.LoadXml(responseStr); XmlNodeList nodeList = resultXml.SelectSingleNode("Response").ChildNodes; foreach (XmlNode item in nodeList) { if (item.Name == "statusCode") { responseResult["statusCode"] = item.InnerText; } else if (item.Name == "statusMsg") { responseResult["statusMsg"] = item.InnerText; } else if (item.Name == "SMSMessage") { Dictionary<string, object> retData = new Dictionary<string, object>(); foreach (XmlNode subItem in item.ChildNodes) { retData.Add(subItem.Name, subItem.InnerText); } //responseResult["data"] = new Dictionary<string, object> { { item.Name, retData } }; Dictionary<string, object> data1 = new Dictionary<string, object>(); data1.Add(item.Name, retData); responseResult["data"] = data1; } } } else { responseResult.Clear(); responseResult["resposeBody"] = responseStr; } return responseResult; } //return new Dictionary<string, object> { { "statusCode", 172002 }, { "statusMsg", "無返回" }, { "data", null } }; Dictionary<string, object> data2 = new Dictionary<string, object>(); data2.Add("statusCode", 172002); data2.Add("statusMsg", "無返回"); data2.Add("data", null); return data2; } } catch (Exception e) { throw e; } } /// <summary> /// 模板短信 /// </summary> /// <param name="to">短信接收端手機號碼集合,用英文逗號分開,每批發送的手機號數量不得超過100個</param> /// <param name="templateId">模板Id</param> /// <param name="data">可選字段 內容數據,用於替換模板中{序號}</param> /// <exception cref="ArgumentNullException">參數不能為空</exception> /// <exception cref="Exception"></exception> /// <returns></returns> public Dictionary<string, object> SendTemplateSMS(string to, string templateId, string[] data) { Dictionary<string, object> initError = paramCheckRest(); if (initError != null) { return initError; } initError = paramCheckMainAccount(); if (initError != null) { return initError; } initError = paramCheckAppId(); if (initError != null) { return initError; } if (to == null) { throw new ArgumentNullException("to"); } if (templateId == null) { throw new ArgumentNullException("templateId"); } try { string date = DateTime.Now.ToString("yyyyMMddhhmmss"); // 構建URL內容 string sigstr = MD5Encrypt(m_mainAccount + m_mainToken + date); string uriStr = string.Format("https://{0}:{1}/{2}/Accounts/{3}/SMS/TemplateSMS?sig={4}", m_restAddress, m_restPort, softVer, m_mainAccount, sigstr); Uri address = new Uri(uriStr); WriteLog("SendTemplateSMS url = " + uriStr); // 創建網絡請求 HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest; setCertificateValidationCallBack(); // 構建Head request.Method = "POST"; Encoding myEncoding = Encoding.GetEncoding("utf-8"); byte[] myByte = myEncoding.GetBytes(m_mainAccount + ":" + date); string authStr = Convert.ToBase64String(myByte); request.Headers.Add("Authorization", authStr); // 構建Body StringBuilder bodyData = new StringBuilder(); if (m_bodyType == EBodyType.EType_XML) { request.Accept = "application/xml"; request.ContentType = "application/xml;charset=utf-8"; bodyData.Append("<?xml version='1.0' encoding='utf-8'?><TemplateSMS>"); bodyData.Append("<to>").Append(to).Append("</to>"); bodyData.Append("<appId>").Append(m_appId).Append("</appId>"); bodyData.Append("<templateId>").Append(templateId).Append("</templateId>"); if (data != null && data.Length>0) { bodyData.Append("<datas>"); foreach (string item in data) { bodyData.Append("<data>").Append(item).Append("</data>"); } bodyData.Append("</datas>"); } bodyData.Append("</TemplateSMS>"); } else { request.Accept = "application/json"; request.ContentType = "application/json;charset=utf-8"; bodyData.Append("{"); bodyData.Append("\"to\":\"").Append(to).Append("\""); bodyData.Append(",\"appId\":\"").Append(m_appId).Append("\""); bodyData.Append(",\"templateId\":\"").Append(templateId).Append("\""); if (data != null && data.Length > 0) { bodyData.Append(",\"datas\":["); int index = 0; foreach (string item in data) { if (index == 0) { bodyData.Append("\""+item+"\""); } else { bodyData.Append(",\"" + item + "\""); } index++; } bodyData.Append("]"); } bodyData.Append("}"); } byte[] byteData = UTF8Encoding.UTF8.GetBytes(bodyData.ToString()); WriteLog("SendTemplateSMS requestBody = " + bodyData.ToString()); // 開始請求 using (Stream postStream = request.GetRequestStream()) { postStream.Write(byteData, 0, byteData.Length); } // 獲取請求 using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) { // Get the response stream StreamReader reader = new StreamReader(response.GetResponseStream()); string responseStr = reader.ReadToEnd(); WriteLog("SendTemplateSMS responseBody = " + responseStr); if (responseStr != null && responseStr.Length > 0) { //Dictionary<string, object> responseResult = new Dictionary<string, object> { { "statusCode", "0" }, { "statusMsg", "成功" }, { "data", null } }; Dictionary<string, object> responseResult = new Dictionary<string, object>(); responseResult.Add("statusCode", "0"); responseResult.Add("statusMsg", "成功"); responseResult.Add("data", null); if (m_bodyType == EBodyType.EType_XML) { XmlDocument resultXml = new XmlDocument(); resultXml.LoadXml(responseStr); XmlNodeList nodeList = resultXml.SelectSingleNode("Response").ChildNodes; foreach (XmlNode item in nodeList) { if (item.Name == "statusCode") { responseResult["statusCode"] = item.InnerText; } else if (item.Name == "statusMsg") { responseResult["statusMsg"] = item.InnerText; } else if (item.Name == "TemplateSMS") { Dictionary<string, object> retData = new Dictionary<string, object>(); foreach (XmlNode subItem in item.ChildNodes) { retData.Add(subItem.Name, subItem.InnerText); } //responseResult["data"] = new Dictionary<string, object> { { item.Name, retData } }; Dictionary<string, object> data1 = new Dictionary<string, object>(); data1.Add(item.Name, retData); responseResult["data"] = data1; } } } else { responseResult.Clear(); responseResult["resposeBody"] = responseStr; } return responseResult; } //return new Dictionary<string, object> { { "statusCode", 172002 }, { "statusMsg", "無返回" }, { "data", null } }; Dictionary<string, object> data2 = new Dictionary<string, object>(); data2.Add("statusCode", 172002); data2.Add("statusMsg", "無返回"); data2.Add("data", null); return data2; } } catch (Exception e) { throw e; } } /// <summary> /// 雙向回呼 /// </summary> /// <param name="from">主叫電話</param> /// <param name="to">被叫電話</param> /// <param name="customerSerNum">可選字段 被叫側顯示的客服號碼,根據平台側顯號規則控制</param> /// <param name="fromSerNum">可選字段 主叫側顯示的號碼,根據平台側顯號規則控制</param> /// <param name="promptTone">可選字段 第三方自定義回撥提示音</param> /// <exception cref="ArgumentNullException">參數不能為空</exception> /// <exception cref="Exception"></exception> /// <returns>包體內容</returns> public Dictionary<string, object> CallBack(string from, string to, string customerSerNum, string fromSerNum, string promptTone) { Dictionary<string, object> initError = paramCheckRest(); if (initError != null) { return initError; } initError = paramCheckSunAccount(); if (initError != null) { return initError; } if (from == null) { throw new ArgumentNullException("from"); } if (to == null) { throw new ArgumentNullException("to"); } try { string date = DateTime.Now.ToString("yyyyMMddhhmmss"); // 構建URL內容 string sigstr = MD5Encrypt(m_subAccount + m_subToken + date); string uriStr = string.Format("https://{0}:{1}/{2}/SubAccounts/{3}/Calls/Callback?sig={4}", m_restAddress, m_restPort, softVer, m_subAccount, sigstr); Uri address = new Uri(uriStr); WriteLog("CallBack url = " + uriStr); // 創建網絡請求 HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest; setCertificateValidationCallBack(); // 構建Head request.Method = "POST"; Encoding myEncoding = Encoding.GetEncoding("utf-8"); byte[] myByte = myEncoding.GetBytes(m_subAccount + ":" + date); string authStr = Convert.ToBase64String(myByte); request.Headers.Add("Authorization", authStr); // 構建Body StringBuilder data = new StringBuilder(); if (m_bodyType == EBodyType.EType_XML) { request.Accept = "application/xml"; request.ContentType = "application/xml;charset=utf-8"; data.Append("<?xml version='1.0' encoding='utf-8'?><CallBack>"); data.Append("<from>").Append(from).Append("</from>"); data.Append("<to>").Append(to).Append("</to>"); if (customerSerNum != null) { data.Append("<customerSerNum>").Append(customerSerNum).Append("</customerSerNum>"); } if (fromSerNum != null) { data.Append("<fromSerNum>").Append(fromSerNum).Append("</fromSerNum>"); } if (promptTone != null) { data.Append("<promptTone>").Append(promptTone).Append("</promptTone>"); } data.Append("</CallBack>"); } else { request.Accept = "application/json"; request.ContentType = "application/json;charset=utf-8"; data.Append("{"); data.Append("\"from\":\"").Append(from).Append("\""); data.Append(",\"to\":\"").Append(to).Append("\""); if (customerSerNum != null) { data.Append(",\"customerSerNum\":\"").Append(customerSerNum).Append("\""); } if (fromSerNum != null) { data.Append(",\"fromSerNum\":\"").Append(fromSerNum).Append("\""); } if (promptTone != null) { data.Append(",\"promptTone\":\"").Append(promptTone).Append("\""); } data.Append("}"); } byte[] byteData = UTF8Encoding.UTF8.GetBytes(data.ToString()); WriteLog("CallBack requestBody = " + data.ToString()); // 開始請求 using (Stream postStream = request.GetRequestStream()) { postStream.Write(byteData, 0, byteData.Length); } // 獲取請求 using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) { // Get the response stream StreamReader reader = new StreamReader(response.GetResponseStream()); string responseStr = reader.ReadToEnd(); WriteLog("CallBack responseBody = " + responseStr); if (responseStr != null && responseStr.Length > 0) { //Dictionary<string, object> responseResult = new Dictionary<string, object> { { "statusCode", "0" }, { "statusMsg", "成功" }, { "data", null } }; Dictionary<string, object> responseResult = new Dictionary<string, object>(); responseResult.Add("statusCode", "0"); responseResult.Add("statusMsg", "成功"); responseResult.Add("data", null); if (m_bodyType == EBodyType.EType_XML) { XmlDocument resultXml = new XmlDocument(); resultXml.LoadXml(responseStr); XmlNodeList nodeList = resultXml.SelectSingleNode("Response").ChildNodes; foreach (XmlNode item in nodeList) { if (item.Name == "statusCode") { responseResult["statusCode"] = item.InnerText; } else if (item.Name == "statusMsg") { responseResult["statusMsg"] = item.InnerText; } else if (item.Name == "CallBack") { Dictionary<string, object> retData = new Dictionary<string, object>(); foreach (XmlNode subItem in item.ChildNodes) { retData.Add(subItem.Name, subItem.InnerText); } //responseResult["data"] = new Dictionary<string, object> { { item.Name, retData } }; Dictionary<string, object> data1 = new Dictionary<string, object>(); data1.Add(item.Name, retData); responseResult["data"] = data1; } } } else { responseResult.Clear(); responseResult["resposeBody"] = responseStr; } return responseResult; } //return new Dictionary<string, object> { { "statusCode", 172002 }, { "statusMsg", "無返回" }, { "data", null } }; Dictionary<string, object> data2 = new Dictionary<string, object>(); data2.Add("statusCode", 172002); data2.Add("statusMsg", "無返回"); data2.Add("data", null); return data2; } } catch (Exception e) { throw e; } } /// <summary> /// 外呼通知 /// </summary> /// <param name="to">被叫號碼</param> /// <param name="mediaName">可選字段 語音文件名稱,格式 wav。與mediaTxt不能同時為空,不為空時mediaTxt屬性失效</param> /// <param name="mediaTxt">可選字段 文本內容,默認值為空</param> /// <param name="displayNum">可選字段 顯示的主叫號碼,顯示權限由服務側控制</param> /// <param name="playTimes">可選字段 循環播放次數,1-3次,默認播放1次</param> /// <param name="type">可選字段 語音文件名的類型,默認值為0,表示用戶語音文件;值為1表示平台通用文件</param> /// <param name="respUrl">可選字段 外呼通知狀態通知回調地址,雲通訊平台將向該Url地址發送呼叫結果通知</param> /// <exception cref="ArgumentNullException">參數不能為空</exception> /// <exception cref="Exception"></exception> /// <returns></returns> public Dictionary<string, object> LandingCall(string to, string mediaName, string mediaTxt, string displayNum, string playTimes, int type, string respUrl) { Dictionary<string, object> initError = paramCheckRest(); if (initError != null) { return initError; } initError = paramCheckMainAccount(); if (initError != null) { return initError; } initError = paramCheckAppId(); if (initError != null) { return initError; } if (to == null) { throw new ArgumentNullException("to"); } if (mediaName==null && mediaTxt==null) { throw new ArgumentNullException("mediaName和mediaTxt同時為null"); } try { string date = DateTime.Now.ToString("yyyyMMddhhmmss"); // 構建URL內容 string sigstr = MD5Encrypt(m_mainAccount + m_mainToken + date); string uriStr = string.Format("https://{0}:{1}/{2}/Accounts/{3}/Calls/LandingCalls?sig={4}", m_restAddress, m_restPort, softVer, m_mainAccount, sigstr); Uri address = new Uri(uriStr); WriteLog("LandingCall url = " + uriStr); // 創建網絡請求 HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest; setCertificateValidationCallBack(); // 構建Head request.Method = "POST"; Encoding myEncoding = Encoding.GetEncoding("utf-8"); byte[] myByte = myEncoding.GetBytes(m_mainAccount + ":" + date); string authStr = Convert.ToBase64String(myByte); request.Headers.Add("Authorization", authStr); // 構建Body StringBuilder data = new StringBuilder(); if (m_bodyType == EBodyType.EType_XML) { request.Accept = "application/xml"; request.ContentType = "application/xml;charset=utf-8"; data.Append("<?xml version='1.0' encoding='utf-8'?><LandingCall>"); data.Append("<appId>").Append(m_appId).Append("</appId>"); data.Append("<to>").Append(to).Append("</to>"); if (mediaName != null) { data.Append("<mediaName type=\""+type+"\">").Append(mediaName).Append("</mediaName>"); } if (mediaTxt != null) { data.Append("<mediaTxt>").Append(mediaTxt).Append("</mediaTxt>"); } if (displayNum!=null) { data.Append("<displayNum>").Append(displayNum).Append("</displayNum>"); } if (playTimes!=null) { data.Append("<playTimes>").Append(playTimes).Append("</playTimes>"); } if (respUrl!=null) { data.Append("<respUrl>").Append(respUrl).Append("</respUrl>"); } data.Append("</LandingCall>"); } else { request.Accept = "application/json"; request.ContentType = "application/json;charset=utf-8"; data.Append("{"); data.Append("\"to\":\"").Append(to).Append("\""); data.Append(",\"appId\":\"").Append(m_appId).Append("\""); if (mediaName != null) { data.Append(",\"mediaName\":\"").Append(mediaName).Append("\""); data.Append(",\"mediaNameType\":\"").Append(type).Append("\""); } if (mediaTxt != null) { data.Append(",\"mediaTxt\":\"").Append(mediaTxt).Append("\""); } if (displayNum != null) { data.Append(",\"displayNum\":\"").Append(displayNum).Append("\""); } if (playTimes != null) { data.Append(",\"playTimes\":\"").Append(playTimes).Append("\""); } if (respUrl != null) { data.Append(",\"respUrl\":\"").Append(respUrl).Append("\""); } data.Append("}"); } byte[] byteData = UTF8Encoding.UTF8.GetBytes(data.ToString()); WriteLog("LandingCall requestBody = " + data.ToString()); // 開始請求 using (Stream postStream = request.GetRequestStream()) { postStream.Write(byteData, 0, byteData.Length); } // 獲取請求 using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) { // Get the response stream StreamReader reader = new StreamReader(response.GetResponseStream()); string responseStr = reader.ReadToEnd(); WriteLog("LandingCall responseBody = " + responseStr); if (responseStr != null && responseStr.Length > 0) { //Dictionary<string, object> responseResult = new Dictionary<string, object> { { "statusCode", "0" }, { "statusMsg", "成功" }, { "data", null } }; Dictionary<string, object> responseResult = new Dictionary<string, object>(); responseResult.Add("statusCode", "0"); responseResult.Add("statusMsg", "成功"); responseResult.Add("data", null); if (m_bodyType == EBodyType.EType_XML) { XmlDocument resultXml = new XmlDocument(); resultXml.LoadXml(responseStr); XmlNodeList nodeList = resultXml.SelectSingleNode("Response").ChildNodes; foreach (XmlNode item in nodeList) { if (item.Name == "statusCode") { responseResult["statusCode"] = item.InnerText; } else if (item.Name == "statusMsg") { responseResult["statusMsg"] = item.InnerText; } else if (item.Name == "LandingCall") { Dictionary<string, object> retData = new Dictionary<string, object>(); foreach (XmlNode subItem in item.ChildNodes) { retData.Add(subItem.Name, subItem.InnerText); } //responseResult["data"] = new Dictionary<string, object> { { item.Name, retData } }; Dictionary<string, object> data1 = new Dictionary<string, object>(); data1.Add(item.Name, retData); responseResult["data"] = data1; } } } else { responseResult.Clear(); responseResult["resposeBody"] = responseStr; } return responseResult; } //return new Dictionary<string, object> { { "statusCode", 172002 }, { "statusMsg", "無返回" }, { "data", null } }; Dictionary<string, object> data2 = new Dictionary<string, object>(); data2.Add("statusCode", 172002); data2.Add("statusMsg", "無返回"); data2.Add("data", null); return data2; } } catch (Exception e) { throw e; } } /// <summary> /// 語音驗證碼 /// </summary> /// <param name="to">接收號碼</param> /// <param name="verifyCode">驗證碼內容,為數字和英文字母,不區分大小寫,長度4-8位</param> /// <param name="displayNum">可選字段 顯示主叫號碼,顯示權限由服務側控制</param> /// <param name="playTimes">可選字段 循環播放次數,1-3次,默認播放1次</param> /// <param name="respUrl">可選字段 語音驗證碼狀態通知回調地址,雲通訊平台將向該Url地址發送呼叫結果通知</param> /// <exception cref="ArgumentNullException">參數不能為空</exception> /// <exception cref="Exception"></exception> /// <returns></returns> public Dictionary<string, object> VoiceVerify(string to, string verifyCode, string displayNum, string playTimes, string respUrl) { Dictionary<string, object> initError = paramCheckRest(); if (initError != null) { return initError; } initError = paramCheckMainAccount(); if (initError != null) { return initError; } initError = paramCheckAppId(); if (initError != null) { return initError; } if (to == null) { throw new ArgumentNullException("to"); } if (verifyCode == null) { throw new ArgumentNullException("verifyCode"); } try { string date = DateTime.Now.ToString("yyyyMMddhhmmss"); // 構建URL內容 string sigstr = MD5Encrypt(m_mainAccount + m_mainToken + date); string uriStr = string.Format("https://{0}:{1}/{2}/Accounts/{3}/Calls/VoiceVerify?sig={4}", m_restAddress, m_restPort, softVer, m_mainAccount, sigstr); Uri address = new Uri(uriStr); WriteLog("VoiceVerify url = " + uriStr); // 創建網絡請求 HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest; setCertificateValidationCallBack(); // 構建Head request.Method = "POST"; Encoding myEncoding = Encoding.GetEncoding("utf-8"); byte[] myByte = myEncoding.GetBytes(m_mainAccount + ":" + date); string authStr = Convert.ToBase64String(myByte); request.Headers.Add("Authorization", authStr); // 構建Body StringBuilder data = new StringBuilder(); if (m_bodyType == EBodyType.EType_XML) { request.Accept = "application/xml"; request.ContentType = "application/xml;charset=utf-8"; data.Append("<?xml version='1.0' encoding='utf-8'?><VoiceVerify>"); data.Append("<appId>").Append(m_appId).Append("</appId>"); data.Append("<verifyCode>").Append(verifyCode).Append("</verifyCode>"); data.Append("<to>").Append(to).Append("</to>"); if (displayNum != null) { data.Append("<displayNum>").Append(displayNum).Append("</displayNum>"); } if (playTimes != null) { data.Append("<playTimes>").Append(playTimes).Append("</playTimes>"); } if (respUrl != null) { data.Append("<respUrl>").Append(respUrl).Append("</respUrl>"); } data.Append("</VoiceVerify>"); } else { request.Accept = "application/json"; request.ContentType = "application/json;charset=utf-8"; data.Append("{"); data.Append("\"to\":\"").Append(to).Append("\""); data.Append(",\"appId\":\"").Append(m_appId).Append("\""); data.Append(",\"verifyCode\":\"").Append(verifyCode).Append("\""); if (displayNum != null) { data.Append(",\"displayNum\":\"").Append(displayNum).Append("\""); } if (playTimes != null) { data.Append(",\"playTimes\":\"").Append(playTimes).Append("\""); } if (respUrl != null) { data.Append(",\"respUrl\":\"").Append(respUrl).Append("\""); } data.Append("}"); } byte[] byteData = UTF8Encoding.UTF8.GetBytes(data.ToString()); WriteLog("VoiceVerify requestBody = " + data.ToString()); // 開始請求 using (Stream postStream = request.GetRequestStream()) { postStream.Write(byteData, 0, byteData.Length); } // 獲取請求 using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) { // Get the response stream StreamReader reader = new StreamReader(response.GetResponseStream()); string responseStr = reader.ReadToEnd(); WriteLog("VoiceVerify responseBody = " + responseStr); if (responseStr != null && responseStr.Length > 0) { //Dictionary<string, object> responseResult = new Dictionary<string, object> { { "statusCode", "0" }, { "statusMsg", "成功" }, { "data", null } }; Dictionary<string, object> responseResult = new Dictionary<string, object>(); responseResult.Add("statusCode", "0"); responseResult.Add("statusMsg", "成功"); responseResult.Add("data", null); if (m_bodyType == EBodyType.EType_XML) { XmlDocument resultXml = new XmlDocument(); resultXml.LoadXml(responseStr); XmlNodeList nodeList = resultXml.SelectSingleNode("Response").ChildNodes; foreach (XmlNode item in nodeList) { if (item.Name == "statusCode") { responseResult["statusCode"] = item.InnerText; } else if (item.Name == "statusMsg") { responseResult["statusMsg"] = item.InnerText; } else if (item.Name == "VoiceVerify") { Dictionary<string, object> retData = new Dictionary<string, object>(); foreach (XmlNode subItem in item.ChildNodes) { retData.Add(subItem.Name, subItem.InnerText); } //responseResult["data"] = new Dictionary<string, object> { { item.Name, retData } }; Dictionary<string, object> data1 = new Dictionary<string, object>(); data1.Add(item.Name, retData); responseResult["data"] = data1; } } } else { responseResult.Clear(); responseResult["resposeBody"] = responseStr; } return responseResult; } //return new Dictionary<string, object> { { "statusCode", 172002 }, { "statusMsg", "無返回" }, { "data", null } }; Dictionary<string, object> data2 = new Dictionary<string, object>(); data2.Add("statusCode", 172002); data2.Add("statusMsg", "無返回"); data2.Add("data", null); return data2; } } catch (Exception e) { throw e; } } /// <summary> /// IVR外呼 暫不支持json格式 /// </summary> /// <param name="number">待呼叫號碼</param> /// <param name="userdata">可選字段 用戶數據,在<startservice>通知中返回,只允許填寫數字字符</param> /// <param name="record">可選字段 是否錄音,可填項為true和false,默認值為false不錄音</param> /// <exception cref="ArgumentNullException">參數不能為空</exception> /// <exception cref="Exception"></exception> /// <returns></returns> public Dictionary<string, object> IvrDial(string number, string userdata, string record) { Dictionary<string, object> initError = paramCheckRest(); if (initError != null) { return initError; } initError = paramCheckMainAccount(); if (initError != null) { return initError; } initError = paramCheckAppId(); if (initError != null) { return initError; } if (number == null) { throw new ArgumentNullException("number"); } try { string date = DateTime.Now.ToString("yyyyMMddhhmmss"); // 構建URL內容 string sigstr = MD5Encrypt(m_mainAccount + m_mainToken + date); string uriStr = string.Format("https://{0}:{1}/{2}/Accounts/{3}/ivr/dial?sig={4}", m_restAddress, m_restPort, softVer, m_mainAccount, sigstr); Uri address = new Uri(uriStr); WriteLog("IvrDial url = " + uriStr); // 創建網絡請求 HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest; setCertificateValidationCallBack(); // 構建Head request.Method = "POST"; request.Accept = "application/xml"; request.ContentType = "application/xml;charset=utf-8"; Encoding myEncoding = Encoding.GetEncoding("utf-8"); byte[] myByte = myEncoding.GetBytes(m_mainAccount + ":" + date); string authStr = Convert.ToBase64String(myByte); request.Headers.Add("Authorization", authStr); // 構建Body StringBuilder data = new StringBuilder(); data.Append("<?xml version='1.0' encoding='utf-8'?><Request>"); data.Append("<Appid>").Append(m_appId).Append("</Appid>"); data.Append("<Dial "); data.Append("number=\"" + number + "\""); if (userdata != null) { data.Append(" userdata=\"" + userdata + "\""); } if (record != null && record=="true") { data.Append(" record=\"true\""); } data.Append("></Dial>"); data.Append("</Request>"); byte[] byteData = UTF8Encoding.UTF8.GetBytes(data.ToString()); WriteLog("IvrDial requestBody = " + data.ToString()); // 開始請求 using (Stream postStream = request.GetRequestStream()) { postStream.Write(byteData, 0, byteData.Length); } // 獲取請求 using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) { // Get the response stream StreamReader reader = new StreamReader(response.GetResponseStream()); string responseStr = reader.ReadToEnd(); WriteLog("IvrDial responseBody = " + responseStr); if (responseStr != null && responseStr.Length > 0) { //Dictionary<string, object> responseResult = new Dictionary<string, object> { { "statusCode", "0" }, { "statusMsg", "成功" }, { "data", null } }; Dictionary<string, object> responseResult = new Dictionary<string, object>(); responseResult.Add("statusCode", "0"); responseResult.Add("statusMsg", "成功"); responseResult.Add("data", null); if (m_bodyType == EBodyType.EType_XML) { XmlDocument resultXml = new XmlDocument(); resultXml.LoadXml(responseStr); XmlNodeList nodeList = resultXml.SelectSingleNode("Response").ChildNodes; foreach (XmlNode item in nodeList) { if (item.Name == "statusCode") { responseResult["statusCode"] = item.InnerText; } else if (item.Name == "statusMsg") { responseResult["statusMsg"] = item.InnerText; } } } else { responseResult.Clear(); responseResult["resposeBody"] = responseStr; } return responseResult; } //return new Dictionary<string, object> { { "statusCode", 172002 }, { "statusMsg", "無返回" }, { "data", null } }; Dictionary<string, object> data2 = new Dictionary<string, object>(); data2.Add("statusCode", 172002); data2.Add("statusMsg", "無返回"); data2.Add("data", null); return data2; } } catch (Exception e) { throw e; } } /// <summary> /// 話單下載 /// </summary> /// <param name="date">day 代表前一天的數據(從00:00 – 23:59);week代表前一周的數據(周一 到周日);month表示上一個月的數據(上個月表示當前月減1,如果今天是4月10號,則查詢結果是3月份的數據)</param> /// <param name="keywords">客戶的查詢條件,由客戶自行定義並提供給雲通訊平台。默認不填忽略此參數</param> /// <exception cref="ArgumentNullException">參數不能為空</exception> /// <exception cref="Exception"></exception> /// <returns></returns> public Dictionary<string, object> BillRecords(string date, string keywords) { Dictionary<string, object> initError = paramCheckRest(); if (initError != null) { return initError; } initError = paramCheckMainAccount(); if (initError != null) { return initError; } initError = paramCheckAppId(); if (initError != null) { return initError; } if (date == null) { throw new ArgumentNullException("date"); } try { string mydate = DateTime.Now.ToString("yyyyMMddhhmmss"); // 構建URL內容 string sigstr = MD5Encrypt(m_mainAccount + m_mainToken + mydate); string uriStr = string.Format("https://{0}:{1}/{2}/Accounts/{3}/BillRecords?sig={4}", m_restAddress, m_restPort, softVer, m_mainAccount, sigstr); Uri address = new Uri(uriStr); WriteLog("BillRecords url = " + uriStr); // 創建網絡請求 HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest; setCertificateValidationCallBack(); // 構建Head request.Method = "POST"; Encoding myEncoding = Encoding.GetEncoding("utf-8"); byte[] myByte = myEncoding.GetBytes(m_mainAccount + ":" + mydate); string authStr = Convert.ToBase64String(myByte); request.Headers.Add("Authorization", authStr); // 構建Body StringBuilder data = new StringBuilder(); if (m_bodyType == EBodyType.EType_XML) { request.Accept = "application/xml"; request.ContentType = "application/xml;charset=utf-8"; data.Append("<?xml version='1.0' encoding='utf-8'?><BillRecords>"); data.Append("<appId>").Append(m_appId).Append("</appId>"); data.Append("<date>").Append(date).Append("</date>"); if (keywords != null) { data.Append("<keywords>").Append(keywords).Append("</keywords>"); } data.Append("</BillRecords>"); } else { request.Accept = "application/json"; request.ContentType = "application/json;charset=utf-8"; data.Append("{"); data.Append("\"appId\":\"").Append(m_appId).Append("\""); data.Append(",\"date\":\"").Append(date).Append("\""); if (keywords != null) { data.Append(",\"keywords\":\"").Append(keywords).Append("\""); } data.Append("}"); } byte[] byteData = UTF8Encoding.UTF8.GetBytes(data.ToString()); WriteLog("BillRecords requestBody = " + data.ToString()); // 開始請求 using (Stream postStream = request.GetRequestStream()) { postStream.Write(byteData, 0, byteData.Length); } // 獲取請求 using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) { // Get the response stream StreamReader reader = new StreamReader(response.GetResponseStream()); string responseStr = reader.ReadToEnd(); WriteLog("BillRecords responseBody = " + responseStr); if (responseStr != null && responseStr.Length > 0) { //Dictionary<string, object> responseResult = new Dictionary<string, object> { { "statusCode", "0" }, { "statusMsg", "成功" }, { "data", null } }; Dictionary<string, object> responseResult = new Dictionary<string, object>(); responseResult.Add("statusCode", "0"); responseResult.Add("statusMsg", "成功"); responseResult.Add("data", null); Dictionary<string, object> retData = new Dictionary<string, object>(); if (m_bodyType == EBodyType.EType_XML) { XmlDocument resultXml = new XmlDocument(); resultXml.LoadXml(responseStr); XmlNodeList nodeList = resultXml.SelectSingleNode("Response").ChildNodes; foreach (XmlNode item in nodeList) { if (item.Name == "statusCode") { responseResult["statusCode"] = item.InnerText; } else if (item.Name == "statusMsg") { responseResult["statusMsg"] = item.InnerText; } else { retData.Add(item.Name, item.InnerText); } } } else { responseResult.Clear(); responseResult["resposeBody"] = responseStr; } if (retData.Count > 0) { responseResult["data"] = retData; } return responseResult; } //return new Dictionary<string, object> { { "statusCode", 172002 }, { "statusMsg", "無返回" }, { "data", null } }; Dictionary<string, object> data2 = new Dictionary<string, object>(); data2.Add("statusCode", 172002); data2.Add("statusMsg", "無返回"); data2.Add("data", null); return data2; } } catch (Exception e) { throw e; } } #region MD5 和 https交互函數定義 private void WriteLog(string log) { if (m_isWriteLog) { string strFilePath = GetLogPath(); System.IO.FileStream fs = new System.IO.FileStream(strFilePath, System.IO.FileMode.Append); System.IO.StreamWriter sw = new System.IO.StreamWriter(fs, System.Text.Encoding.Default); sw.WriteLine(DateTime.Now.ToString() + "\t" + log); sw.Close(); fs.Close(); } } /// <summary> /// 檢查服務器地址信息 /// </summary> /// <returns></returns> private Dictionary<string, object> paramCheckRest() { int statusCode = 0; string statusMsg = null; if (m_restAddress == null) { statusCode = 172004; statusMsg = "IP空"; } else if (m_restPort == null) { statusCode = 172005; statusMsg = "端口錯誤"; } if (statusCode != 0) { //return new Dictionary<string, object> { { "statusCode", statusCode + "" }, { "statusMsg", statusMsg }, { "data", null } }; Dictionary<string, object> data2 = new Dictionary<string, object>(); data2.Add("statusCode", statusCode + ""); data2.Add("statusMsg", statusMsg); data2.Add("data", null); return data2; } return null; } /// <summary> /// 檢查主帳號信息 /// </summary> /// <returns></returns> private Dictionary<string, object> paramCheckMainAccount() { int statusCode = 0; string statusMsg = null; if (m_mainAccount == null) { statusCode = 172006; statusMsg = "主帳號空"; } else if (m_mainToken == null) { statusCode = 172007; statusMsg = "主帳號令牌空"; } if (statusCode != 0) { //return new Dictionary<string, object> { { "statusCode", statusCode + "" }, { "statusMsg", statusMsg }, { "data", null } }; Dictionary<string, object> data2 = new Dictionary<string, object>(); data2.Add("statusCode", statusCode + ""); data2.Add("statusMsg", statusMsg); data2.Add("data", null); return data2; } return null; } /// <summary> /// 檢查子帳號信息 /// </summary> /// <returns></returns> private Dictionary<string, object> paramCheckSunAccount() { int statusCode = 0; string statusMsg = null; if (m_subAccount == null) { statusCode = 172008; statusMsg = "子帳號空"; } else if (m_subToken == null) { statusCode = 172009; statusMsg = "子帳號令牌空"; } else if (m_voipAccount == null) { statusCode = 1720010; statusMsg = "VoIP帳號空"; } else if (m_voipPwd == null) { statusCode = 172011; statusMsg = "VoIP密碼空"; } if (statusCode != 0) { //return new Dictionary<string, object> { { "statusCode", statusCode+"" }, { "statusMsg", statusMsg }, { "data", null } }; Dictionary<string, object> data2 = new Dictionary<string, object>(); data2.Add("statusCode", statusCode + ""); data2.Add("statusMsg", statusMsg); data2.Add("data", null); return data2; } return null; } /// <summary> /// 檢查應用ID /// </summary> /// <returns></returns> private Dictionary<string, object> paramCheckAppId() { if (m_appId == null) { //return new Dictionary<string, object> { { "statusCode", 172012 + "" }, { "statusMsg", "應用ID為空" }, { "data", null } }; Dictionary<string, object> data2 = new Dictionary<string, object>(); data2.Add("statusCode", 172012 + ""); data2.Add("statusMsg", "應用ID為空"); data2.Add("data", null); return data2; } return null; } /// <summary> /// MD5加密 /// </summary> /// <param name="source">原內容</param> /// <returns>加密后內容</returns> public static string MD5Encrypt(string source) { // Create a new instance of the MD5CryptoServiceProvider object. System.Security.Cryptography.MD5 md5Hasher = System.Security.Cryptography.MD5.Create(); // Convert the input string to a byte array and compute the hash. byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(source)); // Create a new Stringbuilder to collect the bytes and create a string. StringBuilder sBuilder = new StringBuilder(); // Loop through each byte of the hashed data and format each one as a hexadecimal string. for (int i = 0; i < data.Length; i++) { sBuilder.Append(data[i].ToString("X2")); } // Return the hexadecimal string. return sBuilder.ToString(); } /// <summary> /// 設置服務器證書驗證回調 /// </summary> public void setCertificateValidationCallBack() { System.Net.ServicePointManager.ServerCertificateValidationCallback = CertificateValidationResult; } /// <summary> /// 證書驗證回調函數 /// </summary> /// <param name="obj"></param> /// <param name="cer"></param> /// <param name="chain"></param> /// <param name="error"></param> /// <returns></returns> public bool CertificateValidationResult(object obj, System.Security.Cryptography.X509Certificates.X509Certificate cer, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors error) { return true; } #endregion } }