使用 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 举报,一经查实,本站将立刻删除。

相关推荐


laravel的dd函数不生效怎么办
看不懂laravel文档咋办
安装laravel框架出现command怎么办
Laravel开发API怎么使用事务
laravel怎么构建复杂查询条件
laravel如何实现防止被下载
为什么laravel比yii火
一些常见的Laravel定时任务不运行的问题
laravel用路由有什么好处
composer无法安装laravel怎么办
laravel现在还用吗
laravel怎么替换主键id
laravel的appurl有什么用
如何修改Laravel的报错输出形式
laravel怎么避免foreach查表
laravel怎样操作数据库
laravel怎么截取字符串
laravel 是国内的吗
laravel怎么设置请求头
浅析Laravel社区Redis组件报错的问题和解决方法