热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP生成验证码图片

赶紧来总结一下自己的小知识,啊~~我还活着最近做了一个投票活动,但有人刷票,就让主办方头疼了,上级让我加一个手机短信验证,就增加了刷票人的成本嘛,第一天完成了手机短信验证功能,但第

赶紧来总结一下自己的小知识,啊~~ 我还活着

最近做了一个投票活动,但有人刷票,就让主办方头疼了,上级让我加一个手机短信验证,就增加了刷票人的成本嘛,第一天完成了手机短信验证功能,但第二天就让我改...  改成 PHP生成验证码,就取消手机短信了

 

哼哼,我居然一点都不慌~ 

 

因为刚做了手机短信验证,是将验证码记录在数据库里的,所以我们的程序生成验证码,我也记录在数据库里了,这是我的设计模式,目的呢,是能记录下来,哪些用户,在什么时间段,获取了验证码,是否使用了等等信息。。

 

我用的是原生PHP,没有用ThinkPHP等框架。因为我们公司有自己的框架,但比较古老,已经out了,正在转TP5

 

完成PHP验证码,很简单:

/**
* 生成随机数字验证码
*
* @param int $size 验证码长度
*
* @return string
*/
function generateRandNumberVerificationCode($size = 4)
{
if($size <= 0 || empty($size) || !isset($size))
{
$size = 4;
}
//验证码内容
$code_array = array(
0,1,2,3,4,5,6,7,8,9
);
$random_keys = array();
for($i = 0; $i <$size; $i++)
{
$keys = array_rand($code_array,1);
array_push($random_keys,$code_array[$keys]);
}
//数组转成字符串
$verification_code = implode('',$random_keys);
return $verification_code;
}

  

上面是我自己写的一个,嗯....里面只有 0-9的数字,如果你想用 a-z 这种,就在 $code_array 数组里加入即可。

封装的这个方法,个人觉得还是很简单,易懂,最后返回获取到的 4位数验证码。 你在外面调用时,可以传入$size,$size=6 就代表是6位验证码,默认是4位

 

我们调用这个方法,获取到验证码,然后就将这个验证码保存在数据库里,再写个接口给前端调用,就完成啦~  注:验证码记录到数据库时,同时记录是哪个用户在操作,操作时间,验证码过期时间,这是我的设计模式

emmmm最开始我是这么想的

 

但前端有点懵,因为我的想法是,接口返回一组字符串,前端收到了,不能就直接显示出来,那多难看啊,肯定要加样式,我想的是给前端处理,让他想个办法,组个图片,或者打乱样式,但好像有点难, 最后商量了一下,让我PHP在后台生成一张图片传给前端, 也就是验证码图片

 

有很多小伙伴不明白验证码图片,因为是图片,用户提交的是字符串,怎么和图片做对比? 以前我也是这么想的。。 其实,上面我就写了,已经生成了一组验证码,记录到数据库了,明白了吗。  用户输入的字符串,最后做比较的,不是图片,而是和我已经生成的验证码, 图片,只是用来给用户看的, 而这个图片的内容,就是我来定义

 

以下是生成 验证码图片代码:

/**
* 生成随机数字验证码图片
*
* @param string $code 验证码内容
*
* @param string $member_id 会员id
*
* @param string $width 图片宽度
*
* @param string $height 图片宽度
*
* @return string
*/
function generateRandNumberVerificationCodeImg($code = '',$member_id = '',$width = 80,$height = 40)
{
if(empty($code) || !isset($code))
{
return false;
}
if(empty($member_id) || !isset($member_id))
{
return false;
}
//判断文件夹是否存在,不存在则创建
$dir = ROOT_PATH.'/upload/verification_code_img';
if(!is_dir($dir)){
mkdir($dir, 0777, true);
}
//验证码图片保存路径,文件名称
$file_name = ROOT_PATH.'/upload/verification_code_img/member_id_'.$member_id.'.png';
//域名返回
$domain_name = _constant_url.'/upload/verification_code_img/member_id_'.$member_id.'.png';
$img = imagecreatetruecolor($width, $height);
$black = imagecolorallocate($img, 0x00, 0x00, 0x00);
$green = imagecolorallocate($img, 0x00, 0xFF, 0x00);
$white = imagecolorallocate($img, 0xFF, 0xFF, 0xFF);
imagefill($img,0,0,$white);
imagestring($img, 5, 22, 12, $code, $black);
//加入噪点干扰
for($i=0;$i<100;$i++) {
imagesetpixel($img, rand(0, $width) , rand(0, $width) , $black); //imagesetpixel — 画一个单一像素,语法: bool imagesetpixel ( resource $image , int $x , int $y , int $color )
imagesetpixel($img, rand(0, $width) , rand(0, $width) , $green);
}
//输出验证码
// header("content-type: image/png");
imagepng($img,$file_name); //保存图片
imagedestroy($img); //图像处理完成后,使用 imagedestroy() 指令销毁图像资源以释放内存,虽然该函数不是必须的,但使用它是一个好习惯。
return $domain_name;
}

  

以上代码需要注意的是:

1. 我这边定义的常量,可能和你们的不同,但基本是国际命名法,大致应该都能明白变量或常量的意思

2. $code 这个参数是验证码内容,就是我先生成了验证码,然后调用这个生成图片,将验证码传了进去,图片里就是我的验证码内容了

3. 方法里最后两个参数:$width 和 $height,这两个参数,是用来定义你的图片宽和高的

4. imagestring() 方法,我在里面写的是绝对值,4位数验证码就合适,但6位,8位,或者其他的,样式就不好看了,小伙伴有兴趣可以写一个数学运算,这样传几位验证码,都能保证在图片中间,以及好看的样式。emmmmm以前写过百分比,各种计算,但这次就算啦

5. 这里生成的图片,你一定要去学习 PHP GD库,可以直接百度"PHP GD库"

 

验证码图片这个方法,我是将图片保存在我的项目里,以及取出它的域名链接,保存在数据库里,这样我就可以传给前端,前端来获取这个验证码的图片了。  用户看到这个图片的内容,输入字符串,后台进行验证,结束。

 

 

以下是我本次处理验证码功能的逻辑:

1. 生成验证码

2. 根据验证码,生成 验证码图片

3. 保存至数据库,记录验证码、当前用户、创建时间、过期时间、是否已验证、验证码图片路径

4. 写接口,传给前端 验证码图片

5. 前端展示图片给用户

6. 用户根据验证码图片输入 验证码内容

7. 前端确认用户输入信息,传给接口

8. PHP接口做处理,验证用户输入的验证码内容是否正确

9. 正确,投票成功;失败,提示错误

 


推荐阅读
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • java编写一个为网站生成验证码的程序_Java后端产生验证码后台验证功能的实现代码...
    直接跳severlet在java后台生成验证码:RequestMapping(valueyzm.action)publicvoidYzm(HttpSessions ... [详细]
  • Java实现验证码的制作
    验证码概述为什么使用验证码?验证码(CAPTCHA)是一种全自动程序。主要是为了区分“进行操作的是不是人”。如果没有验证码机制,将会导致以下的问题:对特定网站不断进行登录,破解密码 ... [详细]
  • 开发笔记:GD库的基本信息,图像的旋转水印缩略图验证码,以及图像类的封装
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了GD库的基本信息,图像的旋转水印缩略图验证码,以及图像类的封装相关的知识,希望对你有一定的参考价值。GD ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 【爬虫】关于企业信用信息公示系统加速乐最新反爬虫机制
    ( ̄▽ ̄)~又得半夜修仙了,作为一个爬虫小白,花了3天时间写好的程序,才跑了一个月目标网站就更新了,是有点悲催,还是要只有一天的时间重构。升级后网站的层次结构并没有太多变化,表面上 ... [详细]
  • 栈是一种先进先出的线性表,对么
    常见问题栈,先进先出,线性表常见问题网络电视直播源码php,ubuntu安装固态硬盘,爬虫思路有哪些,php安全实例,江苏360seolzw栈是一种先进先出的线性表,不对。网页挖矿 ... [详细]
  • [Hei.Captcha]Asp.NetCore跨平台图形验证码实现
    写在前面说起来比较丢脸。我们有个手机的验证码发送逻辑需要使用验证码,这块本来项目里面就有验证码绘制逻辑,.NetFramework的,使用的包是System.Drawing,我 ... [详细]
  • 2010年下半年软件评测师试题标准答案阅卷用标准答案,更多答案登录http:www.enpass.cn查看,软考培训权威机构由于发博文的限制,有些图片不能发上来,下载完全版答 ... [详细]
author-avatar
长不大的二楞子
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有