注意:
TCCC 是加载 SDK 后的全局变量,可直接访问。
通用结构
AgentStatus
座席状态。
字段 | 描述 |
free | 空闲 |
busy | 忙碌 |
arrange | 话后整理 |
notReady | 示忙 |
rest | 小休 |
ServerType
端服务类型,描述电话类型会话时使用的端类型。
字段 | 描述 |
staffSeat | Web 座席类型 |
staffPhoneSeat | 座席手机类型 |
miniProgramSeat | 小程序类型 |
staffExtensionSeat | 话机类型 |
CommonSDKResponse
参数 | 类型 | 必填 | 备注 | |
options | status | 'success' |'error' | 是 | SDK API 调用结果,成功时返回 success,失败返回 error |
| errorMsg | string | 否 | 错误信息,当 status 为 error 时返回 |
Call(电话客服和音频客服相关接口函数)
电话呼出
tccc.Call.startOutboundCall(options): Promise<CallResponse>
CallResponse 描述如下:
参数 | 类型 | 必填 | 备注 | |
response | sessionId | String | 是 | 指定会话 ID |
| calleeLocation | String | 否 | 被叫号码归属地址 |
| calleePhoneNumber | String | 是 | 被叫号码 |
| callerPhoneNumber | String | 是 | 外呼时使用的主叫号码 |
| serverType | String | 是 | |
| remark | String | 否 | 被叫号码备注 |
接听会话
tccc.Call.accept(options): Promise<CommonSDKResponse>
参数 | 类型 | 必填 | 备注 | |
options | sessionId | String | 是 | 指定会话 ID,从 tccc.events.callIn 事件中获取 |
|
挂断会话
tccc.Call.hungUp(options): Promise<CommonSDKResponse>
参数 | 类型 | 必填 | 备注 | |
options | sessionId | String | 是 | 指定会话 ID |
|
删除会话
tccc.Call.deleteCall(options)
参数 | 类型 | 必填 | 备注 | |
options | sessionId | String | 是 | 指定会话 ID |
|
静音
tccc.Call.muteMic(options): Promise<CommonSDKResponse>
参数 | 类型 | 必填 | 备注 | |
options | sessionId | String | 是 | 指定会话 ID |
|
取消静音
tccc.Call.unmuteMic(options): Promise<CommonSDKResponse>
参数 | 类型 | 必填 | 备注 | |
options | sessionId | String | 是 | 指定会话 ID |
|
当前是否静音
tccc.Call.isMicMuted(options): Promise<CommonSDKResponse>
参数 | 类型 | 必填 | 备注 | |
options | sessionId | String | 是 | 指定会话 ID |
|
发起内部通话
tccc.Call.startInternalCall(): Promise<CommonSDKResponse>
参数 | 类型 | 必填 | 备注 | |
options | calleeUserId | String | 是 | 被叫座席账号 |
| useMobile | Boolean | 否 | 是否呼叫对方手机 |
转接会话
tccc.Call.transfer(): Promise<CommonSDKResponse>
参数 | 类型 | 必填 | 备注 | |
options | sessionId | String | 是 | 指定会话 ID |
| skillGroupId | String | 否 | 转接到指定技能组 |
| userId | String | 否 | 转接到指定座席 |
呼叫保持
tccc.Call.hold(): Promise<CommonSDKResponse>
参数 | 类型 | 必填 | 备注 | |
options | sessionId | String | 是 | 指定会话 ID |
|
取消通话保持
tccc.Call.unHold(): Promise<CommonSDKResponse>
参数 | 类型 | 必填 | 备注 | |
options | sessionId | String | 是 | 指定会话 ID |
|
发送分机号
tccc.Call.sendDigits(): Promise<CommonSDKResponse>
参数 | 类型 | 必填 | 备注 | |
options | sessionId | String | 是 | 指定会话 ID |
| dtmfText | String | 否 | 需要发送的分机号 |
Chat(在线客服相关接口函数)
接听会话
tccc.Chat.accept(options): Promise<CommonSDKResponse>
参数 | 类型 | 必填 | 备注 | |
options | sessionId | String | 是 | 指定会话 ID |
|
结束会话
tccc.Chat.end(options): Promise<CommonSDKResponse>
参数 | 类型 | 必填 | 备注 | |
options | sessionId | String | 是 | 指定会话 ID |
|
转接会话
tccc.Chat.transfer(): Promise<CommonSDKResponse>
参数 | 类型 | 必填 | 备注 | |
options | sessionId | String | 是 | 指定会话 ID |
| skillGroupId | String | 否 | 转接到指定技能组 |
| userId | String | 否 | 转接到指定座席 |
Video(视频客服相关接口函数)
接听会话
tccc.Video.accept(options): Promise<CommonSDKResponse>
参数 | 类型 | 必填 | 备注 | |
options | sessionId | String | 是 | 指定会话 ID |
|
挂断会话
tccc.Video.end(options): Promise<CommonSDKResponse>
参数 | 类型 | 必填 | 备注 | |
options | sessionId | String | 是 | 指定会话 ID |
|
静音
tccc.Video.muteMic(options): Promise<CommonSDKResponse>
参数 | 类型 | 必填 | 备注 | |
options | sessionId | String | 是 | 指定会话 ID |
|
取消静音
tccc.Video.unmuteMic(options): Promise<CommonSDKResponse>
参数 | 类型 | 必填 | 备注 | |
options | sessionId | String | 是 | 指定会话 ID |
|
关闭摄像头
tccc.Video.muteVideo(options): Promise<CommonSDKResponse>
参数 | 类型 | 必填 | 备注 | |
options | sessionId | String | 是 | 指定会话 ID |
|
开启摄像头
tccc.Video.unmuteVideo(options): Promise<CommonSDKResponse>
参数 | 类型 | 必填 | 备注 | |
options | sessionId | String | 是 | 指定会话 ID |
|
转接会话
tccc.Video.transfer(): Promise<CommonSDKResponse>
参数 | 类型 | 必填 | 备注 | |
options | sessionId | String | 是 | 指定会话 ID |
| skillGroupId | String | 否 | 转接到指定技能组 |
| userId | String | 否 | 转接到指定座席 |
Agent(座席状态相关接口函数)
上线
tccc.Agent.online(): void
下线
tccc.Agent.offline(): void
设置座席状态
tccc.Agent.setStatus(optoins): Promise<CommonSDKResponse>
参数 | 类型 | 必填 | 备注 | |
options | status | String | 是 | 座席状态,可选值: free:空闲 rest:小休 arrange:话后整理 notReady:示忙 stopNotReady:停止示忙 |
| restReason | String | 否 | 小休原因 |
获取座席状态
tccc.Agent.getStatus():AgentStatus
Devices(设备相关接口函数)
检测当前浏览器是否支持
tccc.Devices.isBrowserSupported(): boolean
说明:
TCCC Web SDK 支持 Chrome 56、Edge 80以上的浏览器。
返回麦克风设备列表
tccc.Devices.getMicrophones(): Promise<MediaDeviceInfo []>
返回扬声器设备列表
tccc.Devices.getSpeakers(): Promise<MediaDeviceInfo []>
UI(座席界面相关接口函数)
隐藏 SDK 所有 UI
tccc.UI.hide(): void
显示 SDK 所有 UI
tccc.UI.show(): void
显示浮动按钮
tccc.UI.showfloatButton(): void
隐藏浮动按钮
tccc.UI.hidefloatButton(): void
显示工作台
tccc.UI.showWorkbench(): void
隐藏工作台
tccc.UI.hideWorkbench(): void
显示通话条
tccc.UI.showNotificationBar(): void
隐藏通话条
tccc.UI.hideNotificationBar(): void
修改SDK本地设置
支持关闭SDK铃声和系统通知
tccc.UI.updateUserCustomSettings(settings): void
settings内参数都是可选项,支持增量更新
参数 | 类型 | 必填 | 备注 | |
settings | disableRingtone | Boolean | 否 | true 表示禁用 SDK 的铃声,包括来电铃声、接听铃声 |
| disableNotification | Boolean | 否 | true 表示禁用 SDK 的系统通知 |
Events(事件)
事件监听
tccc.on(event, callback)
取消事件监听
tccc.off(event, callback)
SDK 初始化完成
tccc.events.ready
当 SDK 初始化完成时触发,此时可安全调用API
callback 参数 | 类型 | 必填 | 备注 | |
options | tabUUID | String | 是 | 表示当前页面的唯一 ID,刷新后会变,用于多 Tab 集成 SDK |
会话呼入
tccc.events.callIn
会话呼入类型包括:
phone:电话会话
im:在线会话
voip:音频会话
video:视频会话
internal:内线会话
电话会话呼入
callback 参数 | 类型 | 必填 | 备注 | |
options | sessionId | String | 是 | 会话 ID |
| type | 'phone' | 是 | 电话会话类型 |
| timeout | Number | 是 | 会话接入超时时长,0代表不超时 |
| calleePhoneNumber | String | 是 | 被叫号码 |
| callerPhoneNumber | String | 否 | 主叫号码 |
| callerLocation | String | 否 | 主叫号码归属地 |
| remark | String | 否 | 备注 |
| ivrPath | {key: String, label: String}[] | - | 用户的 IVR 按键路径,key 表示对应按键,label 表示对应的按键标签 |
| protectedCallee | String | 否 | 在开启号码映射时存在,表示被叫 |
| protectedCaller | String | 否 | 在开启号码映射时存在,表示主叫 |
| serverType | 'staffSeat' | 'staffPhoneSeat' | 'staffExtensionSeat' | 是 | 表示呼入到座席哪一端,staffSeat 为默认值,表示 Web 座席;StaffPhoneSeat 表示呼入到座席手机,MiniProgramSeat 表示小程序座席,staffExtensionSeat 表示呼入到座席绑定的话机 |
在线会话呼入
callback 参数 | 类型 | 必填 | 备注 | |
options | sessionId | String | 是 | 会话 ID |
| type | 'phone' | 是 | 电话会话类型 |
| timeout | Number | 是 | 会话接入超时时长,0代表不超时 |
| nickname | String | 是 | 用户昵称 |
| avatar | String | 否 | 用户头像 |
| remark | String | 否 | 备注 |
| peerSource | String | 否 | 渠道来源 |
| channelName | String | 否 | 自定义参数 |
| clientData | String | 否 | 用户自定义参数 |
音频会话呼入
callback 参数 | 类型 | 必填 | 备注 | |
options | sessionId | String | 是 | 会话 ID |
| type | 'voip' | 是 | 音频会话类型 |
| timeout | Number | 是 | 会话接入超时时长,0代表不超时 |
| callee | String | 是 | 渠道入口 |
| calleeRemark | String | 否 | 渠道入口备注 |
| userId | String | 是 | 用户的 openId |
| nickname | String | 否 | 用户授权后可获得微信昵称 |
| avatar | String | 否 | 用户授权后可获得微信头像 |
| remark | String | 否 | 备注 |
| peerSource | String | 否 | 主叫号码归属地 |
| ivrPath | {key: String, label: String}[] | 否 | 用户的 IVR 按键路径,key 表示对应按键,label 表示对应的按键标签 |
| clientData | String | 否 | 用户自定义参数 |
视频会话呼入
callback 参数 | 类型 | 必填 | 备注 | |
options | sessionId | String | 是 | 会话 ID |
| type | 'video' | 是 | 视频会话类型 |
| timeout | String | 是 | 会话接入超时时长,0代表不超时 |
| userId | String | 是 | 用户的 openId |
| nickname | String | 否 | 用户授权后可获得微信昵称 |
| avatar | String | 否 | 用户授权后可获得微信头像 |
| remark | String | 否 | 备注 |
|
内部会话呼入
callback 参数 | 类型 | 必填 | 备注 | |
options | sessionId | String | 是 | 会话 ID |
| type | 'internal' | 是 | 内部会话类型 |
| timeout | Number | 是 | 会话接入超时时长,0代表不超时 |
| peerUserId | String | 是 | 主叫座席的账号 |
| ||||
| ||||
| ||||
|
座席接入会话
tccc.events.userAccessed
callback 参数 | 类型 | 必填 | 备注 | |
options | sessionId | String | 是 | 指定会话 ID |
| tabUUID | String | 否 | 开启多Tab集成时存在,表示哪个Tab接听的会话 |
|
会话超时转接事件
tccc.events.autoTransfer
callback 参数 | 类型 | 必填 | 备注 | |
options | sessionId | String | 是 | 指定会话 ID |
|
会话结束事件
tccc.events.sessionEnded
callback 参数 | 类型 | 必填 | 备注 | |
options | sessionId | String | 是 | 指定会话 ID |
| closeBy | String | 是 | 表示挂断方: client:用户挂断 seat:座席挂断 admin:系统挂断 timer:定时器挂断 |
| mainReason | String | 否 | 仅在电话类型,并且挂断方为"admin"时存在,表示挂断原因 |
| subReason | String | 否 | 仅在电话类型,并且挂断方为"admin"时存在,表示挂断的详细原因 |
外呼成功事件
tccc.events.callOuted
callback 参数 | 类型 | 必填 | 备注 | |
options | sessionId | String | 是 | 指定会话 ID |
| callerPhoneNumber | String | 是 | 外呼使用的主叫号码 |
| calleePhoneNumber | String | 是 | 被叫号码 |
| serverType | 'staffSeat' | 'staffPhoneSeat' | 'staffExtensionSeat' | 'MiniProgramSeat' | 是 | 表示座席外呼类型: staffSeat 为默认值,表示 Web 座席 StaffPhoneSeat 表示使用手机外呼 MiniProgramSeat 表示使用小程序外 staffExtensionSeat 表示使用话机外呼 |
| tabUUID | String | 否 | 开启多Tab集成时存在,表示哪个Tab发起的外呼 |
|
外呼对方接听事件
tccc.events.calloutAccepted
callback 参数 | 类型 | 必填 | 备注 | |
options | sessionId | String | 是 | 指定会话 ID |
|
会话转接事件
tccc.events.transfer
callback 参数 | 类型 | 必填 | 备注 | |
options | sessionId | String | 是 | 指定会话 ID |
|
座席状态变更事件
tccc.events.statusChanged
callback 参数 | 类型 | 必填 | 备注 | | |
options | status | 否 | 详细说明请参见 座席状态 | |
座席被踢下线事件
tccc.events.kickedOut
座席多端登录时触发。
语音识别事件
tccc.events.asr
callback 参数 | 类型 | 必填 | 备注 | | |
options | sessionId | String | 是 | 指定会话 ID | |
| result | ASR识别结果 | 是 | | |
| flow | 'IN' | 'OUT' | 是 | 识别方向 IN:用户侧 OUT:座席侧 | |
多Tab集成SDK
默认情况下,TCCC Web SDK只允许在一个地方登录,多处登录会触发kickedOut事件。开启多Tab功能后,任意一个页面发起的通话,都会在其他页面显示,开发者可根据业务逻辑自行隐藏UI,或者监听对应事件处理
限制条件
1. 同一个浏览器的多个窗口,注意不能开启无痕模式
2. SDK集成在业务系统处于同一个域名下
3. 不支持移动端浏览器
集成步骤
1. 初始化SDK,参考Web
2. 增加enableShared参数,表示启用多Tab功能
function injectTcccWebSDK(SdkURL) {if (window.tccc) {console.warn('已经初始化SDK了,请确认是否重复执行初始化');return;}return new Promise((resolve, reject) => {const script = document.createElement('script');script.setAttribute('crossorigin', 'anonymous');script.src = SdkURL;/** 增加enableShared,表示启用多Tab功能*/script.dataset.enableShared = 'true'document.body.appendChild(script);script.addEventListener('load', () => {window.tccc.on(window.tccc.events.ready, ({ tabUUID }) => {resolve('初始化成功,当前tabUUID为' + tabUUID)});window.tccc.on(window.tccc.events.tokenExpired, ({message}) => {console.error('初始化失败', message)reject(message)})})})}
3. 处理多Tab逻辑
触发callOuted(外呼成功)和userAccessed(座席接听成功)事件时,会增加tabUUID字段,表示哪个页面发起的外呼/接听
let curTabUUID = '';window.tccc.on(window.tccc.events.ready, ({ tabUUID }) => {console.log('初始化成功,当前tabUUID为' + tabUUID)curTabUUID = tabUUID;});window.tccc.on(window.tccc.events.callOuted, ({ sessionId, tabUUID }) => {if (tabUUID && tabUUID !== curTabUUID) {// 接收到其他页面的外呼成功事件,业务可自行处理}})window.tccc.on(window.tccc.events.userAccessed, ({ sessionId, tabUUID }) => {if (tabUUID && tabUUID !== curTabUUID) {// 接收到其他页面的接听成功事件,业务可自行处理// 此处为示例代码,会忽略该事件return;}})