我有以下简单的回调来处理Twilio调用。我要求用户按任何键盘按钮继续。如果呼叫接收者未按任何键,则再次询问该问题。如何确定呼叫接收方是否挂断。目前,如果呼叫被应答然后挂断,我的重定向路由继续被击中,直到我放弃要求按任意键。在挂断之前和我的应用程序停止接收点击时可能会有一分钟的延迟。
def response
Twilio::TwiML::Response.new do |r|
r.Gather finishOnKey: '#', numDigits: @num_digits,
timeout: @phone_wait_time,
action: NGROK +
voice_path(@notification.id, @final_question_response) do |g|
g.Say @latest_question.text, voice: 'alice', language: 'en-AU'
end
r.Redirect NGROK +
voice_redirect_path(@notification.id, @final_question_response)
end.to_xml
end
这里有关于我遇到的问题和我正在尝试做的事情的更多信息。我将用一个例子。
1)我拨打电话如下
def call_phone
client = Twilio::REST::Client.new(
Rails.application.secrets.twilio_sid,
Rails.application.secrets.twilio_token
)
call = client.account.calls.create(
from: Rails.application.secrets.twilio_voice_number,
to: @phone_number,
url: NGROK + question_path(@notification.id),
method: 'GET',
statusCallback: NGROK + call_status_path(@notification.id),
statusCallbackEvent: [:initiated, :ringing, :answered, :completed]
)
end
2)我的statusCallback
被通常的initiated
,ringing
等点击。来电接听者拿起电话,statusCallback
被{{1}击中}}。我的in-progress
按照上面1中定义的question_path
进行了点击。经过一些处理后,我的响应如下调用
url:
3) def response
Twilio::TwiML::Response.new do |r|
r.Gather finishOnKey: '#', numDigits: @num_digits,
timeout: @phone_wait_time,
action: NGROK +
voice_path(@notification.id, @final_question_response) do |g|
g.Say @latest_question.text, voice: 'alice', language: 'en-AU'
end
r.Redirect NGROK +
voice_redirect_path(@notification.id, @final_question_response)
end.to_xml
end
说@latest_question.text
。如果呼叫接收者挂断,我想终止呼叫。我希望我的Please press any key to continue
会被一个状态命中,让我知道呼叫接收者已经挂断了。它没有这样做,我不知道它发生过。超时后,我的statusCallback
被点击。没有回复,所以我再次提出这个问题。我还是不知道电话已经挂断了。我继续问这个问题,一切都在继续,好像呼叫接收者还在线上。这一直持续到我放弃并挂断电话。然后我的voice_redirect_path
被点击状态为statusCallback
。
提前致谢。
答案 0 :(得分:2)
Twilio开发者传道者在这里。
你不会立即从状态回调中获得挂起事件,这很奇怪。如果您可以发送电子邮件给我发送电子邮件地址为philnash@twilio.com,我会在内部向团队提出(虽然我本周正在休假,所以通过{{3}可能会更快})。
要解决此问题,您可以在重定向到voice_redirect_path
时使用count参数,并在计数过高时自行挂断。类似的东西:
def response
Twilio::TwiML::Response.new do |r|
@count = params[:count] || 0
if @count > MAX_REDIRECTS
r.Hangup
else
r.Gather finishOnKey: '#', numDigits: @num_digits,
timeout: @phone_wait_time,
action: NGROK +
voice_path(@notification.id, @final_question_response) do |g|
g.Say @latest_question.text, voice: 'alice', language: 'en-AU'
end
r.Redirect NGROK +
voice_redirect_path(@notification.id, @final_question_response, :count = @count+1)
end
end.to_xml
end
这样您就可以在等待答案时设置最大重定向次数。
让我知道这是否有帮助。