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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM