侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

Laravel  /  管理员 发布于 8年前   333

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.6composer require toplan/laravel-sms:~2.6 

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

"toplan/laravel-sms": "2.6""toplan/laravel-sms": "2.6" 

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

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

您可能感兴趣的文章:

  • Laravel使用swoole实现websocket主动消息推送的方法介绍
  • laravel框架使用阿里云短信发送消息操作示例
  • Laravel admin实现消息提醒、播放音频功能
  • Laravel Validator自定义错误返回提示消息并在前端展示
  • Laravel使用消息队列需要注意的一些问题
  • PHP的Laravel框架中使用消息队列queue及异步队列的方法
  • 在Laravel框架里实现发送邮件实例(邮箱验证)
  • Laravel框架实现发送短信验证功能代码
  • laravel5.4利用163邮箱发送邮件的步骤详解
  • laravel中短信发送验证码的实现方法
  • 用Laravel Sms实现laravel短信验证码的发送的实现
  • laravel框架使用极光推送消息操作示例


  • 上一条:
    Laravel中服务提供者和门面模式的入门介绍
    下一条:
    Laravel实现数据库迁移与支持中文的填充
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • Laravel 11.14版本发布 - 新的字符串助手和ServeCommand改进(0个评论)
    • Laravel 11.12版本发布 - Artisan的`make`命令自动剪切`.php `扩展(0个评论)
    • Laravel的轻量型购物车扩展包:binafy/laravel-cart(0个评论)
    • Laravel 11.11版本发布 - 查看模型中的第三方关系:show(0个评论)
    • 近期文章
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-07
    • 2017-08
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2020-10
    • 2020-11
    • 2021-01
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-04
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    • 2024-05
    • 2024-06
    • 2024-07
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客