文档

前端SDK文档接入

更新时间:

通过该文档,您可以实现将坐席工作台嵌入到第三方系统中,直接在您系统中实现单点登录、接打电话等功能,并且您可以通过监听SDK中的方法来实现来电弹屏,下面的工作需要您公司的前端工程师来实施。您可随时关注该文档页面,SDK有更新时会及时更新文档页面。

一、前端资源

备注:更新前端资源版本以后,一定要在本地环境做全面测试以后再发布线上环境!

<!-- IM sdk样式文件,不使用IM插件不要加载此文件-->
<link rel="stylesheet" type="text/css" href="https://g.alicdn.com/code/npm/@ali/cc-im-sdk/{version-im-sdk}/index.css">
<!-- 软电话sdk样式文件-->
<link rel="stylesheet" type="text/css" href="//g.alicdn.com/cloudcallcenter/web-workbench-sdk/{version-workbench}/main.min.css">

<!-- IM sdk js文件,不使用IM插件不要加载此文件-->
<script type="text/javascript" src="//g.alicdn.com/code/npm/@ali/cc-im-sdk/{version-im-sdk}/index.js"></script>
<!-- 软电话sdk js文件-->
<script type="text/javascript" src="//g.alicdn.com/cloudcallcenter-voip/web-agentbar-sdk/{version-agentbar}/index.js"></script>
<script type="text/javascript" src="//g.alicdn.com/cloudcallcenter/web-workbench-sdk/{version-workbench}/workbenchSdk.min.js"></script>
以上静态资源,把上面的{version-im-sdk}、{version-agentbar}和{version-workbench}替换为对应的版本号,当前最新版本号为:
version-im-sdk ==>    0.4.4
version-agentbar ==>  2.3.1
version-workbench ==> 2.14.1

注意:以上js文件必须按照顺序加载,有相互依赖的关系。只使用软电话sdk则不需要加载IM sdk的文件,但是只使用IM sdk的话,所有文件都必须加载。

如要兼容Android、iOS和Safari浏览器,请添加WebRTC相关补充库,例如被广泛支持的Adapter.js(在web-agentbar-sdk之前加载)。

二、初始化SDK

接入sdk之前需要做的工作:

  1. 必须使用chrome浏览器,版本号为58以上。原因是云呼叫中心的通话是通过webRTC技术实现的,目前chrome浏览器对于webRTC技术的支持是相对最好的。为了保证您的通话质量及安全性,所以我们做出了这样的要求。

  2. 软电话SDK所嵌入的自有业务系统必须使用HTTPS协议。原因是chrome在47版本之后,禁止http协议获取系统麦克风权限,会造成无法正常通话。

  3. 如果您是在iframe标签内使用软电话SDK,那么需要为iframe标签增加allow="microphone"属性,来允许iframe标签获取系统麦克风权限。

初始化SDK:

window.workbench = new WorkbenchSdk(config)

三、config必选配置

  • dom

挂载元素id
  • instanceId

创建呼叫中心实例填写的域名, 
https://ccc.console.aliyun.com/AccV2Instance
访问地址中workbench/xxx/agentdest中间的字符串(xxx就是实例id),参照下图

域名

  • regionId

云呼服务器部署的集群,如果没有特殊说明,为'cn-shanghai'

四、config可选配置

  • header

是否展示头部(小休,下线,场外模式接听等),默认展示,参数类型:Boolean
  • width

宽度,默认320,参数类型:Number;
  • height

高度,默认580,参数类型:Number;(为了保证完整的UI展示,建议高度最低580);
  • defaultVisible

默认是否展示面板,默认为true,参数类型:Boolean;
  • defaultMainContentVisible

默认是否展开软电话面板,默认为true,参数类型:Boolean;
  • offlineImage

下线展示的静态图片地址,参数类型:String;
  • breakImage

小休展示的静态图片地址,参数类型:String;
  • afterCallRule

挂机后进入空闲状态的时间,单位秒,默认15秒,参数类型:Number;
等待客服手动去从话后处理切换到空闲状态,为”manual”;
  • autoAnswerCall

有来电时自动接听电话的时长,单位秒,默认为手动接听,参数类型:Number;
  • isLoggedKeepBreak

是否在登录时保持小休状态(不想在业务繁忙时上线立即接电话可设置为true)
 
目前是登录时从小休默认自动变为空闲状态
  • isLoggedInvisibility 「version-workbench: 2.12.2」

是否在登录时保持隐身状态,目前登录时会处于
  • isOutboundNotReceivedToBeProcessed

是否在外呼时未接听也流转到话后处理(当前是未接通后到话后处理状态,再立即到空闲状态)
  • exportErrorOfApi

Toast提示接口的错误信息、ApiName、ErrorCode、RequestId,当接口出现错误的,提供错误信息,
便于后端排查问题。默认是false,可根据需要是否Toast错误消息。
  • moreActionList

在头部的功能模块的按钮列表,
值可为["online", "ready", "onlyCall", "break", "offline", "adjustVolume", "changeWorkMode"],
分别对应[上线, 结束小休, 隐身, 小休, 下线, 调节音量, 场外模式接听],用户可根据需求选择配置项,参数类型:Array

默认值:["break", "offline", "adjustVolume", "changeWorkMode"]

注意:
1. 面板收缩时,上面的值全部有效,面板展开时 ["online", "ready"] 设置无效(不显示),操作按钮在可在面板中使用
  • useLocalStorageToCall

是否允许使用多标签页外呼,默认为false,参数类型:Boolean;详细介绍请参考第9条说明。
  • pollFrequenceWithoutWS

当坐席状态WebSocket连接失败时,调用Rest API来拉取坐席状态的频率。
默认值为1000,单位毫秒,参数类型:Number。
目前云呼叫中心采用双通道方式来保证坐席状态的实时性与准确性:WebSocket推送和Rest API拉取。
  • pollFrequenceWithWS

当坐席状态WebSocket连接成功时,调用Rest API来拉取坐席状态的频率。
默认值为10000,单位毫秒,参数类型:Number。
  • pollSaveWebRtcInfoFrequence

SaveWebRtcInfo(存储通话信息)接口的调用频率;
默认值为:10000,单位毫秒,参数类型:Number。
最小值:2000。
  • sideNavList

支持面板左侧导航显示自定义,默认是显示全部,配置以后显示自定义的导航,
配置项:["呼入", "呼出", "内部通话", "通话记录", "转接", "会议", "监听", "我的工作", "设备检测", "设置"]。
  • disableSaveStats

默认为false(不关闭收集通话录音数据),参数类型:Boolean。
收集坐席侧通话录音数据,方便出现问题时进行语音排查和网络分析。
强烈不建议关掉,当出现问题时不方便工程师排查。
  • reducePanel

sdk面板最小化Icon展示,默认为true,如果不需要该功能,可设置为false,参数类型:Boolean。
  • isEnableSwitchAdapter

为提高坐席语音通话质量,新增多个接入点语音专线,默认为true。
如果坐席需要直连云呼服务器,可设置为false,参数类型:Boolean。
  • customizedNotification

支持集成客户自主定制来电桌面提醒,默认显示呼叫中心配置的桌面来电提醒,默认为false。
传值为true时不展示,参数类型:Boolean。
  • allowCalleeEncryption

是否允许被叫号码加密传输(call方法的callee参数类型不做限制)
  • defaultLastSelectedCallerNumber 「version-workbench: 2.12.2」

是否记住上次选中的主叫号码(存储在浏览器缓存中,下次上线默认选中)
  • imConfig

im 聊天的配置,需加载对应的css和js文件

{
  /**
   * 坐席信息,默认是用工作台设置里面的昵称和头像
   */
  user?: {
        /**
         * 显示名称
         */
        nickname?: string;
        /**
         * 头像 URL
         */
        avatarUrl?: string;
    };

  /**
   * im 显示的容器
   */
  getContainer: () => HTMLElement;

  /**
   * 会话改变事件,为null时,没有激活会话
   * @param conv
   * @returns
   */
  onConvChange?: (conv) => void;

  /**
   * 会话邀请事件
   */
  onConvInvite?: (event) => void;

  /**
   * 取消会话邀请事件
   */
  onConvCancelInvite?: (event) => void;

  /**
   * 会话结束事件
   */
  onConvReleased?: (event) => void;

  /**
   * 消息添加事件
   */
  onMessageAdd?: (message) => void;

  /**
   * 队列消息添加事件
   */
  onClaimQueueAdd?: (event) => void;
}

******以下参数是前端请求服务端接口的API地址及请求参数配置:******

请求路径为:${ajaxOrigin}${ajaxPath}?${ajaxApiParamName}=${apiName}&product=CloudCallCenter&version=2020-07-01&region=${regionId}

  • ajaxOrigin

请求源,默认请求当前源(location.origin),参数类型:String;
  • ajaxPath

请求路径,默认为”/data/api.json”
  • withCredentials

表示跨域请求时是否需要使用凭证,是否允许携带cookie,参数类型:Boolean
  • ajaxApiParamName

ajaxType为param时指定区分action的名称,默认action,参数类型:String;
  • ajaxMethod

请求方式,post|get 默认post,参数类型:String;
  • ajaxOtherParams

其他自定义参数和request同一层级,参数类型:Object;
  • ajaxHeaders

请求的header,参数类型:Object;
  • apiAxiosFunc

支持客户自己写请求接口的方法,最终返回结果为一个promise对象且返回的数据格式要和云呼叫中心公有云数据接口返回格式一致

apiAxiosFunc: (apiName, params) => {
   console.log(apiName, params);
   let promise = axios({
      method: 'post',
      url:`/aliyun/ccc/api?action=${apiName}`,
      headers: {
         'Content-Type': 'application/x-www-form-urlencoded',
      },
      data: Qs.stringify({ request: JSON.stringify(params)}),
    });
    return promise;
}

注意:
因为云呼内部使用axios请求库,默认返回的是结果数据结构是
{ 
  data: {
    code:xxx, 
    data: xxx, 
    httpStatusCode: xxx, 
    requestId: xxxx
  }
}
如果不是使用axios的话,请确保 return 的数据是这种数据结构,比 http 请求中返回的值多一个 data 包裹

******请求接口的参数配置结束******

钩子函数

******以下是钩子函数:某些事件触发时的回调函数,类型均为function******

  • onInit()

SDK对象实例化完成时触发
  • onRegister(config)

sip服务注册成功时触发
  • onLogIn()

签入、上线时触发
  • onLogOut()

签出、下线时触发
  • onBreak()

小休时触发
  • onReady()

空闲时触发
  • onAgentOutboundScenario

仅外呼时触发
  • onCallComing(callDetail)

来电时触发,可以在该函数内获取到一个对象callDetail,callDetail参数信息含义如下:

caller:主叫号码
callee:被叫号码
callType:呼叫类型
jobId:当前通话的ID
callContext:当前通话的详细信息

注意:为了提高接通率,当有来电振铃30s后未接听,会自动将当前坐席置为小休状态。
电话自动流转回转人工队列,分配给其他空闲坐席。
  • onBeforeCallDialing(payload)

调用call方法前触发,如果配置这样一个钩子函数一定要执行callback方法,否则电话不会被拨打出去。

payload返回数据的参数含义如下:
callee:被叫号码
userId:用户的userId
callback:满足条件以后的调用,可传入完参数callee:被叫前缀+被叫号码,不传为面板或call方法传入的被叫号码
  • onCallDialing(callDetail)

去电、拨号振铃时触发,可以在该函数内获取到一个对象callDetail,callDetail参数信息含义如下:
caller:主叫号码
callee:被叫号码
callType:呼叫类型
jobId:当前通话的ID
callContext:当前通话的详细信息
  • onHangUp(type)

挂机时触发

参数type值:
`ringing`: 代表呼入未接时挂机
`dialing`: 代表呼出未接时挂机
`inbound`: 代表呼入通话,通话中挂断
`outbound`: 代表呼出通话,通话中挂断
`internalcall`: 代表内部通话,通话中挂断
`agentHeld`: 代表咨询通话,通话中挂断
`meeting`: 代表会议或会议中坐席状态变化,挂断
`consulted`: 代表被动求助(被咨询通话),挂断
`monitored`: 代表监听,通话中挂断
`monitoring`: 代表发起监听,还未监听成功,挂断
`bargedIn`: 代表强插,通话中挂断
`coached`: 代表耳语坐席,进入三方通话,通话中挂断
  • onBeforeCallHangup(payload)

调用hangUp方法前触发,如果配置这样一个钩子函数一定要执行callback方法,否则电话不会被挂断。

payload返回的参数含义如下:
callback:回调方法
jobId:当前通话ID
channelId:这个坐席通话的channel id
userId: loginInfo.userId 
  • onCallEstablish(callDetail)

通话建立连接时触发,可以在该函数内获取到一个对象callDetail,callDetail参数信息含义如下:

callContext:当前通话的详细信息
  • onCallRelease(callDetail)

通话结束时触发,可以在该函数内获取到一个对象callDetail,callDetail参数信息含义如下:

callContext:当前通话的详细信息
  • onErrorNotify(error)

当有一些错误信息的时候触发,可以获取error信息,error参数含义如下:

errorCode: 错误code,
errorMsg: response错误信息,
errorMsgTip: 我们定义的中文错误信息,
requestId: 请求ID
apiCode: API请求的错误code

当处于开发阶段时建议在该钩子函数中打印参数表以获取错误信息
  • onStatusChange(codeDetail)

任何状态改变都会触发该函数,可在该函数内监听当前状态值的变化过程,状态code的含义请参考本文档第八条状态对照表。
可以获取到codeDetail参数,codeDetail参数含义如下:

code: 当前状态码
lastCode: 上次状态码
context:上下文信息
  • onWorkModeChange(workMode)

坐席默认有两种工作模式:场内模式和场外模式。当坐席配置了SIP话机后,还有办公电话模式。
场内模式:通过浏览器接听、拨打电话。
场外模式:通过手机接听电话,即1.0中的“手机接听”方式。
办公电话模式:通过SIP话机接听、拨打电话,无需通过浏览器操作。
workMode参数含义如下:
"ON_SITE":场内模式
"OFF_SITE":场外模式
"OFFICE_PHONE":办公电话模式
  • onDeviceTypeChange(deviceType)

当坐席配置了SIP话机后,坐席如果通过浏览器上线,可选择使用哪种设备:WebRTC软电话和SIP话机。
参数deviceType类型为Number:
0:WebRTC软电话
1:SIP话机
  • onGetStatsData(payload)

具体概念请参考RTCPeerConnection.getStats()

可以订阅此钩子函数,获取通话中的通话语音质量。每秒返回一次数据。
payload中包含:
callId:当前通话的callId
sender:发送方数据
receiver:接收方数据

参考用法:
sender && sender.forEach(report => {
 console.log('sender', report);
}
  • onSelectOutboundNumber(number)

/**
 * 面板中选择主叫号码事件
 *
 * @param {string} number 选择的主叫号码
 */
onSelectOutboundNumber(number: string): void
  • onSelectCurrentCallRecord(payload)

payload.record可查看ListRecentCallDetailRecords - 获取坐席最近通话记录列表接口返回参数。

/**
 * 当前选中的通话记录
 */
onSelectCurrentCallRecord?(payload: {record: object}): void
  • onAfterEarlyMediaRecognized(payload)

/**
 * 外呼智能挂机钩子函数,返回早媒体识别信息
 */
onAfterEarlyMediaRecognized?(payload: {
                             /**
                              * 早媒体状态
                              */
                             earlyMediaState: string,
                             /**
                              * 早媒体开始的时间戳(便于倒计时计算)
                              */
                             earlyMediaTime: number,
                             /**
                              * 早媒体状态说明
                              */
                             earlyMediaText: string,
                             /**
                              * 在设置中添加的倒计时挂机时间
                              */
                             releaseAfterEarlyMediaRecognized: number
                             })

以下是配置示例:

window.workbench = new window.WorkbenchSdk({
  dom: "workbench-container",
  regionId: "cn-shanghai",
  width: "320px",
  height: "552px",
  instanceId: "XXX",
  ajaxPath: "/aliyun/ccc/api",
  ajaxMethod: "post",
  afterCallRule: 15, // 挂机后的话后处理时间
  header: true,
  autoAnswerCall: 8, // 有来电振铃响8s后自动接听
  exportErrorOfApi: true,
  onInit() {
    // window.workbench.register() // 想实现自动上线在此注册
  },
  imConfig: {
    getContainer() {
      return document.getElementById('im-container');
    },
  },
  onLogIn() {
    // window.workbench.renderIM(); // 渲染IM组件
  },
  onLogOut() {
    // window.workbench.unmountIM(); // 卸载IM组件
  },
  onErrorNotify(error) {
    console.warn(error);
  },
  onCallComing(callDetail) {
    console.log(callDetail);
  },
  onCallDialing(callDetail) {
    console.log(callDetail);
  },
  onStatusChange(codeDetail) {
    console.log(codeDetail);
  },
  onCallEstablish(callDetail) {
    console.log("这里是通话建立时触发的回调函数", callDetail);
  },
  onCallRelease(callDetail) {
    console.log("这里是通话结束时触发的回调函数", callDetail);
  },
  onHangUp(type) {
    console.log(`这里是onHangUp事件,type = ${type}`);
  },
});

五、SDK方法

以下调用方式为:window.workbench.方法名(传参);

注意:初始化SDK时定义的全局变量名称是否与文档定义的一致。

  • isAvailBrowser()

此方法用来检测当前浏览器是否支持使用软电话的,若浏览器不兼容软电话,会弹出一个提示框并维持3s,
并在钩子函数onErrorNotify中可得到错误信息提示;若支持则无弹框提示,onErrorNotify中也无错误信息。
  • checkNetwork()

此方法用来检测当前网络连接是否能连接到软电话的服务,检测是否被本地的防火墙拦截。
  • changeVisible(visible)

显示或隐藏软电话面板,参数visible类型为Boolean。
  • changeMainPaneVisible(visible)

展开或折叠软电话面板,参数visible类型为Boolean。
  • changeWidth(width)

设置软电话面板宽度。目前默认值为320px。参数width类型为Number。
  • unloadWorkbench

删除已建立的 Workbench 实例,以供再次创建
  • reRender()

重新进行sdk的挂载,主要场景为在通话过程中或上线状态下切换到其他页面以后再回到坐席工作台界面,
主要适用于SPA应用。
  • register(loginSkillGroupArray, accessPoint, deviceType, mode, breakReason)

/**
 * 首次签入,包含了sip服务注册+签入+置空闲,页面加载完毕,首次签入需调用该方法,
 * 调用完成后坐席进入空闲状态(需要在onInit钩子方法执行之后才可以调用)
 *
 * @param loginSkillGroupArray 从接口`ListSkillGroupsOfUser`得到坐席的技能组列表信息
 * @param accessPoint 从接口`GetTurnServerList`获取的数组对象的`region`,
 * 必须和接口`region`保持一致,否则不能切换成功,自动传`default`,sdk内部实现选择最近的接入点。
 * @param deviceType 设备类型,可选参数,当坐席注册了SIP话机,可设置参数为`1`,指定SIP话机上线。
 * @param mode 登录模式
 * @param breakReason 小休模式上线的时候的小休原因
 */
function register(
    loginSkillGroupArray?: any[],
    accessPoint?: string,
    deviceType?: number,
    mode?: LoginMode,
    breakReason?: string,
  ): void;
  
 /**
  * 登录后的状态
  * `normal`: 正常登录状态
  * `invisibility`: 隐身登录状态
  * `break`: 小休状态
  */
 type LoginMode = 'normal' | 'invisibility' | 'break';
  • logIn(loginSkillGroupArray)

/**
 * 签入(处于签出状态可调用,状态为`1`),调用该方法实现上线操作
 *
 * @param loginSkillGroupArray 从接口`ListSkillGroupsOfUser`得到坐席的技能组列表信息
 * @param mode 登录模式
 * @param breakReason 小休模式上线的时候的小休原因
 */
logIn(loginSkillGroupArray?: any[], mode?: LoginMode, breakReason?: string): void;
  • logOut()

签出,调用该方法实现下线操作
  • ready()

置空闲、通过该方法可变为空闲状态,空闲状态后可接听、拨打电话。
  • applyForBreak(breakReason, callback)

/**
 * 申请小休,设置后来电将不会转到当前坐席,会转到其他空闲的坐席人员。
 *
 * @param breakReason 默认是`default`,可自定义小休原因,方便统计不同的小休类型
 * @param callback 调用成功后的回调函数
 */
applyForBreak(breakReason?: string, callback?: (e?: any) => void): void;
  • applyForCallOnly(isCallOnly)

/**
 * 设置是否仅外呼。如果为true,则坐席不会有电话呼入。(请使用 changeVisibility 代替)
 *
 * @param isCallOnly 是否仅外呼
 */
applyForCallOnly(isCallOnly: boolean): void;
  • changeVisibility(invisible) 「version-workbench: 2.12.2」

/**
 * 隐身模式切换。如果为true,则坐席不会有电话呼入,(效果跟仅外呼一致)
 *
 * @param invisible 是否为隐身模式
 */
changeVisibility(invisible: boolean): void;
  • applyForOnSite()

设置场内模式。当坐席为场外模式时,可调用此方法设置场内模式后再调logIn方法上线。
  • applyForOffSite()

设置场外模式。当坐席空闲时,可调用此方法设置场外模式,即手机接听。
  • applyForOffSiteDirectly()

直接设置场外模式,不显示弹窗确认。当坐席空闲时,可调用此方法设置场外模式,即手机接听。
  • getStatusCode()

/**
 * 获取坐席当前状态码。
 */
getStatusCode(): {
  /**
   * 当前状态
   */
  code: number;
  /**
   * 上一次状态
   */
  lastCode: number;
};
  • hangUp(releaseJobId, releaseChannelId, callback)

/**
 * 挂断,通过该方法可结束通话。
 *
 * @param releaseJobId 可挂断指定通话。如果不传,则挂断当前通话。
 * @param releaseChannelId 可挂断指定通话中的指定方。如果不传,则挂断当前通话。
 * @param callback 调用成功后的回调函数
 */
hangUp(releaseJobId?: string, releaseChannelId?: string, callback?: (e?: any) => void): void;
  • answer(callback)

接听电话,通过该方法可接听来电,建立通话连接。
callcallback: 调用成功后的回调函数,参数类型为Function
  • call(callee, caller, callback, otherParams)

拨打电话

callee:被叫号码,必传,数据类型是String
caller:主叫号码,可以指定主叫号码;
           也可以不传,或者传''或者‘auto’,根据外呼的号码的归属地选择与其同一归属地的主叫号码,
           若没有同一归属地的就随机在坐席绑定的外呼号码列表中随意选择一个;
callcallback: 调用成功后的回调函数,参数类型为Function
otherParams: 可选参数,发起外呼时,可增加一些参数,目前支持的参数有:
  {
    TimeoutSeconds: 超时时间,呼叫在经过该参数指定的时间仍然未接通的情况下,则主动挂断。参数类型为Number
    Tags: 随路数据。参数类型为String。
    MaskedCallee: 脱敏后的被叫号码,例如"1318888****"。参数类型为String。
  }
  • stayAfterCall

保持话后处理状态(与通话结束,点击话后处理按钮效果一致)
  • sendDtmf(number, jobId, channelId, callback)

不传 jobId和channelId 时,第二个参数为可为callback

/**
 * DTMF按键交互,发送dtmf。
 *
 * @param number 可为0~9,*或#
 * @param callback 调用成功后的回调函数
 */
sendDtmf(number: string|number, callback?:(e:any) => void)

/**
 * DTMF按键交互,发送dtmf。
 * 三方通话时,必须要传 jobId 和 channelId
 *
 * @param number 可为0~9,*或#
 * @param jobId 当前话务的 jobId
 * @param channelId 需要发送dtmf的 chennelId (可从 callContext 里面获取)
 * @param callback 调用成功后的回调函数
 */
sendDtmf(number: string|number, jobId?: string, channelId?: string, callback?:(e:any) => void)
  • callHold(callback)

通话保持,通过该方法可使通话进行保持,客户端听到的是一段音乐,坐席端说话客户端无法听到。
callcallback: 调用成功后的回调函数,参数类型为Function
  • callRetrieve(callback)

通话取回,通过该方法结束通话保持的状态,重新建立客户端和坐席端的通话。
callcallback: 调用成功后的回调函数,参数类型为Function。
  • muteAgent()

通话中静音
  • unMuteAgent()

取消通话中静音
  • changeVolumeInCall(volumeInCall)

/**
 * 改变通话中的音量
 *
 * @param volumeInCall 值为[0, 1]的小数
 */
changeVolumeInCall(volumeInCall: number): void;
  • changeRingToneVolume(volumeInCall)

/**
 * 改变来电振铃时的音量
 *
 * @param volumeInCall 值为[0, 1]的小数
 */
changeRingToneVolume(volumeInCall: number): void;
  • thirdCallTransfer(callee, caller, callback) 「version-workbench: <2.13.1」

  • thirdCallTransfer(params) 「version-workbench: >=2.13.1」

/**
 * 通话过程中直接转接,A和B通话,将通话直接交给C
 *
 * @param params.callee 被叫号码 | 技能组ID
 * @param params.caller 主叫号码
 * @param params.callPriority 转接优先级,在转接技能组的时候可以传入,0-9(默认0 最高优先级)
 * @param params.strategyName 转接到技能组队列时的座席分配策略名称
 * @param params.strategyParams 转接到技能组队列时的座席分配策略参数
 * @param params.timeoutSeconds 直接转接超时时间,超过指定时间被转接方没有接起通话,则挂断通话,此字段选填,默认 30,单位秒
 * @param params.callback 调用成功后的回调函数
 *
 * @description
 * ```text
 * 转接给坐席
 * callee:坐席分机号
 * caller: ''
 *
 * 转接给外部电话
 * callee:手机号
 * caller:'auto'
 *
 * 转接给指定技能组
 * callee:技能组ID
 * caller:''
 * ```
 */
thirdCallTransfer(params: {
    callee: string;
    caller?: string;
    callPriority?: number;
    strategyName?: string;
    strategyParams?: string;
    timeoutSeconds?: number;
    callback?: Callback;
  }): void;
  • initiateAttendedTransfer(callee, caller, callback)「version-workbench: <2.13.1」

  • initiateAttendedTransfer(params) 「version-workbench: >=2.13.1」

/**
 * 通话过程中咨询转接,A和B通话,咨询C,咨询过程中A等待
 *
 * @param params.callee 被叫号码 | 技能组ID
 * @param params.caller 主叫号码
 * @param params.callPriority 转接优先级,在转接技能组的时候可以传入,0-9(默认0 最高优先级)
 * @param params.strategyName 转接到技能组队列时的座席分配策略名称
 * @param params.strategyParams 转接到技能组队列时的座席分配策略参数
 * @param params.timeoutSeconds 直接转接超时时间,超过指定时间被转接方没有接起通话,则挂断通话,此字段选填,默认 30,单位秒
 * @param params.callback 调用成功后的回调函数
 *
 * @description
 * 
 * 转接给坐席
 * callee:坐席分机号
 * caller: ''
 *
 * 转接给外部电话
 * callee:手机号
 * caller:'auto'
 *
 * 转接给指定技能组
 * callee:技能组ID
 * caller:''
 */
initiateAttendedTransfer(params: {
    callee: string;
    caller?: string;
    callPriority?: number;
    strategyName?: string;
    strategyParams?: string;
    timeoutSeconds?: number;
    callback?: Callback;
  }): void;
  • thirdCallRetrieve(callback)

三方通话取回,回到原来的通话,A和B通话,咨询C,咨询完成回到A和B通话。
callcallback: 调用成功后的回调函数,参数类型为Function。
  • thirdCallTransferFinished(callback)

三方咨询通话过程中转移通话,A和B通话,咨询C,咨询完成回到A和B通话,实现A和C通话。
callback: 调用成功后的回调函数,参数类型为Function。
  • switchToConference(jobId)

    /**
     * 咨询通话转会议(多方通话)
     * 
     * @param jobId 通话 id
     */
    switchToConference(jobId?: string): void;
  • startConference(participantListJson, otherParams)

    /**
     * 发起会议
     *
     * @param participantListJson 会议通话的另外两方,坐席的话传坐席的分机号,传参类型 `JSON.stringify(['1234567', '7654321'])`
     * @param otherParams 其他参数
     *
     * @example
     * ```js
     * startConference(JSON.stringify(['1234567', '7654321']))
     * ```
     */
    startConference(participantListJson: string, otherParams?: Record<string, any>): void;
  • monitor(userId, callback)

/**
 * 监听方法
 *
 * @param userId 坐席的ID
 * @param callback 调用成功后的回调函数
 */
monitor(userId: string, callback?: (result?: any) => void): void;
  • bargeIn(userId, jobId, callback)

/**
 * 强插方法。成功后,转入三方会议模式。
 *
 * @param userId 坐席的ID
 * @param jobId 要插入的通话ID
 * @param callback 调用成功后的回调函数
 */
bargeIn(userId: string, jobId?: string, callback?:(result?: any) => void): void;
  • intercept(userId, jobId, callback)

/**
 * 强拆方法,成功后,原坐席被踢出通话,新插入坐席与客户通话。
 *
 * @param userId 坐席的ID
 * @param jobId 要插入的通话ID
 * @param callback 调用成功后的回调函数
 */
intercept(userId: string, jobId?: string, callback?: (e?:any) => void): void;
  • coach(userId, jobId, callback)

/**
 * 辅导方法。管理员和技能组组长可以辅导坐席与客户通话。
 * 成功后,客户只能听到初始坐席的声音,被辅导坐席可以同时听到客户和辅导者的声音。辅导者可以同时听到客户和坐席的声音。
 *
 * @param userId 坐席的ID
 * @param jobId 要辅导的通话ID
 * @param callback 调用成功后的回调函数
 */
coach(userId: string, jobId?: string, callback?: (e?:any) => void): void;
  • agentToAgent(userDN, callback)

/**
 * 内部通话方法
 *
 * @param userDN 坐席的分机号,为8位数字
 * @param callback 调用成功后的回调函数
 */
agentToAgent(userDN: string, callback?: (e:any) => void): void;
  • transferStatisfic(contactFlowId)

/**
 * 发送语音满意度,或者转其他IVR流程。
 *
 * @param contactFlowId 如果不传,则发起已配置的语音满意度流程。也可以传入指定IVR流程ID,发起指定IVR流程。发起IVR流程后,当前坐席被挂断。
 */
transferStatisfic(contactFlowId?: string): void;
  • launchShortMessageAppraise()

发送短信满意度,只有在话后处理状态下可用。
  • launchShortMessageMissedCall()

发送漏话短信,只有在拨号状态时可用。
  • launchAuthentication(contactFlowId, contactFlowVariables, callback)

/**
 * 发送指定IVR流程,当前坐席不被挂断。
 *
 * @param contactFlowId 发起指定IVR流程的ID
 * @param contactFlowVariables 给 IVR 流程传参,可在开始节点中定义同名参数获取
 * @param callback 核身接口调用成功的回调
 */
launchAuthentication(
  contactFlowId: string,
  contactFlowVariables?: Record<string, string | number>,
  callback?: (e: any) => void,
): void;
  • forceToPrepareSignIn()

 如果注册时收到7001错误,即已有设备在线,可以调用此方法继续注册。成功后会把原有设备踢下线。
  • testTurnServers(args)

测试云呼坐席接入点的时间。args的参数形式为:

accessPoint: 可以只测某个接入点的值。不传为测试当前所有接入点
currentFrequence: 测试几次。不传为1次,参数类型为Number
callback: (res) => { 在这里得到接入点结果 }
  • switchAccessPoint(accessPoint)

切换坐席接入点,accessPoint为从接口GetTurnServerList获取的turnServerListConfig数组对象的region,
必须和接口region保持一致,否则不能切换成功,自动传’default’
  • getSoftPhoneDeviceId()

获取当前软电话id。可以根据此值进行MakeCall接口调用
  • getAudioDeviceList(callbackFunction)

获取当前麦克风和耳机列表
  • setAudioInputDevice(device_id)

设置麦克风设备
  • setAudioOutputDevice(device_id)

设置耳机设备
  • cancelAutomaticCallRelease

取消外呼智能挂机设置(“设置-坐席工作台-坐席接听-外呼智能挂机”中配置)的自动挂机操作
  • getRemoteMediaStream

/**
 * 获取远程媒体流,可以自定义媒体播放
 */
getRemoteMediaStream(): Promise<MediaStream>;
  • getSkillGroups

/**
 * 获取技能组
 */
getSkillGroups(): {
  /**
   * 上线时已选择的技能组列表
   */
  chooseSkillGroupList:  ListSkillLevelsOfUser[]
  /**
   * 坐席当前所属技能组列表 (ListSkillLevelsOfUser 接口返回)
   */
  allSkillGroupList:  ListSkillLevelsOfUser[]
}

interface ListSkillLevelsOfUser {
  /**
   * 技能组ID
   */
  skillGroupId: string;

  /**
   * 技能组名称
   */
  skillGroupName: string;

  /**
   * 技能组等级
   */
  skillLevel: number;
}
  • renderIM

IM组件渲染,需要加载对应IM组件的css和js文件
在onLogin及之后的钩子函数中调用
  • unmontIM

IM组件卸载,需要加载对应IM组件的css和js文件
在onLogOut钩子函数中调用以卸载IM组件

六、服务端准备工作

因为软电话SDK是嵌入到了您的自有业务系统中,在软电话SDK的使用过程中,会发起多个请求到自有业务系统的服务端,请求的调用地址可以通过四、config可选配置中的ajax相关配置来设置。需要将软电话SDK发出的请求经过您的服务端转发到云呼叫中心的服务端(也就是调用云呼叫中心的openAPI),然后将返回结果透传回软电话SDK中即可。详细步骤如下:

  • 可以通过AK/SK方式请求接口,或通过oauth2方式请求接口

  • 转发sdk发的请求到云呼叫中心服务端,根据 简介调用对应openAPI,将返回结果透传回软电话SDK即可,软电话SDK所需的返回结果必须是JSON数据格式。

  • 坐席,技能组等需要在阿里云云呼叫中心控制台进行配置,否则无法正常工作;

类型

接口

描述

业务接口

GetLoginDetails

获取坐席的登录信息

GetUser

获取坐席的信息

ListSkillLevelsOfUser

坐席的技能组信息

ListOutboundNumbersOfUser

坐席的外呼号码

ListConfigItems

坐席工作台配置信息

GetTurnServerList

获取云呼提供的turn服务接入点

ListPrivilegesOfUser

坐席的权限列表

GetTurnCredentials

Turn服务的账号密码

ListDevices

登录的设备信息

PickOutboundNumbers

自动选择外呼号码

GetNumberLocation

查询号码归属地

ListRealtimeAgentStates

查询当前坐席的状态列表(转接功能)

ListAgentStates

查询当前的坐席列表(监听功能)

ResetAgentState

重置坐席状态

ListRecentCallDetailRecords

查询通话记录

ListSkillGroups

获取技能组,只有admin有权限

ListBriefSkillGroups

转接的技能组列表

ListHistoricalAgentReport

获取坐席我的工作数据

SaveTerminalLog

给服务端上报错误日志

SignInGroup

技能组登录

PollUserStatus

轮询获取用户状态

LaunchAuthentication

核验身份

ChangeVisibility

切换隐身

话务操作相关接口

SignOutGroup

退出

TakeBreak

小休

ReadyForService

置空闲

MakeCall

拨打电话

AnswerCall

接听电话

ReleaseCall

挂电话

HoldCall

通话保持

RetrieveCall

通话取回

BlindTransfer

直接转接

InitiateAttendedTransfer

发起咨询转接

CompleteAttendedTransfer

咨询转接转移通话

CancelAttendedTransfer

取消转接

SendDtmfSignaling

发送DTMF按键

MonitorCall

发起监听

BargeInCall

监听状态下强插

InterceptCall

监听状态下强拆

Coach

监听状态下辅导

MuteCall

静音

UnmuteCall

取消静音

LaunchSurvey

发送语音满意度

ChangeWorkMode

切换工作模式

RedialCall

回拨电话(通过jobId回拨,一般在号码加密的情况下调用)

七、开发错误、操作逻辑错误

SDK会抛出两种类型的错误:开发错误、操作逻辑错误。建议您在开发时配置onErrorNotify钩子并打印参数,方便排查问题并将相关错误抛出给客户,方便问题排查。

  1. 开发错误:简单的说就是可以通过修改您的代码来修复的错误,是稳定重现的,这一类型的错误常见的有配置参数类型出错、调用sdk方法未按照状态约束表进行。比如配置项onInit要求是一个方法,但是却传入了一个字符串,那么sdk会直接执行如下代码,遇到这样的错误js执行被打断,必须要根据错误提示先进行修复

  2. 操作逻辑错误:这一类错误是用户在使用呼叫中心过程中一些操作不当造成的错误,不一定是稳定重现的,这一类型的错误常见的有未允许浏览器对本域名开启声卡权限、账号在别处登录、客服不在任何技能组中、呼叫中心网络错误等。这类错误sdk会调用onErrorNotify方法通知外部系统,钩子函数onErrorNotify中的所有情况:

  5001: '外呼失败',
  5002: '您尚未被加入到技能组中,暂时无法使用,请联系呼叫中心管理员添加',
  5003: '技能组信息异常',
  5004: '请检查坐席是否在通话中,并且设置了语音满意度流程',
  5005: '当前WebSocket连接缓慢,请等待或刷新后重新上线',
  5006: '请检查坐席是否在通话中,并且传入IVR流程ID',
  6001: '没有通话Channel信息',
  6002: '没有通话ChannelID',
  6010: 'sip会话尚未建立',
  7001: '已有设备注册,软电话未初始化', // 初始化sip之前检测出有设备,可以让客户选择是否登录
  7002: '已有设备注册,软电话初始化异常, 请刷新页面', // 初始化sip之后,注册设备和sip不一致,报错
  7003: '无法获取接入点信息',
  7004: '接入点测速失败',
  7005: '请使用http协议',
  7006: '浏览器不满足要求',
  7007: '现在有新设备上线,请检查',
  7008: 'SIP话机不在线',
  9001: '当前状态不能执行此操作',
  9002: '参数异常',
  9003: '执行失败',
  9004: '软电话已初始化好',
  9005: '请先调用PrepareSignIn方法',
  9006: '下线失败',
  9007: '网络连接失败',
  9008: '缺少登录信息',
  9009: '主叫为空',
  9010: '无可用主叫',
  9012: '被叫为空',
  8001: '请检查声卡权限', // 提示设备异常的界面
  8002: '请检查声卡权限', // 提示设备异常的界面
  8003: '已在通话中',
  8011: '检测到通话网络断开,请检查网络后,重新建立通话',
  /* 以下为迁出的event事件 */
  stream_local_refused: '浏览器无麦克风权限,请刷新页面',
  get_lo_failed: '无法获取本地媒体流,请切换接入点到上海',
  PollUserStatusErrorNotify: '无法获取坐席状态,请重新登录',

注:

7001错误中返回值事例:
{
  errorCode: 7001,
  errorMsg: {
     callId: '7089e388-b2db-e3b2-e4c2-572faf77c4d7',
     contact: 'sips:80001012@100.104.xx.xxx:15646;rtcweb-breaker=yes;transport=wss',
     deviceId: 'CCC-30.240.xx.xxx-chrome99-bs82ea17f7804263c',
     extension: '80001010',
     instanceId: 'ABC',
     userId: 'abc@ABC',
     userState: 'DIALING',
  },
  errorMsgTip: '已有设备注册,软电话未初始化'
}
参数说明:
deviceId:当前已登录的设备ID
userState:当前已登录设备状态。目前有以下状态:{
  TALKING: '通话中',
  DIALING: '拨号中',
  RINGING: '振铃中',
  WORKING: '话后处理',
  READY: '空闲',
  BREAK: '小休',
  OFFLINE: '下线',
}

当收到7001错误时,可调用forceToPrepareSignIn接口继续注册,并把原设备踢出。

5001错误中返回的errorMsg是外呼失败所对应的sip code,errorMsgTip是sip code所对应的语义翻译。
不同号码运营商所对应的sip code可能有所差异,这里列出常见sip code关系表:
{
  100: '正在呼叫中',
  180: '被叫正在振铃',
  181: '呼叫被转发',
  182: '正在排队中',
  183: '正在处理中',
  200: '成功',
  300: '多重选择,请求的地址有多个选择',
  301: '地址永久不可用,呼叫已重定向',
  302: '地址临时不可用,呼叫已重定向',
  305: '请求的资源必须通过Contact头域中指定的代理服务器访问',
  380: '替代服务,呼叫不成功,可以尝试另外的服务',
  400: '呼叫请求格式非法或语法错误',
  401: '用户未授权,需要进行用户认证',
  402: '需要付费才能完成会话',
  403: '服务器拒绝提供服务',
  404: '用户不存在,用户在Request-URL指定的服务器上不存在',
  405: '请求的方法不允许',
  406: '请求的资源只对某些特殊请求作出响应,对当前请求不接受',
  407: '需要进行用户认证',
  408: '请求超时,服务器未在规定时间内产生应答',
  409: '请求和当前资源状态产生冲突,请求不能被处理',
  410: '请求的资源在服务器上不存在且无法转发',
  411: '拒绝接受没有定义Content长度的请求',
  413: '请求太大,超出服务器处理上限',
  414: '请求URL太长,服务器拒绝请求',
  415: '服务器不支持请求的消息体格式,拒绝处理该请求',
  416: '不支持的URL计划',
  420: '服务器无法理解在Header中指出的扩展协议',
  421: '服务器需要特定的扩展来处理该请求,但扩展没有在请求中列出',
  423: '间隔太短,服务器在请求中设置的资源刷新时间(或者有效时间)过短',
  480: '被叫已联系上,但被叫方当前不可用',
  481: '服务器已接收到请求,但无法和现存的对话或事务匹配',
  482: '发现环路,服务器检测到一个循环',
  483: '跳数太多,请求包含的Max-Forwards头域为0',
  484: '服务器接收到请求,但Request-URL不完整',
  485: '请求的Request-URL不明确',
  486: '被叫已联系上,但被叫或运营商繁忙,暂时无法处理额外的呼叫',
  487: '请求终止,请求被BYE或CANCEL所终止,常见于主叫方主动取消呼叫的场景',
  488: '被叫无法接受请求,通常是媒体协商失败导致',
  491: '未决请求,在同一会话中,服务器收到的请求有一个依赖的请求正在处理',
  493: '不可辨识,服务器收到的请求包含一个加密的MIME,并且不知道或者没有提供合适的解密密钥',
  500: '运营商服务器内部错误',
  501: '运营商服务器没有实现相关的请求功能',
  502: '运营商服务器从下游服务器接收到一个非法的应答',
  503: '运营商服务器由于超负载或维护问题,暂时不能处理请求',
  504: '运营商服务器请求超时',
  505: '运营商服务器不支持请求中用到的SIP协议版本',
  513: '运营商服务器无法处理超过指定长度的消息',
  600: '被叫已联系上,但被叫处于忙状态,不打算接听电话',
  603: '被叫已联系上,但被叫明确不想应答或者不能加入通话,常见于被叫拉黑主叫的场景',
  604: '被叫离线,被叫不存在于网络中',
  606: '被叫已联系上,但会话描述的某些方面不被接收,媒体协商失败',
}

八、状态对照表及状态说明

状态码

描述

操作

可允许调用的接口

-1

未注册

当前状态只能操作register

register

0

注册中

register

1

离线

上线

logIn, applyForOffSite, forceToPrepareSignIn

2

小休

置空闲,仅外呼,下线

ready, applyForCallOnly, changeVisibility,

logOut

3

空闲

下线、外呼、接听,发起监听,会议

logOut, agentToAgent, call, monitor, applyForBreak, applyForCallOnly,bargeIn, intercept, coach, startConference

4

仅外呼

下线、外呼、接听、发起监听、会议、置空闲

logOut, agentToAgent, call, monitor, applyForBreak,changeVisibility, ready,bargeIn, intercept, coach, startConference

5

话后处理

置空闲

logOut, applyForBreak, ready, call, launchShortMessageAppraise, applyForCallOnly, applyForOffSite

6

振铃

接听

answer

7

IM正在工作中

8

拨号

挂断

hangUp,sendDtmf

9

呼入通话

挂断

hangUp, callHold, callRetrieve, sendDtmf, muteAgent, umMuteAgent, transferStatisfic, launchAuthentication, thirdCallTransfer, initiateAttendedTransfer

10

呼出通话

挂断

hangUp, callHold, callRetrieve, sendDtmf, muteAgent, umMuteAgent, transferStatisfic, launchAuthentication, thirdCallTransfer, initiateAttendedTransfer

11

内部通话

结束通话

hangUp, callHold, callRetrieve, sendDtmf, muteAgent, umMuteAgent

12

通话保持

取消通话保持

callRetrieve

16

发起三方

通话取回、取消三方通话

thirdCallRetrieve

17

咨询通话

取消咨询通话、咨询通话转移

thirdCallRetrieve, thirdCallTransferFinished, sendDtmf, switchToConference

19

会议

坐席由空闲状态发起会议

hangUp, sendDtmf

20

被动求助

挂断

hangUp

21

监听

挂断

hangUp

24

发起监听,还未监听成功

25

强插,进入三方通话

挂断

hangUp

26

耳语坐席,进入三方通话

挂断

hangUp

30

会议中坐席状态变化

例如有人退出会议,或者有人进入会议

hangUp, transferStatisfic

九、多标签页外呼使用要点

使用场景

做了CRM系统集成的用户,可以使用我们的sdk界面进行外呼,但是也存在一些用户需要在其他页面,比如一些用户名单列表或用户详情页面通过点击按钮进行外呼,这时就需要在该页面进行sdk注册,但是我们的sdk是不支持多标签注册的,因此我们提供了这样的方案:在注册过sdk的标签页监听其他标签页localstorage的变化,在其他标签页设置localstorage来实现外呼。

使用方法

  1. 设置配置项useLocalStorageToCall为true

  2. 首先所有标签页都要在一个浏览器中,要求只有一个标签页注册WorkbenchSdk,并保持该标签页的登录状态。

  3. 其他标签页拨打电话时设置一个localstorage(如果拨打电话页和注册页处于同一标签页,该方法将无法监听到,导致电话拨打不出去),key为workbenchSdkCall,value为{callee: ‘1558888****’, caller: ‘05712823****’, random: 0.234234234}。其中caller的值具体设置参照上面sdk方法中call(callee, caller)的规定,设置成功以后,当注册过WorkbenchSdk的标签页监听到localstorge的workbenchSdkCall变化时,便自动外呼电话:

    const value = {
      callee: "1558888****",
      caller: "05712823****",
      publicKey: "",
      useVirNumCall: true,
      random: Math.random(),
    };
    localStorage.setItem("workbenchSdkCall", JSON.stringify(value));
    
  4. 在其他标签页挂断电话时,需设置一个key为workbenchSdkHangup,value为一个随机数的localstorage,便自动挂断电话

     localStorage.setItem('workbenchSdkHangup',  Math.random())
  5. 可通过localStorage.getItem('workbenchSdkStatus')来查询当前workbench状态码,当值为3,4,5时才可以外拨号码;当值为8,9,10,11,12,21时才可挂断电话。

十、对比1.0sdk文档的更新

一、前端资源地址有变化

二、config必选配置项

  • instanceId数据来源有变化,为呼叫中心填写的唯一域名

  • 新增regionId配置,删除useOpenApiSdk参数

三、config可选配置

  • 前端请求资源的路径配置为${ajaxOrigin}${ajaxPath}${ajaxApiParamName}=${apiName}&product=CloudCallCenter&version=2020-07-01&region=${regionId}

  • 回调函数onCallComing、onBeforeCallDialing、onCallDialing、onBeforeCallHangup、onCallEstablish、onErrorNotify、onStatusChange返回的参数都统一为对象格式,具体见文档说明

  • 删除enableRecord配置项

四、SDK方法

  • 离线坐席手机功能放到了坐席管理,通过后端接口修改坐席工作模式,不在前端SDK中提供了

五、服务端准备工作,新增了话务相关的接口,详见上方文档说明

六、错误的code码

  • 减少了双登相关的错误码、2.0如果发现有坐席登录,提示已有设备在线,并列出设备id,请坐席确认

七、状态说明

  • 小休状态码变成了2

十一、更新日志

2024-03-01

Workbench: 2.14.1

Agentbar: 2.3.1

Bug Fixes

  • 修复状态从3-5后,不自动空闲

  • 修复浏览器通知点击后聚焦到当前工作页面

Features

  • 【云呼叫中心】更名为【云联络中心】

  • 新增通话记录中可拉黑号码操作,该操作需要在打开【设置-坐席工作台-坐席配置-是否允许坐席拉黑号码】配置

  • 漏话短信支持在多条短信模板中选择一个发送

  • 添加IM组件,添加imConfig配置项,添加renderIMunmountIM两个方法(具体使用方式请查看上方文档)

  • 新增状态7,为IM工作中的状态

2024-01-09

Workbench: 2.13.1

Agentbar: 2.2.0

Bug Fixes

  • onHangUp 钩子函数添加internalcall(内部通话)type类型

Features

  • 优化thirdCallTransferinitiateAttendedTransfer方法的传参方式,添加strategyNamestrategyParamstimeoutSeconds参数

  • 添加隐藏界面上预测式外呼变量字段,在坐席控制台-设置-坐席工作台配置中设置

2023-11-08

Workbench: 2.12.2

Agentbar: 2.1.2

Bug Fixes

  • 修复处于场外模式在onInit的时候调用register上线时,并没有以场内模式上线

Features

  • 新增 defaultLastSelectedCallerNumber 配置参数,主叫号码,默认选中上次选择的

  • 仅外呼名称更改为隐身,在除下线状态外的其他状态,都可切换隐身,隐身模式的作用跟仅外呼一致(数据报表目前还是仅外呼,仅SDK目前做了更改,后续数据报表也会同步更改

  • 新增业务接口 ChangeVisibility 切换隐身

  • 新增 SDK 实例方法 changeVisibility主动切换隐身

  • 新增 isLoggedInvisibility 配置参数,登录后保持隐身

  • register方法新增 modebreakReason参数,具体可查看register方法说明

  • logIn方法新增 modebreakReason参数,具体可查看logIn方法说明

2023-09-20

Workbench: 2.11.0

Agentbar: 2.0.3

Bug Fixes

  • 修复在SIP WebSocket断线重连时导致通话也被中断

2023-08-21

Workbench: 2.11.0

Agentbar: 2.0.2 (从当前版本开始,不需要再加载SIPml资源)

Performance Improvements

  • 优化底层sip连接逻辑,去除SIPml js资源加载

2023-06-30

Workbench: 2.11.0

Agentbar: 1.15.1

SIPml: 0.6.2

Bug Fixes

  • 上线时技能组选择不能超过36个,限制保持跟后端一致

Features

  • 技能组转接时可以选择转接策略

  • 添加ice协商失败的错误处理(8011 错误码)

2023-05-25

Workbench: 2.10.1

Agentbar: 1.14.4

SIPml: 0.6.1

Bug Fixes

  • 兼容某些移动端HTMLMediaElement.setSinkId方法不存在,导致上线失败的问题

  • 在卸载软电话的时候移除Audio元素,修复上下线后设置设备时不生效的问题

  • umMuteAgent改为unMuteAgentumMuteAgent仍然可用但是会在后续某个版本会删除

Features

  • changeVolumeInCall方法,可以将音量设置到0和1

  • 新增 getRemoteMediaStream方法,可以在通话中获取远程媒体流

  • 优化接入点测速逻辑

2023-04-11

Workbench: 2.10.0

Agentbar: 1.14.2

SIPml: 0.6.1

Bug Fixes

  • 修复自动加载日志配置文件,在某些特殊环境中失败的问题(微前端等场景)

  • 修复强插操作时,在某些情况下会接听不了的问题

  • 优化挂机的sip code和sip msg

  • 优化 sip token 过期刷新机制,解决长时间下线状态再上线时失败的问题

  • 修复在通话保持时被监听,通话取回失败的问题

  • 上线时技能组选择不能超过36个,限制保持跟后端一致

  • 优化同浏览器多tab页,多次相互踢登的问题

Features

  • 转接技能组时添加优先级选择

2023-03-21

Workbench: 2.8.3

Agentbar: 1.12.1

SIPml: 0.6.0

Bug Fixes

  • 修复 onErrorNotify 钩子函数中,errorMsg和errorMsgTip参数传值错误的问题,应该是字符串但是传了对象(该错误在2.7.0版本开始出现,此版本修复)

Features

  • 优化日志系统,删除不必要的日志记录上传,减少网络带宽

2023-02-28

Workbench: 2.8.1

Agentbar: 1.12.0

SIPml: 0.5.0

Features

  • 拨打未接通原因sipCode详情展示

2022-12-13

Workbench: 2.8.0

Agentbar: 1.12.0

SIPml: 0.5.0

Features

  • 新增外呼智能挂机功能,可在云呼控制台“设置-坐席工作台-坐席接听-外呼智能挂机”中开启,开启后根据设置的时间倒计时后自动挂机,振铃音智能识别出来的信息在5001错误的 errorMsgTip字段中返回,onAfterEarlyMediaRecognized钩子方法得到早媒体信息,cancelAutomaticCallRelease手动取消自动挂机

  • 新增自定义通话保持音乐,可在云呼控制台“设置-坐席工作台-坐席接听-通话保持音乐”中设置

  • 在小休状态也可以调用applyForCallOnly方法

Performance Improvements

  • 优化 reRender 方法,避免在部分情况下导致旧的挂载组件仍然存在

2022-11-18

Workbench: 2.7.0

Agentbar: 1.11.0

SIPml: 0.5.0

Bug Fixes

  • 后台自动签出,前端再次上线时报9004

  • 中文用户名注册失败

Features

  • 添加允许拒接来电操作,云呼叫中心控制台“设置-坐席工作台-坐席接听”中设置“允许拒接来电”

  • 优化部分API请求报错的错误提示

Performance Improvements

  • 项目整体体积减小,提升加载效率

2022-10-10

Workbench: 2.6.1

Agentbar: 1.10.0

SIPml: 0.5.0

Bug Fixes

  • 在话后处理时,切换tab导致通话时间丢失

Features

  • 在面板中操作小休,添加小休状态选择,可在云呼叫中心控制台“设置-坐席工作台-坐席配置”中设置“小休状态细分配置”

  • 切换场外模式时,可进行技能组的选择

Performance Improvements

  • 选号逻辑提供降级机制,当自动选号接口失败时,开启随机选择号码,不影响拨打操作

  • AnswerCall接口增加容错能力,AnswerCall和Sip接听解耦,在非SIP话机模式登录时,AnswerCall接口调用失败,不影响客户的接听操作

2022-08-31

Workbench: 2.5.0

Agentbar: 1.9.0

SIPml: 0.5.0

Features

  • 添加 changeRingToneVolume方法,改变来电响铃的音量

  • 咨询通话的时候增加拨号盘功能

  • 样式优化,部分地方显示异常修复

BreakingChanges

  • 当在云呼叫中心控制台“设置-坐席工作台-坐席接听”中设置了外呼或来电号码隐藏时,为了数据安全考虑,坐席权限的用户,后端接口返回的是脱敏号码,通话记录中点击拨打按钮会调用 RedialCall 接口,不再调用MakeCall接口,请尽快升级到此版本或以上版本,未升级的用户可能出现拨打失败的情况。

2022-07-27

Workbench: 2.4.4

Agentbar: 1.8.1

SIPml: 0.4.1

Bug Fixes

  • 切换左侧导航栏导致呼出tab选中的主叫号码不显示

Features

  • 添加onSelectCurrentCallRecord钩子函数,在通话记录中点击返回当前点击的通话记录信息

  • 添加isOutboundNotReceivedToBeProcessed配置参数,可使呼出电话且未接通可以到话后处理倒计时状态

  • 添加stayAfterCall实例方法,保持话后处理状态(与通话结束,点击话后处理按钮效果一致)

  • 优化 unloadWorkbench卸载实例方法

2022-06-29

Workbench: 2.4.3

Agentbar: 1.8.1

SIPml: 0.4.0

Bug Fixes

  • 呼入通话,咨询转接外部通话后转移通话,咨询者报错问题修复

2022-06-28

Workbench: 2.4.2

Agentbar: 1.8.1

SIPml: 0.4.0

Bug Fixes

  • 优化浏览器版本判断逻辑

  • 修复在某些情况下不刷新页面更换用户登录,钩子函数不触发的问题

Features

  • 添加isLoggedKeepBreak配置参数,在登录时保持小休状态

2022-06-21

Workbench: 2.4.1

Agentbar: 1.8.0

SIPml: 0.4.0

Bug Fixes

  • 来电技能组太长显示tooltip

  • 修复切换场外模式再立马以场内模式上线参数没有更新的问题

  • 部分通话时间累计问题修复

  • 修复 moreActionList 填写不支持的参数报错

  • 修复面板收起时主被叫号码更新不及时

  • 收缩盘样式的更改,兼容被叫号码超长的逻辑

  • 修复咨询通话-转移通话时,被叫归属地未显示,呼入时主叫来电次数和来电时间未显示

  • 修复IVRTracking中,有设置变量节点时报错

  • 修复设备检测,麦克风和耳机选择设备选择框中不显示

  • 修复呼入出现滚动条,状态图标被覆盖

  • register方法传deviceType参数为0时,弹窗还是出现

  • 缩小面板后,点击接听按钮,传参错误

  • 修复获取浏览器版本号逻辑,兼容chrom 100版本

  • 优化界面显示,提升体验

Features

  • launchAuthentication核身方法添加 contactFlowVariables变量和 callback成功回调方法

  • sendDtmf方法开放出 jobIdchannelId参数传入

  • 发送语音满意度添加loading状态

  • 来电呼入页面中添加来电技能组字段显示

  • 添加仅外呼配置

  • 添加仅外呼状态是否可以接收任何来电配置,转接和内部通话是否可以给坐席

  • SIPml 添加更多日志,方便排查问题

Performance Improvements

  • 优化 agentbar 体积,js文件减小55%,提升加载效率

  • 本页导读 (0)
文档反馈