ThinkPHP 内置了验证码的支持,可以直接使用。要使用验证码,需要导入扩展类库中的 ORG.Util.Image 类库和 ORG.Util.String 类库。
验证码方法
我们通过在在模块类中增加一个 verify 方法来用于显示验证码,最简单的例子:
Public function verify(){ // 导入Image类库 import("ORG.Util.Image"); Image::buildImageVerify(); }
import 方法是 ThinkPHP 内置的类库和文件导入方法,上例导入的文件为 ThinkPHP 系统目录下 Lib/ORG/Util/Image.class.php 文件。如果已经将 Image 类库拷贝到了当前项目下,如 Lib/ORG 下,则可以以:
import("@.ORG.Util.Image");
import 方法是 ThinkPHP 内置的类库和文件导入方法,上例导入的文件为 ThinkPHP 系统目录下 Lib/ORG/Util/Image.class.php 文件。
访问验证码
可以直接在浏览器里访问该验证码方法以确定验证码是否能正常显示:
http://127.0.0.1/index.php/Public/verify
如果一切正常,显示验证码如下所示:
表单中使用验证码
在表单页面中使用验证码,是以 html img标签 来调用:
<input type="text" name="verify"> <img id="verifyImg" src="__URL__/verify" onClick="changeVerify()" title="点击刷新验证码"/>
src 属性值即为验证码方法访问地址,视实际情况不同而不同。
验证码刷新
当点击验证码图片时,触发 JavaScript changeVerify() 函数重新读取验证码,从而实现验证码刷新。该函数参考如下:
<script language="JavaScript"> function changeVerify(){ var timenow = new Date().getTime(); document.getElementById('verifyImg').src='__URL__/verify/'+timenow; } </script>
验证码验证
在调用验证码 verify 的时候,buildImageVerify 会记录本次验证码的 MD5 信息。在表单验证操作里,以如下方法来检查验证码是否正确:
if($_SESSION['verify'] != md5($_POST['verify'])) { $this->error('验证码错误!'); }
其中 $_SESSION['verify'] 中的 verify 名称为 buildImageVerify 方法默认 SESSION 注册名称,具体见 buildImageVerify 语法。
使用其他风格验证码
buildImageVerify 方法生成验证码时,根据不同参数,可以生成不同风格的验证码。
buildImageVerify()
buildImageVerify 方法语法如下:
buildImageVerify(length, mode, type, width, height, verifyName)
参数说明: 参数 说明
length 验证码字符个数,默认为 4 位。
mode 验证码字符类型,默认为数字。其他支持类型有:0字母 1数字 2大写字母 3小写字母 4中文 5混合(去掉了容易混淆的字符oOLl和数字01)。
type 验证码的图片类型,默认为 png 。
width 验证码图片的宽度,默认根据验证码长度自动计算。
height 验证码图片的高度,默认为 22px 。
verifyName 验证码的 SESSION 注册名称,默认为 verify 。
因此可以根据参数构造出其他风格的验证码,如:
// 5位数字 Image::buildImageVerify(5); // 5位大写字母 Image::buildImageVerify(5, 2); // 6位大小写字母与数字混合 Image::buildImageVerify(6, 5);
中文验证码
buildImageVerify 方法不支持中文验证码的显示,要使用中文验证码,需要使用 GBVerify 方法。
buildImageVerify()
buildImageVerify 方法语法如下:
GBVerify(length, type, width, height, fontface, verifyName)
参数说明: 参数 说明
length 验证码字符个数,默认为 4 位。
type 验证码的图片类型,默认为 png 。
width 验证码图片的宽度,默认根据验证码长度自动计算。
height 验证码图片的高度,默认为 50px 。
fontface 使用的字体文件,使用包含路径的完整文件名或者将字体文件放到图像类(Image.class.php)同目录下,默认使用的字体文件是 simhei.ttf (存在于 windows 的 Fonts 目录下)。
verifyName 验证码的 SESSION 注册名称,默认为 verify 。
例子:
Public function verify(){ import("ORG.Util.Image"); Image::GBVerify(); }
如果一切正常,验证码显示如下:
如果数字英文的验证码能正常显示而不能显示中文验证码,那很可能是没有读取到正确的字体文件。将 simhei.ttf 文件拷贝至 Image.class.php 同目录(ThinkPHP目录/Lib/ORG/Util/)下即可。
ThinkPHP 验证码目前不支持大小写英文混合(无数字)以及中英文混合的验证码。
应用实例:
HTML+JavaScript代码: <script type="text/javascript"> function changeVerify(obj){ var timenow = new Date().getTime(); obj.src = obj.src+'&time='+timenow; } </script> <table border="0" cellspacing="0" style="text-align:left;"> <tr> <td style="text-align:right;">生成图片验证码:</td><td><img src="__URL__/ImageVerify?type=1" onClick="changeVerify(this)" title="点击刷新验证码" /></td> </tr> <tr> <td style="text-align:right;">中文验证码:</td><td><img src="__URL__/ImageVerify?type=2" onClick="changeVerify(this)" title="点击刷新验证码" /></td> </tr> <tr> <td style="text-align:right;">生成高级图像验证码:</td><td><img src="__URL__/ImageVerify?type=3" onClick="changeVerify(this)" title="点击刷新验证码" /></td> </tr> <tr> <td style="text-align:right;">生成UPC-A条形码:</td><td><img src="__URL__/ImageVerify?type=4" onClick="changeVerify(this)" title="点击刷新验证码" /></td> </tr> <tr> <td style="text-align:right;">根据给定的字符串生成图像:</td><td><img src="__URL__/ImageVerify?type=5" onClick="changeVerify(this)" title="点击刷新验证码" /></td> </tr> </table> PHP代码: //验证码 function ImageVerify(){ import("ORG.Util.Image"); $type = isset($_GET['type'])?intval($_GET['type']):1; switch($type){ case 1: Image::buildImageVerify(); //生成图片验证码 break; case 2: Image::GBVerify(); //中文验证码 break; case 3: Image::showAdvVerify(); //生成高级图像验证码 break; case 4: $verify = self::GetRandChar(11); Image::UPCA($verify); //生成UPC-A条形码 break; case 5: $verify = self::GetRandChar(); Image::buildString($verify); //根据给定的字符串生成图像 break; } } //生成指定长度的验证码 function GetRandChar($length = 4){ $str = '123456789abcdefghijklmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ'; $result = ''; $l = strlen($str)-1; $num=0; for($i = 0;$i < $length;$i ++){ $num = rand(0, $l); $a=$str[$num]; $result =$result.$a; } return $result; }