前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >php 利用GD库实现一个验证码功能(封装成了函数可自定义配置验证码外观及功能)

php 利用GD库实现一个验证码功能(封装成了函数可自定义配置验证码外观及功能)

作者头像
1338335202用户
发布2022-12-19 20:39:05
4230
发布2022-12-19 20:39:05
举报
文章被收录于专栏:前端flutter

前言

在这里插入图片描述
在这里插入图片描述

使用 GD库来完成验证码功能非常简单,库中大量函数 API 堆在一起就成了这个功能,下面代码注释中详细介绍了每段代码的功能,非常适合新手。

完整代码

我把验证码功能 封装成了一个函数,因此可以 自定义配置,下面给出了完整代码及配置介绍。

下面这段代码可以直接粘贴到浏览器打开预览,查看效果。

代码语言:javascript
复制
<?php

/*
* //TODO: 验证码参数配置(GD库解决方案)
* @width(数值型): 组件宽度(默认值100)
* @height(数值型): 组件高度(默认值50)
* @length(数值型): 验证码多少位(默认值5)
* @type(数值型): 验证码的类型,分为纯数字(默认1)/纯字母(2)/数字字母混合(3)
*/

function verifyCode($width = 100, $height = 50, $length = 5, $type = 1){
    
# 1. 创建验证码画布(确立组件宽高)
$board = imagecreatetruecolor($width, $height);//画布大小

# 2. 创建随机调色板(深颜色用于验证码字/浅颜色用于背景)

// 浅色(140-255)
$shallow = imagecolorallocate($board, mt_rand(140,255), mt_rand(140,255), mt_rand(140,255));

// 深色(0-120)
$deep = imagecolorallocate($board, mt_rand(0,120), mt_rand(0,120), mt_rand(0,120));
imagefilledrectangle($board, 0, 0, $width, $height, $shallow);//画布背景上色

# 3. 确立验证码类型及创建模板(type)
switch($type){

    case 1 : $str = '0123456789';//数据模板([1]数字0-9)
        $code = substr(str_shuffle($str), 0, $length);//打乱顺序后截取
    break;

    case 2 : $arr = range('a', 'z');//数据模板([2]字母a-z)
        shuffle($arr);//打乱顺序
        $tmp = array_splice($arr, 0, 5);//临时模板
        $code = join('', $tmp);//把数组组合成字符串
    break;

    case 3 : $atr = '123456789abcdefghjkmnopqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ';
        //[3]混合0-9,a-z,A-Z(去掉了0 l o 这种难以识别的字母数字)
        $code = substr(str_shuffle($atr), 0, $length);
    break;

}

# 4. 将随机验证码写入到画布(循环写入)
for($i = 0; $i < $length; $i++){
    $x = floor($width / $length) * $i;//横轴偏移量
    $y = mt_rand(10, $height - 20);//竖轴偏移量(随机偏移)
    imagechar($board, 5, $x, $y, $code[$i], $deep);//写入画布
}

# 5. 画入圆弧干扰线(随机横纵坐标细线)
for($i = 0; $i < $length; $i++){
    imagearc($board,//画板
    mt_rand(10, $$width),//横轴位置
    mt_rand(10, $height),//竖轴位置
    mt_rand(10, $width),//圆弧宽度
    mt_rand(10, $height),//圆弧高度
    mt_rand(0, 10), mt_rand(0,270),$deep);//旋转角度及颜色
}

# 6. 画入干扰点(随机横纵坐标点状圆)
for($i = 0; $i < 50; $i++){
    imagesetpixel($board, mt_rand(0, $width), mt_rand(0, $height), $deep);
}

# 7. 指定输出类型并返回完整的验证码组件
ob_clean();//擦除缓冲区
header('Content-type: image/png');//输出类型
imagepng($board);//输出验证码
imagedestroy($board);//销毁内存(结束)

# 8. return 出去
return $code;

}

# 测试使用
verifyCode(100, 50, 5, 3);//宽为100,高为50,长度为5个字符,类型为混合型(数字+字母)

?>

上述代码,可以看到我配置的验证码属性为:

  • 验证码组件宽度:100px
  • 验证码组件高度:50px
  • 验证码字符长度:5位数
  • 验证码类型:混合型(数字+字母)

当然,数字类型 / 字母类型也都是自由选择,只需要调用验证码函数时改变传参值即可。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-12-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 完整代码
相关产品与服务
验证码
腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档