Twilio TaskRouter问题:无法将Reservation与呼叫建立连接
解决Laravel中Twilio TaskRouter坐席与客户呼叫连接失败问题
核心问题定位
Worker已被选中但呼叫未建立,问题集中在Task属性传递、Workflow回调响应、前端Reservation处理三个关键环节,以下是针对性修复方案:
1. 补全Task属性中的来电号码
原Webhook的Task属性未包含来电号码from,导致Workflow回调无法获取该参数,Twilio无法完成呼叫桥接。修改Webhook代码:
$response = new VoiceResponse(); // 从Twilio的Webhook请求中获取来电号码 $from = request()->input('From'); $taskAttributes = [ 'channel' => 'voice', 'from' => $from, // 新增来电号码属性 ]; $enqueue = $response->enqueue('WSDSupport',[ 'workflowSid' => $workflowSid, 'action' => url('ivr/testQueue') ]); $enqueue->task(json_encode($taskAttributes),['timeout' => 200]); return response($response)->header('Content-Type', 'text/xml');
2. 修正Workflow回调的参数解析
确保正确解析Twilio传递的Task属性,返回符合要求的响应格式:
// 解析Twilio发送的TaskAttributes参数 $taskAttributes = json_decode(request()->input('TaskAttributes'), true); return response()->json([ "instruction" => "dequeue", "from" => $taskAttributes['from'], "post_work_activity_sid" => config('services.twilio')['postWorkActivitySid'] ]);
3. 完善前端Reservation事件监听
仅调用reservation.accept()不足以确保呼叫连接,需添加成功事件监听,同时捕获异常:
taskRouterClient.on('reservation.created', function(reservation) { if (confirm('Incoming call. Accept?')) { reservation.accept() .then(() => { reservation.on('accepted', () => { console.log('呼叫已成功连接'); }); }) .catch(err => { console.error('接受预约失败:', err); }); } else { reservation.reject(); } });
4. 关键配置检查
- 确认Worker的Activity状态为可接听(如
Available),Workflow匹配规则正确指向目标Worker - 检查Twilio控制台的TaskRouter日志,确认Workflow回调是否触发、是否有参数错误提示
- 确保Webhook和Workflow回调URL为公网可访问地址(本地开发需用ngrok等工具暴露服务)
- 验证
enqueue的action路由(ivr/testQueue)返回有效TwiML,处理排队超时场景:
public function testQueue() { $response = new VoiceResponse(); $response->say('暂无空闲坐席,请稍后再拨。'); return response($response)->header('Content-Type', 'text/xml'); }
内容的提问来源于stack exchange,提问作者Yasir Ijaz
相关产品推荐
相关产品推荐

