Asp.Net发送手机验证码
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 } }
//成功一定有方法,失败一定有原因。