使用 laravel sms 构建短信验证码发送校验功能
发布:smiling 来源: PHP粉丝网 添加日期:2021-08-18 11:21:00 浏览: 评论:0
本文通过示例代码给大家介绍了使用 laravel-sms 构建短信验证码发送校验模块,非常不错,具有参考借鉴价值,需要的朋友可以参考下。
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 相关地址,可以看到对应的提示信息语言已经本地化。
Tags: laravel sms php短信验证码
相关文章
- ·搭建php Laravel框架教程详解(2017-03-23)
- ·Laravel执行migrate操作提示”Class not found”怎么解决(2017-03-23)
- ·Laravel 集成 Geetest验证码的方法(2018-06-11)
- ·laravel5.2实现区分前后台用户登录的方法(2018-06-19)
- ·Laravel怎么实现表单提交(2018-08-03)
- ·深入解析PHP的Laravel框架中的event事件操作(2019-11-14)
- ·如何在Laravel中重命名数据库表(2019-12-31)
- ·如何设置Laravel Composer Bin目录路径(2019-12-31)
- ·如何使用hash check来检查当前密码?(Laravel 5.3中)(2020-02-07)
- ·PHP开发框架Laravel数据库操作方法总结(2021-04-10)
- ·详解PHP的Laravel框架中Eloquent对象关系映射使用(2021-07-12)
- ·三个思路解决laravel上传文件报错:413 Request Entity Too Large问题(2021-08-19)
- ·利用Homestead快速运行一个Laravel项目的方法详解(2021-08-19)
- ·Laravel核心解读之异常处理的实践过程(2021-11-10)
- ·解决在Laravel 中处理OPTIONS请求的问题(2022-01-01)
- ·php 调用百度sms来发送短信的实现示例(2021-11-01)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)