2017-05-23 45 views
1

我有以下简单的回叫来处理Twilio呼叫。我要求用户按下任何键盘按钮继续。如果通话收件人未按下某个键,则再次询问该问题。如何确定呼叫接收者是否挂断。目前,如果接听电话并挂机,我的重定向路线继续进行,直到我放弃要求按任意键。在挂断之前可能会有一分钟的延迟,以及我的应用停止接收命中的时间点。如何确定呼叫接收者在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被击中与往常一样,initiatedringing等呼叫接收者拿起电话和statusCallback被击中in-progress。按照上面1中定义的url:命中我的question_path。一些处理后我的反应叫做如下

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 

3)@latest_question.textPlease press any key to continue。如果通话收件人挂断,我想终止通话。我希望我的statusCallback能够打到状态,让我知道电话接收者已挂断。它不这样做,我不知道它发生了。超时后,我的voice_redirect_path被击中。没有回应,所以我再次问这个问题。我仍然不知道电话已挂断。我继续问这个问题,一切仍在继续,好像呼叫接收者仍然在线。这一直持续下去,直到我放弃并挂断电话。然后我的statusCallback被点击,状态为completed

在此先感谢。

+0

您是否在呼出中设置了一个'statusCallback' URL,无论是来自出站的API请求,还是Twilio控制台中编号的'statusCallback'设置? – philnash

+0

是的,我有。即使呼叫已挂断,'statusCallback'仍会继续以'进行中'命中。直到我最终放弃要求呼叫者按任意键并挂断自己,我的'statusCallback'才被命令为'completed'的状态。 – RamJet

+0

我发现这个[link](https://stackoverflow.com/questions/24087517/twiml-app-if-the-caller-hangs-up-in-the-middle-of-the-application-process-does) 。它说我可以做我想做的事,但实际上并没有说我该怎么做。 – RamJet

回答

0

Twilio开发者传道这里。

这很奇怪,你不会立即从状态回调中获得挂断事件。如果您可以发邮件给[email protected]并在发生这种情况时拨打SID,我会在内部与团队一起提高(尽管我本周假期,所以通过support team可能会更快)。

要解决此问题,可以在重定向到voice_redirect_path时使用计数参数,并在计数过高时自行挂断。例如:

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 

这将允许您在等待答案的同时设置最大数量的重定向。

让我知道这是否有帮助。