程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP簡單驗證碼類:字母+數字 字體隨機扭曲

PHP簡單驗證碼類:字母+數字 字體隨機扭曲

編輯:關於PHP編程

   現在各式各樣的驗證碼,個人認為驗證碼是讓用戶看的,所以簡單就好。什麼干擾碼,傾斜,復雜的背景 都是對用戶的一種折磨。
      看了一些比較大的體驗比較好的網站驗證碼都較為簡單,沒有復雜的背景,沒有干擾碼,沒有背景。
      有什麼地方寫的不好的歡迎大家批評,指點。
[php] 
<?php 
if (!defined('IS_INITPHP')) exit('Access Denied!'); 
/*********************************************************************************
 * InitPHP 2.0 國產PHP開發框架  擴展類庫-驗證碼
*-------------------------------------------------------------------------------
* 版權所有: CopyRight By initphp.com
* 您可以自由使用該源碼,但是在使用過程中,請保留作者信息。尊重他人勞動成果就是尊重自己
*-------------------------------------------------------------------------------
* $Author:liuxinming
* $Dtime:2012-10-09
***********************************************************************************/ 
class seccodeInit{ 
    private $width; 
    private $height; 
    private $type=0;// 0 字母+數字驗證碼 
    private $time=3000;//驗證碼過期時間(s) 
    private $color=null;//驗證碼字體顏色 
    private $im; 
    private $length=4;//驗證碼長度 
    private $warping;//隨機扭曲 
     
    /**
     * 獲取隨機數值
     * @return string
     */ 
    private function get_random_val() { 
        $i=0; 
        while($i<$this->length) 
        { 
            mt_srand((double)microtime()*1000000); 
            $randnum=mt_rand(50,90); 
            if(!in_array($randnum,array(58,59,60,61,62,63,64,73,79))) 
            { 
                $authnum=$authnum.chr($randnum); 
                $i++; 
            } 
        } 
        session_start(); 
        $time=time(); 
        $checkcode=md5(md5($authnum.'initphpYzmsy'.$time)); 
        $key=$time.','.$checkcode.','.authnum; 
        $_SESSION['initphp_code'] = $key; 
        return $authnum; 
    } 
     
    /**
     * 獲取驗證碼圖片
     * @param $width 寬
     * @param $height 高
     * @param $warping 字體隨機扭曲開關 0=關,1=開
     * @return string
     */ 
    public function getcode($width=140,$height=40,$warping=0){ 
        $this->width=$width; 
        $this->height=$height; 
        $this->warping=$warping; 
        if($this->type<2&& function_exists('imagecreate') && function_exists('imagecolorset') && function_exists('imagecopyresized') && function_exists('imagecolorallocate') && function_exists('imagechar') && function_exists('imagecolorsforindex') && 
function_exists('imageline') && function_exists('imagecreatefromstring') && (function_exists('imagegif') || function_exists('imagepng') || function_exists('imagejpeg'))){ 
            $this->image(); 
        } 
    } 
    /**
     * 生成圖片驗證碼
     * @return string
     */ 
    public function image(){ 
        $this->im=imagecreate($this->width, $this->height);//設置圖片背景大小 
        imagecolorallocate($this->im, 243, 251, 254);// 設置背景   
        $this->color=imagecolorallocate($this->im, mt_rand(1,120), mt_rand(1,120), mt_rand(1,120));// 驗證碼字體隨機顏色 
        $ttfPath = dirname(__FILE__) . '/font/';//字體目錄 
        $dirs = opendir($ttfPath); 
        $seccodettf = array(); 
        while($entry = readdir($dirs)) { 
            if($entry != '.' && $entry != '..' && in_array(strtolower(addslashes(strtolower(substr(strrchr($entry, '.'), 1, 10)))), array('ttf', 'ttc'))) { 
                 
                $seccodettf[] = $ttfPath.$entry; 
            } 
        } 
        $ttf = $seccodettf[array_rand($seccodettf)];//隨機一種字體 
        $size = $this->type ? $this->width / 7 : $this->width / 6;//字體大小 
        imagettftext($this->im,$size, 0, 10, $size*1.2, $this->color, $ttf, $this->get_random_val());//設置驗證碼字符 
        if($this->warping){//隨機扭曲 
            $this->setWarping(); 
        } 
        if(function_exists("imagepng")) 
        { 
            header ("Content-type: image/png"); 
            $code=imagepng($this->im); 
        }elseif (function_exists("imagejpeg")) 
        { 
            header ("Content-type: image/jpeg"); 
            $code=imagejpeg($this->im); 
        }elseif (function_exists("imagegif"))  
        { 
            header("Content-type: image/gif"); 
            $code=imagegif($this->im); 
        } 
        imagedestroy($this->im); 
        return $code; 
    } 
     
    /**
     * 檢查驗證碼
     * @param $code
     * @return bool
     */ 
    public function checkCode($code) { 
        session_start(); 
        $secode=explode(',', $_SESSION['initphp_code']); 
        $time=time(); 
        //檢查時間是否過期 
        if($secode[0]>$time||$time-$secode[0]>$this->time) 
        { 
            return false; 
        } 
        //驗證碼密鑰 雙md5 後是否一致 
        if($secode[1]<>md5(md5($code.'initphpYzmsy'.$secode[0]))){ 
            return false; 
        } 
        //檢查驗證碼字符串是否一致 
        if($code||$code<>$secode[2]) 
        { 
            return false; 
        } 
        return true; 
    } 
     
    /*隨機扭曲*/ 
    public function setWarping(){ 
        $rgb=array(); 
        $direct=rand(0,1); 
        $width = imagesx($this->im); 
        $height = imagesy($this->im); 
        $level=$width /20; 
        for($j = 0;$j < $height;$j++) { 
            for($i = 0;$i < $width;$i++) { 
                $rgb[$i] = imagecolorat($this->im, $i , $j); 
                } 
            for($i = 0;$i < $width;$i++) { 
                $r = sin($j / $height * 2 * M_PI - M_PI * 0.5) * ($direct ? $level : -$level); 
                 imagesetpixel($this->im, $i + $r , $j , $rgb[$i]); 
                } 
        } 
    } 

?> 
效果:

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved