全栈工程师成长记

编程重新定义人生

在ruby on rails项目中创建geetest滑动验证码

以devise注册页使用滑动验证码为例子。

一. 在rails app的lib文件夹中新建
geetest_ruby_sdk.rb
填入以下内容

lib/geetest_ruby_sdk.rb
require 'digest'
require 'net/http'

class GeetestSDK
    def initialize(key, new_uri=nil)
        @gee_uri = new_uri || 'http://api.geetest.com/validate.php'
        @key = key
    end

    def validate(challenge='', validate='', seccode='')
        md5 = Digest::MD5.hexdigest(@key + 'geetest' + challenge)
        if validate == md5
            back = post(@gee_uri, seccode: seccode) rescue ''
            if back == Digest::MD5.hexdigest(seccode)
                return true
            else
                return false
            end #if

        else
            return false
        end #if

    end #geetest_validate


    # data.is_a?(Hash)==true

    def post(uri, data)
        uri = URI(uri)
        res = Net::HTTP.post_form(uri, data)
        res.body
    end

end

二. 修改想要使用验证码的controller action
这里改的是app/controllers/devise/users/registrations_controller.rb的create action

app/controllers/devise/users/registrations_controller.rb
def create
  require 'geetest_ruby_sdk'

  challenge = params[:geetest_challenge] || ''
  validate = params[:geetest_validate] || ''
  seccode = params[:geetest_seccode] || ''

  # 将私钥传入,在geetest.com注册

  sdk = GeetestSDK.new('你的私钥KEY')
  if sdk.validate(challenge, validate, seccode)
    super
  else
    flash[:alert] = "请滑动滑块进行验证"
    redirect_to :back
  end
end

三、在view中引用验证码
<script type="text/javascript" src="http://api.geetest.com/get.php?gt=id"></script>

这里的id是geetest的公钥,公钥和私钥在geetest.com后台的验证管理里查看。

注意:可以先在浏览器里直接访问http://api.geetest.com/get.php?gt=你的id看看网址是否能连上,如果报404错误之类的,那么在view页面不会出现验证滑块的,要先找geetest的客服帮忙配置一下,这是今天遇到的巨坑,几度怀疑自己代码是否出了问题……