Thinkphp3.2实用篇之计算型验证码示例
是不是觉得普通的验证码已经没办法满足,接下来介绍如何将tp现有的验证码改为计算型验证码:
首先找到:ThinkPHP\Library\Think\Verify.class.php
在其中加入以下代码:
publicfunctionentry_add($id=''){ $this->length='3'; //图片宽(px) $this->imageW||$this->imageW=$this->length*$this->fontSize*1.5+$this->length*$this->fontSize/2; //图片高(px) $this->imageH||$this->imageH=$this->fontSize*2.5; //建立一幅$this->imageWx$this->imageH的图像 $this->_image=imagecreate($this->imageW,$this->imageH); //设置背景 imagecolorallocate($this->_image,$this->bg[0],$this->bg[1],$this->bg[2]); //验证码字体随机颜色 $this->_color=imagecolorallocate($this->_image,mt_rand(1,150),mt_rand(1,150),mt_rand(1,150)); //验证码使用随机字体 $ttfPath=dirname(__FILE__).'/Verify/'.($this->useZh?'zhttfs':'ttfs').'/'; if(empty($this->fontttf)){ $dir=dir($ttfPath); $ttfs=array(); while(false!==($file=$dir->read())){ if($file[0]!='.'&&substr($file,-4)=='.ttf'){ $ttfs[]=$file; } } $dir->close(); $this->fontttf=$ttfs[array_rand($ttfs)]; } $this->fontttf=$ttfPath.$this->fontttf; if($this->useImgBg){ $this->_background(); } if($this->useNoise){ //绘杂点 $this->_writeNoise(); } if($this->useCurve){ //绘干扰线 $this->_writeCurve(); } //绘验证码 $code=array();//验证码 $symbol=array('+','-'); $codeNX=0;//验证码第N个字符的左边距 $now_symbol=$symbol[rand(0,1)]; for($i=0;$i<$this->length;$i++){ if($i==1){ $code[$i]=$now_symbol; $codeNX+=mt_rand($this->fontSize*1.2,$this->fontSize*1.6); imagettftext($this->_image,$this->fontSize,0,$codeNX,$this->fontSize*1.6,$this->_color,$ttfPath.'2.ttf',$code[$i]); } else{ $code[$i]=$this->codeSet[mt_rand(0,strlen($this->codeSet)-1)]; $codeNX+=mt_rand($this->fontSize*1.2,$this->fontSize*1.6); imagettftext($this->_image,$this->fontSize,mt_rand(-40,40),$codeNX,$this->fontSize*1.6,$this->_color,$this->fontttf,$code[$i]); } } //保存验证码 $key=$this->authcode($this->seKey); $str=implode('',$code); eval("\$re=$str;"); $code=$this->authcode($re); $secode=array(); $secode['verify_code']=$code;//把校验码保存到session $secode['verify_time']=NOW_TIME;//验证码创建时间 session($key.$id,$secode); header('Cache-Control:private,max-age=0,no-store,no-cache,must-revalidate'); header('Cache-Control:post-check=0,pre-check=0',false); header('Pragma:no-cache'); header("content-type:image/png"); //输出图像 imagepng($this->_image); imagedestroy($this->_image); }
publicfunctioncheck_add($code,$id=''){ $key=$this->authcode($this->seKey).$id; //验证码不能为空 $secode=session($key); if($code===false||empty($secode)){ returnfalse; } //验证码是否是数字 if(!is_numeric($code)){ returnfalse; } //session过期 if(NOW_TIME-$secode['verify_time']>$this->expire){ session($key,null); returnfalse; } if($this->authcode($code)==$secode['verify_code']){ $this->reset&&session($key,null); returntrue; } returnfalse; }
生成方法:
Publicfunctionverify(){ import('ORG.Util.Verify'); $Verify=newVerify(); $Verify->useNoise=true; $Verify->codeSet='0123456789'; $Verify->useCurve=false; $Verify->entry_add(); }
验证方法:
if(!check_verify($verify,'','add')){ $this->error('验证码错误!'); return; }
调用的公共方法:
//检测输入的验证码是否正确,$code为用户输入的验证码字符串 functioncheck_verify($code,$id='',$type=''){ import('ORG.Util.Verify'); $verify=newVerify(); if($type='add'){ return$verify->check_add($code,$id); } else{ return$verify->check($code,$id); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。