使用 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

标签:laravel,sms
0
投稿

猜你喜欢

  • PyQt5每天必学之切换按钮

    2023-06-14 09:07:06
  • 详解Linux下安装php环境并且配置Nginx支持php-fpm模块

    2023-11-11 02:02:50
  • 通用的下拉菜单__用DL\\DD\\DT解决无法遮住select的问题

    2008-07-28 13:28:00
  • Python遍历文件夹和读写文件的实现代码

    2023-07-28 12:13:10
  • 基于Python编写一个中秋节嫦娥投食小游戏

    2022-12-27 10:46:34
  • PHP的mysqli_rollback()函数讲解

    2023-06-12 08:58:03
  • Python网络爬虫实例讲解

    2023-09-11 23:18:10
  • 访问和更改关系数据,使用MSSQL外联接

    2024-01-18 06:39:33
  • python和pywin32实现窗口查找、遍历和点击的示例代码

    2023-04-06 19:01:23
  • python的列表生成式,生成器和generator对象你了解吗

    2022-05-15 15:10:04
  • javascript给span标签赋值的方法

    2023-09-05 21:28:53
  • 好的产品设计并非始于图片,而是对人的理解

    2009-08-02 20:25:00
  • sqlserver2005 安装图解教程以及SQL 2005 SP3补丁安装图文教程

    2024-01-15 12:05:13
  • Python常用工具之音频调整音量

    2023-10-29 03:15:33
  • 巧妙规划使用Oracle数据空间

    2009-03-20 11:51:00
  • SQL Server分页方法汇总

    2024-01-26 20:18:49
  • Mysql数据库备份和还原常用的命令

    2011-12-01 10:41:54
  • SQL附加数据库失败问题的解决方法

    2024-01-25 19:22:10
  • Go 语言入门之Go 计时器介绍

    2024-05-25 15:16:04
  • SELECT...INTO的具体用法

    2024-01-29 02:20:43
  • asp之家 网络编程 m.aspxhome.com