Welcome

首页 / 网页编程 / PHP / Thinkphp3.2实用篇之计算型验证码示例

是不是觉得普通的验证码已经没办法满足,接下来介绍如何将tp现有的验证码改为计算型验证码:
首先找到:ThinkPHPLibraryThinkVerify.class.php
在其中加入以下代码:

public function entry_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->imageW x $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);}
public function check_add($code, $id = "") {$key = $this->authcode($this->seKey).$id;// 验证码不能为空$secode = session($key);if($code===false || empty($secode)) {return false;}//验证码是否是数字if(!is_numeric($code)) {return false;}// session 过期if(NOW_TIME - $secode["verify_time"] > $this->expire) {session($key, null);return false;}if($this->authcode($code) == $secode["verify_code"]) {$this->reset && session($key, null);return true;}return false;}
生成方法:

Public function verify(){import("ORG.Util.Verify");$Verify = new Verify();$Verify->useNoise = true;$Verify->codeSet = "0123456789";$Verify->useCurve = false;$Verify->entry_add();}
验证方法:

 if (!check_verify($verify,"","add")) {$this->error("验证码错误!");return;}
 调用的公共方法:

 // 检测输入的验证码是否正确,$code为用户输入的验证码字符串function check_verify($code, $id = "",$type=""){import("ORG.Util.Verify");$verify = new Verify();if($type="add"){return $verify->check_add($code, $id);}else{return $verify->check($code, $id);}}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。