短信验证码开发教程 - 3.图形验证码篇

uni-app使用uniCloud实现图形验证码(uni-captcha) uniCloud 是 DCloud 联合阿里云、腾讯云,为开发者提供的基于 serverless 模式和 js 编程的云开发平台。uniCloud中使用图形验证(uni-captcha)主要起到人机校验或其他限制调用的作用。解决[uni-captcha-demo]: MODULE NOT FOUND:Cannot find module 'uni -captcha'异常问题。 阅读详情

前面的文章已经把准备工作都做好了,我们做了注册页面,配置文件,工具文件等基础功能,接下来就进入短信验证码开发的关键阶段,来带领大家完成验证码图片的制作,以及前台在页面上的调用。

验证码开发主要有这么几个部分:创建一个图片画布,生成随机的验证码,把验证码放到画布上,生成干扰线,最后输出图片。下面上代码:

<?php
class Code{
        //资源
        private $img;
        //画布宽度
        private $width=100;
        //画布高度
        private $height=30;
        //背景颜色
        private $bgColor='#ffffff';
        //验证码
        private $code;
        //验证码的随机种子
        private $codeStr='23456789abcdefghjkmnpqrstuvwsyz';
        //验证码长度
        private $codeLen=4;
        //验证码字体
        private $font;
        //验证码字体大小
        private $fontSize=16;
        //验证码字体颜色
        private $fontColor='';

        public function __construct() {
        }

        //创建验证码
        public function make()
        {
                if(empty($this->font))
                {
                        $this->font = __DIR__ . '/../font/consola.ttf';
                }
                $this->create();//生成验证码
                header("Content-type:image/png");
                imagepng($this->img);
                imagedestroy($this->img);
                exit;
        }

        //设置字体文件
        public function font($font)
        {
                $this->font= $font;
                return $this;
        }

        //设置文字大小
        public function fontSize($fontSize)
        {
                $this->fontSize=$fontSize;
                return $this;
        }

        //设置字体颜色
        public function fontColor($fontColor)
        {
                $this->fontColor = $fontColor;
                return $this;
        }

        //验证码数量
        public function num($num)
        {
                $this->codeLen=$num;
                return $this;
        }

        //设置宽度
        public function width($width)
        {
                $this->width = $width;
                return $this;
        }

        //设置高度
        public function height($height)
        {
                $this->height = $height;
                return $this;
        }

        //设置背景颜色
        public function background($color)
        {
                $this->bgColor = $color;
                return $this;
        }

        //返回验证码
        public function get() {
                return $_SESSION['code'];
        }

        //生成验证码
        private function createCode() {
                $code = '';
                for ($i = 0; $i < $this->codeLen; $i++) {
                        $code .= $this->codeStr [mt_rand(0, strlen($this->codeStr) - 1)];
                }
                $this->code = strtoupper($code);
                $_SESSION['code'] = $this->code;
        }

        //建画布
        private function create() {
                if (!$this->checkGD())
                        return false;
                $w = $this->width;
                $h = $this->height;
                $bgColor = $this->bgColor;
                $img = imagecreatetruecolor($w, $h);
                $bgColor = imagecolorallocate($img, hexdec(substr($bgColor, 1, 2)), hexdec(substr($bgColor, 3, 2)), hexdec(substr($bgColor, 5, 2)));
                imagefill($img, 0, 0, $bgColor);
                $this->img = $img;
                $this->createLine();
                $this->createFont();
                $this->createPix();
                $this->createRec();
        }

        //画线
        private function createLine(){
                $w = $this->width;
                $h = $this->height;
                $line_color = "#dcdcdc";
                $color = imagecolorallocate($this->img, hexdec(substr($line_color, 1, 2)), hexdec(substr($line_color, 3, 2)), hexdec(substr($line_color, 5, 2)));
                $l = $h/5;
                for($i=1;$i<$l;$i++){
                        $step =$i*5;
                        imageline($this->img, 0, $step, $w,$step, $color);
                }
                $l= $w/10;
                for($i=1;$i<$l;$i++){
                        $step =$i*10;
                        imageline($this->img, $step, 0, $step,$h, $color);
                }
        }

        //画矩形边框
        private function createRec() {
                //imagerectangle($this->img, 0, 0, $this->width - 1, $this->height - 1, $this->fontColor);
        }

        //写入验证码文字
        private function createFont() {
                $this->createCode();
                $color = $this->fontColor;
                if (!empty($color)) {
                        $fontColor = imagecolorallocate($this->img, hexdec(substr($color, 1, 2)), hexdec(substr($color, 3, 2)), hexdec(substr($color, 5, 2)));
                }
                $x = ($this->width - 10) / $this->codeLen;
                for ($i = 0; $i < $this->codeLen; $i++) {
                        if (empty($color)) {
                                $fontColor = imagecolorallocate($this->img, mt_rand(50, 155), mt_rand(50, 155), mt_rand(50, 155));
                        }
                        imagettftext($this->img, $this->fontSize, mt_rand(- 30, 30), $x * $i + mt_rand(6, 10), mt_rand($this->height / 1.3, $this->height - 5), $fontColor, $this->font, $this->code [$i]);
                }
                $this->fontColor = $fontColor;
        }

        //画线
        private function createPix() {
                $pix_color = $this->fontColor;
                for ($i = 0; $i < 50; $i++) {
                        imagesetpixel($this->img, mt_rand(0, $this->width), mt_rand(0, $this->height), $pix_color);
                }

                for ($i = 0; $i < 2; $i++) {
                        imageline($this->img, mt_rand(0, $this->width), mt_rand(0, $this->height), mt_rand(0, $this->width), mt_rand(0, $this->height), $pix_color);
                }
                //画圆弧
                for ($i = 0; $i < 1; $i++) {
                        // 设置画线宽度
                        imagearc($this->img, mt_rand(0, $this->width), mt_rand(0, $this->height), mt_rand(0, $this->width), mt_rand(0, $this->height)
                                , mt_rand(0, 160), mt_rand(0, 200), $pix_color);
                }
                imagesetthickness($this->img, 1);
        }

        //验证GD库
        private function checkGD() {
                return extension_loaded('gd') && function_exists("imagepng");
        }
}
好了,这样图形验证码类制作好了。接下来我们来做一个调用文件,用于把图形验证码展示出来。 在sms/tool下创建showCode文件,代码如下:
<?php
session_start(); // 开启session会话
require('./Code.php'); // 引入验证码类文件
$code = new Code(); // 实例化
$code->make(); // 调用验证码显示方法来显示

我们还需要完成最后一个步骤,就是在页面上面展示图形验证码。
打开在前面准备工作中创建的注册文件register.php, 找到验证码这里,把代码改成如下:

<div class="form-input">
        <label class="code_label">
            验&ensp;证&ensp;码&emsp;
            <input id="vcode" type="text" name="vcode" value=""/>
            <img id="code_img" src="./tool/show_code.php" onclick="this.src='./tool/show_code.php?'+Math.random()" />
            <p id="code_err" class="errmsg" style="margin:5px 0 0 88px; color:red;"></p>
        </label>
</div>

以上代码我做一下解释:在img标签中,src引入了验证码图片的展示类,把图片直接展示在页面上。添加onclick属性的作用是点击切换图片。完成后在页面上展示的效果如下:

图形验证码制作完毕了,但是有一点要注意,在php.ini配置文件中,必须要打开GD库。

短信验证码开发教程 - 4.后端篇 这篇文件教大家怎么处理后端的业务逻辑。后端的业务我把它分成2块来处理:1. 获取短信验证码的业务处理。 2. 提交表单完成模拟注册。一. 获取短信验证码 :打开sms/register.php这个文件,在表单中找到“获取验证码”的button标签。获取验证码是通过这个按钮触发js事件,ajax调用后台接口来完成发送的。我们在sms/tool目录中,创建一个sendCode.php文件,这个php文件 阅读详情

相关推荐

图形验证码+短信验证码实战

前言:   上一篇分分享了基于阿里云实现的短信验证码文章,考虑到为了防止登录时,非人工操作,频繁获取验证码,趁热打铁,现在添加了图片验证码服务功能。借鉴网上传统的做法,把实现这两个验证的功能做成有个独立的服务,通过Http分别请求获取校验图片验证码和短信验证码。 一、需求描述: 图形验证码为,短信验证码为6位纯数字 同一系统图片验证码缓存中只存在一个,没有有效期,每次刷新更新旧图形验证码 短信...

weixin_43163153的博客 1442

前端实战:使用JS和Canvas实现运算图形验证码(uniapp、微信小程序同样可用)

图形验证码是网站安全防护的重要组成部分,能有效防止自动化脚本进行恶意操作,如何实现一个简单的运算图形验证码?本文封装了一个简单的js类,可以用于生成简单但安全的图形验证码。它支持自定义验证码样式,包括字体大小、颜色以及干扰线的数量和样式。如下图。

Jiaberrr的博客 1997

图形验证码和短信验证码

图形验证码 注意事项 在虚拟环境中安装Pillow 字体文件需要在环境中测试一下(字体文件习惯放在和验证码同层目录下) import random # Image:是一个画板(context),ImageDraw:是一个画笔, ImageFont:画笔的字体 from PIL import Image,ImageDraw,ImageFont import time import os impo...

江江江洗河 1018

jQuery实现验证码控制按钮及图片放大功能分析

下面分享两个小案例: 1、实现发送验证码控制按钮禁用 主要步骤及代码思路是, 添加点击按钮事件 按钮被禁用 替换按钮内的内容 每隔1s进行倒计时的变换 倒计时到0时,停止倒计时,按钮恢复发送 按钮内容更改,禁用取消 <body> <input type="text" id="txt"> <input type="button" id="btn" value="发送"> <script src="../jq/jqu

小白的学习之路 288

Python全栈(十一)Django项目之3.图形验证码实现逻辑和短信验证码初步实现

后端实现图形验证码验证时,需要先使用第三方包生成验证码,同时保存到Redis中,最后响应到前端注册页,需要配置好Redis;前端需要生成uuid,并获取验证码图片和显示,还需要对验证码长度进行验证。短信验证码逻辑为接收参数并校验,在校验成功、图形验证码正确时生成短信验证码并保存、响应;发送短信选择容联云通讯平台,可以进行开发调试,需要安装依赖库;同时为了多人发送短信而需要多次初始化类导致的内存占用问题,封装了短信发送的单例类。按照实现逻辑实现后端视图,并返回相应状态;为了避免硬编码,专门定义常量文件。

CUFEECR的博客 1572

图形验证码及短信验证实现用户登录功能实战

验证码(Completely Automated Public Turing test to tell Computers and Humans Apart),也被称作“全自动区分计算机和人类的图灵测试”。验证码的主要作用是区分操作的用户是计算机程序还是人类用户。其起源于网络安全的需求,尤其是在防止自动化的恶意软件(如垃圾邮件机器人)在互联网上进行操作时。一般而言,验证码生成流程包括以下几个步骤:从预定义的文字集中随机选择一组字符;将这些字符渲染成字体和大小可变的文本;

weixin_35811662的博客 1224

短信验证码开发教程 - 2.准备篇

现在跟着我一起来做短信验证码开发前的准备工作,工作需要完成以下几点:定义目录结构。使用html+css对案例的页面进行布局。创建配置文件。编写开发中的帮助文件和数据验证文件。好了,开工!!目录结构定义工作: 先创建目录,需要一个项目目录,配置文件目录,js文件目录,字体文件目录,工具文件目录。定义完成的目录结构如下: sms — 项目目录 sms/config — 配置文件目录

mindev的博客 1409

手机验证码功能实现demo(含视频教程)

手机验证码功能实现demo 含代码和视频教程!!!!

短信接口开发手机验证码

短信接口开发手机验证码视频教程,该课程以PHP为开发工具,调用相关的短信接口,实现一个短信验证码的功能,课后会提供完整的课件和代码供你参考。手机实名后,让用户使用 手机 + 验证码 的方式可以很容易确定对方是一个真实的人,是一种防止机器人注册的方法。学习完后,你可以轻松的举一反三,实现短信群发,查询回复,找回密码等相关功能。

复旦微FMQL45T900平台RGMII网口调试实战:从PHY寄存器读取异常到链路建立

本文详细记录了复旦微FMQL45T900平台RGMII网口调试的全过程,重点解决了PHY寄存器读取异常问题。通过电压配置调整、时序优化和硬件信号完整性检查,最终成功建立网络链路。文章提供了实用的调试经验和解决方案,适合嵌入式开发人员参考。

weixin_29193359的博客 288

SAP高级外币评估_FINS_FXV_S4 2022 OP

摘要:S/4HANA 2022 On-Premise中的高级外币评估(FINS_FXV)取代了经典外币估值(FAGL_FCV),提供更优化的财务结算功能。主要创新包括:增量发布逻辑、简化账户配置、行项目级估值可见性等。该功能支持IFRS9等会计准则,通过会计原则(Accounting Principle)进行配置,需完成财务报表版本定义、语义标记分配等必要设置。系统演示展示了从汇率维护(FB60/MIRO)、测试运行到最终过账(FB03)的完整流程,能自动计算并过账汇率差异。高级外币评估简化了期末结算操作,

yanzibing99的博客 1260

图形验证码+短信验证码【Java应用实例】

一、图形验证码的实现 1.1 简介 常在网上晃悠的人,对下面这张图都不会陌生。特别是在注册新账号、确认交易时,它们都会频繁出现,要求我们输入正确的验证码,那这些看上去跟我们要做的事情完全无关的验证码到底有何作用呢? 其实,验证码的校验即是一个直接的图灵测试,简单的逻辑是:服务提供者向用户方提出一个较为复杂的问题,能正确回答的即是人类,回答不出的即是机器或者程序代码。这个概念基于这样一个重...

短信接口_短信验证码_短信验证码接口 2万+

工业数据采集实战:用open62541库读写PLC的OPC UA节点(避坑指南)

本文详细介绍了如何使用open62541库实现工业PLC的OPC UA节点数据采集,涵盖环境搭建、节点读写优化及生产环境故障排查。通过订阅模式和多节点读写技术,显著提升数据采集效率与稳定性,适用于智能制造和工业物联网场景。

weixin_30598225的博客 399

spring boot3登录开发-短信验证码接口实现

本文介绍了springboot开发后端服务中,短信验证码接口功能的设计与实现,坚持看完相信对你有帮助。同时欢迎订阅springboot系列专栏,持续分享spring boot的使用经验。上文我们已经整合好了jwt,本文我们开始实现短信验证码接口的实现。这里我选用阿里云的短信服务。本文侧重点在于设计思路,阿里云控制台开通短信服务,你跟着流程走一遍就可以。个人也是可以申请的。对接阿里云短信服务实现短信验证码接口到这里就结束了,接口设计我尽可能简单并有一定安全性考虑。希望看完对你有帮助。

蒾酒的博客 1万+

YOLOv11改进策略【独家融合改进】| MobileNetV4+BiFPN,轻松实现降参涨点,适用专栏内所有的骨干替换

可扩展的高效物体检测BiFPN(加权双向特征金字塔网络)

Limiiiing的博客 2362

立体仓库WCS控制系统-AGV通信代码

string str = "任务下发,WCS->NT8000(q-Message),ikey:" + p.ikey.ToString() + "fromStation:" + p.fromStation.ToString() + "toStation:" + p.toStation.ToString();if (nt8000.Connect(_ServerAddr, _ServerPort)) QueueSpeech.AddQueue(string.Format("与NT8000重连成功"));

xdpcxq的专栏 2203

【5分钟教你】3种实现验证码功能-数字短信验证码-图形验证码-滑动验证码

摘要:我们在做一些后台系统的登录验证的时候。难免会用到验证码功能,来辅助进行验证,提高安全性,在我们日常生活中,验证方式无处不在,最多的是短信验证码的方式,通过点击发送验证码,然后手机接收短信,填写验证码才能登陆成功,但是也有一些其他验证码功能也在使用,所以,我就想着来集中记录一下,希望对大家有所帮助… 一.数字短信验证码 思路: a. 两个文本框+一个获取验证码按钮,文本框用来输入手机号和获...

紫芝的博客 8039

「UG/NX」多功能dll集成一个dll的三种方法

C++多功能集成一个dll的三种方法。

何曾参静谧的博客 1390

短信验证码、动态验证码

短信验证码、图形验证码的快速实现。

李诺轩的博客 5901

【WorkBuddy专栏51】Codex与WorkBuddy的底层基因——两条完全不同的AI智能体路线(上)

【WorkBuddy专栏51】Codex与WorkBuddy的底层基因——两条完全不同的AI智能体路线(上)

AI人人懂 2181

影楼精修-高低频磨皮算法解析

本文介绍了像素蛋糕软件中的高低频磨皮算法原理及实现思路,抛砖引玉。

Trent1985的专栏 2259

短信验证码开发教程 - 1.热身篇

由于最近有一些客户反映,自己的网站受到了短信炸弹攻击,苦不堪言。我经过代码分析,发现是由于客户在使用短信接口时,由于在短信发送接口上,没有做好必要的安全防范措施,导致一些不法之徒利用漏洞,对网站发起攻击。最终导致客户自己的短信条数受到损失。所以我决定写这一系列的文章,来通过添加图形验证码,以及其他限制手段,来达到防范短信接口被攻击的目的。演示案例使用的短信接口是短信宝的接口http://www.sm

mindev的博客 1353

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java实现短信验证码最佳实践

1、背景2、实现3、运行效果:4、源码5、总结1、背景年初,从外地转移阵地到西安,转眼已两个多月。很久不写业务代码了,到了新公司,条件恶劣到前所未有,从需求,设计,架构,实现,实施,测试,...

独行侠梦的博客 2223

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

SpringSecurity(03)——图形验证码和短信验证码

SpringSecurity图形验证码和短信验证码

peng_gx的博客 1515

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

java+vue3实现生成、验证图形验证码,和手机短信验证码

java+vue3实现生成、验证图形验证码,和手机短信验证码

Johnson_7的博客 5586
上一篇: 短信验证码开发教程 - 2.准备篇
下一篇: 短信验证码开发教程 - 4.后端篇
mindev
博客等级 码龄10年 11粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值