更新时间:2025-08-11 GMT+08:00
代码样例
“语音通知场景API”代码样例
voiceNotify.js
/*jshint esversion: 6 */
var https = require('https');
var data = require('./data.js');
var util = require('./reqUtil.js');
/**
* voiceNotifyAPI
* @param displayNbr
* @param calleeNbr
* @param playInfoList
* @returns
*/
function voiceNotifyAPI(displayNbr, calleeNbr, playInfoList) {
if(displayNbr === undefined || displayNbr === null || calleeNbr === undefined || calleeNbr === null) {
return;
}
if(playInfoList === undefined || playInfoList === null) {
return;
}
var method = 'POST';
var uri = '/rest/httpsessions/callnotify/v2.0'; //v1.0 or v2.0
var xaksk = util.buildAKSKHeader(data.data.callnotify_appid, data.data.callnotify_secret);
var options = util.createOptions(method, uri, null, xaksk);
var body = {
/* 必填参数 */
'displayNbr': displayNbr,//主叫用户手机终端的来电显示号码。
'calleeNbr': calleeNbr,//被叫用户终端的来电显示号码。
'playInfoList': playInfoList//播放信息列表,最大支持5个,每个播放信息携带的参数都可以不相同。
/* 选填参数 */
// 'bindNbr': '+86123456789', //CallEnabler业务号码,即绑定号码
// 'statusUrl': 'aHR0cDovLzIxOC40LjMzLjU1Ojg4ODgvdGVzdA==', //要获取通话状态需要在请求中加入statusUrl
// 'feeUrl': 'aHR0cDovLzIxOC40LjMzLjU1Ojg4ODgvdGVzdA==', //要获取话单需要在请求中加入feeUrl
// 'returnIdlePort': 'false', //指示是否需要返回平台空闲呼叫端口数量
// 'userData': 'customerId123' //设置用户的附属信息
};
var req = https.request(options, function (res) {
var resHeaders = JSON.stringify(res.headers);
res.setEncoding('utf8');
res.on('data', function (chunk) {
console.log(chunk);
});
});
req.on('error', function(e) {
console.error('problem with request: ' + e);
});
console.log(JSON.stringify(body));
req.write(JSON.stringify(body));
req.end();
}
/**
* getPlayInfoList
* @param notifyVoice
* @param templateId
* @param templateParas
* @returns
*/
function getPlayInfoList(notifyVoice, templateId, templateParas) {
var playInfoList = [{
'notifyVoice': notifyVoice,//通知语音的放音文件名
'templateId': templateId,//语音通知模板ID,用于唯一标识语音通知模板。
'templateParas': templateParas,//语音通知模板的变量值列表,用于依次填充templateId参数指定的模板内容中的变量。
// 'collectInd': 0, //是否进行收号
// 'replayAfterCollection': 'false', //设置是否在收号后重新播放notifyVoice或templateId指定的放音
// 'collectContentTriggerReplaying': '1' //设置触发重新放音的收号内容
}];
return playInfoList;
}
var playInfoList = getPlayInfoList('notifyvoice.wav', 'xxxxxx', ['3', '人民公园正门']);
voiceNotifyAPI('+8653159511234', '+8613500000001', playInfoList);
“呼叫状态通知API”代码样例
callEventImpl.js
/**
* 呼叫事件通知
* 客户平台收到RTC业务平台的呼叫事件通知的接口通知
*/
//呼叫事件通知样例
var jsonBody = JSON.stringify({
'eventType': 'callout',
'statusInfo': {
'sessionId': '1201_612_4294967295_20190124030424@callenabler245.huaweicaas.com',
'timestamp': '2019-01-24 03:04:24',
'caller': '+8613800000022',
'called': '+8613800000021'
}
});
console.log('jsonBody:', jsonBody);
/**
* 呼叫事件通知
* @brief 详细内容以接口文档为准
* @param jsonBody
*/
function onCallEvent(jsonBody) {
var jsonObj = JSON.parse(jsonBody); //将通知消息解析为jsonObj
var eventType = jsonObj.eventType; //通知事件类型
if ('fee' === eventType) {
console.log('EventType error:', eventType);
return;
}
if (!jsonObj.hasOwnProperty('statusInfo')) {
console.log('param error: no statusInfo.');
return;
}
var statusInfo = jsonObj.statusInfo; //呼叫状态事件信息
console.log('eventType:', eventType); //打印通知事件类型
//callout:呼出事件
if ('callout' === eventType) {
/**
* Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理
*
* 'timestamp': 该呼叫事件发生时RTC业务平台的UNIX时间戳
* 'userData': 用户附属信息
* 'sessionId': 通话链路的标识ID
* 'caller': 主叫号码
* 'called': 被叫号码
*/
if (statusInfo.hasOwnProperty('sessionId')) {
console.log('sessionId:', statusInfo.sessionId);
}
return;
}
//alerting:振铃事件
if ('alerting' === eventType) {
/**
* Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理
*
* 'timestamp': 该呼叫事件发生时RTC业务平台的UNIX时间戳
* 'userData': 用户附属信息
* 'sessionId': 通话链路的标识ID
* 'caller': 主叫号码
* 'called': 被叫号码
*/
if (statusInfo.hasOwnProperty('sessionId')) {
console.log('sessionId:', statusInfo.sessionId);
}
return;
}
//answer:应答事件
if ('answer' === eventType) {
/**
* Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理
*
* 'timestamp': 该呼叫事件发生时RTC业务平台的UNIX时间戳
* 'userData': 用户附属信息
* 'sessionId': 通话链路的标识ID
* 'caller': 主叫号码
* 'called': 被叫号码
*/
if (statusInfo.hasOwnProperty('sessionId')) {
console.log('sessionId:', statusInfo.sessionId);
}
return;
}
//collectInfo:放音收号结果事件,仅应用于语音通知场景
if ('collectInfo' === eventType) {
/**
* Example: 此处以解析digitInfo为例,请按需解析所需参数并自行实现相关处理
*
* 'timestamp': 该呼叫事件发生时RTC业务平台的UNIX时间戳
* 'sessionId': 通话链路的标识ID
* 'digitInfo': 放音收号场景中,RTC业务平台对开发者进行放音收号操作的结果描述
*/
if (statusInfo.hasOwnProperty('digitInfo')) {
console.log('digitInfo:', statusInfo.digitInfo);
}
return;
}
//disconnect:挂机事件
if ('disconnect' === eventType) {
/**
* Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理
*
* 'timestamp': 该呼叫事件发生时RTC业务平台的UNIX时间戳
* 'userData': 用户附属信息
* 'sessionId': 通话链路的标识ID
* 'caller': 主叫号码
* 'called': 被叫号码
* 'partyType': 挂机的用户类型,仅在语音回呼场景携带
* 'stateCode': 通话挂机的原因值
* 'stateDesc': 通话挂机的原因值的描述
*/
if (statusInfo.hasOwnProperty('sessionId')) {
console.log('sessionId:', statusInfo.sessionId);
}
return;
}
}
//呼叫事件处理
onCallEvent(jsonBody);
“话单通知API”代码样例
feeImpl.js
/**
* 话单通知
* 客户平台收到RTC业务平台的话单通知的接口通知
*/
//话单通知样例
var jsonBody = JSON.stringify({
'eventType': 'fee',
'feeLst': [
{
'direction': 0,
'spId': 'CaaS_Test_01',
'appKey': 'ka4kESI5s3YyurL1wpx63s9YnEm2',
'icid': 'CAE-20190124110424-12019775',
'bindNum': '+8675512345678',
'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,
'ulFailReason': 0,
'sipStatusCode': 0,
'callOutStartTime': '2019-01-24 03:04:24',
'callOutAlertingTime': '2019-01-24 03:04:27',
'callOutAnswerTime': '2019-01-24 03:04:31',
'callOutUnaswRsn': 0,
'recordFlag': 0,
'ttsPlayTimes': 0,
'ttsTransDuration': 0,
'serviceType': '002',
'hostName': 'callenabler245.huaweicaas.com'
}
]
});
console.log('jsonBody:', jsonBody);
/**
* 话单通知
* @brief 详细内容以接口文档为准
* @param jsonBody
*/
function onFeeEvent(jsonBody) {
var jsonObj = JSON.parse(jsonBody); //将通知消息解析为jsonObj
var eventType = jsonObj.eventType; //通知事件类型
if ('fee' !== eventType) {
console.log('EventType error:', eventType);
return;
}
if (!jsonObj.hasOwnProperty('feeLst')) {
console.log('param error: no feeLst.');
return;
}
var feeLst = jsonObj.feeLst; //呼叫话单事件信息
/**
* Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理
*
* 'direction': 通话的呼叫方向,以RTC业务平台为基准
* 'spId': 客户的云服务账号
* 'appKey': 应用的app_key
* 'icid': 呼叫记录的唯一标识
* 'bindNum': 发起此次呼叫的CallEnabler业务号码
* 'sessionId': 通话链路的唯一标识
* 'callerNum': 主叫号码
* 'calleeNum': 被叫号码
* 'fwdDisplayNum': 转接呼叫时的显示号码(仅语音回呼场景携带)
* 'fwdDstNum': 转接呼叫时的转接号码(仅语音回呼场景携带)
* 'fwdStartTime': 转接呼叫操作的开始时间(仅语音回呼场景携带)
* 'fwdAlertingTime': 转接呼叫操作后的振铃时间(仅语音回呼场景携带)
* 'fwdAnswerTime': 转接呼叫操作后的应答时间(仅语音回呼场景携带)
* 'callEndTime': 呼叫结束时间
* 'fwdUnaswRsn': 转接呼叫操作失败的Q850原因值
* 'failTime': 呼入,呼出的失败时间
* 'ulFailReason': 通话失败的拆线点
* 'sipStatusCode': 呼入,呼出的失败SIP状态码
* 'callOutStartTime': Initcall的呼出开始时间
* 'callOutAlertingTime': Initcall的呼出振铃时间
* 'callOutAnswerTime': Initcall的呼出应答时间
* 'callOutUnaswRsn': Initcall的呼出失败的Q850原因值
* 'dynIVRStartTime': 自定义动态IVR开始时间(仅语音通知场景携带)
* 'dynIVRPath': 自定义动态IVR按键路径(仅语音通知场景携带)
* 'recordFlag': 录音标识
* 'recordStartTime': 录音开始时间(仅语音回呼场景携带)
* 'recordObjectName': 录音文件名(仅语音回呼场景携带)
* 'recordBucketName': 录音文件所在的目录名(仅语音回呼场景携带)
* 'recordDomain': 存放录音文件的域名(仅语音回呼场景携带)
* 'recordFileDownloadUrl': 录音文件下载地址(仅语音回呼场景携带)
* 'ttsPlayTimes': 应用TTS功能时,使用TTS的总次数
* 'ttsTransDuration': 应用TTS功能时,TTS Server进行TTS转换的总时长(单位为秒)
* 'serviceType': 携带呼叫的业务类型信息
* 'hostName': 话单生成的服务器设备对应的主机名
* 'userData': 用户附属信息
*/
//短时间内有多个通话结束时RTC业务平台会将话单合并推送,每条消息最多携带50个话单
if (feeLst.length > 1) {
for ( var i=0; i<feeLst.length; i++) {
if (feeLst[i].hasOwnProperty('sessionId')) {
console.log('sessionId:', feeLst[i].sessionId);
}
}
} else if (feeLst.length === 1) {
if (feeLst[0].hasOwnProperty('sessionId')) {
console.log('sessionId:', feeLst[0].sessionId);
}
} else {
console.log('feeLst error: no element.');
}
}
//话单处理
onFeeEvent(jsonBody);
父主题: Node.js