当前位置:Gxlcms > PHP教程 > PHP简略验证码类:字母+数字字体随机扭曲

PHP简略验证码类:字母+数字字体随机扭曲

时间:2021-07-01 10:21:17 帮助过:19人阅读

PHP简单验证码类:字母+数字 字体随机扭曲

现在各式各样的验证码,个人认为验证码是让用户看的,所以简单就好。什么干扰码,倾斜,复杂的背景 都是对用户的一种折磨。

看了一些比较大的体验比较好的网站验证码都较为简单,没有复杂的背景,没有干扰码,没有背景。

有什么地方写的不好的欢迎大家批评,指点。

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]);
				}
		}
	}
}
?>

效果:


人气教程排行