2017-02-15 121 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從我的DB調用這個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我已經使用這個 -

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

而且在wait_url我已經使用這個 -

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

而我爲了unholding呼叫我(指已擱置呼叫的相同數量的)不同的使用相同的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_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來保持呼叫者的位置。當你按你孩子的呼叫,被叫的人,將被排隊,並保持信息等

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

現在:你可以使用類似的東西到您現有的保持通知。而且您的座席,來電者,家長電話也會聽到一條消息,表示他們正在保持呼叫方的位置。

現在我們需要重新連接兩個呼叫者。我們通過將代理呼叫(父呼叫)重定向到<Queue>來做到這一點,這會將子呼叫從隊列中彈出並重新連接。我們實際上可以使用現有的update_call功能。請確保您傳遞的是父呼叫SID和產生 TwiML的的,它們的排隊名稱與您首先使用的呼叫方的<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

好的哪部分代碼需要。 –