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

本文实例讲述了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程序设计有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索php
, 验证码
, 类
, click
, 点击
captcha
captcha验证码、captcha验证码不显示、java captcha 验证码、群晖 captcha验证码、php captcha验证码,以便于您获取更多的相关知识。

时间: 2024-11-05 12:35:35

php实现的click captcha点击验证码类实例_php技巧的相关文章

php实现的Captcha验证码类实例_php技巧

本文实例讲述了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技巧

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

PHP验证码类实例

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

PHP生成可点击刷新的验证码简单示例_php技巧

本文实例讲述了PHP生成可点击刷新的验证码.分享给大家供大家参考,具体如下: html文件: <html> <head> <title>验证码</title> </head> <script type="text/javascript"> function yanzheng(){ var im=document.getElementsByTagName("img"); im[0].src=&qu

封装的一个asp.net验证码类_实用技巧

第一个反映是验证码的这些属性是否可以设置(也就是说是封装成一个类,然后以暴露公有属性和方法的方式来使用的,还是在直接在一般处理程序中实现了验证码的生成到输出),结果比较可惜,是后者...... 里面的算法感觉挺不错,至少对于我这种对算法几乎是不懂的人来说是这样,于是想到去封装一下她然后无耻地纳入自己的类库中去^^ old原文件如下:点击下载 首先分析一下这份代码中的不足(自己觉得的): 1.面向过程式的编程,如果要修改验证码的属性,例如修改字体的大小.背景颜色等细节的东西,需要去一般处理程序中找

php封装的验证码工具类完整实例_php技巧

本文实例讲述了php封装的验证码工具类.分享给大家供大家参考,具体如下: <?php //验证码工具类 class Captcha{ //属性 private $width; private $height; private $fontsize; private $pixes; private $lines; private $str_len; /* * 构造方法 * @param1 array $arr = array(),初始化属性的关联数组 */ public function __con

一个经典的PHP验证码类分享_php实例

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

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

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

PHP验证码例子(带刷新)DEMO_PHP图片验证码类实例

直接引入该类文件并创建该类的实例.就可以使用验证码了,验证码类文件vcode.class.php代码如下 //验证码类 class Vcode{ private $width;//图片宽度 private $height;//图片高度 private $num;//验证码个数 private $img;//图片资源 private $code;//验证码 private $pointNum;//干扰点个数 private $lineNum;//干扰线个数 private $fontFile;//