php 生成图片验证码 laravel - 请叫我足下 - 开源中国

[php 生成图片验证码 laravel - 请叫我足下 - 开源中国]

环境:

  1. "php": ">=5.5.9"
  2. "laravel/lumen-framework": "5.2.*",我使用的是laravel框架,其他php框架也一样

使用方法:

1.使用composer获取验证码库

php composer.phar require lifei6671/php-captcha

2.具体使用

<?php
use Minho\Captcha\CaptchaBuilder;
$captch = new CaptchaBuilder();
$captch->initialize([
    'width' => 150,     // 宽度
    'height' => 50,     // 高度
    'line' => false,    // 直线
    'curve' => true,    // 曲线
    'noise' => 1,       // 噪点背景
    'fonts' => []       // 字体
]);
$captch->create();
//直接输出图片:
$captch->output(1);
//保存图片到硬盘:
$captch->save('1.png',1);
//获取验证码文字并存储到session中:
$_SESSION['captch'] = $captch->getText();

示例:

该示例是基于上面的环境
  • 获取验证码和校验验证码的类CaptchaMake

<?php
/**
 * Created by PhpStorm.
 * User: zero
 * Date: 2018/2/26
 * Time: 16:40
 */

namespace App\Libs;
use Illuminate\Http\Request;
use Minho\Captcha\CaptchaBuilder;
use Exception;
use Log;

class CaptchaMake
{

    /**
     * 获取验证码
     * @return string
     */
    public static function getCaptcha()
    {

        try{

            $captch = new CaptchaBuilder();
            $captch->initialize([
                'width' => 150,     // 宽度
                'height' => 50,     // 高度
                'line' => false,    // 直线
                'curve' => true,    // 曲线
                'noise' => 2,       // 噪点背景
                'fonts' => []       // 字体
            ]);

            $captch->create();
            new SessionManager();
            $_SESSION['captch'] = $captch->getText();

            //生成并返回图片流base64编码
            ob_start ();
            $captch->output(1);
            $image_data = ob_get_contents ();
            ob_end_clean ();
            $image_data_base64 = base64_encode ($image_data);
            return $image_data_base64;

        } catch (Exception $e) {
            Log::emergency('获取图片验证码报错: ', [$e->getMessage()]);
            Log::error($e->getFile() . ":" . $e->getLine());
        }


    }

    /**
     * 校验验证码
     * @param Request $request
     * @return array
     */
    public static function checkCaptcha(Request $request)
    {

        try{
            $code=$request->input('code',false);
            if($code===false){
                return ReturnCode::create(-1, [], '请填写图片验证码');
            }
            if(!isset($_SESSION['captch'])){
                return ReturnCode::create(-1, [], '图片验证码已过期,请重新获取');
            }

            if($code!=$_SESSION['captch']){
                return ReturnCode::create(-1, [], '图片验证码错误');
            }

            return ReturnCode::create(ReturnCode::SUCCESS);
        } catch (Exception $e) {
            Log::emergency('校验图片验证码报错: ', [$e->getMessage()]);
            Log::error($e->getFile() . ":" . $e->getLine());
        }


    }

}
  • 将验证码存储到基于redis的session中的类SessionManager

<?php

/**
 * Created by PhpStorm.
 * User: zero
 * Date: 2018/2/27
 * Time: 15:44
 */

namespace App\Libs;
use Log;

class SessionManager
{

    private $redis;
    private $sessionSavePath;
    private $sessionName;
    public function __construct(){
        $this->redis = app('redis');
        $this->sessionExpireTime = 30;
        $retval = session_set_save_handler(
            array($this,"open"),
            array($this,"close"),
            array($this,"read"),
            array($this,"write"),
            array($this,"destroy"),
            array($this,"gc")
        );
        session_start();
    }
    //会话开始时,会执行该方法,连接redis服务器
    public function open($path,$name){

        return true;
    }
    //会话结束时,调用该方法,关闭redis连接
    public function close(){
        return true;
    }
    // 在自动开始会话或者通过调用 session_start() 函数手动开始会话之后,PHP 内部调用 read 回调函数来获取会话数据。
    public function read($id){
        //Log::info('===============session=======read====$id===='.$id);
        //Log::info('===============session=====expire=$id===='. $this->redis->ttl($id));
        $value = $this->redis->get($id);//获取redis中的指定记录
        if($value){
            return $value;
        }else{
            return '';
        }
    }
    // 会话保存数据时调用该方法,在脚本执行完或session_write_close方法调用之后调用
    public function write($id,$data){
        //Log::info('===============session====write=======$id===='.$id);
        //Log::info('===============session====write=======$data===='.$data);
        if($this->redis->set($id,$data)){//以session ID为键,存储
            $this->redis->expire($id,$this->sessionExpireTime);//设置redis中数据的过期时间,即session的过期时间
            return true;
        }
        return false;
    }
    // 清除会话中的数据,当调用session_destroy()函数,或者调用 session_regenerate_id()函数并且设置 destroy 参数为 TRUE 时,会调用此回调函数。
    public function destroy($id){
        if($this->redis->delete($id)){//删除redis中的指定记录
            return true;
        }
        return false;
    }
    public function gc($maxlifetime){
        return true;
    }
    public function __destruct(){
        session_write_close();
    }
    //设置过期时间
    public function setSessionExpireTime($time){
        $this->sessionExpireTime = $time;
    }

}
该示例,需要基本熟悉laravel框架,如有不懂,可以在评论区提问,我会尽力解答

Original url: Access

Created at: 2018-10-10 17:19:16

Category: default

Tags: none

请先后发表评论
  • 最新评论
  • 总共0条评论