You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Twilio TaskRouter:如何将在途通话转为会议以添加坐席

将现有Twilio TaskRouter通话转换为会议(Laravel环境)

我目前用Twilio TaskRouter的enqueue和dequeue指令已经实现了呼叫者和坐席的正常连接,现在需要在同一通话中添加另一名坐席,得把当前通话转换成会议。以下是我当前的入队和出队代码:

当前入队代码

$taskAttributes = [
    'channel' => 'voice', // Specify that it's a voice call
    'type' => $deptName,
    'departmentId' => $department_id,
];
$enqueue->task(json_encode($taskAttributes),['timeout' => 60]);
return response($response)->header('Content-Type', 'text/xml');

当前出队代码

return response()->json([
    "instruction" => "dequeue",
    "status_callback_events" => "initiated,ringing,answered,completed",
    "record" => "record-from-answer",
    "status_callback_url" => url('ivr/statuseventCallback'),
]);

实现步骤

  1. 替换Dequeue指令,将坐席接入会议
    原来的dequeue是让坐席和呼叫者点对点通话,现在要改成让坐席加入唯一会议。当坐席接受任务时,不再返回dequeue的JSON响应,而是返回Twiml指令引导坐席进入会议:

    return response()->xml('<Response>
        <Dial>
            <Conference record="record-from-answer" statusCallbackEvent="initiated,joined,completed" statusCallback="' . url('ivr/conference-status') . '">
                support-call-' . $taskSid . '
            </Conference>
        </Dial>
    </Response>');
    

    用任务的$taskSid作为会议名称,确保每个通话的会议唯一。

  2. 调整呼叫者等待流程,接入同一会议
    呼叫者原来等待时播放等待音,现在要在坐席分配完成后自动转入会议。修改入队Twiml,指定waitUrl处理等待逻辑:

    $response = new Twiml();
    $enqueue = $response->enqueue(['waitUrl' => url('ivr/wait-instruction')]);
    $enqueue->task(json_encode($taskAttributes), ['timeout' => 60]);
    return response($response)->header('Content-Type', 'text/xml');
    

    然后在ivr/wait-instruction路由里检查任务状态,一旦坐席分配完成,引导呼叫者进入会议:

    // ivr/wait-instruction 路由处理逻辑
    $taskSid = request()->query('TaskSid');
    $task = \Twilio\Rest\Client::getInstance()->taskrouter->workspaces('你的工作区SID')
        ->tasks($taskSid)->fetch();
    
    if ($task->assignmentStatus === 'assigned') {
        $twiml = new Twiml();
        $twiml->dial()->conference('support-call-' . $taskSid, [
            'record' => 'record-from-answer',
            'statusCallback' => url('ivr/conference-status')
        ]);
        return response($twiml)->header('Content-Type', 'text/xml');
    } else {
        // 坐席未分配,继续播放等待音乐
        $twiml = new Twiml();
        $twiml->play('https://example.com/hold-music.mp3'); // 替换为你的等待音乐地址
        return response($twiml)->header('Content-Type', 'text/xml');
    }
    
  3. 添加新坐席到会议
    当需要添加另一名坐席时,直接通过Twilio API呼叫该坐席,并返回Twiml让其加入同一会议:

    // 呼叫新坐席的逻辑
    $client = new \Twilio\Rest\Client(env('TWILIO_ACCOUNT_SID'), env('TWILIO_AUTH_TOKEN'));
    $client->calls->create(
        $newWorkerPhone, // 新坐席的电话号码
        env('TWILIO_PHONE_NUMBER'), // 你的Twilio号码
        [
            'url' => url('ivr/join-conference', ['conferenceName' => 'support-call-' . $taskSid])
        ]
    );
    
    // ivr/join-conference 路由处理
    $conferenceName = request()->route('conferenceName');
    $twiml = new Twiml();
    $twiml->dial()->conference($conferenceName, [
        'record' => 'record-from-answer',
        'statusCallback' => url('ivr/conference-status')
    ]);
    return response($twiml)->header('Content-Type', 'text/xml');
    
  4. 处理会议状态回调
    在ivr/conference-status路由里监听会议事件(成员加入、离开、会议结束等),用于日志记录或业务状态更新:

    // ivr/conference-status 路由处理
    $event = request()->input('StatusEvent');
    $conferenceName = request()->input('ConferenceName');
    // 根据事件类型执行对应逻辑,比如记录会议日志、更新业务状态
    return response('', 200);
    

内容的提问来源于stack exchange,提问作者Yasir Ijaz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 11:30:07