Не удалось перевести вызов twilio на новый номер

У нас есть небольшое приложение twilio, которое мы используем для звонков на любой номер клиента с веб-сайта. Сейчас мы пытаемся добавить в наше приложение функционал трансферного звонка. Но мы не можем передать вызов с помощью php api. Вот что мы используем:

  • Набираем номер с сайта, JS возвращает callid
  • У нас есть другой номер, на который нам нужно перевести звонок через несколько минут
  • Итак, у нас есть кнопка «Передать», которая вызывает ajax-вызов php-файла.

которые имеют следующий код:

<?php
    $existing_call_sid = $_REQUEST['CallSid'];
    $new_number = $_REQUEST['new_number'];
    $call = $client->calls($existing_call_sid)->update(
                array(
                    "url" => "transfer_xml_main.php?new_number=".$new_number,
                    "method" => "POST"
                )
            );
    echo $call->to;
?>

transfer_xml_main.php содержит:

<Response>
    <Dial><?php echo $_GET['new_number'];?></Dial>
    <Say>Please be on line we are transferring your call</Say>
</Response>
  • Но когда этот запрос происходит, существующий вызов сбрасывается, а вызов на новый номер отсутствует.
  • также пусто $call->to

Я делаю что-то не так?

Обновить

После реализации ответа Филнаша я получаю следующую фатальную ошибку:

<b>Fatal error</b>:  Uncaught exception 'Twilio\Exceptions\RestException' with message '[HTTP 400] Unable to update record: No 'To' number is specified' in /twilo/twillo_php_master_new/Twilio/Version.php:85
Stack trace:
#0 /twilo/twillo_php_master_new/Twilio/Version.php(127): Twilio\Version-&gt;exception(Object(Twilio\Http\Response), 'Unable to updat...')
#1 /twilo/twillo_php_master_new/Twilio/Rest/Api/V2010/Account/CallContext.php(109): Twilio\Version-&gt;update('POST', '/Accounts/AC618...', Array, Array)
#2 /twilo/twilo_call_transfer.php(26): Twilio\Rest\Api\V2010\Account\CallContext-&gt;update(Array)
#3 {main}
  thrown in <b>/twilo/twillo_php_master_new/Twilio/Version.php</b> on line <b>85</b><br />

Однако я правильно получаю идентификатор родительского вызова, и в $child_calls я правильно получаю и от того, кто звонит первым, и от того, кому звонит пользователь. Все еще что-то не так?

И да, мы хотим точно так же, как вы сказали: 1. Пользователь 1 (агент) позвонил на один номер (клиент А) из JS-клиента twilio 2. Теперь пользователь 1 (агент) хочет перевести вызов на другой номер, который может быть агентом или другим номером.

Также нет ошибок в отладчике


person Jaymin Gajjar    schedule 17.02.2017    source источник
comment
Можете выслать мне CallSid для звонка, на котором это произошло? Вы можете отправить его по электронной почте [email protected].   -  person philnash    schedule 22.02.2017
comment
Спасибо! Отправил вам письмо.   -  person Jaymin Gajjar    schedule 22.02.2017
comment
У меня есть мысль. Как вы отправляете new_number, что вы переадресовываете вызов? Можете ли вы поделиться этим JS?   -  person philnash    schedule 22.02.2017
comment
Конечно, отправил вам JS.   -  person Jaymin Gajjar    schedule 23.02.2017


Ответы (2)


Евангелист разработчиков Twilio здесь.

Я удивлен, что никакого звонка не происходит. Есть ли ошибки в вашем отладчике Twilio?

Хотя я вижу некоторые проблемы.

CallSid, ​​который вы получаете от JS при наборе номера, — это Sid ветви набора номера, принадлежащей вашему агенту. Но я предполагаю, что вы хотите перевести человека, которому звонят, на новый номер. Если это так, вам нужно получить Sid принимающей ветви вызова. Sid для набора номера является родительским Sid для вызовов, поэтому вы можете найти другую ветвь по перечисление дочерних веток, например:

<?php
    $parent_call_sid = $_REQUEST['CallSid'];
    $child_calls = $this->client->calls->read(array("ParentCallSid" => $parent_call_sid));
    $child_call_sid = $childCalls[0]->sid;
    $new_number = $_REQUEST['new_number'];
    $call = $client->calls($child_call_sid)->update(
        array(
            "url" => "transfer_xml_main.php?new_number=".$new_number,
            "method" => "POST"
        )
    );
    echo $call->to;
?>

Во-вторых, ваш TwiML, который вы возвращаете, является неверным. Если вы хотите, чтобы сообщение пришло до того, как вы начнете набор номера, вам нужно поставить <Say>< /а> первый.

<Response>
    <Say>Please be on line we are transferring your call</Say>
    <Dial><?php echo $_GET['new_number'];?></Dial>
</Response>

Когда вы сделаете все это, ваш исходный номеронабиратель отключится при передаче вызова. Вы можете захотеть этого, хотя вы можете обнаружить, что теплый перевод - лучший опыт. Существует хорошее руководство по выполнению теплого переноса с использованием PHP. и Laravel, которые могут помочь.

Дайте мне знать, поможет ли это вообще.

person philnash    schedule 21.02.2017
comment
@philinash спасибо за ответ. Я попробовал код, как вы сказали. но я получаю фатальную ошибку. Я обновил вопрос об ошибке и других вещах. что-то еще не так? - person Jaymin Gajjar; 21.02.2017
comment
Это не работает. Нет (больше?) идентификатора вызова, созданного для вызываемой/принимающей стороны. Есть call sid только для инициатора/вызывающего. - person Brian H; 23.06.2021
comment
Привет, @BrianH, я вижу, ты задал свой вопрос, поэтому я прокомментирую его, чтобы попытаться исправить это для тебя. - person philnash; 24.06.2021

В вашем PHP вы используете метод POST, но в вашем XML вы используете $_GET. Вы не передаете переменные.

<?php
    $parent_call_sid = $_REQUEST['CallSid'];
    $child_calls = $this->client->calls->read(array("ParentCallSid" => $parent_call_sid));
    $child_call_sid = $childCalls[0]->sid;
    $new_number = $_REQUEST['new_number'];
    $call = $client->calls($child_call_sid)->update(
        array(
            "url" => "transfer_xml_main.php?new_number=".$new_number,
            "method" => "POST" // <---NOTICE THE POST
        )
    );
    echo $call->to;
?>

Измените $_GET на $_POST

<Response>
    <Dial><?php echo $_POST['new_number'];?></Dial>
    <Say>Please be on line we are transferring your call</Say>
</Response>
person Jeff Vdovjak    schedule 19.02.2020