PHP 极验验证码实例讲解


Posted in PHP onSeptember 29, 2016

你能找到这篇文章,说明你对极验验证已经不是完全陌生的了,所有废话我就不多说了,直接开始表说如何使用它,不过在此之前呢,先粘贴几个你可能会用得到的网址:

官网:http://www.geetest.com/

官方文档:http://www.geetest.com/install/sections/idx-basic-introduction.html

github:https://github.com/GeeTeam/gt-php-sdk.git

如何使用:

首先要确认前端使用页面,比如登陆页面

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

1.在登陆页面访问引入类库:

如果您的网站使用https,则只需要将引入极验库的地方换成https协议即可,不需要更改其它地方。例如更换成以下代码即可:

<script src="https://code.jquery.com/jquery-1.12.3.min.js"></script>
<script src="https://static.geetest.com/static/tools/gt.js"></script>

2.初始化前端

下面的代码需要在页面加载后就执行,如果你使用jQuery,可以写在$(function(){});内

$.ajax({
  // 获取id,challenge,success(是否启用failback)
  url: "../web/StartCaptchaServlet.php?t=" + (new Date()).getTime(), // 加随机数防止缓存
  type: "get",
  dataType: "json",
  success: function (data) {
    // 使用initGeetest接口
    // 参数1:配置参数
    // 参数2:回调,回调的第一个参数验证码对象,之后可以使用它做appendTo之类的事件
    initGeetest({
      gt: data.gt,
      challenge: data.challenge,
      product: "popup", // 产品形式,包括:float,embed,popup。注意只对PC版验证码有效
      offline: !data.success // 表示用户后台检测极验服务器是否宕机,与SDK配合,用户一般不需要关注
    }, handlerPopup);
  }
});

上面代码的意思是说,页面加载后,需要到你指定的URL地址上获得验证码信息,至于上面的URL地址“../web/StartCaptchaServlet.php”里面写了什么内容,这个我们在服务器端代码部署会详细说明。

但是需要说明的是,上面的代码里有一个回调函数叫“handlerPopup”,这个函数是你需要验证码的真正初始化代码:如下:

// 代码详细说明
var handlerPopup = function (captchaObj) {
  // 注册提交按钮事件,比如在登陆页面的登陆按钮
  $("#popup-submit").click(function () {
    // 此处省略在登陆界面中,获取登陆数据的一些步骤
    
    // 先校验是否点击了验证码
    var validate = captchaObj.getValidate();
    if (!validate) {
      alert('请先完成验证!');
      return;
    }
    // 提交验证码信息,比如登陆页面,你需要提交登陆信息,用户名和密码等登陆数据
    $.ajax({
      url: "../web/VerifyLoginServlet.php",
      type: "post",
      // dataType: "json",
      data: {
        // 用户名和密码等其他数据,自己获取,不做演示
        username:username,
        password:password,
        // 验证码数据,这些数据不用自己获取
        // 这是二次验证所需的三个值
        // 当然,你也可以直接设置验证码单独校验,省略其他信息
        geetest_challenge: validate.geetest_challenge,
        geetest_validate: validate.geetest_validate,
        geetest_seccode: validate.geetest_seccode
      },
      // 这里是正确返回处理结果的处理函数
      // 假设你就返回了1,2,3
      // 当然,正常情况是返回JSON数据
      success: function (result) {
        // 1表示验证码验证失败
        if (result == "1") {
          alert("验证码验证失败!");
        }else if (result == "2") {
          alert("用户名或密码错误!");
        }else if (result == "3") {
          alert("登陆成功!");
          // 登陆成功了,可以在这里做其他处理
        }else{
          alert("登陆错误!");
        }
      }
    });
  });
  // 弹出式需要绑定触发验证码弹出按钮
  // 比如在登陆页面,这个触发按钮就是登陆按钮
  captchaObj.bindOn("#popup-submit");
   
  // 将验证码加到id为captcha的元素里
  // 验证码将会在下面指定的元素中显示出来
  captchaObj.appendTo("#popup-captcha");
   
  // 更多接口参考:http://www.geetest.com/install/sections/idx-client-sdk.html
};

至此,前端的所有设置都写完了,官方的说明文档:http://www.geetest.com/install/sections/idx-client-sdk.html

 3.服务器端部署(PHP) 

在第一步中,我们设置了一个这样的地址“../web/StartCaptchaServlet.php”,在这个地址里边写什么呢:

<?php
// 引入文件
require_once dirname(dirname(__FILE__)) . '/lib/class.geetestlib.php';
require_once dirname(dirname(__FILE__)) . '/config/config.php';
// 实例化,实例化的参数在config中配置,分别是:验证ID 和 验证Key,如何获取下面会说。
$GtSdk = new GeetestLib(CAPTCHA_ID, PRIVATE_KEY);
session_start();
// 这个是用户的标识,或者说是给极验服务器区分的标识,如果你项目没有预先设置,可以像下面这样设置:
if(!isset($_SESSION['user_id'])){
  $_SESSION['user_id']=uniqid();// 生成一个唯一ID
}
$user_id = $_SESSION['user_id'];
// 或者,你就直接写成:
// $user_id = "test";
 
// 生成验证码信息,并返回给客户端
$status = $GtSdk->pre_process($user_id);
$_SESSION['gtserver'] = $status;
$_SESSION['user_id'] = $user_id;
echo $GtSdk->get_response_str();
?>

如何获取 验证ID 和 验证Key :

1.从 验证后台 注册账号
2.添加验证,可以获取一组当前验证的ID/Key
3.将ID和Key分别替换到config.php文件中的captcha_id/private_key变量的值 

4.点击提交按钮之后的服务端校验(二次验证)

比如上面说的,用户登录时,你把用户名和密码和验证码信息都提交到服务器了,这个时候,你就可以做校验了:

<?php
// 引入文件
require_once dirname(dirname(__FILE__)) . '/lib/class.geetestlib.php';
require_once dirname(dirname(__FILE__)) . '/config/config.php';
session_start();
$GtSdk = new GeetestLib(CAPTCHA_ID, PRIVATE_KEY);
 
// 比如你设置了一个验证码是否验证通过的标识
$code_flag=false;
 
// 这里获取你之前设置的user_id,传送给极验服务器做校验
$user_id = $_SESSION['user_id'];
if ($_SESSION['gtserver'] == 1) {
  $result = $GtSdk->success_validate($_POST['geetest_challenge'], $_POST['geetest_validate'], $_POST['geetest_seccode'], $user_id);
  if ($result) {
    // 验证码验证成功
    $code_flag=true;
  }
}else{
  if ($GtSdk->fail_validate($_POST['geetest_challenge'],$_POST['geetest_validate'],$_POST['geetest_seccode'])) {
     // 验证码验证成功
    $code_flag=true;
  }
}
 
// 如果验证码验证成功,再进行其他校验
if($code_flag){
  // 其他验证操作
  // 用户名不对时,返回2,其他错误返回3,等等。。。。
}else{
  // 验证码验证失败,返回1,这里和上面相呼应,当然我的项目没有简单的返回1,而是返回了JSON数据
  echo 1;
  exit(-1);
}
?>

感谢你的阅读,希望能帮助到大家,谢谢大家对本站的支持!

PHP 相关文章推荐
用文本文件制作留言板提示(下)
Oct 09 PHP
使ecshop模板中可引用常量的实现方法
Jun 02 PHP
PHP的5个安全措施小结
Jul 17 PHP
基于curl数据采集之单页面采集函数get_html的使用
Apr 28 PHP
php带抄送和密件抄送的邮件发送方法
Mar 20 PHP
php 利用array_slice函数获取随机数组或前几条数据
Sep 30 PHP
php如何实现只替换一次或N次
Oct 29 PHP
PHP实现类似于C语言的文件读取及解析功能
Sep 01 PHP
PHP中PDO事务处理操作示例
May 02 PHP
PHP堆栈调试操作简单示例
Jun 15 PHP
php用户名的密码加密更安全的方法
Jun 21 PHP
asp.net和php的区别点总结
Oct 10 PHP
php自定义函数转换html标签示例
Sep 29 #PHP
php自定义函数实现汉字转换utf8编码的方法
Sep 29 #PHP
php自定义函数实现二维数组按指定key排序的方法
Sep 29 #PHP
分享一个漂亮的php验证码类
Sep 29 #PHP
你不知道的文件上传漏洞php代码分析
Sep 29 #PHP
PHP的Json中文处理解决方案
Sep 29 #PHP
PHP二分查找算法示例【递归与非递归方法】
Sep 29 #PHP
You might like
同一空间绑定多个域名而实现访问不同页面的PHP代码
2006/12/06 PHP
php+mysql结合Ajax实现点赞功能完整实例
2015/01/30 PHP
PHP+APACHE实现网址伪静态
2015/02/22 PHP
php数组随机排序实现方法
2015/06/13 PHP
php多进程模拟并发事务产生的问题小结
2018/12/07 PHP
用户注册常用javascript代码
2009/08/29 Javascript
js创建对象的几种常用方式小结(推荐)
2010/10/24 Javascript
JavaScript高级程序设计 扩展--关于动态原型
2010/11/09 Javascript
同时使用n个window onload加载实例介绍
2013/04/25 Javascript
JavaScript实现网页上的浮动广告的简单方法
2013/06/14 Javascript
JavaScript动态改变表格单元格内容的方法
2015/03/30 Javascript
浅谈关于JavaScript API设计的一些建议和准则
2015/06/24 Javascript
jQuery原理系列-常用Dom操作详解
2016/06/07 Javascript
vue 打包后的文件部署到express服务器上的方法
2017/08/09 Javascript
Ionic3实现图片瀑布流布局
2017/08/09 Javascript
vue 使用Jade模板写html,stylus写css的方法
2018/02/23 Javascript
vue2 拖动排序 vuedraggable组件的实现
2019/08/08 Javascript
vue使用swiper.js重叠轮播组建样式
2019/11/14 Javascript
微信小程序拖拽排序列表的示例代码
2020/07/08 Javascript
python实现基于两张图片生成圆角图标效果的方法
2015/03/26 Python
Python使用defaultdict读取文件各列的方法
2017/05/11 Python
Python使用ConfigParser模块操作配置文件的方法
2018/06/29 Python
linux查找当前python解释器的位置方法
2019/02/20 Python
PyQt5实现简单数据标注工具
2019/03/18 Python
python文档字符串(函数使用说明)使用详解
2019/07/30 Python
详解使用Python下载文件的几种方法
2019/10/13 Python
完美解决TensorFlow和Keras大数据量内存溢出的问题
2020/07/03 Python
英国No.1文具和办公用品在线:Euroffice
2016/09/21 全球购物
中国最大的潮流商品购物网站:YOHO!BUY有货
2017/01/07 全球购物
我看到了用指针调用函数的不同语法形式
2014/07/16 面试题
机械机修工岗位职责
2014/08/03 职场文书
《夜莺的歌声》教学反思
2016/02/22 职场文书
如何用python绘制雷达图
2021/04/24 Python
vue实现可拖拽的dialog弹框
2021/05/13 Vue.js
Win11怎么进入安全模式?Windows 11进入安全模式的方法
2021/11/21 数码科技
详解Python+OpenCV进行基础的图像操作
2022/02/15 Python