云服务器内容精选

  • “呼叫状态通知API”代码样例 /** * 呼叫事件通知 * 客户平台收到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”代码样例 /*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”代码样例 # -*- coding: utf-8 -*- ''' 呼叫事件通知 客户平台收到语音通话平台的呼叫事件通知的接口通知 ''' import json #呼叫事件通知样例 jsonBody = json.dumps({ 'eventType': 'callout', 'statusInfo': { 'sessionId': '1201_612_4294967295_20190124030424@callenabler245.huaweicaas.com', 'timestamp': '2019-01-24 03:04:24', 'caller': '+86138*******2', 'called': '+86138*******1', 'userData': 'customerId123' } }).encode('ascii') print(jsonBody) ''' 呼叫事件通知 @see: 详细内容以接口文档为准 @param param: jsonBody @return: ''' def onCallEvent(jsonBody): jsonObj = json.loads(jsonBody) #将通知消息解析为jsonObj eventType = jsonObj['eventType'] #通知事件类型 if ('fee' == eventType): print('EventType error: ' + eventType) return if ('statusInfo' not in jsonObj): print('param error: no statusInfo.') return statusInfo = jsonObj['statusInfo'] #呼叫状态事件信息 print('eventType: ' + eventType) #打印通知事件类型 #callout:呼出事件 if ('callout' == eventType): ''' Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 'timestamp': 该呼叫事件发生时语音通话平台的UNIX时间戳 'userData': 用户附属信息 'sessionId': 通话链路的标识ID 'caller': 主叫号码 'called': 被叫号码 ''' if ('sessionId' in statusInfo): print('sessionId: ' + statusInfo['sessionId']) return #alerting:振铃事件 if ('alerting' == eventType): ''' Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 'timestamp': 该呼叫事件发生时语音通话平台的UNIX时间戳 'userData': 用户附属信息 'sessionId': 通话链路的标识ID 'caller': 主叫号码 'called': 被叫号码 ''' if ('sessionId' in statusInfo): print('sessionId: ' + statusInfo['sessionId']) return #answer:应答事件 if ('answer' == eventType): ''' Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 'timestamp': 该呼叫事件发生时语音通话平台的UNIX时间戳 'userData': 用户附属信息 'sessionId': 通话链路的标识ID 'caller': 主叫号码 'called': 被叫号码 ''' if ('sessionId' in statusInfo): print('sessionId: ' + statusInfo['sessionId']) return #collectInfo:放音收号结果事件,仅应用于语音通知场景 if ('collectInfo' == eventType): ''' Example: 此处以解析digitInfo为例,请按需解析所需参数并自行实现相关处理 'timestamp': 该呼叫事件发生时语音通话平台的UNIX时间戳 'sessionId': 通话链路的标识ID 'digitInfo': 放音收号场景中,语音通话平台对开发者进行放音收号操作的结果描述 ''' if ('digitInfo' in statusInfo): print('digitInfo: ' + statusInfo['digitInfo']) return #disconnect:挂机事件 if ('disconnect' == eventType): ''' Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 'timestamp': 该呼叫事件发生时语音通话平台的UNIX时间戳 'userData': 用户附属信息 'sessionId': 通话链路的标识ID 'caller': 主叫号码 'called': 被叫号码 'partyType': 挂机的用户类型,仅在语音回呼场景携带 'stateCode': 通话挂机的原因值 'stateDesc': 通话挂机的原因值的描述 ''' if ('sessionId' in statusInfo): print('sessionId: ' + statusInfo['sessionId']) return if __name__ == '__main__': onCallEvent(jsonBody) #呼叫事件处理
  • “呼叫状态通知API”代码样例 # -*- coding: utf-8 -*- ''' 呼叫事件通知 客户平台收到语音通话平台的呼叫事件通知的接口通知 ''' import json #呼叫事件通知样例 jsonBody = json.dumps({ 'eventType': 'callout', 'statusInfo': { 'sessionId': '1201_612_4294967295_20190124030424@callenabler245.huaweicaas.com', 'timestamp': '2019-01-24 03:04:24', 'caller': '+86138*******2', 'called': '+86138*******1', 'userData': 'customerId123' } }).encode('ascii') print(jsonBody) ''' 呼叫事件通知 @see: 详细内容以接口文档为准 @param param: jsonBody @return: ''' def onCallEvent(jsonBody): jsonObj = json.loads(jsonBody) #将通知消息解析为jsonObj eventType = jsonObj['eventType'] #通知事件类型 if ('fee' == eventType): print('EventType error: ' + eventType) return if ('statusInfo' not in jsonObj): print('param error: no statusInfo.') return statusInfo = jsonObj['statusInfo'] #呼叫状态事件信息 print('eventType: ' + eventType) #打印通知事件类型 #callout:呼出事件 if ('callout' == eventType): ''' Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 'timestamp': 该呼叫事件发生时语音通话平台的UNIX时间戳 'userData': 用户附属信息 'sessionId': 通话链路的标识ID 'caller': 主叫号码 'called': 被叫号码 ''' if ('sessionId' in statusInfo): print('sessionId: ' + statusInfo['sessionId']) return #alerting:振铃事件 if ('alerting' == eventType): ''' Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 'timestamp': 该呼叫事件发生时语音通话平台的UNIX时间戳 'userData': 用户附属信息 'sessionId': 通话链路的标识ID 'caller': 主叫号码 'called': 被叫号码 ''' if ('sessionId' in statusInfo): print('sessionId: ' + statusInfo['sessionId']) return #answer:应答事件 if ('answer' == eventType): ''' Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 'timestamp': 该呼叫事件发生时语音通话平台的UNIX时间戳 'userData': 用户附属信息 'sessionId': 通话链路的标识ID 'caller': 主叫号码 'called': 被叫号码 ''' if ('sessionId' in statusInfo): print('sessionId: ' + statusInfo['sessionId']) return #collectInfo:放音收号结果事件,仅应用于语音通知场景 if ('collectInfo' == eventType): ''' Example: 此处以解析digitInfo为例,请按需解析所需参数并自行实现相关处理 'timestamp': 该呼叫事件发生时语音通话平台的UNIX时间戳 'sessionId': 通话链路的标识ID 'digitInfo': 放音收号场景中,语音通话平台对开发者进行放音收号操作的结果描述 ''' if ('digitInfo' in statusInfo): print('digitInfo: ' + statusInfo['digitInfo']) return #disconnect:挂机事件 if ('disconnect' == eventType): ''' Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 'timestamp': 该呼叫事件发生时语音通话平台的UNIX时间戳 'userData': 用户附属信息 'sessionId': 通话链路的标识ID 'caller': 主叫号码 'called': 被叫号码 'partyType': 挂机的用户类型,仅在语音回呼场景携带 'stateCode': 通话挂机的原因值 'stateDesc': 通话挂机的原因值的描述 ''' if ('sessionId' in statusInfo): print('sessionId: ' + statusInfo['sessionId']) return if __name__ == '__main__': onCallEvent(jsonBody) #呼叫事件处理
  • 语音验证码 表4 语音验证码需准备的资源 资源项 对应接口参数 用途 获取方式 APP_Key X-AKSK X-AKSK鉴权所需参数。 登录管理控制台,从“应用管理”页面获取。 创建应用,请参考添加应用。 APP_Secret APP接入地址 - API调用的基地址。 访问URI - 语音验证码场景API的接口访问URI。 从语音验证码场景API获取。 被叫用户端显示的号码 displayNbr 用户接收到平台来电时的显示号码。可申请多个。 从订购号码页面申请。 号码下发后在号码管理页面获取。 放音文件 preTone 播放语音验证码之前播放的放音文件。 登录管理控制台,从“放音文件管理”页面获取。 上传放音文件,请参考添加放音文件。 具体制作方法参见制作放音文件。 放音文件(可选) posTone 播放语音验证码之后播放的放音文件。 若使用个性化放音,可提交该资源。 若不申请,平台将在语音验证码播放完毕后结束通话。 呼叫状态通知URL(可选) statusUrl 接收呼叫过程中状态信息(振铃、应答、挂机等)的服务器地址。若需订阅呼叫状态通知,可提交该资源。 提前准备可用的服务器地址,创建应用时填写,或调用接口时填写。 创建应用,请参考添加应用。 话单通知URL(可选) feeUrl 接收呼叫结束后产生话单的服务器地址。若需订阅话单通知,可提交该资源。 准备的数据与语音验证码API请求参数关联关系如下:
  • 语音回呼 表1 语音回呼需准备的资源 资源项 对应接口参数 用途 获取方式 APP_Key X-AKSK X-AKSK鉴权所需参数。 登录管理控制台,从“应用管理”页面获取。 创建应用,请参考添加应用。 APP_Secret APP接入地址 - API调用的基地址。 访问URI - 语音回呼场景API的接口访问URI。 从语音回呼场景API获取。 主叫端显示的号码 displayNbr 主叫端接收到平台来电时的显示号码。可申请多个。该号码可以与displayCalleeNbr配置为同一个号码,也可以配置为不同号码。 从订购号码页面申请。 号码下发后在号码管理页面获取。 被叫端显示的号码 displayCalleeNbr 被叫端接收到平台来电时的显示号码。该号码可以与displayNbr配置为同一个号码,也可以配置为不同号码。 放音文件(可选) lastMinVoice 若设置了最大通话时长,平台会于最后一分钟时进行放音提示。 若需使用个性化放音,可提交该资源。 若不提交,使用默认放音“本次通话时长还剩1分钟”。 登录管理控制台,从“放音文件管理”页面获取。 上传放音文件,请参考添加放音文件。 具体制作方法参见制作放音文件。 waitVoice 主叫接听平台来电后的等待音。 若需使用个性化放音,可提交该资源。 若不提交,使用默认回铃音,例如:“嘟...嘟...”。 呼叫状态通知URL(可选) statusUrl 接收呼叫过程中状态信息(振铃、应答、挂机等)的服务器地址。若需订阅呼叫状态通知,可提交该资源。 提前准备可用的服务器地址,创建应用时填写,或调用接口时填写。 创建应用,请参考添加应用。 话单通知URL(可选) feeUrl 接收呼叫结束后产生话单的服务器地址。若需订阅话单通知,可提交该资源。 准备的数据与语音回呼场景API请求参数关联关系如下: 表2 语音回呼录音功能需准备的资源 资源项 对应接口参数 用途 获取方式 放音文件(可选) recordHintTone 平台会于录音前放音,提示通话用户。 若需使用个性化放音,可提交该资源。 若不提交,使用默认放音。 登录管理控制台,从“放音文件管理”页面获取。 上传放音文件,请参考添加放音文件。 具体制作方法参见制作放音文件。 获取录音文件 录音文件名 fileName 下载录音文件时使用。 通过“话单通知API”的recordObjectName参数获取。 录音文件存储的服务器 域名 recordDomain 通过“话单通知API”的recordDomain参数获取。 使用录音功能,需在添加应用时开通。 使用录音功能必须订阅话单通知。不订阅话单通知,则无法获取下载录音文件的关键参数。
  • 语音通知 表3 语音通知需准备的资源 资源项 对应接口参数 用途 获取方式 APP_Key X-AKSK X-AKSK鉴权所需参数。 登录管理控制台,从“应用管理”页面获取。 创建应用,请参考添加应用。 APP_Secret APP接入地址 - API调用的基地址。 访问URI - 语音通知API的接口访问URI。 从语音通知API获取。 被叫用户端显示的号码 displayNbr 用户接收到平台来电时的显示号码。可申请多个。 从订购号码页面申请。 号码下发后在号码管理页面获取。 放音文件 notifyVoice 音频文件,用户接听平台来电后的语音通知内容。 登录管理控制台,从“放音文件管理”页面获取。 上传放音文件,请参考添加放音文件。 具体制作方法参见制作放音文件。 语音通知模板ID(可选) templateId 仅接口版本为v2.0时需申请。 语音通知模板唯一标识。 语音通知模板为文本格式,平台将其转化为用户接听来电后的语音通知。可申请多个语音通知模板。 登录管理控制台,从“语音模板管理”页面获取。 添加语音通知模板,请参考添加语音模板。 呼叫状态通知URL(可选) statusUrl 接收呼叫过程中状态信息(振铃、应答、挂机等)的服务器地址。若需订阅呼叫状态通知,可提交该资源。 提前准备可用的服务器地址,创建应用时填写,或调用接口时填写。 创建应用,请参考添加应用。 话单通知URL(可选) feeUrl 接收呼叫结束后产生话单的服务器地址。若需订阅话单通知,可提交该资源。 准备的数据与语音通知API请求参数关联关系如下:
  • “获取录音文件下载地址API”代码样例 /*jshint esversion: 6 */ var https = require('https'); var util = require('./reqUtil.js'); var querystring = require('querystring'); /** * Get the download link of record file. * @param fileName record file name * @param recordDomain domain name of record file restore server * @returns */ function getRecordLinkAPI(fileName, recordDomain, xaksk) { if(fileName === undefined || fileName === null || recordDomain === undefined || recordDomain === null){ return; } if(xaksk === undefined || xaksk === null){ return; } var location; var method = 'GET'; var uri = '/rest/provision/voice/record/v1.0'; var queryParams = querystring.stringify({'fileName': fileName, 'recordDomain': recordDomain}); var options = util.createOptions(method, uri, queryParams, xaksk); var req = https.request(options, function (res) { if(301 === res.statusCode){ location = Object.getOwnPropertyDescriptor(res.headers, 'location').value; } var resHeaders = JSON.stringify(res.headers); res.setEncoding('utf8'); res.on('data', function (chunk) { console.log('resp:', chunk); //打印响应数据 }); }); req.on('error', function(e) { console.error('problem with request: ' + e); //打印错误信息 }); req.end(); //结束请求 return location; } module.exports = { getRecordLinkAPI };
  • “语音回呼场景API”代码样例 /*jshint esversion: 6 */ var https = require('https'); var data = require('./data.js'); var util = require('./reqUtil.js'); var record = require('./getRecordLink.js'); /** * voiceCallAPI * @param displayNbr * @param callerNbr * @param displayCalleeNbr * @param calleeNbr * @returns */ function voiceCallAPI(displayNbr, callerNbr, displayCalleeNbr, calleeNbr) { if(displayNbr === undefined || displayNbr === null || callerNbr === undefined || callerNbr === null) { return; } if(displayCalleeNbr === undefined || displayCalleeNbr === null || calleeNbr === undefined || calleeNbr === null) { return; } var method = 'POST'; var uri = '/rest/httpsessions/click2Call/v2.0'; var xaksk = util.buildAKSKHeader(data.data.click2call_appid, data.data.click2call_secret); var options = util.createOptions(method, uri, null, xaksk); var body = { /* 必填参数 */ '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': 'aHR0cDovLzIxOC40LjMzLjU1Ojg4ODgvdGVzdA==', //要获取通话状态需要在请求中加入statusUrl // 'feeUrl': 'aHR0cDovLzIxOC40LjMzLjU1Ojg4ODgvdGVzdA==', //要获取话单需要在请求中加入feeUrl // 'recordFlag': 'false', //与调测信息中的recordFlag保持一致 // 'recordHintTone': 'recordhint_voice1.wav', //设置使用录音功能的提示音 // 'partyTypeRequiredInDisconnect': 'false', //disconnect状态是否需要携带通话主动挂机的用户类型 // '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(); } voiceCallAPI('+8653159511234', '+8613500000001', '+8653159511234', '+8613500000002'); var xaksk = util.buildAKSKHeader(data.data.click2call_appid, data.data.click2call_secret); var location = record.getRecordLinkAPI('1200_366_0_20161228102743.wav', 'ostor.huawei.com', xaksk); console.log('The record file download link is: ' + location);
  • “呼叫状态通知API”代码样例 /** * 呼叫事件通知 * 客户平台收到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”代码样例 # -*- coding: utf-8 -*- ''' 呼叫事件通知 客户平台收到语音通话平台的呼叫事件通知的接口通知 ''' import json #呼叫事件通知样例 jsonBody = json.dumps({ 'eventType': 'callout', 'statusInfo': { 'sessionId': '1201_612_4294967295_20190124030424@callenabler245.huaweicaas.com', 'timestamp': '2019-01-24 03:04:24', 'caller': '+86138*******2', 'called': '+86138*******1', 'userData': 'customerId123' } }).encode('ascii') print(jsonBody) ''' 呼叫事件通知 @see: 详细内容以接口文档为准 @param param: jsonBody @return: ''' def onCallEvent(jsonBody): jsonObj = json.loads(jsonBody) #将通知消息解析为jsonObj eventType = jsonObj['eventType'] #通知事件类型 if ('fee' == eventType): print('EventType error: ' + eventType) return if ('statusInfo' not in jsonObj): print('param error: no statusInfo.') return statusInfo = jsonObj['statusInfo'] #呼叫状态事件信息 print('eventType: ' + eventType) #打印通知事件类型 #callout:呼出事件 if ('callout' == eventType): ''' Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 'timestamp': 该呼叫事件发生时语音通话平台的UNIX时间戳 'userData': 用户附属信息 'sessionId': 通话链路的标识ID 'caller': 主叫号码 'called': 被叫号码 ''' if ('sessionId' in statusInfo): print('sessionId: ' + statusInfo['sessionId']) return #alerting:振铃事件 if ('alerting' == eventType): ''' Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 'timestamp': 该呼叫事件发生时语音通话平台的UNIX时间戳 'userData': 用户附属信息 'sessionId': 通话链路的标识ID 'caller': 主叫号码 'called': 被叫号码 ''' if ('sessionId' in statusInfo): print('sessionId: ' + statusInfo['sessionId']) return #answer:应答事件 if ('answer' == eventType): ''' Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 'timestamp': 该呼叫事件发生时语音通话平台的UNIX时间戳 'userData': 用户附属信息 'sessionId': 通话链路的标识ID 'caller': 主叫号码 'called': 被叫号码 ''' if ('sessionId' in statusInfo): print('sessionId: ' + statusInfo['sessionId']) return #collectInfo:放音收号结果事件,仅应用于语音通知场景 if ('collectInfo' == eventType): ''' Example: 此处以解析digitInfo为例,请按需解析所需参数并自行实现相关处理 'timestamp': 该呼叫事件发生时语音通话平台的UNIX时间戳 'sessionId': 通话链路的标识ID 'digitInfo': 放音收号场景中,语音通话平台对开发者进行放音收号操作的结果描述 ''' if ('digitInfo' in statusInfo): print('digitInfo: ' + statusInfo['digitInfo']) return #disconnect:挂机事件 if ('disconnect' == eventType): ''' Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 'timestamp': 该呼叫事件发生时语音通话平台的UNIX时间戳 'userData': 用户附属信息 'sessionId': 通话链路的标识ID 'caller': 主叫号码 'called': 被叫号码 'partyType': 挂机的用户类型,仅在语音回呼场景携带 'stateCode': 通话挂机的原因值 'stateDesc': 通话挂机的原因值的描述 ''' if ('sessionId' in statusInfo): print('sessionId: ' + statusInfo['sessionId']) return if __name__ == '__main__': onCallEvent(jsonBody) #呼叫事件处理
  • “呼叫状态通知API”代码样例 /** * 呼叫事件通知 * 客户平台收到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”代码样例 /*jshint esversion: 6 */ var https = require('https'); var data = require('./data.js'); var util = require('./reqUtil.js'); /** * voiceVerificationCodeAPI * @param displayNbr * @param calleeNbr * @param languageType * @param preTone * @param verifyCode * @returns */ function voiceVerificationCodeAPI(displayNbr, calleeNbr, languageType, preTone, verifyCode) { if(displayNbr === undefined || displayNbr === null || calleeNbr === undefined || calleeNbr === null) { return; } if(languageType === undefined || languageType === null || preTone === undefined || preTone === null) { return; } if(languageType === verifyCode || languageType === verifyCode) { return; } var method = 'POST'; var uri = '/rest/httpsessions/callVerify/v1.0'; var xaksk = util.buildAKSKHeader(data.data.callverify_appid, data.data.callverify_secret); var options = util.createOptions(method, uri, null, xaksk); var body = { /* 必填参数 */ 'displayNbr': displayNbr,//主叫用户手机终端的来电显示号码。 'calleeNbr': calleeNbr,//被叫用户终端的来电显示号码。 'languageType': languageType,//验证码播放的语言类型。 'preTone': preTone,//播放语音验证码之前需要播放的放音文件名 'verifyCode': verifyCode//验证码:只支持0~9的数字,最大8位。 /* 选填参数 */ // 'bindNbr': '+86123456789', //CallEnabler业务号码,即绑定号码 // 'posTone': 'postone.wav', //播放语音验证码之后需要播放的放音文件名 // 'times': 3, //播放次数:0~9 // '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(); } voiceVerificationCodeAPI('+8653159511234', '+8613500000001', 2, 'test.wav', '1234');
  • 语音通话使用全流程 任务 操作步骤 备注 入驻华为云 注册华为账号 并开通华为云:点击注册页面 企业实名认证:点击进行实名认证 实名认证信息最长3个工作日内审核完成,请耐心等待审核结果,审核成功,即可完成认证。 开通服务 如何开通服务,点击查看开通服务。 开通语音通话服务前,请认真阅读《语音通话服务使用声明》。 业务开通申请将在1~2个工作日审核完成,请耐心等待审核结果。 添加应用 如何添加应用,点击查看添加应用。 不支持接入涉及安全事故的语音通知业务。 添加企业 如何添加企业,点击查看添加企业。 企业名称必须填写全称且和营业执照保持一致。 企业注册资金不得低于50W。 企业审核一般需要2个工作日。 订购号码 如何订购号码,点击查看订购号码。 申请固话号码,资源下发需要10个工作日。 添加放音文件/语音模板 如何添加放音文件,点击查看添加放音文件。 如何添加语音模板,点击查看添加语音模板。 根据应用类型添加放音文件或语音模板。 业务测试 如何业务测试,点击查看业务测试。 - 业务商用 如何业务商用,点击查看商业发布。 -
  • 接口示例 请求示例 POST /rest/httpsessions/callVerify/v1.0 HTTP/1.1 content-type: application/json;charset=UTF-8 authorization: AKSK realm="SDP",profile="UsernameToken",type="Appkey" x-aksk: UsernameToken Username="ZRBRz4bAXoFgEH7o4Ew308eXc1RA",PasswordDigest="****",Nonce="ac1c911c4792492687f8f6b2264a491e",Created="2018-05-26T00:35:30Z" content-length:xx { "displayNbr":"+8675528****88", "calleeNbr":"+86189****0007", "languageType":2, "preTone":"welcome.wav", "verifyCode":"12345678", "times":3, "userData":"cwgtest" } 响应示例 HTTP/1.1 200 OK Content-Type: application/json;charset=UTF-8 { "resultcode":"0", "resultdesc":"Success", "sessionId":"1200_366_0_20161228102743@callenabler.home1.com" }