tp5手机号验证码发送及验证
原文链接:https://blog.csdn.net/weixin_43389208/article/details/119153323
为什么使用短信:
        场景:通常在使用手机号注册时需要发送短信验证码,在修改密码等敏感操作时也需要验证手机号发送短信验证码。
目的:验证用户的身份是否本人
平台:百度Apistore数据平台、聚合数据平台、京东万象等等。
在项目代码中发送短信,通常要调用第三方短信商的短信发送接口。
一般情况下,短信接口需要企业认证用户才能申请、一般都是收费的。个人可以购买使用。
思路:
1. 短信宝/京东万象等短信平台的短信api的账号开通及短信api接口申请。
短信宝官网 http://www.smsbao.com/
2. 下载php代码示例,在框架中实现短信接口开发。
实现:
1. 页面绑定验证码点击事件,并请求短信接口进行发送请求。
//验证码点击事件
$('#dyMobileButton').click(function () {
var phone = $('#phone').val();
if (phone == '') {
alert('手机号不能为空');
return false;
} else if (!/^1[3-9]\d{9}$/.test(phone)) {
alert('手机号规则不正确');
return false;
}
//短信发送限制
var time = 60;
setInterval(function () {
time--;
if (time > 0) {
//开始倒计时
$('#dyMobileButton').html('重新发送,还剩:' + time + '秒');
$('#dyMobileButton').prop('disabled', true);
} else {
//结束倒计时
$('#dyMobileButton').html('发送验证码');
$('#dyMobileButton').prop('disabled', false);
}
}, 1000); //请求短信接口
$.ajax({
'url': 'http://www.1904a.com/sendMsg',
'type': 'POST',
'data': {
sendPhone: phone
},
'datatype': 'json',
'success': function (res) {
console.log(res);
},
'error': function (error) {
console.log(error);
return false;
},
});
});
2. 将短信宝所需的配置文件信息存放在application/config下
//短信宝
'smsbao' => [
//短信宝api网址
'smsapi' => 'http://api.smsbao.com/',
//你在短信宝注册的账号
'user' => '',
//你在短信宝注册的密码
'pass' => '',
],
3. 请求短信发送的逻辑处理(短信宝密码需要进行md5加密)。
/**
* 发送短信
* @return \think\response\Json
*/
public function sendMsg()
{
//接受参数
$post = input();
//验证参数
$validate = Loader::validate('User');
if (!$validate->scene('sendMsg')->check($post)) {
$this->error($validate->getError(), 'home/login/register');
} //限制手机号次数
$redis = new Redis();
$num = $redis->inc('register_num_' . $post['sendPhone']); //key =>register_num_17807581416 value +1
if ($num > 10) {
return getJsonData(10011, '手机号请求次数超过10次,请明天请求!');
} //限制验证码时间
$cacheTime = cache('register_time_' . $post['sendPhone']);
if (time() - $cacheTime > 60 * 3) {
return getJsonData(10012, '时间超过3分钟,请重新发送!');
} //限制ip
$ip = request()->ip();
if ($ip != self::SERVER_IP) {
return getJsonData(10013, 'ip地址不正确,无法发送短信,请检查ip');
} //获取短信宝配置信息
$smsbao = config('smsbao'); //随机数
$code = mt_rand(1000, 9999); //4023
$content = "【短信宝】您的验证码是" . $code . ",3分钟有效。";//要发送的短信内容 $sendurl = $smsbao['smsapi'] . "sms?u=" . $smsbao['user'] . "&p=" . md5($smsbao['pass']) . "&m=" . $post['sendPhone'] . "&c=" . urlencode($content);
$result = file_get_contents($sendurl); if (!empty($result)) {
//发送失败
return getJsonData(10010, $this->statusStr[$result]);
} //缓存验证码,3分钟有效
cache('register_code_' . $post['sendPhone'], $code, 60 * 3); cache('register_code_' . $post['sendPhone'], time(), 60 * 3);
$redis->set('register_num_' . $post['sendPhone'], 0, 60 * 60 * 24);
return getJsonData(200, $this->statusStr[$result], $code);
}
4:设置前端倒计时事件。
//设置倒计时
var time = 60;
setInterval(function () {
time--;
if (time > 0) {
//1分钟内
$("#dyMobileButton").prop('disabled', true); //按钮禁用
$("#dyMobileButton").html("重发验证码(" + time + ")"); //修改文案
} else {
$("#dyMobileButton").prop('disabled', false); //按钮启用
$("#dyMobileButton").html("发送验证码"); //修改文案
}
}, 1000);
延伸:
短信发送限制
1. 60秒内不可再次提交验证码。
方案:采用前端倒计时事件
2. 检测一定时间内的发送频率。(同一个手机号 一分钟只能发送一次)
//限制验证码时间
$cacheTime = cache('register_time_' . $post['sendPhone']);
if (time() - $cacheTime > 60 * 3) {
return getJsonData(10012, '时间超过3分钟,请重新发送!');
}
3. 限制用户ip地址。
        const SERVER_IP = '127.0.0.1'; 
        //限制ip
        $ip = request()->ip();
        if ($ip != self::SERVER_IP) {
            return getJsonData(10013, 'ip地址不正确,无法发送短信,请检查ip');
        }
    
4. 限制次数。(一个手机号一天只能请求10次)
//限制手机号次数
$redis = new Redis();
$num = $redis->inc('register_num_' . $post['sendPhone']);
if ($num > 10) {
return getJsonData(10011, '手机号请求次数超过10次,请明天请求!');
}
tp5手机号验证码发送及验证的更多相关文章
- Abp.Zero 手机号免密登录验证与号码绑定功能的实现(一):验证码模块
		这是一篇系列博文,我将使用Abp.Zero搭建一套集成手机号免密登录验证与号码绑定功能的用户系统: Abp.Zero 手机号免密登录验证与号码绑定功能的实现(一):验证码模块 Abp.Zero 手机号 ... 
- php实现的IMEI限制的短信验证码发送类
		php实现的IMEI限制的短信验证码发送类 <?php class Api_Sms{ const EXPIRE_SEC = 1800; // 过期时间间隔 const RESEND_SEC = ... 
- 怎么用php实现短信验证码发送
		我在在众多的第三方短信服务商里选择了云片网这个短信服务商,我也会尽可能利用最简单的方式去帮助广大开发者解决短信验证码功能模块的实现. 再次之前我也参考了大部分网上的博客等,大多数都是把云片网的demo ... 
- 微信小程序+laravel 7+ Redis +短信宝 实现手机号验证码登录
		以下代码可以进行优化和封装:这里我实现功能为主,就不封装啦.小伙伴可以自己试着封装一下. 1:书写登录表单 <view class="container"> <v ... 
- laravel7 手机号验证码登陆
		1"设置路由: //展示手机登录页面 Route::get('admin','admin\AdminController@admin'); 2:html页面 <!DOCTYPE HTM ... 
- 【社交系统研发日记】如何在 Laravel 中 “规范” 的开发验证码发送功能
		顺便发个小通知:7月15日ThinkSNS+开源版发布,同时非开源的APP也走出内测阶段,体验二维码也全面发布体验. 什么是ThinkSNS ? ThinkSNS(简称TS),一款全平台综合性社交系统 ... 
- asp.net mvc 接入美圣短信 验证码发送
		第1步:登录美圣短信控制台 http://www.rcscloud.cn/hy/HY_ZH/login 账号:******* 密码:******* http://www.rcscloud.cn/com ... 
- asp.net mvc 接入阿里大于  短信验证码发送
		项目前端页面实例 第1步:登录阿里大于控制台 https://www.alidayu.com/center/user/account?spm=0.0.0.0.P1K1jG 第2步:创建应用 第3步:配 ... 
- asp.net 进行发送邮箱验证
		利用发送邮件验证码进行注册验证 需要引用using System.Net.Mail;命名空间 #region /// <summary> /// 发送邮件 /// </summary ... 
随机推荐
- Base64补充
			1.Base64简单说明 描述:Base64可以成为密码学的基石,非常重要. 特点:可以将任意的二进制数据进行Base64编码 结果:所有的数据都能被编码为并只用65个字符就能表示的文本文件. 65字 ... 
- Yarn命令列表
			常用命令: 创建项目:yarn init 安装依赖包:yarn == yarn install 添加依赖包:yarn add Yarn命令列表 命令 操作 参数 标签 yarn add 添加依赖包 包 ... 
- node.js 使用domain模块捕获异步回调中的异常
			和其他服务器端语言相比,貌似node.js 对于异常捕捉确实非常困难. 首先你会想到try/catch ,但是在使用过程中我们会发现并没有真正将错误控制在try/catch 语句中. 为什么? 答案是 ... 
- 【转】Python 并行分布式框架 Celery
			原文链接:https://blog.csdn.net/freeking101/article/details/74707619 Celery 官网:http://www.celeryproject.o ... 
- @property修饰符
			@property修饰符 修饰是否生成getter方法的 readonly 只生成setter方法,不生成getter方法 readwrite 既生成getter 又生成setter方法(默认) @p ... 
- SpringDataJpa打印Sql详情(含参数)
			Spring Data Jpa打印Sql详情(带sql参数) 这里使用的是 log4jdbc,yml配置文件里的数据源配置也要做相应的修改 pom文件引入 <dependency> < ... 
- 鸟哥的Linux私房菜学习笔记——文件权限与目录配置
			Linux的文件权限和目录配置 在linux中的每个用户必需属于一个组,不能独立于组外.在linux中每个文件有所有者.所在组.其它组的概念. (1)所有者 一般为文件的创建者,谁创建了该文件,就是天 ... 
- 详解Java12新增语法switch表达式
			引言 在学习分支语句的时候,我们都学过 switch 语句,相比于 if-else 语句,他看起来更加整洁,逻辑更加清晰,Java中当然也给我们提了相关的 switch 方法.但是Java的强大之处在 ... 
- JVM性能调优与实战基础理论篇-中
			JVM内存模型 概述 我们所说的JVM内存模型是指运行时数据区,用New出来的对象放在堆中,如每个线程中局部变量放在栈或叫虚拟机栈中,下图左边区域部分为栈内存的结构.如main线程包含程序炯酸器.线程 ... 
- HTTP缓存协议实战
			一.什么是缓存 缓存,又称作Cache,我们把临时存储数据的地方叫做缓存池,缓存池里面放的数据就叫做缓存.当用户需要使用这些数据,首先在缓存中寻找,如果找到了则直接使用.如果找不到,则再去其他数据源中 ... 
