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


Posted in PHP onNovember 06, 2017

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 构建短信验证码发送校验模块,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
用PHP实现将GB编码转换为UTF8
Nov 25 PHP
php cout<<的一点看法
Jan 24 PHP
解析将多维数组转换为支持curl提交的一维数组格式
Jul 08 PHP
Laravel 4 初级教程之Pages、表单验证
Oct 30 PHP
php文件操作之小型留言本实例
Jun 20 PHP
PHP实现登录注册之BootStrap表单功能
Sep 03 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
Feb 06 PHP
php格式文件打开的四种方法
Feb 24 PHP
PHP多维数组指定多字段排序的示例代码
May 16 PHP
PHP基于pdo的数据库操作类【可支持mysql、sqlserver及oracle】
May 21 PHP
PHP给前端返回一个JSON对象的实例讲解
May 31 PHP
PHP写API输出的时用echo的原因详解
Apr 28 PHP
PHP中危险的file_put_contents函数详解
Nov 04 #PHP
PHP回调函数概念与用法实例分析
Nov 03 #PHP
PHP实现字符串翻转功能的方法【递归与循环算法】
Nov 03 #PHP
PHP空值检测函数与方法汇总
Nov 19 #PHP
使用PHPStorm+XDebug搭建单步调试环境
Nov 19 #PHP
php利用云片网实现短信验证码功能的示例代码
Nov 18 #PHP
swoole和websocket简单聊天室开发
Nov 18 #PHP
You might like
JavaScript 编程引入命名空间的方法与代码
2007/08/13 Javascript
javascript 兼容FF的onmouseenter和onmouseleave的代码
2008/07/19 Javascript
锋利的jQuery 要点归纳(二) jQuery中的DOM操作(下)
2010/03/23 Javascript
基于jquery的自定义鼠标提示效果 jquery.toolTip
2010/11/14 Javascript
实现只能输入数字的input不用replace方法
2013/09/12 Javascript
jquery ajax跨域解决方法(json方式)
2014/02/04 Javascript
javascript实现Table排序的方法
2015/05/15 Javascript
jQuery实现的网格线绘制方法
2016/06/20 Javascript
基于WebUploader的文件上传js插件
2016/08/19 Javascript
原生JS实现首页进度加载动画
2016/09/14 Javascript
Js获取当前日期时间及格式化代码
2016/09/17 Javascript
vue父子组件的数据传递示例
2017/03/07 Javascript
使用ngrok+express解决本地环境中微信接口调试问题
2018/02/26 Javascript
vue.js自定义组件directives的实例代码
2018/11/09 Javascript
通过cordova将vue项目打包为webapp的方法
2019/02/02 Javascript
JS使用栈判断给定字符串是否是回文算法示例
2019/03/04 Javascript
javascript实现日历效果
2019/06/17 Javascript
vue+elementUI 复杂表单的验证、数据提交方案问题
2019/06/24 Javascript
解决layer弹出层的内容页点击按钮跳转到新的页面问题
2019/09/14 Javascript
解决ant-design-vue中menu菜单无法默认展开的问题
2020/10/31 Javascript
[00:30]塑造者的传承礼包-戴泽“暗影之焰”套装展示视频
2014/04/04 DOTA
Python类方法__init__和__del__构造、析构过程分析
2015/03/06 Python
学习python 之编写简单乘法运算题
2016/02/27 Python
十个Python练手的实战项目,学会这些Python就基本没问题了(推荐)
2019/04/26 Python
Python Numpy 自然数填充数组的实现
2019/11/28 Python
AmazeUI中模态框的实现
2020/08/19 HTML / CSS
澳大利亚潮流尖端的快时尚品牌:Cotton On
2016/09/26 全球购物
KIKO MILANO俄罗斯官网:意大利领先的化妆品和护肤品品牌
2021/01/09 全球购物
新闻专业毕业生英文求职信
2014/03/19 职场文书
社团活动总结怎么写
2014/06/30 职场文书
2014年大学生职业规划书:未来不是梦,只要勇敢冲!
2014/09/22 职场文书
离婚协议书范本(通用篇)
2014/11/30 职场文书
大学三好学生主要事迹范文
2015/11/03 职场文书
2016年幼儿园万圣节活动总结
2016/04/05 职场文书
十个Python自动化常用操作,即拿即用
2021/05/10 Python
Java面试题冲刺第十五天--设计模式
2021/08/07 面试题