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

Node.js

注:为节省开发时间,建议先使用Node.js代码样例进行调测,熟悉接口使用后,再参考Java、python、PHP或C#代码样例,结合接口文档进行功能开发。

样例

语音验证码场景API呼叫状态通知API话单通知API

环境要求

Node.js 4.4.4及以上版本。

引用库

-

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

“语音验证码场景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');

“呼叫状态通知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”代码样例

/**
 * 话单通知
 * 客户平台收到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); 

相关文档