Twilio,如何取消保持通话

Twilio,How to unhold the call

我需要帮助 call.I 已经尝试了两种方法。

1。当我按下保持按钮时使用排队动词我有用户更新调用方法

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

(当我按下取消保持按钮时,我使用了相同的更新方法并使用了。)

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

但是当使用队列动词调用时会断开连接。

2。所以我尝试了另一种方式,当我按下保持按钮时只播放音乐。

 <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) {}

                 });
             }

这通过使用我的数据库中的父呼叫 ID 来获取呼叫 ID 调用此函数以保持呼叫

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>

为了取消保持呼叫,我(表示保持呼叫的同一号码)使用相同的 holdaction 方法,但参数不同,xml代码是-

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

我知道我做错了,但我想不出正确的方法,所以如果你能帮我弄清楚我做错了什么,我将不胜感激

此处为 Twilio 开发人员布道师。

感谢您在评论中回答我的问题。我想我知道我们现在在哪里。

如您所说,您已关注。在这种情况下,呼叫者被放入他们所呼叫的代理唯一的队列中。与此同时,代理被重定向到一个循环(在我的示例中,它只是一遍又一遍地说 "You have a caller on hold")。

在这里的问题中,您谈到将已排队的呼叫者重定向到以下 TwiML:

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

<Queue> 动词用于从队列外的人拨给队列中的下一个人。因此,在这种情况下,您试图让排队的呼叫者自己拨打电话,但这是行不通的。

相反,您需要对代理进行重定向,将他们引导出他们已进入的循环,并将该人叫出队列。

因此,您不会通过将呼叫者从 <Enqueue> 移动到 <Queue> 来使呼叫者出队,而是通过让其他人拨打 <Queue>

来使呼叫者出队

如果有帮助请告诉我。

更新

根据你的代码,我相信这就是正在发生的事情。

在您的服务器 update_call 功能中,您正在将呼出电话移入队列,有效地让您的座席等待。我认为这意味着另一端正在失去连接,这是你的问题。如果不是这样,请告诉我。

无论如何,我们需要做的是找到 child 调用并将其推入队列。我会拆分你的 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;
}

如果您现在尝试此操作,那么被叫端 child 呼叫将被重定向到您的队列,但您的呼叫者,您的代理,parent 呼叫将被切断。我们需要阻止这种情况的发生,我们可以通过调整初始 TwiML 来做到这一点。您在下面的评论表明,目前您的 TwiML 看起来像这样:

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

您需要在此处更新 <Dial>,以便在 child 呼叫中断后为其提供更多 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。您需要一些 URL 的 TwiML 来保持呼叫者在线。您可以使用类似于现有保留通知的内容:

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

现在,当您按下保持您的 child 呼叫时,被叫方将排队等待并等待一条保持消息。您的代理人,即呼叫者,parent 呼叫,也会听到一条消息,表明他们正在保留呼叫者。

现在我们需要重新连接两个来电者。为此,我们将代理呼叫 parent 呼叫重定向到 <Queue>,这会将 child 呼叫从队列中弹出并重新连接它们。我们实际上可以为此使用现有的 update_call 函数。确保您正在传递 parent 调用 SID 和从 holdactionurl 生成 <Queue> TwiML 的 $action 具有与您用于 <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;
}

这有意义吗?您需要确保将 child 调用 重定向到使用 <Enqueue> 的 TwiML,在 <Dial> 之后添加额外的 <Redirect> 以便你的 agent 没有挂断,然后当你取消挂断时,将 agent 呼叫 重定向到使用 <Queue>.[=39 的 TwiML =]