2016-12-20 197 views
0

在我的應用程序中,我需要做Twilio控制和取回呼叫。我研究了這個鏈接:https://www.twilio.com/docs/api/rest/change-call-stateTwilio找回呼叫

的JavaScript

function holdCall() { // hold a call 
var callSid = connection.parameters.CallSid; 

$.ajax({ 
    url: "http://www.domain.com/phone/phone_ajax.php", 
    type: 'POST', 
    data: { 
     callSid: callSid 
    }, 
    success: function(data) { 
     console.log(data); 
    }, 
    error: function() { 

    }, 
    complete: function() { 

    } 

}); 
} 

AJAX調用會到這個網頁。

phone_ajax.php

require_once ("http://www.domain.com/phone/phone_api/vendor/autoload.php"); 
use Twilio\Rest\Client; 
use Twilio\Jwt\ClientToken; 

// initialize 

if ($_POST['callSid']) { // hold a call 
    $client = new Client($twilioAccountSID, $twilioAuthenticationToken); 
    $calls = $client->calls->read(
     array("ParentCallSid" => $_POST['callSid']) 
    ); 
    // Loop over the list of calls and echo a property for each one 
    foreach ($calls as $call) { 
     // This will return child call sid e.g CA9ccxxxxxxxxxx 
     $twilioCall = $client 
     ->calls($call->sid) 
     ->update(
      array(
       "url" => "http://demo.twilio.com/docs/voice.xml", 
       "method" => "POST" 
      ) 
     ); 

     echo $twilioCall->to; 
    } 
} 

我打過電話到我的手機,拿起電話,並點擊按住按鈕。我的瀏覽器中的通話結束了,手機中的通話沒有結束(我可以聽到手機中有音樂)。當我再次點擊撥號盤上的保持按鈕時,應該恢復調用。我怎樣才能做到這一點?

任何人都可以幫助我做到這一點?提前致謝。

回答

1

Twilio開發人員傳道這裏。

這裏的問題是,當您更新第一個電話重定向到保持音樂,斷開其他呼叫並結束它。

這很可能是因爲您的TwiML<Dial>之後結束,它們將首先連接兩個呼叫。您可以通過在使用action attribute之後添加更多TwiML來保持呼叫。

相反,如果調用你的Twilio客戶端腿有以下TwiML:

<Response> 
    <Dial action="/holding">NUMBER_TO_DIAL</Dial> 
</Response> 

和端點/holding看起來像:

<Response> 
    <Say>You have a caller on hold.</Say> 
    <Redirect>/holding</Redirect> 
</Response> 

然後您的電話將不會結束。它會無休止地說「你有一個呼叫者擱置」。儘管如此,你可以實現這個。

現在,不應將另一端的呼叫方運送到「http://demo.twilio.com/docs/voice.xml」,您應該等待place them in a queue以供檢索。因此,您需要使用另一個端點/place-on-hold,您可以在按下「保持」按鈕時更新呼叫。這將需要TwiML:

<Response> 
    <Enqueue waitUrl="SOME_HOLD_MUSIC">ADMIN_ID</Enqueue> 
</Response> 

如果你用誰把用戶的呼叫,然後如果你有Twilio客戶端撥號程序的多個用戶,然後他們將各自有自己的保持隊列管理員的ID。

最後,您需要重新連接呼叫者。爲此,您需要再次使用REST API將您的管理員重定向到其持有模式,並將其重新連接到將會重新連接呼叫者的一些TwiML。 TwiML將如下所示:

<Response> 
    <Dial action="/holding"> 
    <Queue>ADMIN_ID</Queue> 
    </Dial> 
</Response> 

這將使掛機的呼叫者脫隊並重新連接。請注意,我們還包含action屬性,以便用戶可以再次處於保持狀態。

讓我知道這是否有幫助。

+0

@ Philnash ..我可以用JavaScript客戶端做到這一點..我真的需要TwiML來做到這一點嗎? – Jenz

+0

好吧,如果您正在尋找保持音樂和其他功能來暫停某人,那麼是的,因爲Twilio客戶端只能控制通話的一方。您可以[靜音Twilio客戶端](https://www.twilio.com/docs/api/client/connection#mute)結束,這將阻止主叫方使用客戶端聽取該人的聲音,但讓他們保持沉默。 – philnash

+0

@ Philnash ..我可以怎樣稱呼twiML文件? '$ twilioCall = $客戶 \t \t - >呼叫($呼叫 - > SID) \t \t - >更新( \t \t \t陣列( \t \t \t \t 「URL」=> 「redirect_twiml.xml」, \t \t \t \t 「方法」=> 「POST」 \t \t \t) \t \t);'它是這樣嗎? – Jenz