| <?php | 
|   | 
| /* | 
|  *  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.yuntongxun.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. | 
|  */ | 
|   | 
| class SMS_SDK_REST { | 
|   | 
|     private $AccountSid; | 
|     private $AccountToken; | 
|     private $AppId; | 
|     private $SubAccountSid; | 
|     private $SubAccountToken; | 
|     private $VoIPAccount; | 
|     private $VoIPPassword; | 
|     private $ServerIP; | 
|     private $ServerPort; | 
|     private $SoftVersion; | 
|     private $Batch;  //时间sh | 
|     private $BodyType = "xml";//包体格式,可填值:json 、xml | 
|     private $enabeLog = true; //日志开关。可填值:true、 | 
|     private $Filename = "../log.txt"; //日志文件 | 
|     private $Handle; | 
|   | 
|     function __construct($ServerIP, $ServerPort, $SoftVersion) { | 
|   | 
|         $this->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 = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Response><statusCode>172001</statusCode><statusMsg>网络错误</statusMsg></Response>"; | 
|             } | 
|         } | 
|   | 
|         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 = "<SubAccount> | 
|                     <appId>$this->AppId</appId> | 
|                     <friendlyName>$friendlyName</friendlyName> | 
|                   </SubAccount>"; | 
|         } | 
|         $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 = " | 
|             <SubAccount> | 
|               <appId>$this->AppId</appId> | 
|               <startNo>$startNo</startNo> | 
|               <offset>$offset</offset> | 
|             </SubAccount>"; | 
|         if ($this->BodyType == "json") { | 
|             $body = "{'appId':'$this->AppId','startNo':'$startNo','offset':'$offset'}"; | 
|         } else { | 
|             $body = " | 
|             <SubAccount> | 
|               <appId>$this->AppId</appId> | 
|               <startNo>$startNo</startNo> | 
|               <offset>$offset</offset> | 
|             </SubAccount>"; | 
|         } | 
|         $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 = " | 
|             <SubAccount> | 
|               <appId>$this->AppId</appId> | 
|               <friendlyName>$friendlyName</friendlyName> | 
|             </SubAccount>"; | 
|         } | 
|         $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 . "<data>" . $datas[$i] . "</data>"; | 
|             } | 
|             $body = "<TemplateSMS> | 
|                     <to>$to</to> | 
|                     <appId>$this->AppId</appId> | 
|                     <templateId>$tempId</templateId> | 
|                     <datas>" . $data . "</datas> | 
|                   </TemplateSMS>"; | 
|         } | 
|         $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 = "<CallBack> | 
|                      <from>$from</from> | 
|                      <to>$to</to> | 
|                      <customerSerNum>$customerSerNum</customerSerNum> | 
|                      <fromSerNum>$fromSerNum</fromSerNum> | 
|                      <promptTone>$promptTone</promptTone> | 
|                                <userData>$userData</userData> | 
|                                <maxCallTime>$maxCallTime</maxCallTime> | 
|                                <hangupCdrUrl>$hangupCdrUrl</hangupCdrUrl> | 
|                      <alwaysPlay>$alwaysPlay</alwaysPlay> | 
|                      <terminalDtmf>$terminalDtmf</terminalDtmf> | 
|                      <needBothCdr>$needBothCdr</needBothCdr> | 
|                      <needRecord>$needRecord</needRecord> | 
|                      <countDownTime>$countDownTime</countDownTime> | 
|                      <countDownPrompt>$countDownPrompt</countDownPrompt> | 
|                    </CallBack>"; | 
|         } | 
|         $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 = "<LandingCall> | 
|                     <to>$to</to> | 
|                     <mediaName>$mediaName</mediaName> | 
|                     <mediaTxt>$mediaTxt</mediaTxt> | 
|                     <appId>$this->AppId</appId> | 
|                     <displayNum>$displayNum</displayNum> | 
|                     <playTimes>$playTimes</playTimes> | 
|                     <respUrl>$respUrl</respUrl> | 
|                     <userData>$userData</userData> | 
|                     <maxCallTime>$maxCallTime</maxCallTime> | 
|                     <speed>$speed</speed> | 
|                     <volume>$volume</volume> | 
|                     <pitch>$pitch</pitch> | 
|                     <bgsound>$bgsound</bgsound> | 
|                   </LandingCall>"; | 
|         } | 
|         $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 = "<VoiceVerify> | 
|                     <appId>$this->AppId</appId> | 
|                     <verifyCode>$verifyCode</verifyCode> | 
|                     <playTimes>$playTimes</playTimes> | 
|                     <to>$to</to> | 
|                     <respUrl>$respUrl</respUrl> | 
|                     <displayNum>$displayNum</displayNum> | 
|                     <lang>$lang</lang> | 
|                     <userData>$userData</userData> | 
|                   </VoiceVerify>"; | 
|         } | 
|         $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 用户数据,在<startservice>通知中返回,只允许填写数字字符,为Dial节点的属性 | 
|      * @param record   是否录音,可填项为true和false,默认值为false不录音,为Dial节点的属性 | 
|      */ | 
|     function ivrDial($number, $userdata, $record) { | 
|   | 
|         //主帐号鉴权信息验证,对必选参数进行判空。 | 
|         $auth = $this->accAuth(); | 
|         if ($auth != "") { | 
|             return $auth; | 
|         } | 
|         // 拼接请求包体 | 
|         $body = " <Request> | 
|                   <Appid>$this->AppId</Appid> | 
|                   <Dial number='$number'  userdata='$userdata' record='$record'></Dial> | 
|                 </Request>"; | 
|         $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 = "<BillRecords> | 
|                     <appId>$this->AppId</appId> | 
|                     <date>$date</date> | 
|                     <keywords>$keywords</keywords> | 
|                   </BillRecords>"; | 
|         } | 
|         $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 = "<Request> | 
|                     <appId>$this->AppId</appId> | 
|                     <templateId>$templateId</templateId> | 
|                   </Request>"; | 
|         } | 
|         $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 = "<CallCancel> | 
|                     <appId>$this->AppId</appId> | 
|                     <callSid>$callSid</callSid> | 
|                     <type>$type</type> | 
|                   </CallCancel>"; | 
|         } | 
|         $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 = "<Request> | 
|                     <Appid>$this->AppId</Appid> | 
|                     <QueryCallState callid ='$callid' action='$action'/> | 
|                   </Request>"; | 
|         } | 
|         $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; | 
|         } | 
|     } | 
| } | 
|   | 
| ?> |