2017-02-15 123 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

好的哪部分代码需要。 –