使用 laravel sms 构建短信验证码发送校验功能
作者:技术学习小组 发布时间:2024-05-03 15:28:42
laravel 实现短信验证码功能,搜索资料发现比较流行的有两个包:
一个是laravel sms 地址 https://github.com/toplan/laravel-sms
一个是easy sms 地址https://github.com/overtrue/easy-sms,
项目中需要实现一个发送和验证短信验证码的功能。以前的办法稍显繁琐。经高人指点,发现可以用 laravel-sms 这个包替代。且配置和使用简单易学。故有了这篇示例。
本例使用了Laravel 5.5、 Api Starter Kit 以及 Laravel Sms 2.6。
本例使用的短信服务商为云片。
安装
在项目根目录下执行(推荐):
composer require toplan/laravel-sms:~2.6
composer require toplan/laravel-sms:~2.6
也可以在 composer.json 的 require 字段中添加:
"toplan/laravel-sms": "2.6"
"toplan/laravel-sms": "2.6"
然后在项目根目录下执行:
composer update
composer update
在 config/app.php 的 providers 数组中添加:
Toplan\PhpSms\PhpSmsServiceProvider::class,
Toplan\Sms\SmsManagerServiceProvider::class,
Toplan\PhpSms\PhpSmsServiceProvider::class,
Toplan\Sms\SmsManagerServiceProvider::class,
并在 aliases 数组里添加:
'PhpSms' => Toplan\PhpSms\Facades\Sms::class,
'SmsManager' => Toplan\Sms\Facades\SmsManager::class,
'PhpSms' => Toplan\PhpSms\Facades\Sms::class,
'SmsManager' => Toplan\Sms\Facades\SmsManager::class,
在项目根目录下执行:
php artisan vendor:publish --provider="Toplan\PhpSms\PhpSmsServiceProvider"
php artisan vendor:publish --provider="Toplan\Sms\SmsManagerServiceProvider"
php artisan vendor:publish --provider="Toplan\PhpSms\PhpSmsServiceProvider"
php artisan vendor:publish --provider="Toplan\Sms\SmsManagerServiceProvider"
会在 config 文件夹中生成两个配置文件:phpsms.php 和 laravel-sms.php。
在 phpsms.php 中可以配置代理器信息及均衡调度方案。
在 laravel-sms.php 中可以配置验证码的发送与验证方案。
同时会向 database\migrations 中复制 2015_12_21_111514_create_sms_table.php 文件。用于生成 laravel_sms 表。
配置
这里仅以云片为例。
配置 phpsms.php
设置 phpsms.php 中 agnets 数组中云片的代理器信息。
'YunPian' => [
//用户唯一标识,必须
'apikey' => '在这里填写你的 APIKEY',
],
'YunPian' => [
//用户唯一标识,必须
'apikey' => '在这里填写你的 APIKEY',
],
设置 scheme 数组,配置均衡调度方案。
'scheme' => [
'YunPian',
],
'scheme' => [
'YunPian',
],
配置 laravel-sms.php
设置内置路由。
'route' => [
'enable' => true,
'prefix' => 'laravel-sms',
'middleware' => ['api'],
],
'route' => [
'enable' => true,
'prefix' => 'laravel-sms',
'middleware' => ['api'],
],
设置请求间隔,单位为秒。
'interval' => 60,
'interval' => 60,
设置号码验证规则。
'validation' => [
'phone_number' => [ //需验证的字段
'isMobile' => true, //本字段是否为手机号
'enable' => true, //是否需要验证
'default' => 'mobile_required', //默认的静态规则
'staticRules' => [ //全部静态规则
'mobile_required' => 'required|zh_mobile',
],
],
],
'validation' => [
'phone_number' => [ //需验证的字段
'isMobile' => true, //本字段是否为手机号
'enable' => true, //是否需要验证
'default' => 'mobile_required', //默认的静态规则
'staticRules' => [ //全部静态规则
'mobile_required' => 'required|zh_mobile',
],
],
],
设置验证码规则。
'code' => [
'length' => 4, //验证码长度
'validMinutes' => 10, //验证码有效时间长度,单位为分钟
'repeatIfValid' => true, //验证码有效期内是否重复使用
'maxAttempts' => 0, //验证码最大尝试验证次数,0 或负数则不启用
],
'code' => [
'length' => 4, //验证码长度
'validMinutes' => 10, //验证码有效时间长度,单位为分钟
'repeatIfValid' => true, //验证码有效期内是否重复使用
'maxAttempts' => 0, //验证码最大尝试验证次数,0 或负数则不启用
],
设置验证码内容短信。
'content' => function ($code, $minutes, $input) {
return "您的验证码是:{$code} ({$minutes}分钟内有效,如非本人操作,请忽略)";
},
'content' => function ($code, $minutes, $input) {
return "您的验证码是:{$code} ({$minutes}分钟内有效,如非本人操作,请忽略)";
},
如果有需要,可以开启数据库日志。需要提前运行 php artisan migrate 生成 laravel_sms 表。
'dbLogs' => 'ture',
'dbLogs' => 'ture',
API 实现
在 app/Utils 下新建 SmsCodeUtil.php,并在里面实现验证码发送和校验功能。这样其他类可以随时调用,提高代码的复用性。
发送模块
发送前需要对手机号进行校验,包括:
validateSendable() :验证是否满足发送间隔
validateFields() :验证数据合法性
通过验证后,再使用 requestVerifySms() 发送验证码。
具体代码如下:
use SmsManager;
trait SmsCodeUtil {
public function sendSmsCode()
{
$result = SmsManager::validateSendable();
if(!$result['success']) {
return respondUnprocessable($result['message']);
}
$result = SmsManager::validateFields();
if(!$result['success']) {
return respondUnprocessable($result['message']);
}
$result = SmsManager::requestVerifySms();
if(!$result['success']) {
return respondUnprocessable($result['message']);
}
return respondSuccess($result['message']);
}
}
use SmsManager;
trait SmsCodeUtil {
public function sendSmsCode()
{
$result = SmsManager::validateSendable();
if(!$result['success']) {
return respondUnprocessable($result['message']);
}
$result = SmsManager::validateFields();
if(!$result['success']) {
return respondUnprocessable($result['message']);
}
$result = SmsManager::requestVerifySms();
if(!$result['success']) {
return respondUnprocessable($result['message']);
}
return respondSuccess($result['message']);
}
}
校验模块
登入时,可能需要校验手机号和验证码。所以需要在 SmsCodeUtil.php 中添加验证码校验功能。这里官方 Github 上已经给出了代码,稍作修改即可。
public function validateSmsCode()
{
//验证数据
$validator = Validator::make(inputAll(), [
'phone_number' => 'required|confirm_mobile_not_change|confirm_rule:mobile_required',
'sms_code' => 'required|verify_code',
]);
if ($validator->fails()) {
//验证失败后建议清空存储的发送状态,防止用户重复试错
SmsManager::forgetState();
respondUnprocessable(formatValidationErrors($validator));
}
}
public function validateSmsCode()
{
//验证数据
$validator = Validator::make(inputAll(), [
'phone_number' => 'required|confirm_mobile_not_change|confirm_rule:mobile_required',
'sms_code' => 'required|verify_code',
]);
if ($validator->fails()) {
//验证失败后建议清空存储的发送状态,防止用户重复试错
SmsManager::forgetState();
respondUnprocessable(formatValidationErrors($validator));
}
}
功能测试
接下来配置路由和控制器,测试下功能是否正常。
可以同时打开 host-domain/laravel-sms/info
查看验证码短信发送和校验状态。
若启用了数据库日志,可以在 laravel_sms 表中查看短信发送结果的详细信息。
先在 api.php 中添加:
$api->post('/auth/send-sms-code', 'Auth\LoginController@sendSmsCode');
$api->post('/auth/validate-sms-code', 'Auth\LoginController@validateSmsCode');
$api->post('/auth/send-sms-code', 'Auth\LoginController@sendSmsCode');
$api->post('/auth/validate-sms-code', 'Auth\LoginController@validateSmsCode');
再在 LoginController.php 中添加:
use App\Utils\SmsCodeUtil;
class LoginController extends Controller {
use SmsCodeUtil;
...
}
use App\Utils\SmsCodeUtil;
class LoginController extends Controller {
use SmsCodeUtil;
...
}
然后使用 Postman 或其他类似工具测试 Api 功能。
发送验证码
POST 服务器地址/api/auth/send-sms-code
{
"phone_number": "手机号"
}
POST 服务器地址/api/auth/send-sms-code
{
"phone_number": "手机号"
}
若通过验证并发送成功,则会返回:
{
"message": "短信验证码发送成功,请注意查收",
"status_code": 200
}
{
"message": "短信验证码发送成功,请注意查收",
"status_code": 200
}
同时填写的手机号接受到验证码。
若验证失败或发送失败,则会返回对应的错误信息。
校验验证码
POST 服务器地址/api/auth/validate-sms-code
{
"phone_number": "手机号",
"sms_code": "验证码"
}
POST 服务器地址/api/auth/validate-sms-code
{
"phone_number": "手机号",
"sms_code": "验证码"
}
若通过验证,则无返回。
若验证失败,则会返回对应的错误信息。
本地化提示信息语言
在 laravel-sms.php 中提供了部分提示信息的自定义。想要将剩余部分的提示信息转换为本地语言,需要另行处理。
首先确保 config/app.php 中的语言设置正确。这里设置为 zh_cn。
'locale' => 'zh_cn',
'locale' => 'zh_cn',
然后在 resources\lang\zh_cn 文件夹下新建 validation.php,并填入本地化信息:
return [
'required' => '缺少:attribute参数',
'zh_mobile' => '非标准的中国大陆手机号',
'confirm_mobile_not_change' => '提交的手机号已变更',
'verify_code' => '验证码不合法或无效',
'attributes' => [
'phone_number' => '手机号',
'sms_code' => '验证码',
],
];
return [
'required' => '缺少:attribute参数',
'zh_mobile' => '非标准的中国大陆手机号',
'confirm_mobile_not_change' => '提交的手机号已变更',
'verify_code' => '验证码不合法或无效',
'attributes' => [
'phone_number' => '手机号',
'sms_code' => '验证码',
],
];
重新 POST 相关地址,可以看到对应的提示信息语言已经本地化。
总结
以上所述是小编给大家介绍的使用 laravel-sms 构建短信验证码发送校验模块网站的支持!
来源:http://blog.qiji.tech/archives/16318?utm_source=tuicool&utm_medium=referral
猜你喜欢
- 安装PandasPandas是构建在Python编程语言之上的一个快速、强大、灵活且易于使用的开源数据分析和操作工具。Pandas是基于Nu
- 前言离过年还有十多天,在这里提前祝各位小伙伴新年快乐呀~先说句题外话:疫情还是比较严峻,各位小伙伴要是出门的话一定要做好防护措施呀,不出门的
- Oracle游标分为显示游标和隐式游标。 显示游标(Explicit Cursor):在PL/SQL程序中定义的、用于查询的游标称作显示游标
- 本文实例讲述了Python实现获取邮箱内容并解析的方法。分享给大家供大家参考,具体如下:# -*- coding: utf-8 -*-fro
- 作为一款「写作软件」在诞生之初就支持了 Markdown,Markdown 是一种「电子邮件」风格的「标记语言」,我们强烈推荐所有写作者学习
- 1、引言小 * 丝:鱼哥,这个周末过得咋样小鱼:酸爽~ ~小 * 丝:额~~ 我能想到的,是这样吗?小鱼:有多远你走多远。小 * 丝:唉,鱼哥,你别说,
- 多线程:在同一个时间做多件事守护线程:如果在程序中将子线程设置为守护线程,则该子线程会在主线程结束时自动退出,设置方式为thread.set
- 因为项目需要数据验证,看bootstrapValidator 还不错,就上手一直,完美兼容,话不多说。bootstrap:能够增加兼容性的强
- 01.简介当我们使用的鱼眼镜头视角大于160°时,OpenCV中用于校准镜头“经典”方法的效果可能就不是和理想了。即使我们仔细遵循OpenC
- 引言:Python中的变量在使用中很流畅,可以不关注类型,任意赋值,对于开发来说效率得到了提升,但若不了解其中的机理,往往也会犯一些小错,让
- pip install xmind 使用場景xmind8 可以打开xmind2020 报错main_fest.xml(xmind8 打开另存
- Pytorch 多分类模型绘制 ROC, PR 曲线(代码 亲测 可用)ROC曲线示例代码import torchimport torch.
- 目录一、Python GUI 编程简介二、流行GUI框架总结三、代码演示四、界面一、Python GUI 编程简介Tkinter 模块(Tk
- (1)方法一、直接用a标签的href+数据库中文件地址,即可下载。缺点:word excel是直接弹框下载,对于image txt 等文件的
- 字符串格式化输出是python非常重要的基础语法,今天就把三种格式化输出做一个简单的总结,希望对大家有帮助。格式化输出:内容按照一定格式要求
- 一、制作思路由于注册的时候常常会用到注册码来防止机器恶意注册,这里我发表一个产生png图片验证码的基本图像,简单的思路分析:1、产生一张pn
- 触发器是一种特殊的存储过程,触发器主要是通过事件进行触发而被自动调用执行,而存储过程必须通过存储过程的名称被调用。一、触发器的定义触发器是在
- 如下所示:import ioimport torchimport torch.onnxfrom models.C3AEModel impor
- 今天也碰到了el表达式无法解析的事情,于是在网上查询了下,大多说是因为web.xml中声明的版本问题于是收集了如下版本:web-app_2_
- 问题最近在工作中遇到一个问题,在安装python软件包的时候,经常会遇类似这样一个问题。比如对于ipython,机子本身安装的版本是1.2.