帮你快速理解、总结文档立即下载

实现三方通话

最近更新时间:2026-09-03 14:39:29
我的收藏

介绍

云联络中心支持在用户和座席双人通话的基础上,座席向其他座席,或技能组,或外线,发起“咨询”,待被咨询方接听后,三方进入通话流程。如下图所示:

说明:
使用此功能,请先 登录 云联络中心管理端,在电话客服 > 电话客服设置 > 通用设置内,打开经典多路通话交互方式。


API 列表

发起咨询

tccc.Call.invite(options): Promise

说明:
座席外呼场景下,请在用户接听后(监听 calloutAccepted 事件)再发起咨询,否则会咨询失败。
参数
类型
必填
备注
options
sessionId
String
是
会话唯一标识。
callee
Object
是
被叫信息,须从下方三个属性中选择一个传入。
allowQueue
Boolean
否
默认 false,咨询时不排队。设置为 true 咨询时排队。
callee 内部属性(三选一)
属性名
类型
说明
userId
String
被咨询方的 userId。
skillGroupId
Number | String
技能组 ID。
phone
String
外线电话号码。
// 咨询技能组
let promise = tccc.Call.invite({
sessionId: 'a43e7b8f-122c-47f5-ad33-ef4e326981fc',
callee: { skillGroupId: 81681 }
});

// 咨询指定座席
let promise = tccc.Call.invite({
sessionId: 'a43e7b8f-122c-47f5-ad33-ef4e326981fc',
callee: { userId: 'myemail@tencent.com' }
});

// 咨询外线
let promise = tccc.Call.invite({
sessionId: 'a43e7b8f-122c-47f5-ad33-ef4e326981fc',
callee: { phone: '185xxxx1935' }
});

promise.then(() => { // 发起咨询成功 }).catch((error) => {
if (error.code === '-7') {
// 系统错误,会话不存在
} else if (error.code === '-8001') {
// 无成员在线
} else if (error.code === '-8003') {
// 成员全忙
} else if (error.code === '-8002' || error.code === '-8004') {
// 通知或转接失败
} else if (error.code === '-999') {
// 其它错误
}
// error.message 错误信息
});

取回咨询

tccc.Call.reconnect(options): Promise

说明:
请提前监听 memberStateChanged 事件,获取 userId 对应的 memberId,调用接口时请传入 memberId。
参数
类型
必填
备注
options
sessionId
String
是
会话唯一标识。
memberId
String
是
用户 X 的 memberId,取回时会取消对用户 X 的通话保持。
let promise = tccc.Call.reconnect({
sessionId: 'a43e7b8f-122c-47f5-ad33-ef4e326981fc',
memberId: '6bcde1a7-975d-4a99-8831-8e21f566fbc0'
});


取消保持

tccc.Call.unHold(options): Promise

参数
类型
必填
备注
options
sessionId
String
是
会话唯一标识。
memberId
String
否
不传则默认取消对用户 X 的通话保持,设置后则取消对指定 member 的通话保持。
let promise = tccc.Call.unHold({
sessionId: 'a43e7b8f-122c-47f5-ad33-ef4e326981fc'
});


保持

tccc.Call.hold(options): Promise

参数
类型
必填
备注
options
sessionId
String
是
会话唯一标识。
memberId
String
否
不传则默认对用户 X 的通话保持,设置后则对指定 member 的通话保持。
let promise = tccc.Call.hold({
sessionId: 'a43e7b8f-122c-47f5-ad33-ef4e326981fc'
});

转接

tccc.Call.transfer(options): Promise

座席 A 调用,留用户 X 与座席 B 通话(取消对 memberId 的通话保持,座席 B 成为 host),等同于座席 A 退出会议。
参数
类型
必填
备注
options
sessionId
String
是
会话唯一标识。
memberId
String
是
用户 X 的 memberId。
let promise = tccc.Call.transfer({
sessionId: 'a43e7b8f-122c-47f5-ad33-ef4e326981fc',
memberId: '6bcde1a7-975d-4a99-8831-8e21f566fbc0'
});

挂断

tccc.Call.hangUp(options): Promise

座席 A 调用,留用户 X 与座席 B 通话(不会取消对 memberId 的通话保持,座席 B 成为 host),等同于座席 A 退出会议。座席 B 调用,则等同于座席 B 退出会议。
参数
类型
必填
备注
options
sessionId
String
是
会话唯一标识.
let promise = tccc.Call.hangUp({
sessionId: 'a43e7b8f-122c-47f5-ad33-ef4e326981fc'
});

获取技能组列表

tccc.Agent.getSkillGroupList(options): Promise

参数
类型
必填
备注
options
freeOnly
Boolean
否
是否查找有空闲座席的技能组。
fuzzingKeyWord
String
否
模糊搜索技能组里的关键词。
pageSize
String
否
分页大小。
// 获取有空闲座席的,技能组名字里包含"售前"的技能组
let promise = tccc.Agent.getSkillGroupList({ freeOnly: true,
fuzzingKeyWord: "售前",
pageSize: "100"
});

获取座席列表

tccc.Agent.getStaffList(options): Promise

参数
类型
必填
备注
options
userId
String
否
用户 ID,通常为邮箱名,模糊查找。
staffName
String
否
姓名,模糊查找。
roleId
String
否
角色 ID,精确查找。
mobile
String
否
手机号,模糊查找。
staffNo
String
否
工号,精确查找。
fuzzingStaffNo
String
否
工号,模糊查找。
skillGroupType
Number
否
技能组类型,默认值填0。
skillGroupId
String
否
技能组 ID。
notSkillGroupId
String
否
排除技能组 ID。
pageSize
String
否
分页大小。
pageNum
String
否
页码,从0开始。
orderField
String
否
按 ctime/seat_status/staff_no 排序。
orderType
String
否
asc 正序,desc 倒序。
status
[]
否
按状态筛选。
isNeedStatus
boolean
否
是否需要回包带上状态。
fuzzingKeyWord
String
否
模糊搜索名字或者邮箱里的关键词。
// 查询状态是空闲或者示忙的座席
let promise = tccc.Agent.getStaffList({ status: [100, 700]});

// 模糊搜索名字或者邮箱里包含"qiao",空闲或者示忙的座席,并且需要回包带上座席的状态
let promise = tccc.Agent.getStaffList({
fuzzingKeyWord: "qiao", status: [100, 700],
isNeedStatus: true });
// 回包的 staffNo 代表座席的工号

事件监听

座席端请监听 memberStateChanged 事件。
tccc.on(tccc.events.memberStateChanged, (evt) => {
const {
userId,
memberId,
displayName,
sessionId,
serverType,
isHost,
isSelf,
acceptedState,
callState,
acceptTimestamp,
ringTimestamp,
hungupParams } = evt;
// displayName 技能组或者座席展示的名称
// serverType
// - staffSeat web 端座席
// - customer 用户
// - outboundSeat 外线座席
// - staffExtensionSeat 话机座席
// - queue 排队中
// callState
// - RINGING 振铃中
// - END 已结束
// - ACCEPTED 已接通
const { MUTE, ON_HOLD } = acceptedState;
// MUTE 是否静音
// ON_HOLD 通话是否挂起
// 当 callState 为 'ACCEPTED', acceptTimestamp 为接听时间戳
// hungupParams 当通话结束,这个字段包含了挂断方,挂断原因等信息});
if (serverType === 'queue' && ringTimestamp === 0) {
// 咨询请求排队中
}
});