图形验证码插件开发
位置
插件放在 public/plugins/captcha/ 目录下
目录结构
public/plugins/captcha/tp_captcha
|--- controller(控制器目录,实现接口)
|--- TpCaptcha.php(插件主文件)
|--- config.php(配置项客户配置项,在插件设置中显示)
|--- route.php(路由文件)开发流程
以thinkphp图形验证码为例:
创建图形验证码插件目录 public/plugins/captcha/tp_captcha/
①目录名以小写字母+下划线形式,必须以字母开头,如tp_captcha;
创建入口文件:TpCaptcha.php
①命名空间namespace captcha\tp_captcha(控制器下命名空间对应相应目录即可,其它同理);
②以目录名大驼峰+.php,创建在插件根目录下,如tp_captcha\TpCaptcha.php;
③文件中需要定义info属性,示例:
# 插件基本信息
public $info = array(
'name' => 'TpCaptcha', //插件英文名,作为插件唯一标识,改成你的插件英文就行了
'title' => 'thinkphp图形验证码', //插件名称
'description' => 'thinkphp图形验证码', //插件描述
'author' => '智简魔方', //开发者
'version' => '1.0', // 版本号
);④必须实现install()安装以及uninstall()卸载方法
⑤获取前台验证码,需实现方法:插件名+Describe,如TpCaptchaDescribe(),返回html;
⑥获取后台验证码,需实现方法:插件名+DescribeAdmin,如TpCaptchaDescribeAdmin(),返回html;
验证码输出方法返回值
| 方法 | 类型 | 说明 |
|---|---|---|
TpCaptchaDescribe | HTML | 前台验证码内容 |
TpCaptchaDescribeAdmin | HTML | 后台验证码内容 |
⑦需实现验证方法:插件名+Verify,如TpCaptchaVerify($param),系统会传递默认参数至此方法,参数为⑨中验证成功后传递给系统js方法captchaCheckSuccsss()。
参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
captcha | string | — | 验证码 |
token | string | — | 唯一识别码 |
参数示例
$param = [
"captcha" => 'test', // 验证码
"token" => 'adfhaksdf', // 唯一识别码
];返回值
| 字段 | 类型 | 说明 |
|---|---|---|
status | integer | 200成功,400失败 |
msg | string | 消息 |
⑧在⑤和⑥中,如果系统未加载js,可设置定时操作;
⑨验证成功或失败后可调用系统js:
captchaCheckSuccsss(bol,captcha,token,login)参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
bol | bool | — | 是否成功 |
captcha | string | — | 验证码 |
token | string | — | 唯一识别码 |
login | bool | — | 后台是否直接登录 |
⑩取消系统弹框:
captchaCheckCancel()确定是否需要后台配置文件,如果需要,在接口根目录下加上config.php,示例
<?php
/**
* @desc 插件后台配置
* @author wyh
* @version 1.0
* @time 2022-05-27
*/
return [
'module_name' => [ # 在后台插件配置表单中的键名(统一规范:小写+下划线),会是config[module_name]
'title' => '名称', # 表单的label标题
'type' => 'text', # 表单的类型:text文本,password密码,checkbox复选框,select下拉,radio单选,textarea文本区域,tip提示
'value' => 'thinkphp图形验证', # 表单的默认值
'tip' => 'friendly name', # 表单的帮助提示
'size' => 200, # 输入框长度(当type类型为text,password,textarea,tip时,可传入此键)
],
'captcha_width' => [
'title' => '验证码宽度',
'type' => 'text',
'value' => 250,
'tip' => '',
'size' => 200,
],
'captcha_height' => [
'title' => '验证码高度',
'type' => 'text',
'value' => 61,
'tip' => '',
'size' => 200,
],
'captcha_length' => [
'title' => '验证码长度',
'type' => 'text',
'value' => 4,
'tip' => '',
'size' => 200,
],
/*'code_set' => [
'title' => '验证码字符集',
'type' => 'text',
'value' => '1234567890',
'tip' => '',
'size' => 200,
],*/
];外部访问
创建插件后台控制器 tp_captcha\controller\IndexController.php
①命名空间captcha\tp_captcha\controller;
②继承后基类控制器app\home\controller\BaseController;
③实现接口,如 public function refresh(),系统默认访问此接口的 URL 为:
/captcha/tp_captcha/index/refresh地址格式为 /captcha/插件/控制器/方法。
④自定义路由,创建route.php文件:
<?php
/**
* 插件自定义路由,此文档作为范例,注意不要和系统路由产生冲突
* 说明:官方默认路由需要登录后才能访问,若需要免登录访问,需要自定义路由.
* 默认路由,后台:/{DIR_ADMIN}/addon?_plugin=demo_style&_controller=admin_index&_action=addhelp;
* 前台:/console/addon?_plugin=demo_style&_controller=admin_index&_action=addhelp
* @author wyh
* @time 2022-06-02
*/
use think\facade\Route;
# 不需要登录
Route::get('country1', 'home/common/countryList');⑤跨域设置
$origin = isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : '';
Route::get('country4', 'home/common/countryList')
->allowCrossDomain([
'Access-Control-Allow-Origin' => $origin,
'Access-Control-Allow-Credentials' => 'true',
'Access-Control-Max-Age' => 600,
]);示例
具体可参考 public/plugins/captcha/tp_captcha/