首页 > 解决方案 > 如果任何一个用户接到呼叫,立即呼叫用户并断开其他呼叫

问题描述

我想拥有使用 twilio 的循环呼叫功能。

比方说。我有 100 个用户和他们的电话号码。

我想同时给他们打电话。

然后,无论第一个人接到电话,我都会将该电话连接到我的销售部门,并立即切断或断开其他电话。

我通过 twiML 知道我可以拨打我的销售团队,并且我还知道我可以检查正在进行的事件以查看呼叫是否已连接。

但是,我坚持同时呼叫所有用户并在第一个用户连接到呼叫后断开连接,这是我的第一步。

我正在做更多更新,因为我的场景发生了一些变化。

在这种情况下,我首先打电话给填写了我的潜在客户表格的用户。一旦主要用户接到电话,我将呼叫我的销售团队的 10 个座席,但我想跟踪哪个座席收到了领先呼叫,并希望将座席信息保存到我的数据库中并切断其他呼叫。

在我的计数器中

<?php

namespace App\Http\Controllers;

use App\Listing;
use App\User;
use Illuminate\Http\Request;
use Twilio\Rest\Client;
use Twilio\TwiML\VoiceResponse;
use Twilio\Twiml;


class TwilioController extends Controller
{
    public function leadCall(Request $request)
    {
        // Lead user
        $lead = Lead::where('id', $request->lead_id)->first();
    
        $country_code = "+1";
        $visitor_phone = $country_code . $lead->details_phone;
        $url = "https://www.samplewebsite.com/outbound?multi_call=true";

        // Twilio Credentials
        $AccountSid = 'xyz';
        $AuthToken = 'xyz';
        
        $twilio_number = "123";

        $client = new Client($AccountSid, $AuthToken);

        
    
        // Calling the lead visitor first
        try {
            $call = $client->account->calls->create($visitor_phone, $twilio_number,
                array(
                    "url" =>  $url
                )
            );
        } catch (Exception $e) {
            echo "Error: " . $e->getMessage();
        }

    }

    if($request->multi_call)
    {
        // Fetch 10 agents
        $users = User::all()->take(10);

        // Calling Twilio
        $twiml = new VoiceResponse();
        $twiml->say('Please hold, we are connecting your call to one of our agent.', array('voice' => 'alice'));
        
        $dial = $twiml->dial();
        
        foreach ($users as $user) {
            if($user->phone && $user->live_call)
            {
                $dial->number($user->phone,
                ['statusCallbackEvent' => 'answered',
                'statusCallback' => 'https://www.samplewebsite.com/outbound?agent_call=true',
                'statusCallbackMethod' => 'GET']);
            }
        }


        $response = response()->make($twiml, 200);
        $response->header('Content-Type', 'text/xml');
        return $response;
    }

    if($request->agent_call)
    {
        return "Call was made to: " . $request->to;
    }


}

这就是我到目前为止所做的

并在路线文件中

Route::post('lead-call', 'TwilioController@leadCall')->name('leadCall');

Route::get('outbound', 'TwilioController@outboundMultiCall');

和 TwiML 共鸣

<Response>
<Say voice="alice">Please hold, we are connecting your call to one of our agent.</Say>
<Dial>
<Number statusCallbackEvent="answered" statusCallback="https://www.samplewebsite.com/outbound?agent_call=true" statusCallbackMethod="GET">xxx-xxx-xxxx</Number>
<Number statusCallbackEvent="answered" statusCallback="https://www.samplewebsite.com/outbound?agent_call=true" statusCallbackMethod="GET">xxx-xxx-xxxx</Number>
<Number statusCallbackEvent="answered" statusCallback="https://www.samplewebsite.com/outbound?agent_call=true" statusCallbackMethod="GET">xxx-xxx-xxxx</Number>
</Dial>
</Response>

我有两个问题。当我在 webhook 中添加像 multi_call=true 这样的 get 参数时,我得到应用程序错误。所以我不能给我的代理拨打 10 次电话。

另外,我想跟踪哪个用户首先参加了电话会议,以便我可以维护到我的数据库并提高他们的评级。

谢谢

标签: laraveltwiliotwilio-php

解决方案


Twilio 开发人员布道者在这里。

首先,我只需要警告您,默认情况下,Twilio 帐户限制为每秒创建 1 个调用,因此对于任何代码,您的调用仍将按顺序放置。

如果您可以拨打一个电话,那么您一次可以拨打多个电话。您需要遍历要拨打电话的号码,并为要创建的每个电话发出 API 请求。

下一部分是在一个呼叫连接后取消其他呼叫。创建调用时,您将收到来自 API 的带有调用 SID 的响应。一旦您的第一个呼叫连接,您将收到一个指向您的应用程序的 webhook。参数将包括呼叫 SID。因此,要取消其他调用,您需要获取已创建的调用 SID 列表,删除已连接的调用 SID,然后进行API 调用以将其他调用更新为“已完成”状态,这将挂断呼叫。

编辑:

我看到您先连接出站呼叫,然后使用 TwiML 进行多拨。这应该可行,只是你做错了几件事。

首先,您在 a中使用多个<Dial>s而不是多个<Number>s<Dial>来进行多重调用。尝试以下操作:

    public function outboundMultiCall(Request $request)
    {
        if($request->multi_call)
        {
            // Fetch 10 agents
            $users = User::all()->take(10);

            // Calling Twilio
            $twiml = new VoiceResponse();
            $twiml->say('Please hold, we are connecting your call to one of our agent.', array('voice' => 'alice'));
            
            $dial = $twiml->dial();
            
            foreach ($users as $user) {
                $dial->number($user->phone);
            }

            $response = response()->make($twiml, 200);
            $response->header('Content-Type', 'text/xml');
            return $response;
        }

        return 'Some other action based on GET URL paramter';
    }

其次,Twilio webhookPOST默认是请求。所以,你应该把你的路线变成POST

Route::post('outbound', 'TwilioController@outboundMultiCall');

method或者,您可以在创建调用时传递一个参数:

$call = $client->account->calls->create($visitor_phone, $twilio_number,
    array(
        "url" =>  $url,
        "method" => "GET"
    )
);

statusCallback最后,要记录谁接听<Number>了电话,您可以使用. 当调用转换到新状态时,Twilio 将发送一个 webhook。事件是“启动的”、“响铃的”、“应答的”和“完成的”。Webhook 将包含所有正常的语音呼叫参数,因此您可以通过该To参数判断呼叫的对象。还有额外的参数,这可能很有用。


推荐阅读