VoiceReport

订阅呼叫记录消息(VoiceReport)可以在呼叫结束后获取呼叫的记录信息,包括通话类型、通话的开始及结束时间、通话时长、结束原因等。

返回参数

您已配置回执消息

名称

类型

示例

描述

call_id

String

100001616500^100001871490

呼叫ID。

originate_time

String

2020-05-01 10:00:00

呼叫发起时间,即通话由云通信侧向运营商发起时间。

ring_time

String

2020-05-01 10:00:03

被叫响铃时间,即发起外呼后被叫收到请求开始响铃的时间,若被叫未响铃,则该字段为空。

start_time

String

2017-06-01 10:00:00

通话接通时间,即被叫接起电话时间,未接通则为空。

end_time

String

2017-06-01 10:00:00

通话结束时间。

caller

String

05711111****

主叫号码。

callee

String

1390000****

被叫号码

duration

String

10秒

通话时长,单位为秒,未接通为0秒。

status_code

String

200010

呼叫结果状态码,状态码说明请查看呼叫状态码

early_media_code

String

200002

早媒体结果状态码(功能开启才会有),状态码说明请查看呼叫状态码

说明

语音服务控制台智能语音机器人 > 任务管理界面开启功能。打开号码状态识别功能,以辅助识别停机、无服务等号码状态,并根据号码状态自动执行挂断动作。打开后会产生语音识别费用。

hangup_direction

String

用户

挂断方向。取值:

  • 用户

  • 机器

status_msg

String

执行完成

结果描述。

out_id

String

123456

扩展字段回传。将调用API时传入的字段返回,智能外呼SAAS助手相关API的out_id内容为ALICOM_SMART_SAAS^111111^2222222,其中的111111为批次任务ID。

dtmf

String

123456

DTMF按键。

voice_type

String

voice

话单类型。取值:

  • voice为普通话单

  • asr为asr话单

  • smart_transfer为智能外呼转接话单

dialog_id

String

100001097****

话术ID,智能外呼SAAS助手专有。

toll_type

String

LOCAL

通话类型。取值:

  • LOCAL:市话

  • PROVINCE:省内长途

  • DOMESTIC:国内长途

  • INTERNATIONAL:国际长途

Demo下载

说明
  • Demo下载成功后,部分jar包在lib目录下,您需要单击Add as Library完成引入,具体如下图所示。
  • 可在pom.xml文件中查找Maven依赖并安装阿里云Java SDK。

lib

示例代码

说明

调用接口前,需配置环境变量,通过环境变量读取访问凭证。AccessKey ID和AccessKey Secret的环境变量名:VMS_AK_ENV 、VMS_SK_ENV。配置详情请参见配置访问凭证

使用该示例时,您需要注意如下信息。

  • 将AccessKey ID和AccessKey Secret换成您的AccessKey信息。

    // 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
    // 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
    // 本示例以将AccessKey ID和AccessKey Secret保存在环境变量为例说明。您也可以根据业务需要,保存到配置文件里。
    String accessKeyId = System.getenv("VMS_AK_ENV");
    String accessKeySecret = System.getenv("VMS_SK_ENV");
  • messageType换成您需要的消息类型,如订阅呼叫记录消息(VoiceReport)。语音服务支持的回执消息类型,请参见回执消息简介与配置流程

    String messageType="messageType";
  • queueName是MNS消息队列名称,您可以在语音服务控制台通用设置 > 订阅回执消息页面查看。

    String queueName="queueName";
  • 以本文示例代码为例,您获取到的上行信息内容由dealMessage方法处理,您可以将需要的上行信息内容的业务逻辑写在该方法中。

    // 根据文档中具体的消息格式进行消息体的解析
    String arg = (String) contentMap.get("arg");
    // 编写您的业务代码

    arg代表回执消息体中的参数,可填写的值为:dest_code、send_time、sequence_id、phone_number、content。

package com.alicom.mns.sample;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


import com.alicom.mns.tools.DefaultAlicomMessagePuller;
import com.alicom.mns.tools.MessageListener;
import com.aliyun.mns.model.Message;
import com.google.gson.Gson;

/**
 * 只能用于接收云通信的消息,不能用于接收其他业务的消息
 * MNS消息接收demo
 */

public class ReceiveDemo {

    private static Log logger=LogFactory.getLog(ReceiveDemo.class);

    static class MyMessageListener implements MessageListener{
        private Gson gson=new Gson();

        @Override
        public boolean dealMessage(Message message) {

            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            //消息的几个关键值
            System.out.println("message receiver time from mns:" + format.format(new Date()));
            System.out.println("message handle: " + message.getReceiptHandle());
            System.out.println("message body: " + message.getMessageBodyAsString());
            System.out.println("message id: " + message.getMessageId());
            System.out.println("message dequeue count:" + message.getDequeueCount());
            System.out.println("Thread:" + Thread.currentThread().getName());
            try{
                Map<String,Object> contentMap=gson.fromJson(message.getMessageBodyAsString(), HashMap.class);

                // 根据文档中具体的消息格式进行消息体的解析
                String arg = (String) contentMap.get("arg");

                // 这里开始编写您的业务代码

            }catch(com.google.gson.JsonSyntaxException e){
                logger.error("error_json_format:"+message.getMessageBodyAsString(),e);
                //理论上不会出现格式错误的情况,所以遇见格式错误的消息,只能先delete,否则重新推送也会一直报错
                return true;
            } catch (Throwable e) {
                //您自己的代码部分导致的异常,应该return false,这样消息不会被delete掉,而会根据策略进行重推
                return false;
            }

            //消息处理成功,返回true, SDK将调用MNS的delete方法将消息从队列中删除掉
            return true;
        }

    }

    public static void main(String[] args) throws Exception, ParseException {

        DefaultAlicomMessagePuller puller=new DefaultAlicomMessagePuller();

        //设置异步线程池大小及任务队列的大小,还有无数据线程休眠时间
        puller.setConsumeMinThreadSize(6);
        puller.setConsumeMaxThreadSize(16);
        puller.setThreadQueueSize(200);
        puller.setPullMsgThreadSize(1);
        //和服务端联调问题时开启,平时无需开启,消耗性能
        puller.openDebugLog(false);

        // 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
        // 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
        // 本示例以将AccessKey ID和AccessKey Secret保存在环境变量为例说明。您也可以根据业务需要,保存到配置文件里。
        String accessKeyId = System.getenv("VMS_AK_ENV");
        String accessKeySecret = System.getenv("VMS_SK_ENV");

        /*
        *  将messageType和queueName替换成您需要的消息类型名称和对应的队列名称
        *云通信产品下所有的回执消息类型:
        *1:呼叫记录:VoiceReport
        *2:呼叫中间状态:VoiceCallReport
        *3:录音记录消息:VoiceRecordReport
        *4:ASR实时消息:VoiceRTASRReport
        */
        String messageType="messageType";//此处应该替换成相应产品的消息类型
        String queueName="queueName";//在云通信页面开通相应业务消息后,就能在页面上获得对应的queueName,格式类似Alicom-Queue-******-VoiceReport
        puller.startReceiveMsg(accessKeyId,accessKeySecret,messageType,queueName,new MyMessageListener());
    }
}