
# AXB模式
|    样例    | [AXB模式绑定接口] [AXB模式解绑接口] [AXB模式绑定信息修改接口] [AXB模式绑定信息查询接口] [获取录音文件下载地址接口] [呼叫事件通知接口] [话单通知接口] [短信通知接口] |
|---|---|
| **环境要求** | 基于PHP 7.2.9版本，要求PHP 5.6及以上版本。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
   
![](https://support.huaweicloud.com/devg-PrivateNumber/public_sys-resources/notice_3.0-zh-cn.png)
- 本文档所述Demo在提供服务的过程中，可能会涉及个人数据的使用，建议您遵从国家的相关法律采取足够的措施，以确保用户的个人数据受到充分的保护。
- 本文档所述Demo仅用于功能演示，不允许客户直接进行商业使用。
- 本文档信息仅供参考，不构成任何要约或承诺。
- 本文档接口携带参数只是用作参考，不可以直接复制使用，填写参数需要替换为实际值，请参考"[开发准备](https://support.huaweicloud.com/devg-PrivateNumber/privatenumber_01_0005.html)"获取所需数据。
 
 #### AXB模式绑定接口
```
<?php
// 必填,请参考"开发准备"获取如下数据,替换为实际值
$realUrl = 'https://rtcpns.cn-north-1.myhuaweicloud.com/rest/caas/relationnumber/partners/v1.0'; // APP接入地址+接口访问URI
$APP_KEY = 'a1********'; // APP_Key
$APP_SECRET = 'cfc8****************'; // APP_Secret
$relationNum = '+86180****0001'; // X号码(隐私号码)
$callerNum = '+86186****5678'; // A号码
$calleeNum = '+86186****5679'; // B号码
/*
 * 选填,各参数要求请参考"AXB模式绑定接口"
 */
// $areaCode = '0755'; // 需要绑定的X号码对应的城市码
// $callDirection = 0; // 允许呼叫的方向
// $duration = 86400; // 绑定关系保持时间,单位为秒。到期后会被系统自动解除绑定关系
// $recordFlag = 'false'; // 是否需要针对该绑定关系产生的所有通话录音
// $recordHintTone = 'recordHintTone.wav'; // 设置录音提示音
// $maxDuration = 60; // 设置允许单次通话进行的最长时间,单位为分钟。通话时间从接通被叫的时刻开始计算
// $privateSms = 'true'; // 设置该绑定关系是否支持短信功能
// $callerHintTone = 'callerHintTone.wav'; // 设置A拨打X号码时的通话前等待音
// $calleeHintTone = 'calleeHintTone.wav'; // 设置B拨打X号码时的通话前等待音
// $preVoice = [
//     'callerHintTone' => $callerHintTone,
//     'calleeHintTone' => $calleeHintTone
// ];
// 请求Headers
$headers = [
    'Accept: application/json',
    'Content-Type: application/json;charset=UTF-8',
    'Authorization: AKSK realm="SDP",profile="UsernameToken",type="Appkey"',
    'X-AKSK: ' . buildAKSKHeader($APP_KEY, $APP_SECRET)
];
// 请求Body,可按需删除选填参数
$data = json_encode([
    'relationNum' => $relationNum,
    // 'areaCode' => $areaCode,
    'callerNum' => $callerNum,
    'calleeNum' => $calleeNum,
    // 'callDirection' => $callDirection,
    // 'duration' => $duration,
    // 'recordFlag' => $recordFlag,
    // 'recordHintTone' => $recordHintTone,
    // 'maxDuration' => $maxDuration,
    // 'privateSms' => $privateSms,
    // 'preVoice' => $preVoice
]);
$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($realUrl, 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); //关闭文件
}
/**
 * buildAKSKHeader
 * @param string $appKey
 * @param string $appSecret
 * @return string
 */
function buildAKSKHeader($appKey, $appSecret) {
    date_default_timezone_set("UTC");
    $Created = date('Y-m-d\TH:i:s\Z'); //Created
    $nonce = uniqid(); //Nonce
    $base64 = base64_encode(hash_hmac('sha256', ($nonce . $Created), $appSecret, TRUE)); //PasswordDigest
    return sprintf("UsernameToken Username=\"%s\",PasswordDigest=\"%s\",Nonce=\"%s\",Created=\"%s\"", $appKey, $base64, $nonce, $Created);
}
?>
```
 #### AXB模式解绑接口
```
<?php
// 必填,请参考"开发准备"获取如下数据,替换为实际值
$realUrl = 'https://rtcpns.cn-north-1.myhuaweicloud.com/rest/caas/relationnumber/partners/v1.0'; // APP接入地址+接口访问URI
$APP_KEY = 'a1********'; // APP_Key
$APP_SECRET = 'cfc8****************'; // APP_Secret
/*
 * 选填,各参数要求请参考"AXB模式解绑接口"
 * subscriptionId和relationNum为二选一关系,两者都携带时以subscriptionId为准
 */
$subscriptionId = '********';
$relationNum = '+86180****0001';
// 请求Headers
$headers = [
    'Accept: application/json',
    'Content-Type: application/json;charset=UTF-8',
    'Authorization: AKSK realm="SDP",profile="UsernameToken",type="Appkey"',
    'X-AKSK: ' . buildAKSKHeader($APP_KEY, $APP_SECRET)
];
// 请求URL参数
$data = http_build_query([
    'subscriptionId' => $subscriptionId,
    'relationNum' => $relationNum
]);
// 完整请求地址
$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();
}
/**
 * buildAKSKHeader
 * @param string $appKey
 * @param string $appSecret
 * @return string
 */
function buildAKSKHeader($appKey, $appSecret) {
    date_default_timezone_set("UTC");
    $Created = date('Y-m-d\TH:i:s\Z'); //Created
    $nonce = uniqid(); //Nonce
    $base64 = base64_encode(hash_hmac('sha256', ($nonce . $Created), $appSecret, TRUE)); //PasswordDigest
    return sprintf("UsernameToken Username=\"%s\",PasswordDigest=\"%s\",Nonce=\"%s\",Created=\"%s\"", $appKey, $base64, $nonce, $Created);
}
?>
```
 #### AXB模式绑定信息修改接口
```
<?php
// 必填,请参考"开发准备"获取如下数据,替换为实际值
$realUrl = 'https://rtcpns.cn-north-1.myhuaweicloud.com/rest/caas/relationnumber/partners/v1.0'; // APP接入地址+接口访问URI
$APP_KEY = 'a1********'; // APP_Key
$APP_SECRET = 'cfc8****************'; // APP_Secret
$subscriptionId = '****'; // 必填,指定"AXB模式绑定接口"返回的绑定ID进行修改
/*
 * 选填,各参数要求请参考"AXB模式绑定信息修改接口"
 */
$callerNum = '+86186****5678'; // A号码
$calleeNum = '+86186****5679'; // B号码
// $callDirection = 0; //允许呼叫的方向
// $duration = 86400; //绑定关系保持时间,单位为秒。到期后会被系统自动解除绑定关系
// $maxDuration = 60; //设置允许单次通话进行的最长时间,单位为分钟。通话时间从接通被叫的时刻开始计算
// $privateSms = 'true'; //设置该绑定关系是否支持短信功能
// $callerHintTone = 'callerHintTone.wav'; // 设置A拨打X号码时的通话前等待音
// $calleeHintTone = 'calleeHintTone.wav'; // 设置B拨打X号码时的通话前等待音
// $preVoice = [
//     'callerHintTone' => $callerHintTone,
//     'calleeHintTone' => $calleeHintTone
// ];
// 请求Headers
$headers = [
    'Accept: application/json',
    'Content-Type: application/json;charset=UTF-8',
    'Authorization: AKSK realm="SDP",profile="UsernameToken",type="Appkey"',
    'X-AKSK: ' . buildAKSKHeader($APP_KEY, $APP_SECRET)
];
// 请求Body,可按需删除选填参数
$data = json_encode([
    'subscriptionId' => $subscriptionId,
    'callerNum' => $callerNum,
    'calleeNum' => $calleeNum,
    // 'callDirection' => $callDirection,
    // 'duration' => $duration,
    // 'maxDuration' => $maxDuration,
 
    // 'privateSms' => $privateSms,
    // 'preVoice' => $preVoice
]);
$context_options = [
    'http' => [
        'method' => 'PUT', // 请求方法为PUT
        'header' => $headers,
        'content' => $data,
        'ignore_errors' => true // 获取错误码,方便调测
    ],
    'ssl' => [
        'verify_peer' => false,
        'verify_peer_name' => false
    ] // 为防止因HTTPS证书认证失败造成API调用失败,需要先忽略证书信任问题
];
try {
    print_r($data . PHP_EOL); // 打印请求数据
    $response = file_get_contents($realUrl, false, stream_context_create($context_options)); // 发送请求
    print_r($response . PHP_EOL); // 打印响应结果
} catch (Exception $e) {
    echo $e->getMessage();
}
/**
 * buildAKSKHeader
 * @param string $appKey
 * @param string $appSecret
 * @return string
 */
function buildAKSKHeader($appKey, $appSecret) {
    date_default_timezone_set("UTC");
    $Created = date('Y-m-d\TH:i:s\Z'); //Created
    $nonce = uniqid(); //Nonce
    $base64 = base64_encode(hash_hmac('sha256', ($nonce . $Created), $appSecret, TRUE)); //PasswordDigest
    return sprintf("UsernameToken Username=\"%s\",PasswordDigest=\"%s\",Nonce=\"%s\",Created=\"%s\"", $appKey, $base64, $nonce, $Created);
}
?>
```
 #### AXB模式绑定信息查询接口
```
<?php
// 必填,请参考"开发准备"获取如下数据,替换为实际值
$realUrl = 'https://rtcpns.cn-north-1.myhuaweicloud.com/rest/caas/relationnumber/partners/v1.0'; // APP接入地址+接口访问URI
$APP_KEY = 'a1********'; // APP_Key
$APP_SECRET = 'cfc8****************'; // APP_Secret
/*
 * 选填,各参数要求请参考"AXB模式绑定信息查询接口"
 * subscriptionId和relationNum为二选一关系,两者都携带时以subscriptionId为准
 */
$subscriptionId = '********'; // 指定"AXB模式绑定接口"返回的绑定ID进行查询
$relationNum = '+86180****0001'; // 指定X号码(隐私号码)进行查询
// $pageIndex = 1; //查询的分页索引,从1开始编号
// $pageSize = 20; //查询的分页大小,即每次查询返回多少条数据
// 请求Headers
$headers = [
    'Accept: application/json',
    'Content-Type: application/json;charset=UTF-8',
    'Authorization: AKSK realm="SDP",profile="UsernameToken",type="Appkey"',
    'X-AKSK: ' . buildAKSKHeader($APP_KEY, $APP_SECRET)
];
// 请求URL参数
$data = http_build_query([
    'subscriptionId' => $subscriptionId,
    'relationNum' => $relationNum
    // 'pageIndex' => $pageIndex,
    // 'pageSize' => $pageSize
]);
// 完整请求地址
$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); //关闭文件
}
/**
 * buildAKSKHeader
 * @param string $appKey
 * @param string $appSecret
 * @return string
 */
function buildAKSKHeader($appKey, $appSecret) {
    date_default_timezone_set("UTC");
    $Created = date('Y-m-d\TH:i:s\Z'); //Created
    $nonce = uniqid(); //Nonce
    $base64 = base64_encode(hash_hmac('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: AKSK realm="SDP",profile="UsernameToken",type="Appkey"',
    'X-AKSK: ' . buildAKSKHeader($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); //关闭文件
}
/**
 * buildAKSKHeader
 * @param string $appKey
 * @param string $appSecret
 * @return string
 */
function buildAKSKHeader($appKey, $appSecret) {
    date_default_timezone_set("UTC");
    $Created = date('Y-m-d\TH:i:s\Z'); //Created
    $nonce = uniqid(); //Nonce
    $base64 = base64_encode(hash_hmac('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_1029_4294967295_20190123091514@callenabler246.huaweicaas.com',
        'timestamp' => '2019-01-23 09:16:41',
        'caller' => '+86138****0021',
        '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.3757223714.337238282.9',
            'bindNum' => '+86138****0022',
            'sessionId' => '1200_1029_4294967295_20190123091514@callenabler246.huaweicaas.com',
            'subscriptionId' => '********',
            'callerNum' => '+86138****0021',
            'calleeNum' => '+86138****0022',
            'fwdDisplayNum' => '+86138****0022',
            'fwdDstNum' => '+86138****7021',
            'callInTime' => '2019-01-23 09:15:14',
            'fwdStartTime' => '2019-01-23 09:15:15',
            'fwdAlertingTime' => '2019-01-23 09:15:21',
            'fwdAnswerTime' => '2019-01-23 09:15:36',
            'callEndTime' => '2019-01-23 09:16:41',
            'fwdUnaswRsn' => 0,
            'ulFailReason' => 0,
            'sipStatusCode' => 0,
            'callOutUnaswRsn' => 0,
            'recordFlag' => 1,
            'recordStartTime' => '2019-01-23 09:15:37',
            'recordDomain' => '****.com',
            'recordBucketName' => '****',
            'recordObjectName' => '****.wav',
            'ttsPlayTimes' => 0,
            'ttsTransDuration' => 0,
            'mptyId' => '****',
            'serviceType' => '004',
            '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.');
    }
}
?>
```
 #### 短信通知接口
```
<?php
/**
 * 短信通知
 * 客户平台收到隐私保护通话平台的短信通知的接口通知
 */
//短信通知样例
$jsonBody = json_encode([
    'appKey' => '********',
    'smsEvent' => [
        'smsIdentifier' => '********',
        'notificationMode' => 'Block',
        'calling' => '+86138****0001',
        'virtualNumber' => '+86138****0000',
        'event' => 'TextSMS',
        'timeStamp' => '2018-09-13T09:46:16.023Z'
    ]
]);
print_r($jsonBody . PHP_EOL);
/*
 * 短信通知处理
 */
onSmsEvent($jsonBody);
/**
 * 短信通知
 * @desc 详细内容以接口文档为准
 * @param jsonBody
 */
function onSmsEvent($jsonBody) {
    //将通知消息解析为关联数组
    $jsonArr = json_decode($jsonBody, true);
    if (!array_key_exists('smsEvent', $jsonArr)) {
        print_r('param error: no smsEvent.');
        return;
    }
    //print_r($jsonArr['appKey'] . PHP_EOL); //商户应用的AppKey
    $smsEvent = $jsonArr['smsEvent']; //短信通知信息
    /**
     * Example: 此处以解析notificationMode为例,请按需解析所需参数并自行实现相关处理
     *
     * 'smsIdentifier': 短信唯一标识
     * 'notificationMode': 通知模式
     * 'calling': 真实发送方号码
     * 'called': 真实接收方号码
     * 'virtualNumber': 隐私号码(X号码)
     * 'event': 短信状态事件
     * 'timeStamp': 短信事件发生的系统时间戳,UTC时间
     * 'subscriptionId': 绑定ID
     * 'smsContent': 用户发送的短信内容
     */
    if (array_key_exists('notificationMode', $smsEvent)) {
        if (strcasecmp($smsEvent['notificationMode'], 'Block') == 0) {
            //收到隐私保护通话平台的短信通知,若为Block模式,请参考接口文档回消息指示下一步操作
            $actions = [
                'operation' => 'vNumberRoute', //操作类型:转发短信/丢弃短信
                'message' => [
                    'called' => '+86138****7022', //真实接收方号码
                    'calling' => '+86138****7021' //真实发送方号码
                ]
            ];
            $resp = json_encode(['actions' => [$actions]]); //Block模式响应消息
            print_r($resp . PHP_EOL);
        } elseif (strcasecmp($smsEvent['notificationMode'], 'Notify') == 0) {
            //收到隐私保护通话平台的短信通知,若为Notify模式,请回HTTP状态码为200的空消息
            //http_response_code(200);
            print_r('This is AXB sms Notify mode.');
        } else {
            print_r('notificationMode param error.');
        }
    }
}
?>
```
