更新时间:2024-09-24 GMT+08:00
分享

PHP

样例

语音回呼场景API获取录音文件下载地址API呼叫状态通知API话单通知API

环境要求

PHP 7.0及以上版本。

引用库

-

  • 本文档所述Demo在提供服务的过程中,可能会涉及个人数据的使用,建议您遵从国家的相关法律采取足够的措施,以确保用户的个人数据受到充分的保护。
  • 本文档所述Demo仅用于功能演示,不允许客户直接进行商业使用。
  • 本文档信息仅供参考,不构成任何要约或承诺。

“语音回呼场景API”代码样例

<?php
include 'data.php';
include 'util.php';
include 'getRecordLink.php';
/**
 * voiceCallAPI
 * @param string $displayNbr
 * @param string $callerNbr
 * @param string $displayCalleeNbr
 * @param string $calleeNbr
 */
function voiceCallAPI($displayNbr, $callerNbr, $displayCalleeNbr, $calleeNbr) {
    if (empty($displayNbr) || empty($callerNbr) || empty($displayCalleeNbr) || empty($calleeNbr)) {
        return;
    }

    $method = 'POST';
    $apiUri = '/rest/httpsessions/click2Call/v2.0';
    $xaksk = buildAKSKHeader(getClick2Call_AppId(), getClick2Call_Secret());

    $content = json_encode([
        /* 必填参数*/
        'displayNbr' => $displayNbr,//主叫用户手机终端的来电显示号码。
        'callerNbr' => $callerNbr,//发起呼叫时所使用的主叫号码。
        'displayCalleeNbr' => $displayCalleeNbr,//被叫用户终端的来电显示号码。
        'calleeNbr' => $calleeNbr//发起呼叫时所拨打的被叫号码。
        /* 选填参数*/
//         'bindNbr' => '+86123456789', //CallEnabler业务号码,即绑定号码
//         'maxDuration' => 0, //允许单次通话进行的最长时间
//         'lastMinVoice' => 'lastmin_voice1.wav', //最后一分钟放音提示音
//         'lastMinToUE' => 'both', //最后一分钟放音的播放对象
//         'playPreVoice' => 'false', //设置主叫(callerNbr)应答语音回呼后,呼叫被叫(calleeNbr)前,是否向主叫(callerNbr)播放提示音
//         'preVoice' => 'pre_voice1.wav', //设置主叫(callerNbr)应答语音回呼后,呼叫被叫(calleeNbr)前向主叫播放的提示音
//         'waitVoice' => 'wait_voice1.wav', //设置主叫应答语音回呼后的等待音
//         'calleeMedia' => 'all', //指定被叫的媒体音播放方式
//         'statusUrl' => '', //设置SP接收状态上报的URL,要求使用BASE64编码
//         'feeUrl' => '', //设置SP接收话单上报的URL,要求使用BASE64编码
//         'recordFlag' => 'false', //设置语音回呼通话过程是否录音
//         'recordHintTone' => 'recordhint_voice1.wav', //设置使用录音功能的提示音
//         'partyTypeRequiredInDisconnect' => 'false', //disconnect状态是否需要携带通话主动挂机的用户类型
//         'returnIdlePort' => 'false', //指示是否需要返回平台空闲呼叫端口数量
//         'userData' => 'customerId123' //设置用户的附属信息
    ]);

    $requestUrl = getBaseUrl() . $apiUri;
    $context_options = createOptions($method, $xaksk, $content);

    try {
        $response = file_get_contents($requestUrl, false, stream_context_create($context_options)); // 发送请求
        print_r($response . PHP_EOL); // 打印响应结果
    } catch (Exception $e) {
        echo $e->getMessage(); //打印错误信息
    }
}
voiceCallAPI('+8653159511234', '+8613500000001', '+8653159511234', '+8613500000002');
$xaksk = buildAKSKHeader(getClick2Call_AppId(), getClick2Call_Secret());
$location = getRecordLinkAPI('1200_366_0_20161228102743.wav', 'ostor.huawei.com', $xaksk);
print_r('The record file download link is: ' . $location . PHP_EOL);
?>

“获取录音文件下载地址API”代码样例

<?php
include 'data.php';
include 'util.php';
/**
 * getRecordLinkAPI
 * @param string $fileName
 * @param string $recordDomain
 * @param string $xaksk
 * @return void|string|mixed
 */
function getRecordLinkAPI($fileName, $recordDomain, $xaksk) {
    if (empty($fileName) || empty($recordDomain) || empty($xaksk)) {
        return;
    }

    $location = '';

    $method = 'GET';
    $apiUri = '/rest/provision/voice/record/v1.0';
    $queryParams = http_build_query(['fileName' => $fileName, 'recordDomain' => $recordDomain]);

    $requestUrl = getBaseUrl() . $apiUri . '?' . $queryParams;
    $context_options = createOptions($method, $xaksk, null);

    try {
        $http_response_header = get_headers($requestUrl, 1, stream_context_create($context_options)); //获取响应消息头域信息
        if(strpos($http_response_header[0], '301')){
            $location = $http_response_header['Location']; //获取录音文件下载地址
        }else{
            print_r($http_response_header[0] . PHP_EOL); //打印响应码400/401/403/500
//             $response = file_get_contents($requestUrl, false, stream_context_create($context_options)); //获取响应消息数据信息
//             print_r($response . PHP_EOL); // 打印响应结果
        }
    } catch (Exception $e) {
        echo $e->getMessage(); //打印错误信息
    }

    return $location;
}
?>

“呼叫状态通知API”代码样例

<?php
/**
 * 呼叫事件通知
 * 客户平台收到RTC业务平台的呼叫事件通知的接口通知
 */
//呼叫事件通知样例
$jsonBody = json_encode([
    'eventType' => 'callout',
    'statusInfo' => [
        'sessionId' => '1201_612_4294967295_20190124030424@callenabler245.huaweicaas.com',
        'timestamp' => '2019-01-24 03:04:24',
        'caller' => '+8613800000022',
        'called' => '+8613800000021'
    ]
]);
print_r($jsonBody . PHP_EOL);
onCallEvent($jsonBody);//呼叫事件处理
/**
 * 呼叫事件通知
 * @desc 详细内容以接口文档为准
 * @param jsonBody
 */
function onCallEvent($jsonBody) {
    $jsonArr = json_decode($jsonBody, true); //将通知消息解析为关联数组
    $eventType = $jsonArr['eventType']; //通知事件类型

    if (strcasecmp($eventType, 'fee') == 0) {
        print_r('EventType error: ' . $eventType);
        return;
    }

    if (!array_key_exists('statusInfo', $jsonArr)) {
        print_r('param error: no statusInfo.');
        return;
    }
    $statusInfo = $jsonArr['statusInfo']; //呼叫状态事件信息

    print_r('eventType: ' . $eventType . PHP_EOL); //打印通知事件类型
    //callout:呼出事件
    if (strcasecmp($eventType, 'callout') == 0) {
        /**
         * Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理
         *
         * 'timestamp': 该呼叫事件发生时RTC业务平台的UNIX时间戳
         * 'userData': 用户附属信息
         * 'sessionId': 通话链路的标识ID
         * 'caller': 主叫号码
         * 'called': 被叫号码
         */
        if (array_key_exists('sessionId', $statusInfo)) {
            print_r('sessionId: ' . $statusInfo['sessionId'] . PHP_EOL);
        }
        return;
    }
    //alerting:振铃事件
    if (strcasecmp($eventType, 'alerting') == 0) {
        /**
         * Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理
         *
         * 'timestamp': 该呼叫事件发生时RTC业务平台的UNIX时间戳
         * 'userData': 用户附属信息
         * 'sessionId': 通话链路的标识ID
         * 'caller': 主叫号码
         * 'called': 被叫号码
         */
        if (array_key_exists('sessionId', $statusInfo)) {
            print_r('sessionId: ' . $statusInfo['sessionId'] . PHP_EOL);
        }
        return;
    }
    //answer:应答事件
    if (strcasecmp($eventType, 'answer') == 0) {
        /**
         * Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理
         *
         * 'timestamp': 该呼叫事件发生时RTC业务平台的UNIX时间戳
         * 'userData': 用户附属信息
         * 'sessionId': 通话链路的标识ID
         * 'caller': 主叫号码
         * 'called': 被叫号码
         */
        if (array_key_exists('sessionId', $statusInfo)) {
            print_r('sessionId: ' . $statusInfo['sessionId'] . PHP_EOL);
        }
        return;
    }
    //collectInfo:放音收号结果事件,仅应用于语音通知场景
    if (strcasecmp($eventType, 'collectInfo') == 0) {
        /**
         * Example: 此处以解析digitInfo为例,请按需解析所需参数并自行实现相关处理
         *
         * 'timestamp': 该呼叫事件发生时RTC业务平台的UNIX时间戳
         * 'sessionId': 通话链路的标识ID
         * 'digitInfo': 放音收号场景中,RTC业务平台对开发者进行放音收号操作的结果描述
         */
        if (array_key_exists('digitInfo', $statusInfo)) {
            print_r('digitInfo: ' . $statusInfo['digitInfo'] . PHP_EOL);
        }
        return;
    }
    //disconnect:挂机事件
    if (strcasecmp($eventType, 'disconnect') == 0) {
        /**
         * Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理
         *
         * 'timestamp': 该呼叫事件发生时RTC业务平台的UNIX时间戳
         * 'userData': 用户附属信息
         * 'sessionId': 通话链路的标识ID
         * 'caller': 主叫号码
         * 'called': 被叫号码
         * 'partyType': 挂机的用户类型,仅在语音回呼场景携带
         * 'stateCode': 通话挂机的原因值
         * 'stateDesc': 通话挂机的原因值的描述
         */
        if (array_key_exists('sessionId', $statusInfo)) {
            print_r('sessionId: ' . $statusInfo['sessionId'] . PHP_EOL);
        }
        return;
    }
}
?>

“话单通知API”代码样例

<?php
/**
 * 话单通知
 * 客户平台收到RTC业务平台的话单通知的接口通知
 */
//话单通知样例
$jsonBody = json_encode([
    'eventType' => 'fee',
    'feeLst' => [
        [
            'direction' => 0, //通话的呼叫方向,以RTC业务平台为基准
            'spId' => 'CaaS_Test_01', //客户的云服务账号
            'appKey' => 'ka4kESI5s3YyurL1wpx63s9YnEm2', //应用的app_key
            'icid' => 'CAE-20190124110424-12019775', //呼叫记录的唯一标识
            'bindNum' => '+8675512345678', //发起此次呼叫的CallEnabler业务号码,即绑定号码
            'sessionId' => '1201_612_4294967295_20190124030424@callenabler245.huaweicaas.com', //通话链路的唯一标识
            'callerNum' => '+8613800000022', //主叫号码
            'calleeNum' => '+8613800000021', //被叫号码
            'fwdDisplayNum' => '+8613800000022', //转接呼叫时的显示号码(仅语音回呼场景携带)
            'fwdDstNum' => '+8613866887021', //转接呼叫时的转接号码(仅语音回呼场景携带)
            'fwdStartTime' => '2019-01-24 03:04:31', //转接呼叫操作的开始时间(仅语音回呼场景携带)
            'fwdAlertingTime' => '2019-01-24 03:04:36', //转接呼叫操作后的振铃时间(仅语音回呼场景携带)
            'fwdAnswerTime' => '2019-01-24 03:04:38', //转接呼叫操作后的应答时间(仅语音回呼场景携带)
            'callEndTime' => '2019-01-24 03:04:49', //呼叫结束时间
            'fwdUnaswRsn' => 0, //转接呼叫操作失败的Q850原因值
            'failTime' => '', //呼入,呼出的失败时间
            'ulFailReason' => 0, //通话失败的拆线点
            'sipStatusCode' => 0, //呼入,呼出的失败SIP状态码
            'callOutStartTime' => '2019-01-24 03:04:24', //Initcall的呼出开始时间
            'callOutAlertingTime' => '2019-01-24 03:04:27', //Initcall的呼出振铃时间
            'callOutAnswerTime' => '2019-01-24 03:04:31', //Initcall的呼出应答时间
            'callOutUnaswRsn' => 0, //Initcall的呼出失败的Q850原因值
            'dynIVRStartTime' => '', #自定义动态IVR开始时间(仅语音通知场景携带)
            'dynIVRPath' => '', //自定义动态IVR按键路径(仅语音通知场景携带)
            'recordFlag' => 0, //录音标识
            'recordStartTime' => '', //录音开始时间(仅语音回呼场景携带)
            'recordObjectName' => '', //录音文件名(仅语音回呼场景携带)
            'recordBucketName' => '', //录音文件所在的目录名(仅语音回呼场景携带)
            'recordDomain' => '', //存放录音文件的域名(仅语音回呼场景携带)
            'recordFileDownloadUrl' => '', //录音文件下载地址(仅语音回呼场景携带)
            'ttsPlayTimes' => 0, //应用TTS功能时,使用TTS的总次数
            'ttsTransDuration' => 0, //应用TTS功能时,TTS Server进行TTS转换的总时长(单位为秒)
            'serviceType' => '002', //携带呼叫的业务类型信息
            'hostName' => 'callenabler245.huaweicaas.com', //话单生成的服务器设备对应的主机名
            'userData' => '' //用户附属信息
        ]
    ]
]);
print_r($jsonBody . PHP_EOL);
onFeeEvent($jsonBody);//话单处理
/**
 * 话单通知
 * @desc 详细内容以接口文档为准
 * @param jsonBody
 */
function onFeeEvent($jsonBody) {
    $jsonArr = json_decode($jsonBody, true); //将通知消息解析为关联数组
    $eventType = $jsonArr['eventType']; //通知事件类型

    if (strcasecmp($eventType, 'fee') != 0) {
        print_r('EventType error: ' . $eventType);
        return;
    }

    if (!array_key_exists('feeLst', $jsonArr)) {
        print_r('param error: no feeLst.');
        return;
    }

    $feeLst = $jsonArr['feeLst']; //呼叫话单事件信息

    //Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理
    //短时间内有多个通话结束时RTC业务平台会将话单合并推送,每条消息最多携带50个话单
    if (sizeof($feeLst) > 1) {
        foreach ($feeLst as $loop){
            if (array_key_exists('sessionId', $loop)) {
                print_r('sessionId: ' . $loop['sessionId'] . PHP_EOL);
            }
        }
    } else if(sizeof($feeLst) == 1) {
        if (array_key_exists('sessionId', $feeLst[0])) {
            print_r('sessionId: ' . $feeLst[0]['sessionId'] . PHP_EOL);
        }
    } else {
        print_r('feeLst error: no element.');
    }
}
?>

相关文档