Batch       = date("YmdHis");
        $this->ServerIP    = $ServerIP;
        $this->ServerPort  = $ServerPort;
        $this->SoftVersion = $SoftVersion;
        $this->Handle      = fopen($this->Filename, 'a');
    }
    /**
     * 设置主帐号
     *
     * @param AccountSid   主帐号
     * @param AccountToken 主帐号Token
     */
    function setAccount($AccountSid, $AccountToken) {
        $this->AccountSid   = $AccountSid;
        $this->AccountToken = $AccountToken;
    }
    /**
     * 设置子帐号
     *
     * @param SubAccountSid   子帐号
     * @param SubAccountToken 子帐号Token
     * @param VoIPAccount     VoIP帐号
     * @param VoIPPassword    VoIP密码
     */
    function setSubAccount($SubAccountSid, $SubAccountToken, $VoIPAccount, $VoIPPassword) {
        $this->SubAccountSid   = $SubAccountSid;
        $this->SubAccountToken = $SubAccountToken;
        $this->VoIPAccount     = $VoIPAccount;
        $this->VoIPPassword    = $VoIPPassword;
    }
    /**
     * 设置应用ID
     *
     * @param AppId 应用ID
     */
    function setAppId($AppId) {
        $this->AppId = $AppId;
    }
    /**
     * 打印日志
     *
     * @param log 日志内容
     */
    function showlog($log) {
        if ($this->enabeLog) {
            fwrite($this->Handle, $log . "\n");
        }
    }
    /**
     * 发起HTTPS请求
     */
    function curl_post($url, $data, $header, $post = 1) {
        //初始化curl
        $ch = curl_init();
        //参数设置
        $res = curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_POST, $post);
        if ($post) {
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        }
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
        $result = curl_exec($ch);
        //连接失败
        if ($result == FALSE) {
            if ($this->BodyType == 'json') {
                $result = "{\"statusCode\":\"172001\",\"statusMsg\":\"网络错误\"}";
            } else {
                $result = "172001网络错误";
            }
        }
        curl_close($ch);
        return $result;
    }
    /**
     * 创建子帐号
     *
     * @param friendlyName 子帐号名称
     */
    function createSubAccount($friendlyName) {
        //主帐号鉴权信息验证,对必选参数进行判空。
        $auth = $this->accAuth();
        if ($auth != "") {
            return $auth;
        }
        // 拼接请求包体
        if ($this->BodyType == "json") {
            $body = "{'appId':'$this->AppId','friendlyName':'$friendlyName'}";
        } else {
            $body = "
                    $this->AppId
                    $friendlyName
                  ";
        }
        $this->showlog("request body = " . $body);
        // 大写的sig参数
        $sig = strtoupper(md5($this->AccountSid . $this->AccountToken . $this->Batch));
        // 生成请求URL
        $url = "https://$this->ServerIP:$this->ServerPort/$this->SoftVersion/Accounts/$this->AccountSid/SubAccounts?sig=$sig";
        $this->showlog("request url = " . $url);
        // 生成授权:主帐号Id + 英文冒号 + 时间戳
        $authen = base64_encode($this->AccountSid . ":" . $this->Batch);
        // 生成包头
        $header = array(
            "Accept:application/$this->BodyType",
            "Content-Type:application/$this->BodyType;charset=utf-8",
            "Authorization:$authen"
        );
        // 发请求
        $result = $this->curl_post($url, $body, $header);
        $this->showlog("response body = " . $result);
        if ($this->BodyType == "json") {//JSON格式
            $datas = json_decode($result);
        } else { //xml格式
            $datas = simplexml_load_string(trim($result, " \t\n\r"));
        }
        //  if($datas == FALSE){
        //            $datas = new stdClass();
        //            $datas->statusCode = '172003';
        //            $datas->statusMsg = '返回包体错误';
        //        }
        return $datas;
    }
    /**
     * 获取子帐号
     *
     * @param startNo 开始的序号,默认从0开始
     * @param offset  一次查询的最大条数,最小是1条,最大是100条
     */
    function getSubAccounts($startNo, $offset) {
        //主帐号鉴权信息验证,对必选参数进行判空。
        $auth = $this->accAuth();
        if ($auth != "") {
            return $auth;
        }
        // 拼接请求包体
        $body = "
            
              $this->AppId
              $startNo
              $offset
            ";
        if ($this->BodyType == "json") {
            $body = "{'appId':'$this->AppId','startNo':'$startNo','offset':'$offset'}";
        } else {
            $body = "
            
              $this->AppId
              $startNo
              $offset
            ";
        }
        $this->showlog("request body = " . $body);
        // 大写的sig参数
        $sig = strtoupper(md5($this->AccountSid . $this->AccountToken . $this->Batch));
        // 生成请求URL
        $url = "https://$this->ServerIP:$this->ServerPort/$this->SoftVersion/Accounts/$this->AccountSid/GetSubAccounts?sig=$sig";
        $this->showlog("request url = " . $url);
        // 生成授权:主帐户Id + 英文冒号 + 时间戳。
        $authen = base64_encode($this->AccountSid . ":" . $this->Batch);
        // 生成包头
        $header = array(
            "Accept:application/$this->BodyType",
            "Content-Type:application/$this->BodyType;charset=utf-8",
            "Authorization:$authen"
        );
        // 发送请求
        $result = $this->curl_post($url, $body, $header);
        $this->showlog("response body = " . $result);
        if ($this->BodyType == "json") {//JSON格式
            $datas = json_decode($result);
        } else { //xml格式
            $datas = simplexml_load_string(trim($result, " \t\n\r"));
        }
        //  if($datas == FALSE){
        //            $datas = new stdClass();
        //            $datas->statusCode = '172003';
        //            $datas->statusMsg = '返回包体错误';
        //        }
        return $datas;
    }
    /**
     * 子帐号信息查询
     *
     * @param friendlyName 子帐号名称
     */
    function querySubAccount($friendlyName) {
        //主帐号鉴权信息验证,对必选参数进行判空。
        $auth = $this->accAuth();
        if ($auth != "") {
            return $auth;
        }
        // 拼接请求包体
        if ($this->BodyType == "json") {
            $body = "{'appId':'$this->AppId','friendlyName':'$friendlyName'}";
        } else {
            $body = "
            
              $this->AppId
              $friendlyName
            ";
        }
        $this->showlog("request body = " . $body);
        // 大写的sig参数
        $sig = strtoupper(md5($this->AccountSid . $this->AccountToken . $this->Batch));
        // 生成请求URL
        $url = "https://$this->ServerIP:$this->ServerPort/$this->SoftVersion/Accounts/$this->AccountSid/QuerySubAccountByName?sig=$sig";
        $this->showlog("request url = " . $url);
        // 生成授权:主帐户Id + 英文冒号 + 时间戳。
        $authen = base64_encode($this->AccountSid . ":" . $this->Batch);
        // 生成包头
        $header = array(
            "Accept:application/$this->BodyType",
            "Content-Type:application/$this->BodyType;charset=utf-8",
            "Authorization:$authen"
        );
        // 发送请求
        $result = $this->curl_post($url, $body, $header);
        $this->showlog("response body = " . $result);
        if ($this->BodyType == "json") {//JSON格式
            $datas = json_decode($result);
        } else { //xml格式
            $datas = simplexml_load_string(trim($result, " \t\n\r"));
        }
        //  if($datas == FALSE){
        //            $datas = new stdClass();
        //            $datas->statusCode = '172003';
        //            $datas->statusMsg = '返回包体错误';
        //        }
        return $datas;
    }
    /**
     * 发送模板短信
     *
     * @param to      短信接收彿手机号码集合,用英文逗号分开
     * @param datas   内容数据
     * @param $tempId 模板Id
     */
    function sendTemplateSMS($to, $datas, $tempId) {
        //主帐号鉴权信息验证,对必选参数进行判空。
        $auth = $this->accAuth();
        if ($auth != "") {
            return $auth;
        }
        // 拼接请求包体
        if ($this->BodyType == "json") {
            $data = "";
            for ($i = 0; $i < count($datas); $i++) {
                $data = $data . "'" . $datas[$i] . "',";
            }
            $body = "{'to':'$to','templateId':'$tempId','appId':'$this->AppId','datas':[" . $data . "]}";
        } else {
            $data = "";
            for ($i = 0; $i < count($datas); $i++) {
                $data = $data . "" . $datas[$i] . "";
            }
            $body = "
                    $to
                    $this->AppId
                    $tempId
                    " . $data . "
                  ";
        }
        $this->showlog("request body = " . $body);
        // 大写的sig参数
        $sig = strtoupper(md5($this->AccountSid . $this->AccountToken . $this->Batch));
        // 生成请求URL
        $url = "https://$this->ServerIP:$this->ServerPort/$this->SoftVersion/Accounts/$this->AccountSid/SMS/TemplateSMS?sig=$sig";
        $this->showlog("request url = " . $url);
        // 生成授权:主帐户Id + 英文冒号 + 时间戳。
        $authen = base64_encode($this->AccountSid . ":" . $this->Batch);
        // 生成包头
        $header = array(
            "Accept:application/$this->BodyType",
            "Content-Type:application/$this->BodyType;charset=utf-8",
            "Authorization:$authen"
        );
        // 发送请求
        $result = $this->curl_post($url, $body, $header);
        $this->showlog("response body = " . $result);
        if ($this->BodyType == "json") {//JSON格式
            $datas = json_decode($result);
        } else { //xml格式
            $datas = simplexml_load_string(trim($result, " \t\n\r"));
        }
        //  if($datas == FALSE){
        //            $datas = new stdClass();
        //            $datas->statusCode = '172003';
        //            $datas->statusMsg = '返回包体错误';
        //        }
        //重新装填数据
        if ($datas->statusCode == 0) {
            if ($this->BodyType == "json") {
                $datas->TemplateSMS = $datas->templateSMS;
                unset($datas->templateSMS);
            }
        }
        return $datas;
    }
    /**
     * 双向回呼
     *
     * @param from            主叫电话号码
     * @param to              被叫电话号码
     * @param customerSerNum  被叫侧显示的客服号码
     * @param fromSerNum      主叫侧显示的号码
     * @param promptTone      自定义回拨提示音
     * @param userData        第三方私有数据
     * @param maxCallTime     最大通话时长
     * @param hangupCdrUrl    实时话单通知地址
     * @param alwaysPlay      是否一直播放提示音
     * @param terminalDtmf    用于终止播放promptTone参数定义的提示音
     * @param needBothCdr     是否给主被叫发送话单
     * @param needRecord      是否录音
     * @param countDownTime   设置倒计时时间
     * @param countDownPrompt 倒计时时间到后播放的提示音
     */
    function callBack($from, $to, $customerSerNum, $fromSerNum, $promptTone, $alwaysPlay, $terminalDtmf, $userData, $maxCallTime, $hangupCdrUrl, $needBothCdr, $needRecord, $countDownTime, $countDownPrompt) {
        //子帐号鉴权信息验证,对必选参数进行判空。
        $auth = $this->subAuth();
        if ($auth != "") {
            return $auth;
        }
        // 拼接请求包体
        if ($this->BodyType == "json") {
            $body = "{'from':'$from','to':'$to','customerSerNum':'$customerSerNum','fromSerNum':'$fromSerNum','promptTone':'$promptTone','userData':'$userData','maxCallTime':'$maxCallTime','hangupCdrUrl':'$hangupCdrUrl',
           'alwaysPlay':'$alwaysPlay','terminalDtmf':'$terminalDtmf','needBothCdr':'$needBothCdr',
           'needRecord':'$needRecord','countDownTime':'$$countDownTime','countDownPrompt':'$countDownPrompt'}";
        } else {
            $body = "
                     $from
                     $to
                     $customerSerNum
                     $fromSerNum
                     $promptTone
					           $userData
					           $maxCallTime
					           $hangupCdrUrl
                     $alwaysPlay
                     $terminalDtmf
                     $needBothCdr
                     $needRecord
                     $countDownTime
                     $countDownPrompt
                   ";
        }
        $this->showlog("request body = " . $body);
        // 大写的sig参数
        $sig = strtoupper(md5($this->SubAccountSid . $this->SubAccountToken . $this->Batch));
        // 生成请求URL
        $url = "https://$this->ServerIP:$this->ServerPort/$this->SoftVersion/SubAccounts/$this->SubAccountSid/Calls/Callback?sig=$sig";
        $this->showlog("request url = " . $url);
        // 生成授权:子帐号Id + 英文冒号 + 时间戳
        $authen = base64_encode($this->SubAccountSid . ":" . $this->Batch);
        // 生成包头
        $header = array(
            "Accept:application/$this->BodyType",
            "Content-Type:application/$this->BodyType;charset=utf-8",
            "Authorization:$authen"
        );
        // 发请求
        $result = $this->curl_post($url, $body, $header);
        $this->showlog("response body = " . $result);
        if ($this->BodyType == "json") {//JSON格式
            $datas = json_decode($result);
        } else { //xml格式
            $datas = simplexml_load_string(trim($result, " \t\n\r"));
        }
        //  if($datas == FALSE){
        //            $datas = new stdClass();
        //            $datas->statusCode = '172003';
        //            $datas->statusMsg = '返回包体错误';
        //        }
        return $datas;
    }
    /**
     * 外呼通知
     *
     * @param to          被叫号码
     * @param mediaName   语音文件名称,格式 wav。与mediaTxt不能同时为空。当不为空时mediaTxt属性失效。
     * @param mediaTxt    文本内容
     * @param displayNum  显示的主叫号码
     * @param playTimes   循环播放次数,1-3次,默认播放1次。
     * @param respUrl     外呼通知状态通知回调地址,云通讯平台将向该Url地址发送呼叫结果通知。
     * @param userData    用户私有数据
     * @param maxCallTime 最大通话时长
     * @param speed       发音速度
     * @param volume      音量
     * @param pitch       音调
     * @param bgsound     背景音编号
     */
    function landingCall($to, $mediaName, $mediaTxt, $displayNum, $playTimes, $respUrl, $userData, $maxCallTime, $speed, $volume, $pitch, $bgsound) {
        //主帐号鉴权信息验证,对必选参数进行判空。
        $auth = $this->accAuth();
        if ($auth != "") {
            return $auth;
        }
        // 拼接请求包体
        if ($this->BodyType == "json") {
            $body = "{'playTimes':'$playTimes','mediaTxt':'$mediaTxt','mediaName':'$mediaName','to':'$to','appId':'$this->AppId','displayNum':'$displayNum','respUrl':'$respUrl',
           'userData':'$userData','maxCallTime':'$maxCallTime','speed':'$speed','volume':'$volume','pitch':'$pitch','bgsound':'$bgsound'}";
        } else {
            $body = "
                    $to
                    $mediaName
                    $mediaTxt
                    $this->AppId
                    $displayNum
                    $playTimes
                    $respUrl
                    $userData
                    $maxCallTime
                    $speed
                    $volume
                    $pitch
                    $bgsound
                  ";
        }
        $this->showlog("request body = " . $body);
        // 大写的sig参数
        $sig = strtoupper(md5($this->AccountSid . $this->AccountToken . $this->Batch));
        // 生成请求URL
        $url = "https://$this->ServerIP:$this->ServerPort/$this->SoftVersion/Accounts/$this->AccountSid/Calls/LandingCalls?sig=$sig";
        $this->showlog("request url = " . $url);
        // 生成授权:主帐户Id + 英文冒号 + 时间戳。
        $authen = base64_encode($this->AccountSid . ":" . $this->Batch);
        // 生成包头
        $header = array(
            "Accept:application/$this->BodyType",
            "Content-Type:application/$this->BodyType;charset=utf-8",
            "Authorization:$authen"
        );
        // 发送请求
        $result = $this->curl_post($url, $body, $header);
        $this->showlog("response body = " . $result);
        if ($this->BodyType == "json") {//JSON格式
            $datas = json_decode($result);
        } else { //xml格式
            $datas = simplexml_load_string(trim($result, " \t\n\r"));
        }
        //  if($datas == FALSE){
        //            $datas = new stdClass();
        //            $datas->statusCode = '172003';
        //            $datas->statusMsg = '返回包体错误';
        //        }
        return $datas;
    }
    /**
     * 语音验证码
     *
     * @param verifyCode 验证码内容,为数字和英文字母,不区分大小写,长度4-8位
     * @param playTimes  播放次数,1-3次
     * @param to         接收号码
     * @param displayNum 显示的主叫号码
     * @param respUrl    语音验证码状态通知回调地址,云通讯平台将向该Url地址发送呼叫结果通知
     * @param lang       语言类型
     * @param userData   第三方私有数据
     */
    function voiceVerify($verifyCode, $playTimes, $to, $displayNum, $respUrl, $lang, $userData) {
        //主帐号鉴权信息验证,对必选参数进行判空。
        $auth = $this->accAuth();
        if ($auth != "") {
            return $auth;
        }
        // 拼接请求包体
        if ($this->BodyType == "json") {
            $body = "{'appId':'$this->AppId','verifyCode':'$verifyCode','playTimes':'$playTimes','to':'$to','respUrl':'$respUrl','displayNum':'$displayNum',
           'lang':'$lang','userData':'$userData'}";
        } else {
            $body = "
                    $this->AppId
                    $verifyCode
                    $playTimes
                    $to
                    $respUrl
                    $displayNum
                    $lang
                    $userData
                  ";
        }
        $this->showlog("request body = " . $body);
        // 大写的sig参数
        $sig = strtoupper(md5($this->AccountSid . $this->AccountToken . $this->Batch));
        // 生成请求URL
        $url = "https://$this->ServerIP:$this->ServerPort/$this->SoftVersion/Accounts/$this->AccountSid/Calls/VoiceVerify?sig=$sig";
        $this->showlog("request url = " . $url);
        // 生成授权:主帐户Id + 英文冒号 + 时间戳。
        $authen = base64_encode($this->AccountSid . ":" . $this->Batch);
        // 生成包头
        $header = array(
            "Accept:application/$this->BodyType",
            "Content-Type:application/$this->BodyType;charset=utf-8",
            "Authorization:$authen"
        );
        // 发送请求
        $result = $this->curl_post($url, $body, $header);
        $this->showlog("response body = " . $result);
        if ($this->BodyType == "json") {//JSON格式
            $datas = json_decode($result);
        } else { //xml格式
            $datas = simplexml_load_string(trim($result, " \t\n\r"));
        }
        //  if($datas == FALSE){
        //            $datas = new stdClass();
        //            $datas->statusCode = '172003';
        //            $datas->statusMsg = '返回包体错误';
        //        }
        return $datas;
    }
    /**
     * IVR外呼
     *
     * @param number   待呼叫号码,为Dial节点的属性
     * @param userdata 用户数据,在通知中返回,只允许填写数字字符,为Dial节点的属性
     * @param record   是否录音,可填项为true和false,默认值为false不录音,为Dial节点的属性
     */
    function ivrDial($number, $userdata, $record) {
        //主帐号鉴权信息验证,对必选参数进行判空。
        $auth = $this->accAuth();
        if ($auth != "") {
            return $auth;
        }
        // 拼接请求包体
        $body = " 
                  $this->AppId
                  
                ";
        $this->showlog("request body = " . $body);
        // 大写的sig参数
        $sig = strtoupper(md5($this->AccountSid . $this->AccountToken . $this->Batch));
        // 生成请求URL
        $url = "https://$this->ServerIP:$this->ServerPort/$this->SoftVersion/Accounts/$this->AccountSid/ivr/dial?sig=$sig";
        $this->showlog("request url = " . $url);
        // 生成授权:主帐户Id + 英文冒号 + 时间戳。
        $authen = base64_encode($this->AccountSid . ":" . $this->Batch);
        // 生成包头
        $header = array(
            "Accept:application/xml",
            "Content-Type:application/xml;charset=utf-8",
            "Authorization:$authen"
        );
        // 发送请求
        $result = $this->curl_post($url, $body, $header);
        $this->showlog("response body = " . $result);
        $datas = simplexml_load_string(trim($result, " \t\n\r"));
        //  if($datas == FALSE){
        //            $datas = new stdClass();
        //            $datas->statusCode = '172003';
        //            $datas->statusMsg = '返回包体错误';
        //        }
        return $datas;
    }
    /**
     * 话单下载
     *
     * @param date       day 代表前一天的数据(从00:00 – 23:59)
     * @param keywords   客户的查询条件,由客户自行定义并提供给云通讯平台。默认不填忽略此参数
     */
    function billRecords($date, $keywords) {
        //主帐号鉴权信息验证,对必选参数进行判空。
        $auth = $this->accAuth();
        if ($auth != "") {
            return $auth;
        }
        // 拼接请求包体
        if ($this->BodyType == "json") {
            $body = "{'appId':'$this->AppId','date':'$date','keywords':'$keywords'}";
        } else {
            $body = "
                    $this->AppId
                    $date
                    $keywords
                  ";
        }
        $this->showlog("request body = " . $body);
        // 大写的sig参数
        $sig = strtoupper(md5($this->AccountSid . $this->AccountToken . $this->Batch));
        // 生成请求URL
        $url = "https://$this->ServerIP:$this->ServerPort/$this->SoftVersion/Accounts/$this->AccountSid/BillRecords?sig=$sig";
        $this->showlog("request url = " . $url);
        // 生成授权:主帐户Id + 英文冒号 + 时间戳。
        $authen = base64_encode($this->AccountSid . ":" . $this->Batch);
        // 生成包头
        $header = array(
            "Accept:application/$this->BodyType",
            "Content-Type:application/$this->BodyType;charset=utf-8",
            "Authorization:$authen"
        );
        // 发送请求
        $result = $this->curl_post($url, $body, $header);
        $this->showlog("response body = " . $result);
        if ($this->BodyType == "json") {//JSON格式
            $datas = json_decode($result);
        } else { //xml格式
            $datas = simplexml_load_string(trim($result, " \t\n\r"));
        }
        //  if($datas == FALSE){
        //            $datas = new stdClass();
        //            $datas->statusCode = '172003';
        //            $datas->statusMsg = '返回包体错误';
        //        }
        return $datas;
    }
    /**
     * 主帐号信息查询
     */
    function queryAccountInfo() {
        //主帐号鉴权信息验证,对必选参数进行判空。
        $auth = $this->accAuth();
        if ($auth != "") {
            return $auth;
        }
        // 大写的sig参数
        $sig = strtoupper(md5($this->AccountSid . $this->AccountToken . $this->Batch));
        // 生成请求URL
        $url = "https://$this->ServerIP:$this->ServerPort/$this->SoftVersion/Accounts/$this->AccountSid/AccountInfo?sig=$sig";
        $this->showlog("request url = " . $url);
        // 生成授权:主帐户Id + 英文冒号 + 时间戳。
        $authen = base64_encode($this->AccountSid . ":" . $this->Batch);
        // 生成包头
        $header = array(
            "Accept:application/$this->BodyType",
            "Content-Type:application/$this->BodyType;charset=utf-8",
            "Authorization:$authen"
        );
        // 发送请求
        $result = $this->curl_post($url, "", $header, 0);
        $this->showlog("response body = " . $result);
        if ($this->BodyType == "json") {//JSON格式
            $datas = json_decode($result);
        } else { //xml格式
            $datas = simplexml_load_string(trim($result, " \t\n\r"));
        }
        //  if($datas == FALSE){
        //            $datas = new stdClass();
        //            $datas->statusCode = '172003';
        //            $datas->statusMsg = '返回包体错误';
        //        }
        return $datas;
    }
    /**
     * 短信模板查询
     *
     * @param date     templateId 模板ID
     */
    function QuerySMSTemplate($templateId) {
        //主帐号鉴权信息验证,对必选参数进行判空。
        $auth = $this->accAuth();
        if ($auth != "") {
            return $auth;
        }
        // 拼接请求包体
        if ($this->BodyType == "json") {
            $body = "{'appId':'$this->AppId','templateId':'$templateId'}";
        } else {
            $body = "
                    $this->AppId
                    $templateId
                  ";
        }
        $this->showlog("request body = " . $body);
        // 大写的sig参数
        $sig = strtoupper(md5($this->AccountSid . $this->AccountToken . $this->Batch));
        // 生成请求URL
        $url = "https://$this->ServerIP:$this->ServerPort/$this->SoftVersion/Accounts/$this->AccountSid/SMS/QuerySMSTemplate?sig=$sig";
        $this->showlog("request url = " . $url);
        // 生成授权:主帐户Id + 英文冒号 + 时间戳。
        $authen = base64_encode($this->AccountSid . ":" . $this->Batch);
        // 生成包头
        $header = array(
            "Accept:application/$this->BodyType",
            "Content-Type:application/$this->BodyType;charset=utf-8",
            "Authorization:$authen"
        );
        // 发送请求
        $result = $this->curl_post($url, $body, $header);
        $this->showlog("response body = " . $result);
        if ($this->BodyType == "json") {//JSON格式
            $datas = json_decode($result);
        } else { //xml格式
            $datas = simplexml_load_string(trim($result, " \t\n\r"));
        }
        //  if($datas == FALSE){
        //            $datas = new stdClass();
        //            $datas->statusCode = '172003';
        //            $datas->statusMsg = '返回包体错误';
        //        }
        return $datas;
    }
    /**
     * 取消回拨
     *
     * @param callSid          一个由32个字符组成的电话唯一标识符
     * @param type             0: 任意时间都可以挂断电话;1 :被叫应答前可以挂断电话,其他时段返回错误代码;2: 主叫应答前可以挂断电话,其他时段返回错误代码;默认值为0。
     */
    function CallCancel($callSid, $type) {
        //主帐号鉴权信息验证,对必选参数进行判空。
        $auth = $this->subAuth();
        if ($auth != "") {
            return $auth;
        }
        // 拼接请求包体
        if ($this->BodyType == "json") {
            $body = "{'appId':'$this->AppId','callSid':'$callSid','type':'$type'}";
        } else {
            $body = "
                    $this->AppId
                    $callSid
                    $type
                  ";
        }
        $this->showlog("request body = " . $body);
        // 大写的sig参数
        $sig = strtoupper(md5($this->SubAccountSid . $this->SubAccountToken . $this->Batch));
        // 生成请求URL
        $url = "https://$this->ServerIP:$this->ServerPort/$this->SoftVersion/SubAccounts/$this->SubAccountSid/Calls/CallCancel?sig=$sig";
        $this->showlog("request url = " . $url);
        // 生成授权:主帐户Id + 英文冒号 + 时间戳。
        $authen = base64_encode($this->SubAccountSid . ":" . $this->Batch);
        // 生成包头
        $header = array(
            "Accept:application/$this->BodyType",
            "Content-Type:application/$this->BodyType;charset=utf-8",
            "Authorization:$authen"
        );
        // 发送请求
        $result = $this->curl_post($url, $body, $header);
        $this->showlog("response body = " . $result);
        if ($this->BodyType == "json") {//JSON格式
            $datas = json_decode($result);
        } else { //xml格式
            $datas = simplexml_load_string(trim($result, " \t\n\r"));
        }
        //  if($datas == FALSE){
        //            $datas = new stdClass();
        //            $datas->statusCode = '172003';
        //            $datas->statusMsg = '返回包体错误';
        //        }
        return $datas;
    }
    /**
     * 呼叫状态查询
     *
     * @param callid     呼叫Id
     * @param action     查询结果通知的回调url地址
     */
    function QueryCallState($callid, $action) {
        //主帐号鉴权信息验证,对必选参数进行判空。
        $auth = $this->accAuth();
        if ($auth != "") {
            return $auth;
        }
        // 拼接请求包体
        if ($this->BodyType == "json") {
            $body = "{'Appid':'$this->AppId','QueryCallState':{'callid':'$callid','action':'$action'}}";
        } else {
            $body = "
                    $this->AppId
                    
                  ";
        }
        $this->showlog("request body = " . $body);
        // 大写的sig参数
        $sig = strtoupper(md5($this->AccountSid . $this->AccountToken . $this->Batch));
        // 生成请求URL
        $url = "https://$this->ServerIP:$this->ServerPort/$this->SoftVersion/Accounts/$this->AccountSid/ivr/call?sig=$sig&callid=$callid";
        $this->showlog("request url = " . $url);
        // 生成授权:主帐户Id + 英文冒号 + 时间戳。
        $authen = base64_encode($this->AccountSid . ":" . $this->Batch);
        // 生成包头
        $header = array(
            "Accept:application/$this->BodyType",
            "Content-Type:application/$this->BodyType;charset=utf-8",
            "Authorization:$authen"
        );
        // 发送请求
        $result = $this->curl_post($url, $body, $header);
        $this->showlog("response body = " . $result);
        if ($this->BodyType == "json") {//JSON格式
            $datas = json_decode($result);
        } else { //xml格式
            $datas = simplexml_load_string(trim($result, " \t\n\r"));
        }
        //  if($datas == FALSE){
        //            $datas = new stdClass();
        //            $datas->statusCode = '172003';
        //            $datas->statusMsg = '返回包体错误';
        //        }
        return $datas;
    }
    /**
     * 呼叫结果查询
     *
     * @param callSid     呼叫Id
     */
    function CallResult($callSid) {
        //主帐号鉴权信息验证,对必选参数进行判空。
        $auth = $this->accAuth();
        if ($auth != "") {
            return $auth;
        }
        // 大写的sig参数
        $sig = strtoupper(md5($this->AccountSid . $this->AccountToken . $this->Batch));
        // 生成请求URL
        $url = "https://$this->ServerIP:$this->ServerPort/$this->SoftVersion/Accounts/$this->AccountSid/CallResult?sig=$sig&callsid=$callSid";
        $this->showlog("request url = " . $url);
        // 生成授权:主帐户Id + 英文冒号 + 时间戳。
        $authen = base64_encode($this->AccountSid . ":" . $this->Batch);
        // 生成包头
        $header = array(
            "Accept:application/$this->BodyType",
            "Content-Type:application/$this->BodyType;charset=utf-8",
            "Authorization:$authen"
        );
        // 发送请求
        $result = $this->curl_post($url, "", $header, 0);
        $this->showlog("response body = " . $result);
        if ($this->BodyType == "json") {//JSON格式
            $datas = json_decode($result);
        } else { //xml格式
            $datas = simplexml_load_string(trim($result, " \t\n\r"));
        }
        //  if($datas == FALSE){
        //            $datas = new stdClass();
        //            $datas->statusCode = '172003';
        //            $datas->statusMsg = '返回包体错误';
        //        }
        return $datas;
    }
    /**
     * 语音文件上传
     *
     * @param filename     文件名
     * @param body         二进制串
     */
    function MediaFileUpload($filename, $body) {
        //主帐号鉴权信息验证,对必选参数进行判空。
        $auth = $this->accAuth();
        if ($auth != "") {
            return $auth;
        }
        // 拼接请求包体
        $this->showlog("request body = " . $body);
        // 大写的sig参数
        $sig = strtoupper(md5($this->AccountSid . $this->AccountToken . $this->Batch));
        // 生成请求URL
        $url = "https://$this->ServerIP:$this->ServerPort/$this->SoftVersion/Accounts/$this->AccountSid/Calls/MediaFileUpload?sig=$sig&appid=$this->AppId&filename=$filename";
        $this->showlog("request url = " . $url);
        // 生成授权:主帐户Id + 英文冒号 + 时间戳。
        $authen = base64_encode($this->AccountSid . ":" . $this->Batch);
        // 生成包头
        $header = array(
            "Accept:application/$this->BodyType",
            "Content-Type:application/octet-stream",
            "Authorization:$authen"
        );
        // 发送请求
        $result = $this->curl_post($url, $body, $header);
        $this->showlog("response body = " . $result);
        if ($this->BodyType == "json") {//JSON格式
            $datas = json_decode($result);
        } else { //xml格式
            $datas = simplexml_load_string(trim($result, " \t\n\r"));
        }
        //  if($datas == FALSE){
        //            $datas = new stdClass();
        //            $datas->statusCode = '172003';
        //            $datas->statusMsg = '返回包体错误';
        //        }
        return $datas;
    }
    /**
     * 子帐号鉴权
     */
    function subAuth() {
        if ($this->ServerIP == "") {
            $data             = new stdClass();
            $data->statusCode = '172004';
            $data->statusMsg  = 'IP为空';
            return $data;
        }
        if ($this->ServerPort <= 0) {
            $data             = new stdClass();
            $data->statusCode = '172005';
            $data->statusMsg  = '端口错误(小于等于0)';
            return $data;
        }
        if ($this->SoftVersion == "") {
            $data             = new stdClass();
            $data->statusCode = '172013';
            $data->statusMsg  = '版本号为空';
            return $data;
        }
        if ($this->SubAccountSid == "") {
            $data             = new stdClass();
            $data->statusCode = '172008';
            $data->statusMsg  = '子帐号为空';
            return $data;
        }
        if ($this->SubAccountToken == "") {
            $data             = new stdClass();
            $data->statusCode = '172009';
            $data->statusMsg  = '子帐号令牌为空';
            return $data;
        }
        if ($this->AppId == "") {
            $data             = new stdClass();
            $data->statusCode = '172012';
            $data->statusMsg  = '应用ID为空';
            return $data;
        }
    }
    /**
     * 主帐号鉴权
     */
    function accAuth() {
        if ($this->ServerIP == "") {
            $data             = new stdClass();
            $data->statusCode = '172004';
            $data->statusMsg  = 'IP为空';
            return $data;
        }
        if ($this->ServerPort <= 0) {
            $data             = new stdClass();
            $data->statusCode = '172005';
            $data->statusMsg  = '端口错误(小于等于0)';
            return $data;
        }
        if ($this->SoftVersion == "") {
            $data             = new stdClass();
            $data->statusCode = '172013';
            $data->statusMsg  = '版本号为空';
            return $data;
        }
        if ($this->AccountSid == "") {
            $data             = new stdClass();
            $data->statusCode = '172006';
            $data->statusMsg  = '主帐号为空';
            return $data;
        }
        if ($this->AccountToken == "") {
            $data             = new stdClass();
            $data->statusCode = '172007';
            $data->statusMsg  = '主帐号令牌为空';
            return $data;
        }
        if ($this->AppId == "") {
            $data             = new stdClass();
            $data->statusCode = '172012';
            $data->statusMsg  = '应用ID为空';
            return $data;
        }
    }
}
?>