如何保留挂断客户在Task Router队列中的位置并实现回呼?
解决方案:实现客户挂断后保留队列位置并自动回呼
这个需求完全可行,核心思路是拆分「客户来电会话」和「排队任务」的绑定关系,不再依赖TaskRouter默认的来电与Task绑定逻辑,而是手动管理任务生命周期和回呼流程。以下是具体实现步骤:
核心逻辑调整
原逻辑:来电→
<Enqueue>创建Task→客户挂断→Task自动取消
新逻辑:来电→手动创建独立Task→客户挂断→保留Task→Task分配→自动回呼客户+呼叫员工
1. 初始化排队任务
当客户首次来电时,不要直接用<Enqueue>标签绑定TaskRouter队列,而是:
- 先通过TaskRouter API创建一个独立的Task,属性中包含客户手机号、排队优先级、业务类型等关键信息
- 给客户播放等待音(用Twiml的
<Play>或<Say>),同时在来电的Attributes中记录这个Task的Sid,方便后续关联
示例:创建Task的API调用
curl -X POST 'https://taskrouter.twilio.com/v1/Workspaces/{WorkspaceSid}/Tasks' \ --data-urlencode 'Attributes={"customer_phone": "+1234567890", "queue_status": "waiting", "service_type": "support"}' \ --data-urlencode 'WorkflowSid={WorkflowSid}' \ -u '{AccountSid}:{AuthToken}'
2. 处理客户挂断事件
通过Twilio的Call Status Webhook监听来电状态,当检测到来电状态为completed(客户挂断)时:
- 不要取消Task,而是更新Task的
Attributes,标记其状态为「等待回呼」 - 保留Task在队列中继续排队,TaskRouter会正常处理其优先级和分配逻辑
示例:Node.js处理Call Status的Webhook
app.post('/call-status-webhook', (req, res) => { const callStatus = req.body.CallStatus; const taskSid = req.body.TaskSid; // 来电时将TaskSid存入Call的Attributes if (callStatus === 'completed') { // 更新Task属性,标记客户已挂断等待回呼 twilio.taskrouter.workspaces('{WorkspaceSid}') .tasks(taskSid) .update({ Attributes: JSON.stringify({ customer_phone: "+1234567890", queue_status: "waiting_callback", service_type: "support" }) }) .catch(err => console.error('Update task failed:', err)); } res.sendStatus(200); });
3. Task分配时触发回呼与员工呼叫
当Task排到队首并分配给Worker时,通过Task Assignment Webhook触发两个并行动作:
- 调用Twilio Call API回呼客户手机号,回呼接通后返回Twiml用于桥接员工
- 同时呼叫目标Worker的电话/软终端,同样返回Twiml用于桥接客户
示例:Task分配Webhook处理逻辑
app.post('/task-assignment-webhook', (req, res) => { const taskAttrs = JSON.parse(req.body.TaskAttributes); const customerPhone = taskAttrs.customer_phone; const workerPhone = req.body.WorkerAttributes.phone; // 假设Worker属性中存了手机号 // 1. 回呼客户 twilio.calls.create({ to: customerPhone, from: '{YourTwilioNumber}', url: 'https://your-server.com/bridge-to-worker' // 该URL返回桥接员工的Twiml }); // 2. 呼叫员工 twilio.calls.create({ to: workerPhone, from: '{YourTwilioNumber}', url: 'https://your-server.com/bridge-to-customer' // 该URL返回桥接客户的Twiml }); // 告知TaskRouter接受分配 res.json({ instruction: 'accept' }); });
4. 通话桥接与异常处理
- 桥接Twiml示例(
bridge-to-worker端点返回):
<Response> <Say>您好,现在为您转接客服,请稍候</Say> <Dial>{WorkerCallSid}</Dial> <!-- 这里可以用Call Control API获取员工通话的Sid,或直接转员工号码 --> </Response>
- 异常处理:如果回呼客户失败(无人接听、占线),可设置重试机制(比如间隔5分钟重试2次),重试失败后将Task重新放回队列末尾,或标记为待人工处理
关键注意事项
- 确保Task的优先级配置正确,避免回呼顺序混乱
- 回呼时可添加去电显示标识,让客户识别是官方回呼
- 做好日志监控,跟踪Task状态、回呼结果和通话桥接情况,方便排查问题
内容的提问来源于stack exchange,提问作者neubert
相关产品推荐
相关产品推荐

