2017-02-15 6 views
1

Мне нужна помощь в вызове вызова. Я пробовал два метода.Twilio, Как отменить звонок

. использовать Епдиеий глагол, когда я нажимаю кнопку удержания меня пользователю метод вызова обновления

<Response> 
    <Enqueue waitUrl="urltoplaytheholdmusic">1111</Enqueue> 
</Response> 

(и при нажатии на кнопку Извлечь, я использовал тот же метод обновления и используются.)

<Response> 
    <Queue >1111</Queue> 
</Response> 

но когда используется вызов глагола очереди, который отключается.

. Поэтому я попробовал другой способ просто воспроизвести музыку, когда я нажимаю кнопку удержания.

<Response><Say>We are putting you on hold Please wait!</Say><Play loop="0">https://api.twilio.com/cowbell.mp3</Play></Response> 

Теперь я не знаю, что делать, чтобы отменить вызов.

вопрос: reference question

это все, что я делаю. , когда я делаю позвонить я использовал JS liberay для этого и использовали эту функцию

function call(dial_number, from_phone) { 

       params = { 
        "to_phone": to_phone, 
        "from_phone": from_phone, 
        "from_id": current_user_id, 
        "to_id": user_id 
       }; 

       connection = Twilio.Device.connect(params); 


       connection._onAnswer = function(conn) { 
        console.log(conn.callsid); 
/*get parentcall sid when make the call*/ 
        Sid = { 
         parent_callSid: conn.callsid, 
         type: 'outgoing' 
        }; 
       }; 


      } 

И поставить вызов на удержание, я использовал эту строку кода

function holdaction() { 
       jQuery.ajax({ 
        url: 'url', 
        type: 'POST', 
        data: 'sid=' + parentSid + '&admin_no=' + encodeURIComponent(jQuery('#twilio_from_number').val()) + '&action=' + hold_action, 
        dataType: 'json', 
        success: function(data) {} 

       }); 
      } 

Это получает в callsid по используя parentcallsid из моей БД называют это functionto поставить вызов на удержание

function update_call($callSid, $action, $admin_no = '') { 
       $rr = array(
        "url" => "holdactionurl?type=".$action. 
        '&admin_no='.$admin_no, 
        "method" => "POST" 
       ); 
       $call = $this->client->calls($callSid)->update($rr); 
       return $call->to; 
      } 

И holdactionurl я использовал this-

<Response> 
    <Enqueue waitUrl="wait_url">first_queue</Enqueue> 
</Response> 

И wait_url я использовал this-

<Response> 
    <Say>You are on hold </Say> 
    <Redirect>wait_url</Redirect> 
</Response> 

И я для unholding вызов I (означает то же число, которое поставили вызов на удержание) используется тот же метод holdaction с различными параметр и код XML для этого это-

<Response> 
    <Dial> 
    <Queue>first_queue1</Queue> 
    </Dial> 
</Response> 

Я знаю, что я делаю это неправильно, но я не могу понять, правильный путь, так что я буду очень признателен, если вы можете помочь мне понять это то, что Я делаю неправильно

+0

Что вы пытаетесь сделать с вызовом, как только оно будет отменено? Вы подключаетесь к другому абоненту или делаете что-то еще? Я могу помочь, мне просто нужно знать, что будет дальше. – philnash

+0

спасибо за ответ. Я удержал вызов, когда я нажимаю кнопку удержания, но я не могу понять, как отменить вызов и снова подключить тех же абонентов. –

+0

Хорошо, круто, так как они связаны в первую очередь и что вы делаете с другим концом? Можете ли вы поделиться кодом, который вы используете для достижения этого до сих пор? – philnash

ответ

0

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

Спасибо, что ответили на мои вопросы в комментариях. Кажется, я знаю, где мы сейчас.

Как вы говорите, вы следовали my answer here. При этом вызывающая сторона помещается в очередь, уникальную для вызываемого агента. Агент, между тем, перенаправляется на цикл (в моем примере он просто сказал «У вас есть вызывающий абонент» снова и снова).

В своем вопросе, вы говорите о перенаправлении абонента, который был поставлен в очередь на следующую TwiML:

<Response> 
    <Queue>1111</Queue> 
</Response> 

Глагол <Queue> используется для набора номера из людей вне очереди к следующему человеку в очередь. Таким образом, в этом случае вы пытаетесь заставить вызываемого по очереди вызывающего абонента набрать номер, который не может работать.

Вместо этого вам необходимо сделать переадресацию на агенте, направляя их из цикла, в который они были помещены, и вызывать человека из очереди.

Таким образом, вы не из очереди звонящему, перемещая их из <Enqueue> в <Queue>, вы из очереди абонента путем получения кто-то набрать <Queue>

Позвольте мне знать, если это помогает вообще.

Update

Из кода я считаю, что это то, что происходит.

На вашем сервере update_call Функция, в которой вы перемещаете исходящий вызов в очередь, эффективно помещает ваш агент в режим ожидания. Я предполагаю, что это означает, что другой конец теряет соединение, и это ваша проблема. Если это не так, просто дай мне знать.

В любом случае, нам нужно найти дочерний вызов и нажать его в очередь. Я бы разделил вашу функцию update_call, чтобы выполнить две разные вещи. Во-первых, получите childCallSid и перенаправьте его на holdactionurl.

function holdChildCall($parentCallSid, $action, $admin_no = '') { 
    $childCalls = $this->client->calls->read(array("ParentCallSid" => $parentCallSid)); 
    $childCallSid = $childCalls[0]->sid; 
    $rr = array(
     "url" => "holdactionurl?type=".$action. 
     '&admin_no='.$admin_no, 
     "method" => "POST" 
    ); 
    $call = $this->client->calls($childCallSid)->update($rr); 
    return $call->to; 
} 

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

<Response> 
    <Dial callerId="callerid"> 
    <Number statusCallbackEvent="initiated ringing answered completed" statusCallback="urltohadlestatus">user_number</Number> 
    </Dial> 
</Response> 

Вам необходимо обновить <Dial> здесь, чтобы дать ему больше TwiML заскочить в один раз ребенок вызов сбрасывается. Добавьте перенаправление после <Dial>.

<Response> 
    <Dial callerId="callerid"> 
    <Number statusCallbackEvent="initiated ringing answered completed" statusCallback="urltohadlestatus">user_number</Number> 
    </Dial> 
    <Redirect>/admin_on_hold</Redirect> 
</Response> 

Вы можете вызвать URL, что вы хотите, я назвал его /admin_on_hold сейчас. Вам нужен TwiML по этому URL-адресу, который также поддерживает вызывающего абонента. Вы могли бы использовать что-то подобное к существующему уведомлению удержания:

<Response> 
    <Say>You have a caller on hold. </Say> 
    <Pause length="5"></Pause> 
    <Redirect>wait_url</Redirect> 
</Response> 

Теперь, когда вы нажимаете держите ребенка вызов, вызываемый человек, будет поставлен в очередь и ждать с сообщением удержания. И ваш агент, вызывающий, родительский вызов, также услышит сообщение, чтобы сказать, что они удерживают вызывающего абонента на удержании.

Теперь нам нужно подключить двух вызывающих абонентов. Мы делаем это, перенаправляя вызов агента, родительский вызов, на <Queue>, это вызовет дочерний вызов из очереди и снова подключит их. Фактически мы можем использовать существующую функцию update_call. Убедитесь, что вы передаете родительский вызов SID и $action, который создает <Queue> TwiML от holdactionurl с тем же именем очереди, которое вы использовали для <Enqueue> вызывающего абонента.

function update_call($parentCallSid, $action, $admin_no = '') { 
    $rr = array(
     "url" => "holdactionurl?type=".$action. 
     '&admin_no='.$admin_no, 
     "method" => "POST" 
    ); 
    $call = $this->client->calls($parentCallSid)->update($rr); 
    return $call->to; 
} 

Имеет ли это смысл? Вы должны убедиться, что вы перенаправлять ребенка вызов к TwiML, который использует <Enqueue>, добавьте дополнительный <Redirect> после <Dial> так, что ваш агент не вешается, а затем, когда вы снятие этого перенаправить вызов агента к TwiML, что использует <Queue>.

+0

хорошо, можете ли вы предоставить код для этого (вам нужно сделать перенаправление на агенте, направление их из цикла, в которое они были помещены, и вызов человека из очереди.) –

+0

Если вы редактируете исходный вопрос с кодом и потоком вызовов, который вы используете в настоящее время, я могу способный адаптировать его. Я не могу написать весь код для вас, поскольку я не знаю вашего варианта использования или как вы его начали. – philnash

+0

Хорошо, какая часть кода нужна. –