一、在写给APP图片验证码时有两种思路
1、用php原生代码写一个,这个有很多现成的代码,不再赘述;
2、使用thinkphp3.2的图片验证码,这里主要讲的就是这种;
二、生成验证码
public function verifyImg() {
//让APP端传递一串字符串用于校验使用
$sendVerifyName= I('get.verifyName');
//根据你定义的规则对str校验,这里忽略
//...
//生成缓存名,用于保存验证码
//根据你的规则生成,比如md5加盐处理
$sendVerifyName = md5($sendVerifyName . '12345');
//实例化验证码对象
$Verify = new \Think\Verify();
//================你的验证码参数start==================
$Verify->fontSize = 20;
$Verify->length = 4;
$Verify->codeSet = '0123456789';
$Verify->imageW = 150;
$Verify->imageH = 50;
$Verify->expire = 600;
$Verify->fontttf = '5.ttf';
//================你的验证码参数end==================
//生成验证码
$Verify->entry();
//后续处理,用于验证,这里可以封装成函数操作
//最好不要改下面的第二个和第三个参数,不然就需要修改\Think\Verify()原文件
$key = substr(md5($Verify->seKey), 5, 8);
$str = substr(md5($Verify->seKey), 8, 10);
$key = md5($key . $str);
S($sendVerifyName, session($key), 180);
}
三、校验验证码
比如说在注册时验证
public function register(){
//一些参数和逻辑处理主要使用verifyName、validity这两个参数,其他参数及校验不需要
$requestData = array();
$requestData['tel'] = I('post.tel');
$requestData['password'] = I('post.password');
$requestData['confirmPassword'] = I('post.confirmPassword');
$requestData['verifyName'] = I('post.verifyName');
$requestData['validity'] = I('post.validity');
$requestData['sign'] = I('post.sign');
foreach($requestData as $k => $v){
if(mb_strlen($v, 'utf-8') == 0){
my_json_encode(10002, '参数不能为空');
}
}
if(!check_sign($requestData)){
my_json_encode(10003, '验签失败');
}
//根据规则得到验证码的缓存名
$sendVerifyName = md5($requestData['verifyName'] . '12345');
//=============生成加密后的验证码start==============
$Verify = new \Think\Verify();
$key = substr(md5($Verify->seKey), 5, 8);
$str = substr(md5($requestData['validity']), 8, 10);
//这个就是加密后的验证码,用它与S($sendVerifyName)比较即可
$key = md5($key . $str);
//=============生成加密后的验证码end==============
//后续处理,判断缓存是否存在,不存在即验证码过期,存在则比较
//...
}