4

我正在 Rails 3 中构建一个应用程序,使用 twilio 来验证企业的存在。基本上,当您创建一个新业务时,我会随机生成一个 6 位数字,然后使用此验证码拨打业务电话号码,用户需要将其输入回系统中才能完成注册过程。我很难找到有关如何进行此设置的任何相关示例。我找到了这个,但它似乎已经过时了,并且似乎不适用于 Rails 3。twilio-rb gem的文档也令人困惑。

有谁知道任何示例或有任何代码示例可以为我指明正确的方向?

4

3 回答 3

6

正如我在对您的问题本身的评论中所说,我是您提到的 twilio-rb gem 的作者。在我的脑海中,我会实施一个验证资源,你可以在其中发布电话号码。

POST /verifications.voice { telephone_number: '+12125551234' }

在创建操作中,使用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 

您还需要挽救 twilio-rb 可能引发的任何 API 错误。url 指的是验证资源实例的显示动作。然后,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

由于 Twilio 当前未实现 PUT 动词,因此您将向资源添加成员

resources :verifications do
  member { post 'twilio_hack' }
end

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

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

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

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

这一切都未经测试,我想了大约 2 分钟就想不通了,但它应该能让你开始。

于 2011-04-20T16:51:38.687 回答
2

当您希望验证商家时:

  • 生成验证码。
  • 使用 Twilio REST API 启动出站调用,将回调的 URL 传递给将处理验证逻辑的控制器。Twilio 的文档在这里,示例在这里
  • 这意味着您需要通过回调 URL 将验证码传递给您的控制器。使用带有绑定参数的非资源路由。见这里

编写一个处理调用和处理验证的控制器:

  • 发出要求用户输入验证码的 TwiML。我发现使用 Nokogiri 自己构建 TwiML 是最直接的方法。(请参阅我写的这个简单应用程序中的 phone_greeting 方法:here。)
  • 如果正确,将商家标记为已验证,祝贺用户,然后挂断。
  • 如果没有,则循环。

希望这些信息足以为您指明正确的方向。

于 2011-04-20T15:43:40.607 回答
1

您是否考虑过使用 Twilio 的拨出呼叫者 ID 来帮助解决此问题?

当通过 REST 调用 Twilio 向您的帐户添加新的来电显示时,Twilio 将返回一个 6 位验证码(属性 ValidationCode)供您显示在您的 UI 中,然后 Twilio 将自动拨打该号码并提示输入该代码。当用户通过电话验证号码时,他们的号码将被添加到您帐户的来电显示中。然后,您可以通过 REST(参数 PhoneNumber)查询 Twilio 的电话号码,以确保验证成功。

有关文档,请参见此处:

添加来电显示:http: //www.twilio.com/docs/api/rest/outgoing-caller-ids#list-post

查找来电显示:http: //www.twilio.com/docs/api/rest/outgoing-caller-ids#list

于 2011-04-20T08:21:53.083 回答