TP5框架集成极验验证码

为了解决在注册时被机器人刷账号,现在有个极验验证码,可以增加注册时的难度

极验验证码有一个免费版本,自行去极验验证码官网的官网注册申请,http://www.geetest.com/

官网有文档,可以自己对照集成。

下面是我的集成方法

下载SDK,放到extend中的jiyan文件夹中

lib中的文件名字改一下

在需要集成的页面引入JS 

<script src="http://code.jquery.com/jquery-1.12.3.min.js"></script>

<script src="http://static.geetest.com/static/tools/gt.js"></script>

在需要集成的页面中

添加下面的代码

<dd id="captcha-box" class="pwd_icon"></dd>
<script type="text/javascript">
	$(function(){
		$.ajax({
		    url: "/getData?t=" + (new Date()).getTime(),// 加随机数防止缓存
		    type: "get",
		    dataType: "json",
		    success: function (data) {
		    	var JsonObjs = $.parseJSON(data);
		        //请检测data的数据结构, 保证data.gt, data.challenge, data.success有值
		        initGeetest({
		            // 以下配置参数来自服务端 SDK
		            gt: JsonObjs.gt,
		            challenge: JsonObjs.challenge,
		            offline: !JsonObjs.success,
		            product: "popup", // 产品形式,包括:float,embed,popup。注意只对PC版验证码有效
		            new_captcha: true
		        }, handlerPopup)
		    }
		})
	})
	

</script>

 在路由文件route.php中配置一下路由

Route::get('getData','api/Jiyan/getData');

按照路由

<?php
namespace app\api\controller;

use think\Controller;
use think\Request;
// 引入 extend/wechat-sdk/wechat.class.php
// 助手函数import('wechat-sdk.wechat', EXTEND_PATH,'.class.php');

class Jiyan extends Controller
{
    public function getData()
    {
    	
		$request = Request::instance();
		$ip = $request->ip();
		import('jiyan.lib.geetestlib', EXTEND_PATH,'.class.php');
		$GtSdk = new \GeetestLib(config('xcx.JIYANID'), config('xcx.JIYANKEY'));
		session_start();
		if(!isset($_SESSION['user_id'])){
		    $_SESSION['user_id']=uniqid();// 生成一个唯一ID
		}
		$user_id = $_SESSION['user_id'];
		$data = array(
				"user_id" => $user_id, # 网站用户id
				"client_type" => "web", #web:电脑上的浏览器;h5:手机上的浏览器,包括移动应用内完全内置的web_view;native:通过原生SDK植入APP应用的方式
				"ip_address" => $ip # 请在此处传输用户请求验证时所携带的IP
			);
		$status = $GtSdk->pre_process($data, 1);
		$_SESSION['gtserver'] = $status;
		$_SESSION['user_id'] = $data['user_id'];
		return $GtSdk->get_response_str();
    }
    
}

在配置项文件中配置

 

这个时候第一步验证已经完成

下面来做点击提交的验证(第二步验证)

从上面的步骤中我们看到有一个函数  handlerPopup,下面就是这个函数

<script type="text/javascript">
	
	var handlerPopup = function (captchaObj) {
		captchaObj.appendTo('#captcha-box');
	    // 注册提交按钮事件,比如在登陆页面的登陆按钮
	    $(".submit_btn").click(function () {
	        // 此处省略在登陆界面中,获取登陆数据的一些步骤
	        
	        // 先校验是否点击了验证码
	        var validate = captchaObj.getValidate();
	        if (!validate) {
	            alert('请先完成验证!');
	            return;
	        }
	        // 提交验证码信息,比如登陆页面,你需要提交登陆信息,用户名和密码等登陆数据
	        
	    });
	    // 弹出式需要绑定触发验证码弹出按钮
	    // 比如在登陆页面,这个触发按钮就是登陆按钮
	    captchaObj.bindOn(".submit_btn");
	     
	    // 将验证码加到id为captcha的元素里
	    // 验证码将会在下面指定的元素中显示出来
	    captchaObj.appendTo(".submit_btn");
	     
	    // 更多接口参考:http://www.geetest.com/install/sections/idx-client-sdk.html
	};


</script>

提交是提交到 Login 控制器中

<?php

namespace app\admin\controller;

use think\Controller;
use think\Request;
use think\Db;

class Login extends Controller
{
	public function index(Request $request){
		if($request->isPost()){
			session_start();
			import('jiyan.lib.geetestlib', EXTEND_PATH,'.class.php');
			$GtSdk = new \GeetestLib(config('xcx.JIYANID'), config('xcx.JIYANKEY'));
			// 比如你设置了一个验证码是否验证通过的标识
			$code_flag=false;
			// 这里获取你之前设置的user_id,传送给极验服务器做校验
			$user_id[] = $_SESSION['user_id'];
			if ($_SESSION['gtserver'] == 1) {
			    $result = $GtSdk->success_validate($request->param('geetest_challenge'), $request->param('geetest_validate'), $request->param('geetest_seccode'), $user_id);
			    if ($result) {
			        // 验证码验证成功
			        $code_flag=true;
			    }
			}else{
			    if ($GtSdk->fail_validate($request->param('geetest_challenge'),$request->param('geetest_validate'),$request->param('geetest_seccode'))) {
			         // 验证码验证成功
			        $code_flag=true;
			    }
			}
			// 如果验证码验证成功,再进行其他校验
			if($code_flag){
			    // 其他验证操作
			    // 用户名不对时,返回2,其他错误返回3,等等。。。。
			    $username = $request->param('user_name');
				$passqord = md5($request->param('password'));
				$res = Db::name('admin')->where(['user_name'=>$username,'password'=>$passqord])->find();
				if($res){
					session('user_name',$username);
					return $this->success('登录成功','/admin');
				}else{
					return $this->error('用户名或者密码错误','/login');
				}
			}else{
			    // 验证码验证失败,返回1,这里和上面相呼应,当然我的项目没有简单的返回1,而是返回了JSON数据
			    return $this->error('验证码验证失败','/login');
			}
			
		}else{
			return $this->fetch();
		}
	}

    
}

这样就验证完成了

参考:https://www.cnblogs.com/caoruiy/p/5544102.html

猜你喜欢

转载自blog.csdn.net/dabao87/article/details/82856162
今日推荐