3.2 PHP 代码样例
3.2.4 AXYB 模式
//短时间内有多个通话结束时隐私保护通话平台会将话单合并推送,每条消息最多携带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.');
} }?>
3.2.4 AXYB 模式
样例
AXYB模式绑定接口
AXYB模式解绑接口
AXYB模式绑定信息查询接口
获取录音文件下载地址接口 呼叫事件通知接口话单通知接口
环境要求 基于PHP 7.2.9版本,要求PHP 5.6及以上版本。
须知
● 本文档所述Demo在提供服务的过程中,可能会涉及个人数据的使用,建议您遵从 国家的相关法律采取足够的措施,以确保用户的个人数据受到充分的保护。
● 本文档所述Demo仅用于功能演示,不允许客户直接进行商业使用。
● 本文档信息仅供参考,不构成任何要约或承诺。
● 本文档接口携带参数只是用作参考,不可以直接复制使用,填写参数需要替换为实 际值,请参考“开发准备”获取所需数据。
AXYB 模式绑定接口
<?php
// 必填,请参考"开发准备"获取如下数据,替换为实际值
$realUrl = 'https://rtcpns.cn-north-1.myhuaweicloud.com/rest/omp/xyrelationnumber/v1.0'; // APP接入地址 +接口访问URI
$APP_KEY = 'a1****'; // APP_Key
$APP_SECRET = 'cfc8************'; // APP_Secret
$origNum_A = '+86186****5678'; //用户号码A
$origNum_B = '+86186****5679'; //用户号码B /* * 选填,各参数要求请参考"AXYB模式绑定接口"
*/$areaCode = '0755'; //区号,标示小号归属的区域 //$areaMatchMode = '0'; // 号码筛选方式
$subscriptionId = '********'; // 绑定关系ID //$callDirection = 0; // 允许的呼叫方向
//$duration = 7200; // 绑定关系保持时间(单位为秒) //$recordFlag = true; // 录音标识
//$recordHintTone = 'recordHintTone.wav'; // 录音提示音
//$preVoiceX = 'x_hint_tone1.wav'; // 设置对X号码播放的个性化通话前等待音 //$preVoiceY = 'y_hint_tone1.wav'; // 设置对Y号码播放的个性化通话前等待音 // 请求Headers
$headers = [
'Accept: application/json',
'Content-Type: application/json;charset=UTF-8',
'Authorization: WSSE realm="SDP",profile="UsernameToken",type="Appkey"', 'X-WSSE: ' . buildWsseHeader($APP_KEY, $APP_SECRET)
];// 请求URL参数
$data = http_build_query([
'app_key' => $APP_KEY ]);// 完整请求地址
$fullUrl = $realUrl . '?' . $data;
// 先绑定AX,获取subscriptionId
$data = json_encode([
'origNum' => $origNum_A, 'areaCode' => $areaCode,
// 'areaMatchMode' => $areaMatchMode, // 'callDirection' => $callDirection, // 'duration' => $duration, // 'recordFlag' => $recordFlag,
// 'recordHintTone' => $recordHintTone, // 'preVoiceX' => $preVoiceX,
]);// 再携带subscriptionId,绑定YB,确认AXYB // $data = json_encode([
// 'origNum' => $origNum_B, // // 'areaCode' => $areaCode,
// // 'areaMatchMode' => $areaMatchMode, // 'subscriptionId' => $subscriptionId, // // 'preVoiceY' => $preVoiceY, // ]);
$context_options = [ 'http' => [
'method' => 'POST', // 请求方法为POST 'header' => $headers,
'content' => $data,
'ignore_errors' => true // 获取错误码,方便调测 ],
'ssl' => [
'verify_peer' => false, 'verify_peer_name' => false
] // 为防止因HTTPS证书认证失败造成API调用失败,需要先忽略证书信任问题 ];
try {
$file=fopen('bind_data.txt', 'a'); //打开文件 print_r($data . PHP_EOL); // 打印请求数据
fwrite($file, '绑定请求数据:' . $data . PHP_EOL); //绑定请求参数记录到本地文件,方便定位问题 $response = file_get_contents($fullUrl, false, stream_context_create($context_options)); // 发送请求 print_r($response . PHP_EOL); // 打印响应结果
fwrite($file, '绑定结果:' . $response . PHP_EOL); //绑定ID很重要,请记录到本地文件 } catch (Exception $e) {
echo $e->getMessage();
} finally {
fclose($file); //关闭文件 }
/** * 构建X-WSSE值
* * @param string $appKey * @param string $appSecret * @return string
*/function buildWsseHeader($appKey, $appSecret) { date_default_timezone_set("UTC");
$Created = date('Y-m-d\TH:i:s\Z'); //Created $nonce = uniqid(); //Nonce
$base64 = base64_encode(hash('sha256', ($nonce . $Created . $appSecret), TRUE)); //PasswordDigest return sprintf("UsernameToken Username=\"%s\",PasswordDigest=\"%s\",Nonce=\"%s\",Created=\"%s
\"", $appKey, $base64, $nonce, $Created);
}?>
AXYB 模式解绑接口
<?php
// 必填,请参考"开发准备"获取如下数据,替换为实际值
$realUrl = 'https://rtcpns.cn-north-1.myhuaweicloud.com/rest/omp/xyrelationnumber/v1.0'; // APP接入地址 +接口访问URI
$APP_KEY = 'a1****'; // APP_Key
$APP_SECRET = 'cfc8************'; // APP_Secret /* * 必填,参数要求请参考"AXYB模式解绑接口"
*/$subscriptionId = '********'; // 指定"AXYB模式绑定接口"返回的绑定ID进行解绑
// 请求Headers
$headers = [
'Accept: application/json',
'Content-Type: application/json;charset=UTF-8',
'Authorization: WSSE realm="SDP",profile="UsernameToken",type="Appkey"', 'X-WSSE: ' . buildWsseHeader($APP_KEY, $APP_SECRET)
];// 请求URL参数
$data = http_build_query([
'subscriptionId' => $subscriptionId, 'app_key' => $APP_KEY
]);// 完整请求地址
$fullUrl = $realUrl . '?' . $data;
$context_options = [ 'http' => [
'method' => 'DELETE', // 请求方法为DELETE 'header' => $headers,
'ignore_errors' => true // 获取错误码,方便调测 ],
'ssl' => [
'verify_peer' => false, 'verify_peer_name' => false
] // 为防止因HTTPS证书认证失败造成API调用失败,需要先忽略证书信任问题 ];
try {
print_r($data . PHP_EOL); // 打印请求数据
$response = file_get_contents($fullUrl, false, stream_context_create($context_options)); // 发送请求 print_r($response . PHP_EOL); // 打印响应结果
} catch (Exception $e) { echo $e->getMessage();
}
/** * 构建X-WSSE值 *
* @param string $appKey * @param string $appSecret * @return string
*/function buildWsseHeader($appKey, $appSecret) { date_default_timezone_set("UTC");
$Created = date('Y-m-d\TH:i:s\Z'); //Created $nonce = uniqid(); //Nonce
$base64 = base64_encode(hash('sha256', ($nonce . $Created . $appSecret), TRUE)); //PasswordDigest return sprintf("UsernameToken Username=\"%s\",PasswordDigest=\"%s\",Nonce=\"%s\",Created=\"%s
\"", $appKey, $base64, $nonce, $Created);
}?>
AXYB 模式绑定信息查询接口
<?php
// 必填,请参考"开发准备"获取如下数据,替换为实际值
$realUrl = 'https://rtcpns.cn-north-1.myhuaweicloud.com/rest/omp/xyrelationnumber/v1.0'; // APP接入地址 +接口访问URI
$APP_KEY = 'a1****'; // APP_Key
$APP_SECRET = 'cfc8************'; // APP_Secret /* * 选填,各参数要求请参考"AXYB模式绑定信息查询接口"
* subscriptionId和relationNum为二选一关系,两者都携带时以subscriptionId为准 */$relationNum = '+8675528****01+86138****0022'; // 指定X号码进行查询
$subscriptionId = '********'; // 指定"AXYB模式绑定接口"返回的绑定ID进行查询 // 请求Headers
$headers = [
'Accept: application/json',
'Content-Type: application/json;charset=UTF-8',
'Authorization: WSSE realm="SDP",profile="UsernameToken",type="Appkey"', 'X-WSSE: ' . buildWsseHeader($APP_KEY, $APP_SECRET)
];// 请求URL参数
$data = http_build_query([
'relationNum' => $relationNum, 'subscriptionId' => $subscriptionId, 'app_key' => $APP_KEY
]);// 完整请求地址
$fullUrl = $realUrl . '?' . $data;
$context_options = [ 'http' => [
'method' => 'GET', // 请求方法为GET 'header' => $headers,
'ignore_errors' => true // 获取错误码,方便调测 ],
'ssl' => [
'verify_peer' => false, 'verify_peer_name' => false
] // 为防止因HTTPS证书认证失败造成API调用失败,需要先忽略证书信任问题 ];
try {
$file=fopen('bind_data.txt', 'a'); //打开文件
$response = file_get_contents($fullUrl, false, stream_context_create($context_options)); // 发送请求 print_r($response . PHP_EOL); // 打印响应结果
fwrite($file, '绑定查询结果:' . $response . PHP_EOL); //查询结果,记录到本地文件 } catch (Exception $e) {
echo $e->getMessage();
} finally {
fclose($file); //关闭文件
}
/** * 构建X-WSSE值
* * @param string $appKey * @param string $appSecret * @return string
*/function buildWsseHeader($appKey, $appSecret) { date_default_timezone_set("UTC");
$Created = date('Y-m-d\TH:i:s\Z'); //Created $nonce = uniqid(); //Nonce
$base64 = base64_encode(hash('sha256', ($nonce . $Created . $appSecret), TRUE)); //PasswordDigest return sprintf("UsernameToken Username=\"%s\",PasswordDigest=\"%s\",Nonce=\"%s\",Created=\"%s
\"", $appKey, $base64, $nonce, $Created);
}?>
获取录音文件下载地址接口
<?php
// 必填,请参考"开发准备"获取如下数据,替换为实际值
$realUrl = 'https://rtcpns.cn-north-1.myhuaweicloud.com/rest/provision/voice/record/v1.0'; // APP接入地址 +接口访问URI
$APP_KEY = 'a1****'; // APP_Key
$APP_SECRET = 'cfc8************'; // APP_Secret // 必填,通过"话单通知接口"获取
$recordDomain = '****.com';
$fileName = '****.wav';
// 请求Headers
$headers = [
'Accept: application/json',
'Content-Type: application/json;charset=UTF-8',
'Authorization: WSSE realm="SDP",profile="UsernameToken",type="Appkey"', 'X-WSSE: ' . buildWsseHeader($APP_KEY, $APP_SECRET)
];// 请求URL参数
$data = http_build_query([
'recordDomain' => $recordDomain, 'fileName' => $fileName
]);// 完整请求地址
$fullUrl = $realUrl . '?' . $data;
$context_options = [ 'http' => [
'method' => 'GET', // 请求方法为GET 'header' => $headers,
'max_redirects' => '0', // 关闭重定向
'ignore_errors' => true // 获取错误码,方便调测
],// 为防止因代码工具重定向导致获取内容乱码,需要关闭重定向.若PHP是7.1.0及以上版本,若不需要可注释掉 'ssl' => [
'verify_peer' => false, 'verify_peer_name' => false
] // 为防止因HTTPS证书认证失败造成API调用失败,需要先忽略证书信任问题
];//若PHP版本介于5.1.3和7.1.0之间,请使用如下代码.若PHP是7.1.0及以上版本,请注释掉如下代码
// stream_context_set_default([
// 'ssl' => [
// 'verify_peer' => false, // 'verify_peer_name' => false // ]
// ]);
try {
$file=fopen('bind_data.txt', 'a'); //打开文件
//若PHP版本介于5.1.3和7.1.0之间,请使用如下代码获取响应消息头域信息 //$http_response_header = get_headers($fullUrl, 1); //获取响应消息头域信息 //若PHP是7.1.0及以上版本,请使用如下代码获取响应消息头域信息
$http_response_header = get_headers($fullUrl, 1, stream_context_create($context_options)); //获取响应消 息头域信息
if(strpos($http_response_header[0], '301') !== false){
foreach ($http_response_header as $loop){
if(strpos($loop, "Location") !== false){
$fileUrl = trim(substr($loop, 10));
print_r($fileUrl); //获取录音文件下载地址
fwrite($file, '获取录音文件下载地址:' . $fileUrl . PHP_EOL); //查询结果,记录到本地文件 }
} }else{
print_r($http_response_header[0] . PHP_EOL); //打印响应码400/401/403/500
// $response = file_get_contents($fullUrl, false, stream_context_create($context_options)); //获取响应消 息数据信息
// print_r($response . PHP_EOL); // 打印响应结果 }
} catch (Exception $e) { echo $e->getMessage();
} finally {
fclose($file); //关闭文件 }
/** * 构建X-WSSE值
* * @param string $appKey * @param string $appSecret * @return string
*/function buildWsseHeader($appKey, $appSecret) { date_default_timezone_set("UTC");
$Created = date('Y-m-d\TH:i:s\Z'); //Created $nonce = uniqid(); //Nonce
$base64 = base64_encode(hash('sha256', ($nonce . $Created . $appSecret), TRUE)); //PasswordDigest return sprintf("UsernameToken Username=\"%s\",PasswordDigest=\"%s\",Nonce=\"%s\",Created=\"%s
\"", $appKey, $base64, $nonce, $Created);
}?>
呼叫事件通知接口
<?php
/** * 呼叫事件通知
* 客户平台收到隐私保护通话平台的呼叫事件通知的接口通知 */
//呼叫事件通知样例
$jsonBody = json_encode([
'eventType' => 'disconnect', 'statusInfo' => [
'sessionId' => '1200_1827_4294967295_20190124023003@callenabler246.huaweicaas.com', 'timestamp' => '2019-01-24 02:30:22',
'caller' => '+86138****0022', 'called' => '+86138****7021', 'stateCode' => 0,
'stateDesc' => 'The user releases the call.', 'subscriptionId' => '****'
] ]);
print_r($jsonBody . PHP_EOL);
//呼叫事件处理
onCallEvent($jsonBody);
/** * 呼叫事件通知
* @desc 详细内容以接口文档为准 * @param jsonArr
*/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); //打印通知事件类型 //callin:呼入事件
if (strcasecmp($eventType, 'callin') == 0) { /**
* Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 *
* 'timestamp': 呼叫事件发生时隐私保护通话平台的UNIX时间戳 * 'sessionId': 通话链路的标识ID
* 'caller': 主叫号码 * 'called': 被叫号码
* 'subscriptionId': 绑定关系ID */
if (array_key_exists('sessionId', $statusInfo)) {
print_r('sessionId: ' . $statusInfo['sessionId'] . PHP_EOL);
} return;
}
//callout:呼出事件
if (strcasecmp($eventType, 'callout') == 0) { /**
* Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 *
* 'timestamp': 呼叫事件发生时隐私保护通话平台的UNIX时间戳 * 'sessionId': 通话链路的标识ID
* 'caller': 主叫号码 * 'called': 被叫号码
* 'subscriptionId': 绑定关系ID */
if (array_key_exists('sessionId', $statusInfo)) {
print_r('sessionId: ' . $statusInfo['sessionId'] . PHP_EOL);
} return;
}
//alerting:振铃事件
if (strcasecmp($eventType, 'alerting') == 0) { /**
* Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 *
* 'timestamp': 呼叫事件发生时隐私保护通话平台的UNIX时间戳 * 'sessionId': 通话链路的标识ID
* 'caller': 主叫号码 * 'called': 被叫号码
* 'subscriptionId': 绑定关系ID */
if (array_key_exists('sessionId', $statusInfo)) {
print_r('sessionId: ' . $statusInfo['sessionId'] . PHP_EOL);
} return;
}
//answer:应答事件
if (strcasecmp($eventType, 'answer') == 0) { /**
* Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 *
* 'timestamp': 呼叫事件发生时隐私保护通话平台的UNIX时间戳 * 'sessionId': 通话链路的标识ID
* 'caller': 主叫号码 * 'called': 被叫号码
* 'subscriptionId': 绑定关系ID */
if (array_key_exists('sessionId', $statusInfo)) {
print_r('sessionId: ' . $statusInfo['sessionId'] . PHP_EOL);
} return;
}
//disconnect:挂机事件
if (strcasecmp($eventType, 'disconnect') == 0) { /**
* Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 *
* 'timestamp': 呼叫事件发生时隐私保护通话平台的UNIX时间戳 * 'sessionId': 通话链路的标识ID
* 'caller': 主叫号码 * 'called': 被叫号码
* 'stateCode': 通话挂机的原因值 * 'stateDesc': 通话挂机的原因值的描述 * 'subscriptionId': 绑定关系ID */
if (array_key_exists('sessionId', $statusInfo)) {
print_r('sessionId: ' . $statusInfo['sessionId'] . PHP_EOL);
} return;
} }?>
话单通知接口
<?php /** * 话单通知
* 客户平台收到隐私保护通话平台的话单通知的接口通知 */
//话单通知样例
$jsonBody = json_encode([
'eventType' => 'fee', 'feeLst' => [ [
'direction' => 1, 'spId' => '********', 'appKey' => '********',
'icid' => 'ba171f34e6953fcd751edc77127748f4.3757285803.338666679.5', 'bindNum' => '+86138****0022',
'sessionId' => '1200_1827_4294967295_20190124023003@callenabler246.huaweicaas.com', 'subscriptionId' => '********',
'callerNum' => '+86138****0021', 'calleeNum' => '+86138****0022', 'fwdDisplayNum' => '+86138****0022', 'fwdDstNum' => '+86138****7021', 'callInTime' => '2019-01-24 02:30:03', 'fwdStartTime' => '2019-01-24 02:30:03', 'fwdAlertingTime' => '2019-01-24 02:30:04', 'fwdAnswerTime' => '2019-01-24 02:30:06', 'callEndTime' => '2019-01-24 02:30:22',
'fwdUnaswRsn' => 0, 'ulFailReason' => 0, 'sipStatusCode' => 0, 'callOutUnaswRsn' => 0, 'recordFlag' => 1,
'recordStartTime' => '2019-01-24 02:30:06', 'recordDomain' => '****.com',
'recordBucketName' => '********', 'recordObjectName' => '****.wav', 'ttsPlayTimes' => 0,
'ttsTransDuration' => 0, 'mptyId' => '****', 'serviceType' => '003',
'hostName' => 'callenabler246.huaweicaas.com' ]
] ]);
print_r($jsonBody . PHP_EOL);
//话单处理
onFeeEvent($jsonBody);
/** * 话单通知
* @desc 详细内容以接口文档为准 * @param jsonArr
*/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']; //呼叫话单事件信息
print_r('eventType: ' . $eventType . PHP_EOL); //打印通知事件类型 /**
* Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 *
* 'direction': 通话的呼叫方向 * 'spId': 客户的云服务账号 * 'appKey': 商户应用的AppKey * 'icid': 呼叫记录的唯一标识 * 'bindNum': 隐私保护号码 * 'sessionId': 通话链路的唯一标识 * 'callerNum': 主叫号码
* 'calleeNum': 被叫号码
* 'fwdDisplayNum': 转接呼叫时的显示号码 * 'fwdDstNum': 转接呼叫时的转接号码 * 'callInTime': 呼入的开始时间
* 'fwdStartTime': 转接呼叫操作的开始时间 * 'fwdAlertingTime': 转接呼叫操作后的振铃时间 * 'fwdAnswerTime': 转接呼叫操作后的应答时间 * 'callEndTime': 呼叫结束时间
* 'fwdUnaswRsn': 转接呼叫操作失败的Q850原因值 * 'failTime': 呼入,呼出的失败时间
* 'ulFailReason': 通话失败的拆线点
* 'sipStatusCode': 呼入,呼出的失败SIP状态码 * 'recordFlag': 录音标识
* 'recordStartTime': 录音开始时间 * 'recordObjectName': 录音文件名
* 'recordBucketName': 录音文件所在的目录名 * 'recordDomain': 存放录音文件的域名 * 'serviceType': 携带呼叫的业务类型信息
* 'hostName': 话单生成的服务器设备对应的主机名 * 'subscriptionId': 绑定关系ID
*/
//短时间内有多个通话结束时隐私保护通话平台会将话单合并推送,每条消息最多携带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.');
} }?>