Skip to content

Instantly share code, notes, and snippets.

@lokielse
Last active December 1, 2015 14:41
Show Gist options
  • Save lokielse/19b82d286dd1d3418c5a to your computer and use it in GitHub Desktop.
Save lokielse/19b82d286dd1d3418c5a to your computer and use it in GitHub Desktop.
容联-云通讯 PHP-SDK
<?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