zoukankan      html  css  js  c++  java
  • PHP 验证码生成类(可定制长度和内容)

    ===================VerifyTool======================

    <?php
    
    class VerifyTool
    {
        private $fontPath;      //字体路径
        private $verifyStr;     //字符库
        private $verifyLen;     //字符数
        private $verifyCode;    //验证码
        private $verifyImg;     //验证图像
    
        public function __construct($fontPath)
        {
            $this->fontPath = $fontPath;
            $this->verifyLen = 4;
            $this->verifyStr = '0123456789'
                . 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
                . 'abcdefghijklmnopqrstuvwxyz';
        }
    
        /**
         * 设置验证码所包含的字符
         * @param $str
         */
        public function setChars($str)
        {
            $this->verifyStr = $str;
        }
    
        /**
         * 设置验证码字符串长度
         * @param $num
         */
        public function setLength($num)
        {
            $this->verifyLen = $num;
        }
    
        /**
         * 得到验证码的内容(默认转换为小写)
         * @param bool $tolower
         * @return string
         */
        public function getCode($tolower = true)
        {
            if ($tolower) {
                return strtolower($this->verifyCode);
            } else {
                return $this->verifyCode;
            }
        }
    
        /**
         * 绘制验证码图像
         * @return $this
         */
        public function drawImage()
        {
            $width = $this->verifyLen * 50;//图片宽度
            $height = 60;//图片高度
            $graylevel = 240;//背景灰度
            $fontsize = 24;//字体大小
            $content = '';//验证码内容
            $image = imagecreatetruecolor($width, $height);
            $bgcolor = imagecolorallocate($image, $graylevel, $graylevel, $graylevel);
            imagefill($image, 0, 0, $bgcolor);
            //绘制随机字符
            for ($i = 0; $i < $this->verifyLen; $i++) {
                $fontcolor = imagecolorallocate($image, rand(120, 220), rand(60, 150), rand(100, 200));
                $fontchar = mb_substr($this->verifyStr, rand(0, mb_strlen($this->verifyStr, 'utf8') - 1), 1, 'utf8');
                $x = ($i * $width / $this->verifyLen) + rand(10, 20);
                $y = $height / 2 + rand(-5, 5) + $fontsize / 2;
                imagettftext($image, $fontsize, rand(-60, 60), $x, $y, $fontcolor, $this->fontPath, $fontchar);
                $content .= $fontchar;
            }
            //绘制随机点
            for ($i = 0; $i < $this->verifyLen * 10; $i++) {
                $pointcolor = imagecolorallocate($image, rand(50, 200), rand(50, 200), rand(50, 200));
                imagefilledellipse($image, rand(0, $width), rand(0, $height), 5, 5, $pointcolor);
            }
            //绘制随机直线
            for ($i = 0; $i < $this->verifyLen; $i++) {
                $linecolor = imagecolorallocatealpha($image, rand(60, 120), rand(80, 160), rand(60, 120), rand(80, 100));
                imageline($image, 0, rand(0, $height - 0), $width, rand(0, $height - 0), $linecolor);
            }
            $this->verifyCode = $content;
            $this->verifyImg = $image;
            return $this;
        }
    
        /**
         * 显示验证码
         */
        public function show()
        {
            header('content-type: image/png');
            imagepng($this->verifyImg);
            imagedestroy($this->verifyImg);
        }
    }
    VerifyTool.class.php

    ==================使用方式====================

    创建一个verify_image.php文件:

    <?php
    //开启SESSION
    session_start();
    //引入验证码工具
    require_once 'VerifyTool.class.php';
    //初始化工具(必须传入有效的字体路径)
    $verifyTool = new VerifyTool('../res/simhei.ttf');
    //绘制图像并显示
    $verifyTool->drawImage()->show();
    //将验证码信息保存至SESSION
    $_SESSION['verify_code'] = $verifyTool->getCode();  

    如果直接打开效果如下:

    还可以为验证工具设置参数:

    $verifyTool = new VerifyTool('../res/simhei.ttf');
    //设置验证码字符内容
    $verifyTool->setChars('巧学巧用');
    //设置验证码长度
    $verifyTool->setLength(10);
    $verifyTool->drawImage()->show();

    设置参数后效果如下:

    ==================验证方式====================

    创建一个 verify_test.php 文件:

    <?php
    //如果需要使用SESSION,必须在脚本开始处开启SESSION
    session_start();
    ?>
        <!--显示验证码和输入框-->
        <img src="verify_image.php">
        <form action="verify_test.php" method="get">
            <input type="text" name="mycode">
            <input type="submit" value="submit">
        </form>
    
    <?php
    if (!empty($_GET['mycode'])) {
        //去除用户输入的多余空格,并将输入转换为小写字母
        $mycode = strtolower(trim($_GET['mycode']));
        //将SESSION保存的验证码信息取出,并进行比较
        if ($mycode == $_SESSION['verify_code']) {
            echo '验证成功,请继续';
        } else {
            echo '验证失败,请重试';
        }
    }

    这仅仅是测试验证码的小Demo,如果要在其他场景下使用的话,就需要理解其中的原理,做到巧学巧用才行。

  • 相关阅读:
    BZOJ1443 [JSOI2009]游戏Game
    BZOJ4950 [Wf2017]Mission Improbable
    假期编程
    假期编程
    假期编程
    假期编程
    假期编程练习-求和
    假期编程练习——一个数的n次幂取余
    假期编程练习———十进制转二进制
    小球抛物线运动
  • 原文地址:https://www.cnblogs.com/woider/p/5843921.html
Copyright © 2011-2022 走看看