php实现的click captcha点击验证码类实例

本文实例讲述了php实现的click captcha点击验证码类及其用法,是非常实用的功能。分享给大家供大家参考之用。具体如下:

一、需求:

现在常用的表单验证码大部分都是要用户输入为主,但这样对手机用户会不方便。
如果手机用户访问,可以不用输入,而是click某一位置便可确认验证码,这样就会方便很多。

二、原理:

1.使用PHP imagecreate创建PNG图象,在图中画N个圆弧,其中一个是完整的圆(验证用),将圆心坐标及半径记录入session。

2.在浏览器,当用户在验证码图片上点击时,记录点击的位置。

3.将用户点击的坐标与session记录的圆心坐标、半径比较,判断是否在圆中,如是则验证通过。

程序运行效果如下图所示:

三、实现方法:

ClickCaptcha.class.php类文件如下:

<?php
/** Click Captcha 验证码类
*  Date:  2013-05-04
*  Author: fdipzone
*  Ver:  1.0
*/ 

class ClickCaptcha { // class start 

  public $sess_name = 'm_captcha';
  public $width = 500;
  public $height = 200;
  public $icon = 5;
  public $iconColor = array(255, 255, 0);
  public $backgroundColor = array(0, 0, 0);
  public $iconSize = 56; 

  private $_img_res = null; 

  public function __construct($sess_name=''){
    if(session_id() == ''){
      session_start();
    } 

    if($sess_name!=''){
      $this->sess_name = $sess_name; // 设置session name
    }
  } 

  /** 创建验证码 */
  public function create(){ 

    // 创建图象
    $this->_img_res = imagecreate($this->width, $this->height); 

    // 填充背景
    ImageColorAllocate($this->_img_res, $this->backgroundColor[0], $this->backgroundColor[1], $this->backgroundColor[2]); 

    // 分配颜色
    $col_ellipse = imagecolorallocate($this->_img_res, $this->iconColor[0], $this->iconColor[1], $this->iconColor[2]); 

    $minArea = $this->iconSize/2+3; 

    // 混淆用图象,不完整的圆
    for($i=0; $i<$this->icon; $i++){
      $x = mt_rand($minArea, $this->width-$minArea);
      $y = mt_rand($minArea, $this->height-$minArea);
      $s = mt_rand(0, 360);
      $e = $s + 330;
      imagearc($this->_img_res, $x, $y, $this->iconSize, $this->iconSize, $s, $e, $col_ellipse);
    } 

    // 验证用图象,完整的圆
    $x = mt_rand($minArea, $this->width-$minArea);
    $y = mt_rand($minArea, $this->height-$minArea);
    $r = $this->iconSize/2;
    imagearc($this->_img_res, $x, $y, $this->iconSize, $this->iconSize, 0, 360, $col_ellipse);     

    // 记录圆心坐标及半径
    $this->captcha_session($this->sess_name, array($x, $y, $r)); 

    // 生成图象
    Header("Content-type: image/PNG");
    ImagePNG($this->_img_res);
    ImageDestroy($this->_img_res); 

    exit();
  } 

  /** 检查验证码
  * @param String $captcha 验证码
  * @param int  $flag   验证成功后 0:不清除session 1:清除session
  * @return boolean
  */
  public function check($captcha, $flag=1){
    if(trim($captcha)==''){
      return false;
    } 

    if(!is_array($this->captcha_session($this->sess_name))){
      return false;
    } 

    list($px, $py) = explode(',', $captcha);
    list($cx, $cy, $cr) = $this->captcha_session($this->sess_name); 

    if(isset($px) && is_numeric($px) && isset($py) && is_numeric($py) &&
      isset($cx) && is_numeric($cx) && isset($cy) && is_numeric($cy) && isset($cr) && is_numeric($cr)){
      if($this->pointInArea($px,$py,$cx,$cy,$cr)){
        if($flag==1){
          $this->captcha_session($this->sess_name,'');
        }
        return true;
      }
    }
    return false;
  } 

  /** 判断点是否在圆中
  * @param int $px 点x
  * @param int $py 点y
  * @param int $cx 圆心x
  * @param int $cy 圆心y
  * @param int $cr 圆半径
  * sqrt(x^2+y^2)<r
  */
  private function pointInArea($px, $py, $cx, $cy, $cr){
    $x = $cx-$px;
    $y = $cy-$py;
    return round(sqrt($x*$x + $y*$y))<$cr;
  } 

  /** 验证码session处理方法
  * @param  String  $name  captcha session name
  * @param  String  $value
  * @return String
  */
  private function captcha_session($name,$value=null){
    if(isset($value)){
      if($value!==''){
        $_SESSION[$name] = $value;
      }else{
        unset($_SESSION[$name]);
      }
    }else{
      return isset($_SESSION[$name])? $_SESSION[$name] : '';
    }
  }
} // class end 

?>

demo.php示例程序如下:

<?php
session_start();
require('ClickCaptcha.class.php'); 

if(isset($_GET['get_captcha'])){ // get captcha
  $obj = new ClickCaptcha();
  $obj->create();
  exit();
} 

if(isset($_POST['send']) && $_POST['send']=='true'){ // submit
  $name = isset($_POST['name'])? trim($_POST['name']) : '';
  $captcha = isset($_POST['captcha'])? trim($_POST['captcha']) : ''; 

  $obj = new ClickCaptcha(); 

  if($obj->check($captcha)){
    echo 'your name is:'.$name;
  }else{
    echo 'captcha not match';
  }
  echo ' <a href="demo.php">back</a>'; 

}else{ // html
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
 <meta http-equiv="content-type" content="text/html; charset=utf-8">
 <title> Click Captcha Demo </title>
 <script type="text/javascript" src="jquery-1.6.2.min.js"></script>
 <script type="text/javascript">
  $(function(){
    $('#captcha_img').click(function(e){
      var x = e.pageX - $(this).offset().left;
      var y = e.pageY - $(this).offset().top;
      $('#captcha').val(x+','+y);
    }) 

    $('#btn').click(function(e){
      if($.trim($('#name').val())==''){
        alert('Please input name!');
        return false;
      } 

      if($.trim($('#captcha').val())==''){
        alert('Please click captcha!');
        return false;
      }
      $('#form1')[0].submit();
    })
  })
 </script>
 </head> 

 <body>
  <form name="form1" id="form1" method="post" action="demo.php" onsubmit="return false">
  <p>name:<input type="text" name="name" id="name"></p>
  <p>Captcha:Please click full circle<br><img id="captcha_img" src="demo.php?get_captcha=1&t=<?=time() ?>" style="cursor:pointer"></p>
  <p><input type="submit" id="btn" value="submit"></p>
  <input type="hidden" name="send" value="true">
  <input type="hidden" name="captcha" id="captcha">
  </form>
 </body>
</html>
<?php } ?>

本文完整源码点击此处本站下载。

希望本文所述对大家的PHP程序设计有所帮助。

(0)

相关推荐

  • 一个漂亮的php验证码类(分享)

    直接上代码: 复制代码 代码如下: //验证码类class ValidateCode { private $charset = 'abcdefghkmnprstuvwxyzABCDEFGHKMNPRSTUVWXYZ23456789';//随机因子 private $code;//验证码 private $codelen = 4;//验证码长度 private $width = 130;//宽度 private $height = 50;//高度 private $img;//图形资源句柄 pri

  • PHP验证码类代码( 最新修改,完全定制化! )

    Authnum.class.php 下载 复制代码 代码如下: <?php session_start(); class Authnum { //图片对象.宽度.高度.验证码长度 private $im; private $im_width; private $im_height; private $len; //随机字符串.y轴坐标值.随机颜色 private $randnum; private $y; private $randcolor; //背景色的红绿蓝,默认是浅灰色 public $

  • PHP实现的封装验证码类详解

    用PHP写一个验证码类,并进行封装.类名: validationcode.class.php代码如下: 复制代码 代码如下: <?php class ValidationCode {  private $width;  private $height;  private $codeNum;  private $image;   //图像资源  private $disturbColorNum;  private $checkCode;  function __construct($width=8

  • PHP 动态随机生成验证码类代码

    下面是效果图,这个效果图是没有开启干扰码的效果图 下面是类代码 复制代码 代码如下: <?php /************************************************ //FILE:ImageCode //DONE:生成动态验证码类 //DATE"2010-3-31 //Author:www.5dkx.com 5D开心博客 *********************************************************************

  • 一个好用的PHP验证码类实例分享

    分享一个好用的php验证码类,包括调用示例.说明:如果不适用指定的字体,那么就用imagestring()函数,如果需要遇到指定的字体,就要用到imagettftext()函数.字体的位置在C盘下Windows/Fonts. 参考了网上的php 生成验证码的方法,以及php 图片验证码和php 中文验证码的生成方法.用到了PHP GD库的相关知识. 1,生成验证码的类 VerificationCode.class.php 复制代码 代码如下: <?php      class Verificat

  • PHP验证码类ValidateCode解析

    PHP解析验证码类 1.开始 在网上看到使用PHP写的ValidateCode生成验证码类,感觉不错,特拿来分析学习一下. 2.类图 3.验证码类部分代码 3.1  定义变量 //随机因子 private $charset = 'abcdefghjkmnprstuvwxyzABCDEFGJKMNPRSTUVWXYZ23456789'; private $code; private $codeLen = 4; private $width = 130; private $heigh = 50; p

  • php实现的Captcha验证码类实例

    本文实例讲述了php实现的Captcha验证码类,在php程序设计中有着极其广泛的应用.分享给大家供大家参考.具体方法如下: 验证码类文件如下: <?php /** Captcha 验证码类 * Date: 2011-02-19 * Author: fdipzone */ class Captcha{ //class start private $sname = ''; public function __construct($sname=''){ // $sname captcha sessi

  • 一个PHP验证码类代码分享(已封装成类)

    复制代码 代码如下: <?php session_start(); Header("Content-type: image/gif"); class SecurityCode { private $codes = ''; function __construct() { $code = '0-1-2-3-4-5-6-7-8-9-A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z'; $codeArray = explode('-

  • PHP学习笔记 用户注册模块用户类以及验证码类

    所以,把第一章,可重用类的代码贴出来,便于以后查阅以及供给有需要的朋友. :User类,包括读取和设置数据库,以及保存更改交互 复制代码 代码如下: <?php class User{ private $uid; private $fields; public function __construct(){ $this->uid=null; $this->fields=array('username'=>'','password'=>'','emailAddr'=>''

  • 一个经典的PHP验证码类分享

    我们通过PHP的GD库图像处理内容,设计一个验证码类Vcode.将该类声明在文件vcode.class.php中,并通过面向对象的特性将一些实现的细节封装在该类中.只要在创建对象时,为构造方法提供三个参数,包括创建验证码图片的宽度.高度及验证码字母个数,就可以成功创建一个验证码类的对象.该类的声明代码如下所示: <?php class Vcode { private $width; //宽 private $height; //高 private $num; //数量 private $code

随机推荐