【问题标题】:Twilio,How to unhold the callTwilio,如何取消保持通话
【发布时间】:2017-02-15 05:45:47
【问题描述】:

我需要帮助来接听电话。我尝试了两种方法。

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

                 });
             }

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

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>

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

【问题讨论】:

  • 通话被挂断后,你想做什么?您是在连接另一个呼叫者还是在做其他事情?我可以帮忙,我只需要知道接下来会发生什么。
  • 感谢您的回复。当我按下保持按钮时,我将通话置于保持状态,但我不知道如何取消保持通话并再次重新连接相同的呼叫者。
  • 好的,很酷,那么它们首先是如何连接的,你如何处理另一端?你能分享到目前为止你用来实现这一目标的代码吗?
  • 我已经使用这个'&lt;Response&gt;&lt;Dial callerId="callerid"&gt;&lt;Number statusCallbackEvent="initiated ringing answered completed" statusCallback="url1" satusCallbackMethod="POST"&gt;number&lt;/Number&gt;&lt;/Dial&gt; &lt;/Response&gt;'拨出号码并使用更新方法将呼叫置于保持状态-&lt;Response&gt;&lt;Enqueue waitUrl="wait_url"&gt;1111&lt;/Enqueue&gt;&lt;/Response&gt; 和 wait_url 我播放保持音乐并取消保持我使用相同的更新方法并使用了“&lt;Response&gt;&lt;Dial&gt;&lt;Queue&gt;1111&lt;/Queue&gt;&lt;/Dial&gt;&lt;/Response&gt;
  • 我遵循了你在回答这个问题时提到的确切过程 [stackoverflow.com/questions/41236926/… 但是当我使用&lt;Response&gt; &lt;Dial action="/holding"&gt; &lt;Queue&gt;ADMIN_ID&lt;/Queue&gt; &lt;/Dial&gt; &lt;/Response&gt;时它不起作用

标签: twilio twilio-php twilio-api twilio-click-to-call


【解决方案1】:

这里是 Twilio 开发者宣传员。

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

如您所说,您已关注my answer here。在这种情况下,呼叫者被放入他们呼叫的代理独有的队列中。与此同时,代理被重定向到一个循环(在我的示例中,它只是一遍又一遍地说“您有一个呼叫者处于等待状态”)。

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

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

&lt;Queue&gt; 动词用于从队列外的人拨打队列中的下一个人。所以在这种情况下,你试图让排队的呼叫者自己拨号,这是行不通的。

相反,您需要对代理进行重定向,将他们引导出他们被放入的循环并将此人从队列中调用。

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

让我知道这是否有帮助。

更新

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

在您的服务器 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>

您需要在此处更新&lt;Dial&gt;,以便在子呼叫中断后为其提供更多的 TwiML。在&lt;Dial&gt; 之后添加重定向。

<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>

现在,当您按住您的孩子呼叫时,被叫方将排队等待并显示保留消息。您的代理、呼叫者、家长呼叫也会听到一条消息,说明他们正在保留呼叫者。

现在我们需要重新连接两个调用者。我们通过将代理呼叫(父呼叫)重定向到&lt;Queue&gt; 来做到这一点,这会将子呼叫从队列中弹出并重新连接它们。我们实际上可以为此使用现有的update_call 函数。确保传递父调用 SID 和 $action,该 $actionholdactionurl 生成 &lt;Queue&gt; TwiML,队列名称与最初用于 &lt;Enqueue&gt; 调用者的队列名称相同。

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;
}

这有意义吗?您需要确保将子调用重定向到使用&lt;Enqueue&gt;的TwiML,在&lt;Dial&gt;之后添加额外的&lt;Redirect&gt;,这样您的代理就不会挂起向上,然后当您松开时,将 代理调用 重定向到使用 &lt;Queue&gt; 的 TwiML。

【讨论】:

  • 好的,谢谢,您能否为此提供一些代码(您需要在代理上进行重定向,将他们引导出他们被放入的循环并将此人从队列中调用。 )
  • 如果您使用您当前使用的代码和呼叫流程编辑您的原始问题,我也许可以对其进行调整。我无法为您编写整个代码,因为我不知道您的用例或您是如何开始的。
  • 与此调用流程相关的所有位。
  • 我已经编辑了我的问题并添加了用于保持通话和取消保持通话的代码。让我们提一下我需要什么。例如。如果 A(admin) 向 B(user) 拨出电话,并且在通话后 A 暂停通话,然后 B 听等待音乐,当 A 再次准备好时,A 按 unhold 按钮并再次与 B 重新连接。这是我需要什么来纠正我在代码中做错的地方。
  • 拨出电话时,连接两个电话的TwiML是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多