laravel - 如果任何一个用户接到呼叫,立即呼叫用户并断开其他呼叫
问题描述
我想拥有使用 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 次电话。
另外,我想跟踪哪个用户首先参加了电话会议,以便我可以维护到我的数据库并提高他们的评级。
谢谢
解决方案
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
参数判断呼叫的对象。还有额外的参数,这可能很有用。