ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 验证码插件制作演示 ## 涉及技术点 * 控制器 * 模板 * 第三方类库 * URL调用 <div class="simditor-body" contenteditable="true"><p>开发插件请开启你的网站调试. 如果你不开启则不会显示你的更改内容,你需要手动清理论坛缓存!&nbsp;</p><p><strong style="color: rgb(34, 34, 34);">开启方式: 管理员后台 - 全局设置 - 调试相关 - 开启DEBUG模式 打上勾 保存配置!</strong><br></p><p>按照惯例 来到插件后台 新建插件</p><p><b>后台 - 插件 - 点击制作插件按钮 - 弹出对话框</b></p><p><b>插件名 : 你所制作的插件名称</b></p><p><b>英文名 : <u>你的插件英文名</u>, 必须保持英文, 可以使用下划线以及一些支持路劲的符号</b></p><p><b>插件FA图标 :&nbsp;<a href="http://fontawesome.io/icons/">http://fontawesome.io/icons/</a> 从此处选择一个图标名称输入!</b></p><p><b>如果你的插件不需要配置表单参数 , 就不需要勾选</b></p><p><b>如果你的插件不需要安装函数 (也就是 插件可以在安装的时候执行PHP命令 )</b></p><p><b>此处默认两处不勾选,因为 此文插件无需用到</b></p><p><b>填写完毕 执行即可</b></p><p><img alt="QQ截图20160515190838.jpg" src="http://bbs.hyyyp.com/upload/userfile/1/dc7a871059568931d3ae1d4f65717b75.jpg"><br></p><p><img alt="QQ截图20160515191432.jpg" src="http://bbs.hyyyp.com/upload/userfile/1/bab6954a59e65fe9777efec44f4f8142.jpg"><br></p><p><b>插件新建成功, 会告诉你插件的绝对路劲</b></p><p><b>返回上一页 &nbsp;回到插件页面</b></p><p><b><img alt="QQ截图20160515191547.jpg" src="http://bbs.hyyyp.com/upload/userfile/1/f9242c93837d1c017f79eaa2744f4284.jpg"><br></b></p><p><b>找到你的插件 , 开启你的插件, 默认是 禁用的!</b></p><p><b><img alt="QQ截图20160515191551.jpg" src="http://bbs.hyyyp.com/upload/userfile/1/c17653c2b82b3d69c5724003facfac12.jpg"></b><br></p><hr><p>新建插件到一段落了</p><hr><h1>开始制作插件</h1><hr><p>本文是开发 验证码, 所以作者本人就从网上找现成的验证码程序了!</p><hr><p>寻找中...</p><hr><p><img alt="201308061003582.jpg" src="http://bbs.hyyyp.com/upload/userfile/1/3a7ca0782fbc2780dff741add5c82535.jpg"><br></p><p>找到了这款 .&nbsp;</p><p>看一下这款验证码的代码 :&nbsp;</p><pre data-lang="php">//验证码类 class ValidateCode { &nbsp;private $charset = 'abcdefghkmnprstuvwxyzABCDEFGHKMNPRSTUVWXYZ23456789';//随机因子 &nbsp;private $code;//验证码 &nbsp;private $codelen = 4;//验证码长度 &nbsp;private $width = 130;//宽度 &nbsp;private $height = 50;//高度 &nbsp;private $img;//图形资源句柄 &nbsp;private $font;//指定的字体 &nbsp;private $fontsize = 20;//指定字体大小 &nbsp;private $fontcolor;//指定字体颜色 &nbsp;//构造方法初始化 &nbsp;public function __construct() { &nbsp;&nbsp;$this-&gt;font = dirname(__FILE__).'/font/elephant.ttf';//注意字体路径要写对,否则显示不了图片 &nbsp;} &nbsp;//生成随机码 &nbsp;private function createCode() { &nbsp;&nbsp;$_len = strlen($this-&gt;charset)-1; &nbsp;&nbsp;for ($i=0;$i&lt;$this-&gt;codelen;$i++) { &nbsp;&nbsp;&nbsp;$this-&gt;code .= $this-&gt;charset[mt_rand(0,$_len)]; &nbsp;&nbsp;} &nbsp;} &nbsp;//生成背景 &nbsp;private function createBg() { &nbsp;&nbsp;$this-&gt;img = imagecreatetruecolor($this-&gt;width, $this-&gt;height); &nbsp;&nbsp;$color = imagecolorallocate($this-&gt;img, mt_rand(157,255), mt_rand(157,255), mt_rand(157,255)); &nbsp;&nbsp;imagefilledrectangle($this-&gt;img,0,$this-&gt;height,$this-&gt;width,0,$color); &nbsp;} &nbsp;//生成文字 &nbsp;private function createFont() { &nbsp;&nbsp;$_x = $this-&gt;width / $this-&gt;codelen; &nbsp;&nbsp;for ($i=0;$i&lt;$this-&gt;codelen;$i++) { &nbsp;&nbsp;&nbsp;$this-&gt;fontcolor = imagecolorallocate($this-&gt;img,mt_rand(0,156),mt_rand(0,156),mt_rand(0,156)); &nbsp;&nbsp;&nbsp;imagettftext($this-&gt;img,$this-&gt;fontsize,mt_rand(-30,30),$_x*$i+mt_rand(1,5),$this-&gt;height / 1.4,$this-&gt;fontcolor,$this-&gt;font,$this-&gt;code[$i]); &nbsp;&nbsp;} &nbsp;} &nbsp;//生成线条、雪花 &nbsp;private function createLine() { &nbsp;&nbsp;//线条 &nbsp;&nbsp;for ($i=0;$i&lt;6;$i++) { &nbsp;&nbsp;&nbsp;$color = imagecolorallocate($this-&gt;img,mt_rand(0,156),mt_rand(0,156),mt_rand(0,156)); &nbsp;&nbsp;&nbsp;imageline($this-&gt;img,mt_rand(0,$this-&gt;width),mt_rand(0,$this-&gt;height),mt_rand(0,$this-&gt;width),mt_rand(0,$this-&gt;height),$color); &nbsp;&nbsp;} &nbsp;&nbsp;//雪花 &nbsp;&nbsp;for ($i=0;$i&lt;100;$i++) { &nbsp;&nbsp;&nbsp;$color = imagecolorallocate($this-&gt;img,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255)); &nbsp;&nbsp;&nbsp;imagestring($this-&gt;img,mt_rand(1,5),mt_rand(0,$this-&gt;width),mt_rand(0,$this-&gt;height),'*',$color); &nbsp;&nbsp;} &nbsp;} &nbsp;//输出 &nbsp;private function outPut() { &nbsp;&nbsp;header('Content-type:image/png'); &nbsp;&nbsp;imagepng($this-&gt;img); &nbsp;&nbsp;imagedestroy($this-&gt;img); &nbsp;} &nbsp;//对外生成 &nbsp;public function doimg() { &nbsp;&nbsp;$this-&gt;createBg(); &nbsp;&nbsp;$this-&gt;createCode(); &nbsp;&nbsp;$this-&gt;createLine(); &nbsp;&nbsp;$this-&gt;createFont(); &nbsp;&nbsp;$this-&gt;outPut(); &nbsp;} &nbsp;//获取验证码 &nbsp;public function getCode() { &nbsp;&nbsp;return strtolower($this-&gt;code); &nbsp;} }<br></pre><p>类方法中都注释了中文</p><p>代码里有两点需要关注,&nbsp;</p><p>1. $charset 随机因子 , 就是验证码会出现的字符</p><p>2. $this-&gt;font 验证码字体</p><p>看看验证码程序压缩包里的文件</p><p><img alt="QQ截图20160515192229.jpg" src="http://bbs.hyyyp.com/upload/userfile/1/d6375a65ae57fdf44404bcdb6be0fb56.jpg"><br></p><p>font 就是字体</p><p>而captcha.php 就是演示验证码使用的代码</p><p>而sessionValidate.php 就是上面贴的代码类库</p><p>好了 我们来到我们新建的插件目录 .</p><p>论坛根目录\Plugin\hy_codes<br></p><p>hy_codes 是我们刚才新建的插件 (英文名 就是 目录名)</p><hr><p>我们将<b>sessionValidate.php</b>和<b>font</b>目录复制到插件目录</p><p><img alt="QQ截图20160515192528.jpg" src="http://bbs.hyyyp.com/upload/userfile/1/1a64b3363fee817675fb830d3fe2b6dd.jpg"><br></p><p><br></p><h1>正题来了</h1><hr><p>我们如何在登录与注册页面插入这个验证码图片呢?</p><p>首先我们来到 登录与注册的模板</p><p>/View &nbsp;目录 是论坛的模板目录</p><p>/View/hy_user 是论坛默认的用户模板目录</p><p>/View/hy_user/user_login.html 登录页面模板&nbsp;</p><p>打开这个文件.</p><p><img alt="QQ截图20160515193637.jpg" src="http://bbs.hyyyp.com/upload/userfile/1/9b24f6be986f4f7618269aa770d183b3.jpg"><br></p><p>我们是想把验证码插入 密码下面,</p><p>那么我们复制这个hook名</p><p>t_user_login_2 &nbsp;我们在插件目录新建文件 t_user_login_2.hook&nbsp;</p><p><img alt="QQ截图20160515193851.jpg" src="http://bbs.hyyyp.com/upload/userfile/1/e13b01835c948fae070c0f802052d22e.jpg"><br></p><p>在该文件写入 11111111 保存后 看看网站登录页面如何 !</p><p><img alt="QQ截图20160515194235.jpg" src="http://bbs.hyyyp.com/upload/userfile/1/f3f10d494c4c413da8790908974dfdac.jpg"><br></p><p>登录页面显示了我们插件文件内的内容</p><p>那么我们就需要在这里显示我们的验证码了</p><p>但我们的验证码程序是PHP脚本, 而我们的插入点是 是HTML 用不了的说. 咋办咧? &nbsp;</p><p>那我们在能执行PHP的地方插入我们的验证码类库 从而HTML去加载这个PHP 链接显示验证码</p><p>打开文件 /Action/User.php 拉倒文件底部</p><p><img alt="QQ截图20160515194433.jpg" src="http://bbs.hyyyp.com/upload/userfile/1/f61ee33b88613e83ae53738bab3fd143.jpg"><br></p><p>a_user_fun, 按照上面的一样 插件目录新建一个&nbsp;a_user_fun.hook<br></p><h1>开始输出我们的验证码</h1><hr><p><span style="color: rgb(51, 51, 51); font-size: 16px;">&nbsp;</span><span style="color: rgb(51, 51, 51); font-size: 16px;">a_user_fun.hook写入内容</span><br></p><pre data-lang="php">public function show_codes(){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//加载 验证码类库 include PLUGIN_PATH . 'hy_codes/sessionValidate.php'; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//new 验证码类 $codes = new ValidateCode();&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//输出验证码<br> $codes-&gt;doimg(); //获取本次验证码的值 $codes-&gt;getCode(); }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></pre><p>可见我们定义了一个函数 show_codes() 他是属于user控制器</p><p>所以他的链接就成了&nbsp;</p><p>xxx.com/user/show_codes</p><p>我们访问我们的函数</p><p><img alt="QQ截图20160515195144.jpg" src="http://bbs.hyyyp.com/upload/userfile/1/2d1c5bd4cf344b6d6970b64299b2259b.jpg"><br></p><p>提示错误 意思是说 Action空间没有 验证码类</p><p>就是我们的New 出问题了</p><p>我们打开验证码类库</p><p><img alt="QQ截图20160515195317.jpg" src="http://bbs.hyyyp.com/upload/userfile/1/bacb2244cd7ca869e55e92af97cf4dd8.jpg"><br></p><p>为类库增加一个命名空间组</p><p>namespace Plugin;</p><p>然后我们的<span style="color: rgb(51, 51, 51); font-size: 16px;">&nbsp;</span><span style="color: rgb(51, 51, 51); font-size: 16px;">a_user_fun.hook 内容改为</span></p><pre data-lang="php">public function show_codes(){ include PLUGIN_PATH . 'hy_codes/sessionValidate.php'; $codes = new \Plugin\ValidateCode();&nbsp; $codes-&gt;doimg(); $codes-&gt;getCode(); }<br></pre><p>$codes = new \Plugin\ValidateCode();<br></p><p>再次访问</p><p><a href="http://127.0.0.1/user/show_codes">http://127.0.0.1/user/show_codes</a><br></p><p><img alt="QQ截图20160515195503.jpg" src="http://bbs.hyyyp.com/upload/userfile/1/da7bbbac1ae1bff6ac80bef0c26ed751.jpg"><br></p><p>可见验证码输出咯</p><p>然后我们的t_user_login_2.hook文件 &nbsp;就是刚才输入 111111111的地方 改为<br></p><pre data-lang="html">&lt;img src="{#WWW}user{#EXP}show_codes"&gt;<br></pre><p>可见代码使用了img标签 显示了 &nbsp;我们的验证码图片地址</p><p>{#WWW} &nbsp;则等于我们的网站链接 <a href="http://127.0.0.1/">http://127.0.0.1/</a> &nbsp;</p><p>{#EXP} 则是我们程序的分割符号 / &nbsp;, 因为有的用户吧 /改为了 - 之类的符号 我们不能直接 /user/show_codes 这样不正确滴!</p><p><br></p><hr><p>再看下登录页面</p><p><img alt="QQ截图20160515195810.jpg" src="http://bbs.hyyyp.com/upload/userfile/1/0ec9e3ffc4b49489f4ab33e6367078bb.jpg"><br></p><p>显示了我们的验证码 &nbsp;,我们再改下t_user_login_2.hook 内容 让验证码可以点击 刷新!</p><pre data-lang="html">&lt;img src="{#WWW}user{#EXP}show_codes" onclick="this.src='{#WWW}user{#EXP}show_codes?time='+new Date()"&gt;<br></pre><p>可见内容</p><p>onclick="this.src='{#WWW}user{#EXP}show_codes?time='+new Date()"<br></p><p>点击后 img的src = 我们的验证码图片地址 &nbsp;后面加的参数 time + Date 是为了 防止浏览器使用该缓存图片!&nbsp;</p><p>这样 图片就可以点击刷新验证码了!</p><p><br></p><hr><p>突然发现没有验证码输入框呢&nbsp;</p><p>这样就行鸟? &nbsp;不行. 我们还要在 登陆提交的时候 检查用户输入的验证码是否正确呢!</p><p>再次打开我们的</p><p>a_user_fun.hook &nbsp;我们需要将验证码的值储存到session<br></p><pre data-lang="php">public function show_codes(){ session_start(); include PLUGIN_PATH . 'hy_codes/sessionValidate.php'; $codes = new \Plugin\ValidateCode();&nbsp; $codes-&gt;doimg(); $code = $codes-&gt;getCode(); $_SESSION['hy_codes'] = $code; }<br></pre><p>可见我们增加了session_start 启动session储存</p><p>$_SESSION['hy_codes'] = $code; 将验证码值储存到session里<br></p><p><br></p><h1>提交验证</h1><hr><p>找到登录账号提交入口</p><p>/Action/User.php&nbsp;</p><p><img alt="QQ截图20160515201158.jpg" src="http://bbs.hyyyp.com/upload/userfile/1/32f05570e7cc6c1ba0c81eb980723486.jpg"><br></p><p>IS_POST下就是提交登录</p><p>而上面的IS_GET 是访问登录模板</p><p>得到下面的插入点</p><p>a_user_login_3</p><p>和上面一样在插件目录新建&nbsp;a_user_login_3.hook 输入内容</p><pre data-lang="php">session_start(); //判断是否已经设置该数组 if(!isset($_SESSION['hy_codes'])) return $this-&gt;message('请刷新验证码');&nbsp; $hy_codes = $_SESSION['hy_codes']; //获取用户提交过来的验证码值 $input_code = X("post.code"); //验证码开始判断咯 if($hy_codes != $input_code) return $this-&gt;message('验证码错误!');&nbsp; //验证成功后 关闭session session_destroy();<br></pre><p>,这时候我们正式使用一下吧</p><p><img alt="QQ截图20160515202022.jpg" src="http://bbs.hyyyp.com/upload/userfile/1/a29b93cc93e3685af36580734d43b55f.jpg"><br></p><p>输入错误验证码提交后 &nbsp;提示验证码错误</p><p>那我们输入正确的提交一下</p><p><img alt="QQ截图20160515202102.jpg" src="http://bbs.hyyyp.com/upload/userfile/1/e4407087575c28b099a4f4017ba22858.jpg"></p><p><img alt="QQ截图20160515202118.jpg" src="http://bbs.hyyyp.com/upload/userfile/1/1e0f19b11c40c1c63f4feaf39f4d9d36.jpg"><br></p><p>登录成功咯!</p><p>这样就做完咯</p><h1>突然发现注册账号没做</h1><hr><p>其实做了登录 &nbsp;, 而注册也是一样的过程啦 &nbsp;不讲了</p><p><br></p><p><br></p><p><b>附件已上传, 也包含了注册页面的验证码</b></p></div> http://bbs.hyyyp.com/t/159.html 附件下载