Rails 3和Twilio做电话验证

god*_*yan 4 verification ruby-on-rails phone-call twilio ruby-on-rails-3

我在Rails 3中构建一个应用程序,使用twilio来验证企业的存在.基本上,当您创建新的商务时,我会随机生成一个6位数字,然后使用此验证码调用商家电话号码,用户需要将其输入系统以完成注册过程.我无法找到有关如何设置此设置的相关示例.我发现了这一点,但它看起来非常过时,似乎与Rails 3不兼容.twilio-rb gem的文档也令人困惑.

有没有人知道任何例子或有任何代码样本可以指向我正确的方向?

Ste*_*ham 6

正如我在你的问题评论中所说,我是你提到的twilio-rb gem的作者.在我的头顶,我会实现一个你发布电话号码的验证资源.

POST /verifications.voice { telephone_number: '+12125551234' }
Run Code Online (Sandbox Code Playgroud)

在create action中用于使用Twilio::Call.createTwilio创建新的调用

def create
  @verification = Verification.new params[:verification]

  if @verification.save
    Twilio::Call.create to: @verification.telephone_number, 
      from: YOUR_CALLER_ID, url: verification_url(@verification, format: :voice)
    # 201 created and return verification code etc
  else
    # Handle errors
  end
end 
Run Code Online (Sandbox Code Playgroud)

您还需要解决twilio-rb可能引发的任何API错误.url指的是验证资源实例的show动作.然后Twilio将拨打提供的电话号码,并且当呼叫连接时将请求该URL,例如,GET /verifications/1.voice因此您需要一个显示视图,要求提供验证码并使用<Gather>动词收集数字:

res.gather num_digits: 4, action: twilio_hack_verification_url(@verification, :format => :voice), method: 'POST' do |form|
  form.say 'Please enter the your 4 digit verification code'
end
Run Code Online (Sandbox Code Playgroud)

由于Twilio目前没有实现PUT动词,因此您将向您的资源添加成员

resources :verifications do
  member { post 'twilio_hack' }
end
Run Code Online (Sandbox Code Playgroud)

然后在您的控制器中使用用户输入更新对象:

def twilio_hack
  @verification = Verification.find(params[:id]).tap do |v|
    v.user_input params['Digits']
    v.save
  end

  if @verification.confirmed?
    # handle success
  else
    # handle failure
  end

end
Run Code Online (Sandbox Code Playgroud)

最后,在您的模型中,您将需要生成验证码的代码,并验证它是否已确认

class Verification < ActiveRecord::Base
  before_save   -> { self[:confirmed] = true if user_input == verification_code }, if: user_input
  before_create -> { self[:verification_code] = rand.to_s[2..5] }
end
Run Code Online (Sandbox Code Playgroud)

这一切都是未经测试的,并且在大约2分钟的时间里我想到了,但它应该让你开始.