使用 laravel sms 构建短信验证码发送校验功能

laravel 实现短信验证码功能搜索资料发现比较流行的有两个包:

一个是laravel sms 地址

一个是easy sms 地址

项目中需要实现一个发送和验证短信验证码的功能。以前的办法稍显繁琐。经高人指点,发现可以用 laravel-sms 这个包替代。且配置和使用简单易学。故有了这篇示例。

本例使用了以及

本例使用的短信服务商为

安装

在项目根目录下执行(推荐):

rush:PHP;"> composer require toplan/laravel-sms:~2.6 composer require toplan/laravel-sms:~2.6

也可以在 composer.json 的 require 字段中添加

rush:PHP;"> "toplan/laravel-sms": "2.6" "toplan/laravel-sms": "2.6"

然后在项目根目录下执行:

rush:PHP;"> composer update composer update

在 config/app.PHP 的 providers 数组中添加

rush:PHP;"> Toplan\PHPSms\PHPSmsServiceProvider::class,Toplan\Sms\SmsManagerServiceProvider::class,Toplan\PHPSms\PHPSmsServiceProvider::class,

并在 aliases 数组里添加

Toplan\PHPSms\Facades\Sms::class,'SmsManager' => Toplan\Sms\Facades\SmsManager::class,'PHPSms' => Toplan\PHPSms\Facades\Sms::class,

在项目根目录下执行:

rush:PHP;"> 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 数组中云片的代理器信息。

[ //用户唯一标识,必须 'apikey' => '在这里填写你的 APIKEY',],'YunPian' => [ //用户唯一标识,必须 'apikey' => '在这里填写你的 APIKEY',

设置 scheme 数组,配置均衡调度方案。

[ 'YunPian','scheme' => [ 'YunPian',

配置 laravel-sms.PHP

设置内置路由。

[ 'enable' => true,'prefix' => 'laravel-sms','middleware' => ['api'],'route' => [ 'enable' => true,

设置请求间隔,单位为秒。

60,'interval' => 60,

设置号码验证规则。

[ 'phone_number' => [ //需验证的字段 'isMobile' => true,//本字段是否为手机号 'enable' => true,//是否需要验证 'default' => 'mobile_required',//认的静态规则 'staticrules' => [ //全部静态规则 'mobile_required' => 'required|zh_mobile','validation' => [ 'phone_number' => [ //需验证的字段 'isMobile' => true,

设置验证码规则。

[ 'length' => 4,//验证码长度 'validMinutes' => 10,//验证码有效时间长度,单位为分钟 'repeatIfValid' => true,//验证码有效期内是否重复使用 'maxAttempts' => 0,//验证码最大尝试验证次数,0 或负数则不启用 ],'code' => [ 'length' => 4,

设置验证码内容短信。

function ($code,$minutes,$input) { return "您的验证码是:{$code} ({$minutes}分钟内有效,如非本人操作,请忽略)"; },'content' => function ($code,

如果有需要,可以开启数据库日志。需要提前运行 PHP artisan migrate 生成 laravel_sms 表。

'ture','dbLogs' => 'ture',

API 实现

在 app/Utils 下新建 SmsCodeUtil.PHP,并在里面实现验证码发送和校验功能。这样其他类可以随时调用,提高代码的复用性。

发送模块

发送前需要对手机号进行校验,包括

rush:PHP;"> validateSendable() :验证是否满足发送间隔 validateFields() :验证数据合法性

通过验证后,再使用 requestVerifySms() 发送验证码。

具体代码如下:

rush:PHP;"> 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 上已经给出了代码,稍作修改即可。

'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(),]);
if ($validator->fails()) {
//验证失败后建议清空存储的发送状态,防止用户重复试错
SmsManager::forgetState();
respondUnprocessable(formatValidationErrors($validator));
}
}

功能测试

接下来配置路由和控制器,测试下功能是否正常。

可以同时打开 host-domain/laravel-sms/info 查看验证码短信发送和校验状态。

若启用了数据库日志,可以在 laravel_sms 表中查看短信发送结果的详细信息。

先在 api.PHP添加

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@validateSmsCode');

再在 LoginController.PHP添加

rush:PHP;"> use App\Utils\SmsCodeUtil; class LoginController extends Controller { use SmsCodeUtil; ... } use App\Utils\SmsCodeUtil; class LoginController extends Controller { use SmsCodeUtil;

...
}

然后使用 Postman 或其他类似工具测试 Api 功能

发送验证码

rush:PHP;"> POST 服务器地址/api/auth/send-sms-code { "phone_number": "手机号" } POST 服务器地址/api/auth/send-sms-code { "phone_number": "手机号" }

若通过验证并发送成功,则会返回:

rush:PHP;"> { "message": "短信验证码发送成功,请注意查收","status_code": 200 } { "message": "短信验证码发送成功,请注意查收","status_code": 200 }

同时填写的手机号接受到验证码。

若验证失败或发送失败,则会返回对应的错误信息。

校验验证码

rush:PHP;"> 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。

'zh_cn','locale' => 'zh_cn',

然后在 resources\lang\zh_cn 文件夹下新建 validation.PHP,并填入本地化信息:

'缺少:attribute参数','zh_mobile' => '非标准的中国大陆手机号','confirm_mobile_not_change' => '提交的手机号已变更','verify_code' => '验证码不合法或无效','attributes' => [ 'phone_number' => '手机号','sms_code' => '验证码',]; return [ 'required' => '缺少:attribute参数',];

重新 POST 相关地址,可以看到对应的提示信息语言已经本地化。

总结

以上所述是小编给大家介绍的使用 laravel-sms 构建短信验证码发送校验模块,希望对大家有所帮助。程序员遇到问题都会上(编程之家jb51.cc)查找问题解答方法!如果觉得站点还不错,随手转发给程序员朋友一下!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


今天windows 之家小编给大家介绍下在windows 中使用laravel安装homestead的操作方法!安装及配置:安装使用Vagrant安装Homestead盒子安装 Homestead配置 Homestead设置 Provider配置共享文件夹配置 Nginx 站点Hosts文件启动 Vagrant Box可
我有一个网站,包括2个不同的登录表单,2个位置,一个在导航栏上,另一个是登录页面,将在系统捕获未登记的访问者时使用.我可以问一下我在LoginRequest.php中做错了什么,如果登录过程中出现任何类型的错误,我会设置一个重定向到自定义登录页面的条件?我的代码如下:<?phpnamespaceApp
这是我用于上传多个文件的控制器代码,我从GoogleChrome上的’postman’restAPI客户端传递密钥和值.我正在从邮递员添加多个文件,但只有1个文件正在上传.publicfunctionpost_files(){$allowedExts=array("gif","jpeg","jpg","png","txt","pdf","doc
1. 只需要在 config\app.php 文件中加入 faker_locale=>'zh_CN' ,可生成部分中文数据,如nameaddress 等 2. 时间生成,当月随机时间$faker->dateTimeThisMonth()3. 随机数rand(1,5)'id'=>$faker->randomElement(['1','2','3'])
我正在尝试运行迁移(见下文)并为数据库播种,但是当我运行时phpartisanmigrate--seed我收到此错误:Migrationtablecreatedsuccessfully.Migrated:2015_06_17_100000_create_users_tableMigrated:2015_06_17_200000_create_password_resets_tableMigrated:2015_06_1
我正在尝试获取所有模型的关联数组.我有以下型号:classArticleextendsEloquent{protected$guarded=array();publicstatic$rules=array();publicfunctionauthor(){return$this->belongsTo('Author');}publicfunctionc
我有一个包含以下表和关系的数据库:租房广告1-1Carm-1型号m-1品牌如果我想要检索广告,我可以简单地使用:Advert::find(1);如果我想要汽车的细节,我可以使用:Advert::find(1)->with('Car');但是,如果我还想要模型的细节(跟随与Car的关系),语法是什么,以下不起作用:Advert:
在5.3之前的Laravel项目中,我使用脚本标记使用了Vue.js,如下所示:<scripttype="text/javascript"src="../js/vue.js"></script>然后我会创建一个特定于该页面的Vue实例,如下所示:<script>newVue({el:'#app',data:{message:&#03
我似乎不明白为什么我们需要运行一个带有phpartisan服务的Laravel应用程序而不是用Apache或nginx运行它.我知道在开发过程中,我们使用artisan来启动站点,在部署到服务器之后,您使用Web服务器来加载站点.什么是首先在工匠中运行应用程序的用途?解决方法:serve命令只是PHPBuilt-in
我已经设置了以下Laravel命令:protectedfunctionschedule(Schedule$schedule){$schedule->command('command:daily-reset')->daily();$schedule->command('command:monthly-reset')->monthly();}然后,在我的服务器上,我已经设置了一个cron作业,
所以我向reviewsController@export发了一个小的ajax请求.现在当我在console.log()成功方法中的数据时,ajax响应显示正确的数据.但是我的CSV尚未下载.所以我拥有所有正确的信息并且基本上创建了csv.我认为这可能与设置标题有关吗?publicfunctionexport(){header("Conte
我之前没有遇到过这个问题,但是我的php工匠修补程序因发出任何命令而崩溃–并且没有留下任何导致崩溃的日志.project4$phpartisantinkerPsyShellv0.9.9(PHP7.3.0—cli)byJustinHileman>>>use\App\Jobs\testJob;project4$甚至是最简单的命令:project4$php
在进行laravel迁移时,我面临一些小小的不便.我使用Laravel5.1.由于存在许多具有许多关系的表,因此我可能无法重命名迁移文件,因此它们以正确的顺序运行,因此不会违反外键约束.这就是我过去做过的事情,而且非常不实用.我现在正在做的是定义每个迁移,如下所示:classCreateSomeTa
当我运行它输出:phpartisanserve--port=80Laraveldevelopmentserverstartedonhttp://localhost:80如何让它在后台运行,当我退出控制台时服务器停止.解决方法:简短的回答:不要Web服务器工匠使用的是PHP内置Web服务器,它不适用于除了开发之外的任何场景,如Built-inwebs
我仔细阅读并重新阅读了Vuedocs“ReactivityinDepth”以及vm.$set和Vue.set的API,但我仍然很难确定何时使用哪个.我能够区分这两者是很重要的,因为在我目前的Laravel项目中,我们动态地在对象上设置了很多属性.文档中的区别似乎是vm.$set为“ForVueinstance”的语言,而Vue.se
我一直试图从上传的文件中获取扩展名,在谷歌搜索,我没有得到任何结果.该文件已存在于路径中:\Storage::get('/uploads/categories/featured_image.jpg);现在,我如何获得上述文件的扩展名?使用输入字段我可以像这样获得扩展:Input::file('thumb')->getClientOriginalExtension(
我正在尝试使用信息https://github.comrk/predis连接到具有predis1.1和SSL的Redis,其中在示例中使用以下配置://Namedarrayofconnectionparameters:$client=newPredis\Client(['scheme'=>'tls','ssl'=>['cafile'=>'p
根据Laravel4documentation.作曲家是:Viewcomposersarecallbacksorclassmethodsthatarecalledwhenaviewisrendered.Ifyouhavedatathatyouwantboundtoagivenvieweachtimethatviewisrenderedthroughoutyourapplication,aviewcomposercan
是否可以手动注册用户(与工匠?)而不是通过身份验证注册页面?我只需要一些用户帐户,并想知道是否有办法创建这些帐户而无需设置注册控制器和视图.解决方法:我想你想一次性这样做,所以不需要像创造一个Artisan命令那样花哨的东西等等.我建议简单地使用phpartisantinker(很棒的工具!)
所以我的迁移文件夹看起来像这样,因为我有几十个表,它保持组织和清洁:migrations/create_user_table.phprelations/translations/我正在尝试刷新所有迁移和种子,但似乎我遇到了轻微的打嗝,我不知道artisan命令以递归方式运行迁移(即在关系和翻译文件夹中运行迁移).我