Last active
December 1, 2015 14:41
-
-
Save lokielse/19b82d286dd1d3418c5a to your computer and use it in GitHub Desktop.
容联-云通讯 PHP-SDK
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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 CCPRest | |
{ | |
protected $accountSid; | |
protected $accountToken; | |
protected $appId; | |
protected $subAccountSid; | |
protected $subAccountToken; | |
protected $voIPAccount; | |
protected $voIPPassword; | |
protected $serverIP; | |
protected $serverPort; | |
protected $softVersion; | |
protected $batch; | |
protected $enableLog = false; | |
protected $logHandle = null; | |
protected static $logFile = null; | |
public function __construct($serverIP, $serverPort, $softVersion) | |
{ | |
$this->serverIP = $serverIP; | |
$this->serverPort = $serverPort; | |
$this->softVersion = $softVersion; | |
$this->refreshBatch(); | |
} | |
public function __destruct() | |
{ | |
if ($this->logHandle) { | |
fclose($this->logHandle); | |
} | |
} | |
public static function setLogFile($logFile) | |
{ | |
self::$logFile = $logFile; | |
} | |
/** | |
* 设置主帐号 | |
* | |
* @param $accountSid ,主帐号 | |
* @param $accountToken ,主帐号Token | |
*/ | |
public function setAccount($accountSid, $accountToken) | |
{ | |
$this->accountSid = $accountSid; | |
$this->accountToken = $accountToken; | |
} | |
/** | |
* 设置子帐号 | |
* | |
* @param $subAccountSid ,子帐号 | |
* @param $subAccountToken ,子帐号Token | |
* @param $voIPAccount ,VoIP帐号 | |
* @param $voIPPassword ,VoIP密码 | |
*/ | |
public function setSubAccount($subAccountSid, $subAccountToken, $voIPAccount = '', $voIPPassword = '') | |
{ | |
$this->subAccountSid = $subAccountSid; | |
$this->subAccountToken = $subAccountToken; | |
$this->voIPAccount = $voIPAccount; | |
$this->voIPPassword = $voIPPassword; | |
} | |
/** | |
* 设置应用ID | |
* | |
* @param $appId ,应用ID | |
*/ | |
public function setAppId($appId) | |
{ | |
$this->appId = $appId; | |
} | |
/** | |
* 打印日志 | |
* | |
* @param $content ,日志内容 | |
*/ | |
protected function log($content) | |
{ | |
if ($this->enableLog && self::$logFile) { | |
if (!$this->logHandle === null) { | |
$this->logHandle = fopen(self::$logFile, 'a'); | |
} | |
fwrite($this->logHandle, $content . "\n"); | |
} | |
} | |
/** | |
* 发起HTTPS请求 | |
* | |
* @param $url | |
* @param $data | |
* @param $header | |
* @param bool $post | |
* | |
* @return string | |
*/ | |
protected function curl($url, $data, $header, $post = true) | |
{ | |
$this->log("request body = " . $data); | |
$ch = curl_init(); | |
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); | |
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) { | |
$result = json_encode(['statusCode' => '172001', "statusMsg" => '网络错误']); | |
} | |
curl_close($ch); | |
$this->log("response body = " . $result); | |
return $result; | |
} | |
protected function url($path, $isSubAccount = false) | |
{ | |
if ($isSubAccount) { | |
$sig = strtoupper(md5($this->subAccountSid . $this->subAccountToken . $this->batch)); | |
} else { | |
$sig = strtoupper(md5($this->accountSid . $this->accountToken . $this->batch)); | |
} | |
// 生成请求URL | |
$url = sprintf('https://%s:%s/%s/%s?sig=%s', $this->serverIP, $this->serverPort, $this->softVersion, $path, $sig); | |
$this->log("request url = " . $url); | |
return $url; | |
} | |
/** | |
* @param $isSubAccount | |
* | |
* @return string | |
*/ | |
protected function auth($isSubAccount) | |
{ | |
if ($isSubAccount) { | |
return base64_encode($this->subAccountSid . ":" . $this->batch); | |
} else { | |
return base64_encode($this->accountSid . ":" . $this->batch); | |
} | |
} | |
/** | |
* @param $isSubAccount | |
* | |
* @return array | |
*/ | |
protected function getHeader($isSubAccount) | |
{ | |
// 生成授权:主帐户Id + 英文冒号 + 时间戳。 | |
$auth = $this->auth($isSubAccount); | |
// 生成包头 | |
$header = array( | |
"Accept:application/json", | |
"Content-Type:application/json;charset=utf-8", | |
"Authorization:$auth" | |
); | |
return $header; | |
} | |
/** | |
* @param $path | |
* @param $data | |
* @param bool $isSubAccount | |
* @param bool $post | |
* | |
* @return mixed | |
*/ | |
public function api($path, $data, $isSubAccount = false, $post = true) | |
{ | |
$this->refreshBatch(); | |
//主帐号鉴权信息验证,对必选参数进行判空。 | |
if ($isSubAccount) { | |
$auth = $this->subAuth(); | |
} else { | |
$auth = $this->accAuth(); | |
} | |
if ($auth) { | |
return $auth; | |
} | |
// 拼接请求包体 | |
$data['appId'] = $this->appId; | |
$body = json_encode($data); | |
$url = $this->url($path, $isSubAccount); | |
// 发请求 | |
$result = $this->curl($url, $body, $this->getHeader($isSubAccount), $post); | |
$data = json_decode($result); | |
return $data; | |
} | |
/** | |
* 创建子帐号 | |
* | |
* @param friendlyName ,子帐号名称 | |
* | |
* @return mixed | |
*/ | |
public function createSubAccount($friendlyName) | |
{ | |
$data = [ | |
'friendlyName' => $friendlyName | |
]; | |
return $this->api("Accounts/$this->accountSid/SubAccounts", $data); | |
} | |
/** | |
* 获取子帐号 | |
* | |
* @param startNo ,开始的序号,默认从0开始 | |
* @param offset ,一次查询的最大条数,最小是1条,最大是100条 | |
* | |
* @return mixed | |
*/ | |
public function getSubAccounts($startNo, $offset) | |
{ | |
$data = [ | |
'startNo' => $startNo, | |
'offset' => $offset | |
]; | |
return $this->api("Accounts/$this->accountSid/GetSubAccounts", $data); | |
} | |
/** | |
* 子帐号信息查询 | |
* | |
* @param friendlyName ,子帐号名称 | |
* | |
* @return mixed | |
*/ | |
public function querySubAccount($friendlyName) | |
{ | |
$data = [ | |
'friendlyName' => $friendlyName, | |
]; | |
return $this->api("Accounts/$this->accountSid/QuerySubAccountByName", $data); | |
} | |
/** | |
* 发送短信 | |
* | |
* @param to ,短信接收彿手机号码集合,用英文逗号分开 | |
* @param body ,短信正文 | |
* | |
* @return mixed | |
*/ | |
public function sendSMS($to, $smsBody) | |
{ | |
$data = [ | |
'to' => $to, | |
'smsBody' => $smsBody, | |
]; | |
return $this->api("Accounts/$this->accountSid/SMS/Messages", $data); | |
} | |
/** | |
* 发送模板短信 | |
* | |
* @param $to ,短信接收手机号码集合,用英文逗号分开 | |
* @param array $data ,内容数据 | |
* @param $tempId ,模板Id | |
* | |
* @return mixed | |
*/ | |
public function sendTemplateSMS($to, array $data, $tempId) | |
{ | |
$data = [ | |
'to' => $to, | |
'templateId' => $tempId, | |
'datas' => $data, | |
]; | |
return $this->api("Accounts/$this->accountSid/SMS/TemplateSMS", $data); | |
} | |
/** | |
* 双向回呼 | |
* | |
* @param from ,主叫电话号码 | |
* @param to ,被叫电话号码 | |
* @param customerSerNum ,被叫侧显示的客服号码 | |
* @param fromSerNum ,主叫侧显示的号码 | |
* @param promptTone ,第三方自定义回拨提示音 | |
* | |
* @return mixed | |
*/ | |
public function callBack($from, $to, $customerSerNum, $fromSerNum, $promptTone, $userData = '') | |
{ | |
$data = [ | |
'to' => $to, | |
'from' => $from, | |
'customerSerNum' => $customerSerNum, | |
'fromSerNum' => $fromSerNum, | |
'promptTone' => $promptTone, | |
'userData' => $userData, | |
]; | |
return $this->api("SubAccounts/$this->subAccountSid/Calls/Callback", $data, true); | |
} | |
/** | |
* 营销外呼 | |
* | |
* @param to ,被叫号码 | |
* @param mediaName ,语音文件名称,格式 wav。与mediaTxt不能同时为空。当不为空时mediaTxt属性失效。 | |
* @param mediaTxt ,文本内容 | |
* @param displayNum ,显示的主叫号码 | |
* @param playTimes ,循环播放次数,1-3次,默认播放1次。 | |
* @param respUrl ,营销外呼状态通知回调地址,云通讯平台将向该Url地址发送呼叫结果通知。 | |
* | |
* @return mixed | |
*/ | |
public function landingCall($to, $mediaName, $mediaTxt, $displayNum, $playTimes, $respUrl) | |
{ | |
$data = [ | |
'playTimes' => $playTimes, | |
'mediaTxt' => $mediaTxt, | |
'mediaName' => $mediaName, | |
'to' => $to, | |
'displayNum' => $displayNum, | |
'respUrl' => $respUrl, | |
]; | |
return $this->api("Accounts/$this->accountSid/Calls/LandingCalls", $data); | |
} | |
/** | |
* 语音验证码 | |
* | |
* @param verifyCode ,验证码内容,为数字和英文字母,不区分大小写,长度4-8位 | |
* @param playTimes ,播放次数,1-3次 | |
* @param to ,接收号码 | |
* @param displayNum ,显示的主叫号码 | |
* @param respUrl ,语音验证码状态通知回调地址,云通讯平台将向该Url地址发送呼叫结果通知 | |
* | |
* @return mixed | |
*/ | |
public function voiceVerify($verifyCode, $playTimes, $to, $displayNum, $respUrl) | |
{ | |
$data = [ | |
'verifyCode' => $verifyCode, | |
'playTimes' => $playTimes, | |
'to' => $to, | |
'displayNum' => $displayNum, | |
'respUrl' => $respUrl, | |
]; | |
return $this->api("Accounts/$this->accountSid/Calls/VoiceVerify", $data); | |
} | |
/** | |
* IVR外呼 | |
* | |
* @param number ,待呼叫号码,为Dial节点的属性 | |
* @param $userData ,用户数据,在<startservice>通知中返回,只允许填写数字字符,为Dial节点的属性 | |
* @param record ,是否录音,可填项为true和false,默认值为false不录音,为Dial节点的属性 | |
* | |
* @return mixed | |
*/ | |
public function ivrDial($number, $userData, $record) | |
{ | |
$data = [ | |
'Dial' => ['number' => $number, 'userdata' => $userData, 'record' => $record] | |
]; | |
return $this->api("Accounts/$this->accountSid/ivr/dial", $data); | |
} | |
/** | |
* 话单下载 | |
* | |
* @param $date ,day 代表前一天的数据(从00:00 – 23:59);week代表前一周的数据(周一 到周日);month表示上一个月的数据(上个月表示当前月减1,如果今天是4月10号,则查询结果是3月份的数据) | |
* @param $keywords ,客户的查询条件,由客户自行定义并提供给云通讯平台。默认不填忽略此参数 | |
* | |
* @return mixed | |
*/ | |
public function billRecords($date, $keywords) | |
{ | |
$data = [ | |
'date' => $date, | |
'keywords' => $keywords, | |
]; | |
return $this->api("Accounts/$this->accountSid/BillRecords", $data); | |
} | |
/** | |
* 主帐号信息查询 | |
*/ | |
public function queryAccountInfo() | |
{ | |
$data = []; | |
return $this->api("Accounts/$this->accountSid/AccountInfo", $data, false, false); | |
} | |
/** | |
* 子帐号鉴权 | |
*/ | |
protected 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; | |
} | |
return null; | |
} | |
/** | |
* 主帐号鉴权 | |
*/ | |
protected 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; | |
} | |
return null; | |
} | |
protected function refreshBatch() | |
{ | |
$this->batch = date("YmdHis"); | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment