我需要帮助才能保持通话。我尝试了两种方法。
1 即可。当我按下保持按钮我使用enqueue动词我有用户更新呼叫方法
<Response>
<Enqueue waitUrl="urltoplaytheholdmusic">1111</Enqueue>
</Response>
(当我按下unhold按钮时,我使用了相同的更新方法并使用了。)
<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>
现在我不知道如何解决这个问题。
这就是我正在做的事情。 当我打电话时,我已经使用了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) {}
});
}
这通过使用来自我的db调用此函数的parentcallsid来获取callsid以保持呼叫
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>
我取消保持呼叫I(表示保持呼叫的相同号码)使用相同的 holdaction 方法和不同的参数,xml代码是 -
<Response>
<Dial>
<Queue>first_queue1</Queue>
</Dial>
</Response>
我知道我做错了但是我无法找到正确的方法所以我会非常感激如果你能帮助我弄明白我做错了什么
答案 0 :(得分:1)
Twilio开发者传道者在这里。
感谢您在评论中回答我的问题。我想我知道我们现在在哪里。
正如您所说,您已关注my answer here。在此,调用者被放入他们调用的代理所特有的队列中。同时,代理被重定向到一个循环(在我的例子中它只是说&#34;你有一个呼叫者保持&#34;一遍又一遍)。
在这里的问题中,您谈到将已排队的调用者重定向到以下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>
您可以随意调用网址,我现在称之为/admin_on_hold
。您需要在该URL处使用一些TwiML,以便将呼叫者保持在线路上。您可以使用类似于现有保留通知的内容:
<Response>
<Say>You have a caller on hold. </Say>
<Pause length="5"></Pause>
<Redirect>wait_url</Redirect>
</Response>
现在,当您按住您的子女呼叫时,被叫方将排队并等待保持消息。而您的座席,来电者,家长电话,也会听到一条消息,说他们正在等待来电。
现在我们需要重新连接两个来电者。我们通过将代理调用(父调用)重定向到<Queue>
来执行此操作,这将弹出子调用队列并重新连接它们。我们实际上可以使用现有的update_call
函数。确保您传递父调用SID和$action
来自<Queue>
的{{1}} TwiML holdactionurl
,其名称与您在第一个调用方中使用的<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;
}
这有意义吗?您需要确保将子呼叫重定向到使用<Enqueue>
的TwiML,在<Redirect>
之后添加额外的<Dial>
以便代理没有挂机,然后当您取消将座席呼叫重定向到使用<Queue>
的TwiML时。