<?php
/**
* 验证码类
* Class VerifyCode
*/
class VerifyCode {
protected $redisObj;
private $charset = 'abcdefghkmnprstuvwxyzABCDEFGHKMNPRSTUVWXYZ23456789'; // 随机因子
private $codelen = 4; // 验证码长度
private $width = 85; // 宽度
private $height = 30; // 高度
private $fontsize = 14; // 指定字体大小
private $code; // 验证码
private $img; // 图形资源句柄
private $font; // 指定的字体
private $fontcolor; // 指定字体颜色
public function getRedisObj() {
return $this->redisObj;
}
protected function setRedisObj($configName='') {
try {
if ('' === $configName) {
$obj = new RedisService();
}
else {
$obj = new RedisService($configName);
}
$this->redisObj = $obj->getInstance();
}
catch (Exception $e) {
throw $e;
}
}
//构造方法初始化
public function __construct($width=85, $height=30) {
$this->setRedisObj();
$this->width = $width;
$this->height = $height;
$this->font = $_SERVER['DOCUMENT_ROOT'].PUBLIC_PATH.DIRECTORY_SEPARATOR.'file'.DIRECTORY_SEPARATOR.'elephant.ttf';
}
//生成随机码
private function createCode() {
$_len = strlen($this->charset)-1;
for ($i=0; $i<$this->codelen; $i++) {
$this->code .= $this->charset[mt_rand(0, $_len)];
}
}
//生成背景
private function createBg() {
$this->img = @imagecreate($this->width, $this->height);
$color = imagecolorallocate($this->img, mt_rand(157, 255), mt_rand(157, 255), mt_rand(157, 255));
imagefilledrectangle($this->img, 0, $this->height, $this->width, 0, $color);
}
//生成文字
private function createFont() {
$_x = $this->width/$this->codelen;
for ($i=0; $i<$this->codelen; $i++) {
$this->fontcolor = imagecolorallocate($this->img, mt_rand(0, 156), mt_rand(0, 156), mt_rand(0, 156));
imagettftext($this->img, $this->fontsize, mt_rand(-30, 30), $_x*$i+mt_rand(1, 5), $this->height/1.4, $this->fontcolor, $this->font, $this->code[$i]);
}
}
//生成线条、雪花
private function createLine() {
for ($i=0; $i<3; $i++) {
$color = imagecolorallocate($this->img, mt_rand(0, 156), mt_rand(0, 156), mt_rand(0, 156));
imageline($this->img, mt_rand(0, $this->width), mt_rand(0, $this->height), mt_rand(0, $this->width), mt_rand(0, $this->height), $color);
}
for ($i=0; $i<50; $i++) {
$color = imagecolorallocate($this->img, mt_rand(200, 255), mt_rand(200, 255), mt_rand(200, 255));
imagestring($this->img, mt_rand(1, 5), mt_rand(0, $this->width), mt_rand(0, $this->height), '*', $color);
}
}
//输出
private function outPut() {
header('Content-type: image/png');
imagepng($this->img);
imagedestroy($this->img);
}
//对外生成
public function doimg() {
$logTitle = '生成验证码';
$this->createBg();
$this->createCode();
$this->createLine();
$this->createFont();
$sessionId = session_id();
$verifyCode = $this->getCode();
$this->redisObj->hSet(SysConst::REDIS_VERIFY_CODE_KEY, $sessionId, $verifyCode);
$this->redisObj->expire(SysConst::REDIS_VERIFY_CODE_KEY, SysConst::REDIS_EXPIRE_TIME);
$result = setcookie(SysConst::VERIFY_CODE_ID, $sessionId, time()+SysConst::REDIS_EXPIRE_TIME, '/');
$logStr = __CLASS__.'|'.__FUNCTION__.'|'.__LINE__.'|'.$logTitle.'|redisKey:'.SysConst::REDIS_VERIFY_CODE_KEY.'|key:'.$sessionId.'|verifyCode:'.$verifyCode.'|cookieVerifyCodeId:'.$sessionId.'|setCookieResult:'.((1 == $result) ? 'true' : 'false').'|trace:'.json_encode(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS), JSON_UNESCAPED_UNICODE);
Log::write($logStr);
$this->outPut();
}
//获取验证码
public function getCode() {
return strtolower($this->code);
}
}