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
}
}