文档地址:FreeSWITCH调用接口 监听 多方通话 强转 抢接等
class CallSystem extends Model{
public $url = 'http://192.168.0.251:8085/api/';
public $username = 'admin'; //获取token的超级用户
public $password = 'admin'; //获取token的超级用户密码
//
/**这里是2、3、4三个接口一起写
* 2、设置分机忙闲
* 3、设置分机状态,上线或者下线
* 4、设置分机呼叫状态
* @param $Extension 分机用户名(分机号)
* @param $Value 设置的值
* @param $type array(2, 3, 4)
* @return array
*/
public function set_extension($Extension, $type, $Value) {
$config = array(
2 => array(
'url' => 'extension_seatstatus',
'val' => array(
0 => 'idle', //闲时
1 => 'busy' //忙时
)
),
3 => array(
'url' => 'extension_seatstate',
'val' => array(
0 => 'up', //上线
1 => 'down' //下线
)
),
4 => array(
'url' => 'extension_callstate',
'val' => array(
0 => 'ring', //振铃中
1 => 'talking', //通话中
2 => 'ivr', //语音导航中
3 => 'ready' //准备就绪
)
),
);
if (isset($config[$type]['val'][$Value])) {
$url = $this->url . $config[$type]['url'];
$params = array(
'Extension' => $Extension,
'Value' => $config[$type]['val'][$Value]
);
$res = $this->curl($url, json_encode($params), true);
return json_decode($res, true);;
}
}
/**5、token认证, 登陆后获取token
* @return mixed|string
*/
public function Token() {
$username = $this->username;
$password = $this->password;
$token = '';
$cache = \Yii::$app->cache;
//$token = $cache->delete($username . '_token');
if ($cache->get($username . '_token')) {
$token = $cache->get($username . '_token');
} else {
$params = array(
'username' => $username,
'password' => $password
);
$url = $this->url . 'login';
$res = $this->curl($url, json_encode($params), true, false);
$res_arr = json_decode($res,true);
if (isset($res_arr['token'])) {
$token = $res_arr['token'];
$cache->add($username . '_token', $res_arr['token']);
}
}
return $token;
}
/**6、获取uuid
* @return mixed|string
*/
public function get_uuid() {
$username = $this->username;
$uuid = '';
$cache = \Yii::$app->cache;
if ($cache->get($username . '_uuid')) {
$uuid = $cache->get($username . '_uuid');
} else {
$url = $this->url . 'get_uuid';
$res = $this->curl($url);
$res_arr = json_decode($res, true);
if (isset($res_arr['uuid'])) {
$uuid = $res_arr['uuid'];
$cache->add($username . '_uuid', $res_arr['uuid']);
}
}
return $uuid;
}
/**这里是1、7、8、9、10四个接口整合
* 1、查询分机状态
* 7、获取一个正在通话中的电话的uuid
* 8、挂断一个正通话中电话
* 9、hold一个通话
* 10、unhold一个通话
* 14、park一个通话 挂起一个号码
* 15、抢接一个来电 把最后一个来电抢接过来
* 16、由平台应答
* 20 preanswer
* 22、中止相关操作
* @param $username 分机用户名(分机号)
* @param $type 接口编号
* @return mixed
*/
public function sent($username, $type) {
$config = array(
1 => 'extension_info/',
7 => 'get_phone_uuid/',
8 => 'hangup/',
9 => 'hold/',
10 => 'unhold/',
14 => 'park/',
15 => 'intercept/',
16 => 'answer/',
20 => 'preanswer/',
22 => 'break/',
);
if (isset($config[$type])) {
$url = $this->url . 'get_phone_uuid/' . $username;
$res = $this->curl($url);
return json_decode($res, true);
}
}
/**11、发起一个呼叫
* @param $args
* @return mixed
*/
public function originate($args) {
$url = $this->url . 'originate';
$params = array(
"Job_uuid" => $this->get_uuid(), //uuid
"Callername" => $args['Callername'], //主叫用户名
"Callernum" => $args['Callernum'], //主叫号码
"Calleenum" => $args['Calleenum'], //被叫号码
"A_gatewayname" => $args['A_gatewayname'], //如果a是外线,则要指定a的出局网关
"B_gatewayname" => $args['B_gatewayname'], //如果b是外线,则要指定b的出局网关
"A_effective_caller_id_num" => $args['A_effective_caller_id_num'], //被叫手机显示号码
"B_effective_caller_id_num" => $args['B_effective_caller_id_num'], //主叫手机显示号码
"A_external" => $args['A_external'], //标记a是不是外线
"B_external" => $args['B_external'] //标记b是不是外线
);
$res = $this->curl($url, json_encode($params), true);
return json_decode($res,true);
}
/**11b 呼叫两个通道且放音 1、先呼外线在呼内线 2、先呼内线在呼外线 3、两个都为外线
* @param $args
* @return mixed
*/
public function originate_playring($args) {
$url = $this->url . 'originate_playring';
$params = array(
"Job_uuid" => $this->get_uuid(), //uuid
"Callername" => $args['Callername'], //主叫用户名
"Callernum" => $args['Callernum'], //主叫号码
"Calleenum" => $args['Calleenum'], //被叫号码
"A_gatewayname" => $args['A_gatewayname'], //如果a是外线,则要指定a的出局网关
"B_gatewayname" => $args['B_gatewayname'], //如果b是外线,则要指定b的出局网关
"A_effective_caller_id_num" => $args['A_effective_caller_id_num'], //被叫手机显示号码
"B_effective_caller_id_num" => $args['B_effective_caller_id_num'], //主叫手机显示号码
"A_external" => $args['A_external'], //标记a是不是外线
"B_external" => $args['B_external'], //标记b是不是外线
"Ring_id" => $args['Ring_id']
);
$res = $this->curl($url, json_encode($params), true);
return json_decode($res,true);
}
/**11c 发起时由调用方指定呼叫事件和cdr的post URL
* @return mixed
*/
public function originate_yn() {
$url = $this->url . 'originate_yn';
$params = array(
"Job_uuid" => "1234",
"Callername" => "1002",
"Callernum" => "1002",
"Calleenum" => "1000",
"A_gatewayname" => "",
"B_gatewayname" => "",
"A_effective_caller_id_num" => "1002",
"B_effective_caller_id_num" => "1000",
"A_external" => "false",
"B_external" => "false",
"Ring_id" => "35",
"Cdr_url" => "http://123.1.2.2/cdr/",
"Event_url" => "http://123.1.2.2/event/"
);
$res = $this->curl($url, json_encode($params), true);
return json_decode($res,true);;
}
/**11d 采用fsgui中配的网关组呼叫
* @return mixed
*/
public function originate_ext() {
$url = $this->url . 'originate_ext';
$params = array(
"Job_uuid" => "1234",
"Callername" => "1002",
"Callernum" => "1002",
"Calleenum" => "1000",
"A_effective_caller_id_num" => "1002",
"GatewayGroupId" => "1",
"B_effective_caller_id_num" => "1000",
"A_external" => "false",
"B_external" => "false",
"Ring_id" => "35",
"Cdr_url" => "http://123.1.2.2/cdr/",
"Event_url" => "http://123.1.2.2/event/"
);
$res = $this->curl($url, json_encode($params), true);
$res_arr = json_decode($res,true);
return $res_arr;
}
/**12、按uuid桥接两个通话通道 13、按号码桥接两个通话通道
* @param $args
* @param $type 0、按uuid桥接两个通话通道 1、按号码桥接两个通话通道
* @return mixed
*/
public function bridge($args, $type) {
$config = array(
0 => array(
"A_uuid" => $this->sent($args['A_uuid'], 7),
"B_uuid" => $this->sent($args['B_uuid'], 7)
),
1 => array(
"A_phone" => $args['phone1'],
"B_phone" => $args['phone2']
)
);
if ($type==0) {
$url = $this->url . 'bridge';
} else {
$url = $this->url . 'bridge_phone';
}
$params = $config[$type];
$res = $this->curl($url, json_encode($params), true);
return json_decode($res, true);
}
/**17 按号码监听 被监听的号码、由哪个号码监听、如果是外线号码进行监听,则需要指定网关
* 18 多方通话 邀请加入多方通话的的号码、邀请加入的多方通话里有哪个号码在通话、 如果是外线号码,则需要指定网关
* 19 耳语 被监听的的号码、监听的号码、如果是外线号码,则需要指定网关
* 26 转接 正在通话的号码、要转出的号码、如果是外线号码,则需要指定网关
* @param $args
* @param $type
* @return array
*/
public function number($args, $type) {
$args = array(
"EvdedPhone" => $args['EvdedPhone'],
"EvdPhone" => $args['EvdPhone'],
"EvdGateway" => $args['EvdGateway']
);
$flag = '';
switch ($type) {
case 17 :
$flag = 'eavesdrop';
break;
case 18 :
$flag = 'threeway';
break;
case 19 :
$flag = 'threeway';
break;
case 26 :
$flag = 'transfer';
break;
default:
break;
}
$url = $this->url . $flag;
$res = $this->curl($url, json_encode($args), true);
return json_decode($res, true);;
}
/**21、给已answer的通道放音
* @param $PhoneNumber 准备放音的号码
* @param $FilePath 语音文件路径
* @param $Loopplay 不间断循环
* @return mixed
*/
public function playback($PhoneNumber, $FilePath, $Loopplay) {
$url = $this->url . 'playback';
$params = array(
"PhoneNumber" => $PhoneNumber,
"FilePath" => $FilePath,
"Loopplay" => $Loopplay
);
$res = $this->curl($url, json_encode($params), true);
$res_arr = json_decode($res, true);
return $res_arr;
}
/**23、录音
* @param $PhoneNumber 准备录音的号码
* @param $Filepath 语音文件路径
* @param $Flag 开始就录制
* @param $Limit 0即通话哪怕是一秒也录制,如果是5,则如果通话低于5就不保存
* @return mixed
*/
public function record($PhoneNumber, $Filepath, $Flag, $Limit) {
$url = $this->url . 'record';
$params = array(
"PhoneNumber" => $PhoneNumber,
"Filepath" => $Filepath,
"Flag" => $Flag,
"Limit" => $Limit
);
$res = $this->curl($url, json_encode($params), true);
$res_arr = json_decode($res, true);
return $res_arr;
}
/**24 发送dtmf
* @param $PhoneNumber 准备发送dtmf的号码
* @param $Dtmf dtmf
* @return mixed
*/
public function senddtmf($PhoneNumber, $Dtmf) {
$url = $this->url . 'senddtmf';
$params = array(
"PhoneNumber" => $PhoneNumber,
"Dtmf" => $Dtmf
);
$res = $this->curl($url, json_encode($params), true);
$res_arr = json_decode($res, true);
return $res_arr;
}
/**25 发送传真
* @return mixed
*/
public function send_fax() {
$url = $this->url . 'send_fax';
$params = array(
"PhoneNumber" => "02112345678",
"GatewayName" => "fax",
"FaxFile" => "/tmp/av.tiff"
);
$res = $this->curl($url, json_encode($params), true);
$res_arr = json_decode($res, true);
return $res_arr;
}
public function curl($url, $data = [], $post=false, $flag=true){
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HTTP_VERSION, '1.0');//使用HTTP 1.0协议
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
if($post){
curl_setopt($curl, CURLOPT_POST, TRUE);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
}
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FRESH_CONNECT ,true); //关闭内容缓存
//设置头部信息----------------------------------
$ip = $_SERVER['REMOTE_ADDR'];
$ipArray = explode('.', $ip);
$ip = $ipArray[0].'.'.$ipArray[1].'.'.rand(2,254).'.'.rand(2,254);
$header[] = "Accept: ".$_SERVER['HTTP_ACCEPT'];
$header[] = 'X-FORWARDED-FOR: '.$ip;
$header[] = 'CLIENT-IP: '.$ip;
$header[] = "Cache-Control: no-cache";
$header[] = "Connection: keep-alive";
$header[] = "Keep-Alive: 300";
$header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
$header[] = "Accept-Language: zh-CN,zh;q=0.8,en;q=0.6";
$header[] = "User-Agent: ".$_SERVER['HTTP_USER_AGENT']; // browsers keep this blank.
$header[] = "Content-Type:application/json";
if ($flag) {
$header[] = "Authorization:Nway " . $this->Token();
}
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
$output = curl_exec($curl);
curl_close($curl);
return $output;
}
}