Only the Chinese version of this page is provided currently. The English version will be provided soon.

实现三方通话

Last updated: 2026-07-17 21:00:59

介绍

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


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) {
// 咨询请求排队中
}
});