FreeSwitch关于PHP接口开发

文档地址: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;
    }



}

你可能感兴趣的:(FreeSwitch关于PHP接口开发)