当前位置:首页 > PHP教程 > php应用 > 列表

使用 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 数组里添加:

  1. 'PhpSms' => Toplan\PhpSms\Facades\Sms::class
  2. 'SmsManager' => Toplan\Sms\Facades\SmsManager::class
  3. 'PhpSms' => Toplan\PhpSms\Facades\Sms::class
  4. 'SmsManager' => Toplan\Sms\Facades\SmsManager::class

在项目根目录下执行:

  1. php artisan vendor:publish --provider="Toplan\PhpSms\PhpSmsServiceProvider" 
  2. php artisan vendor:publish --provider="Toplan\Sms\SmsManagerServiceProvider" 
  3. php artisan vendor:publish --provider="Toplan\PhpSms\PhpSmsServiceProvider" 
  4. 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 数组中云片的代理器信息。

  1. 'YunPian' => [ 
  2.  //用户唯一标识,必须 
  3.  'apikey' => '在这里填写你的 APIKEY'
  4. ], 
  5. 'YunPian' => [ 
  6.  //用户唯一标识,必须 
  7.  'apikey' => '在这里填写你的 APIKEY'
  8. ], 

设置 scheme 数组,配置均衡调度方案。

  1. 'scheme' => [ 
  2.  'YunPian'
  3. ], 
  4. 'scheme' => [ 
  5.  'YunPian'
  6. ], 

配置 laravel-sms.php

设置内置路由。

  1. 'route' => [ 
  2.  'enable'  => true, 
  3.  'prefix'  => 'laravel-sms',  
  4.  'middleware' => ['api'], 
  5. ], 
  6. 'route' => [ 
  7.  'enable'  => true, 
  8.  'prefix'  => 'laravel-sms',  
  9.  'middleware' => ['api'], 
  10. ], 

设置请求间隔,单位为秒。

'interval' => 60,

'interval' => 60,

设置号码验证规则。

  1. 'validation' => [ 
  2.  'phone_number' => [ //需验证的字段 
  3.  'isMobile' => true, //本字段是否为手机号 
  4.  'enable'  => true, //是否需要验证 
  5.  'default'  => 'mobile_required'//默认的静态规则 
  6.  'staticRules' => [ //全部静态规则 
  7.   'mobile_required'  => 'required|zh_mobile'
  8.  ], 
  9.  ], 
  10. ], 
  11. 'validation' => [ 
  12.  'phone_number' => [ //需验证的字段 
  13.  'isMobile' => true, //本字段是否为手机号 
  14.  'enable'  => true, //是否需要验证 
  15.  'default'  => 'mobile_required'//默认的静态规则 
  16.  'staticRules' => [ //全部静态规则 
  17.   'mobile_required'  => 'required|zh_mobile'
  18.  ], 
  19.  ], 
  20. ], 

设置验证码规则。

  1. 'code' => [ 
  2.  'length'  => 4, //验证码长度 
  3.  'validMinutes' => 10, //验证码有效时间长度,单位为分钟 
  4.  'repeatIfValid' => true, //验证码有效期内是否重复使用 
  5.  'maxAttempts' => 0, //验证码最大尝试验证次数,0 或负数则不启用 
  6. ], 
  7. 'code' => [ 
  8.  'length'  => 4, //验证码长度 
  9.  'validMinutes' => 10, //验证码有效时间长度,单位为分钟 
  10.  'repeatIfValid' => true, //验证码有效期内是否重复使用 
  11.  'maxAttempts' => 0, //验证码最大尝试验证次数,0 或负数则不启用 
  12. ], 

设置验证码内容短信。

  1. 'content' => function ($code$minutes$input) { 
  2.  return "您的验证码是:{$code} ({$minutes}分钟内有效,如非本人操作,请忽略)"
  3. }, 
  4. 'content' => function ($code$minutes$input) { 
  5.  return "您的验证码是:{$code} ({$minutes}分钟内有效,如非本人操作,请忽略)"
  6. }, 

如果有需要,可以开启数据库日志,需要提前运行 php artisan migrate 生成 laravel_sms 表。

'dbLogs' => 'ture',

'dbLogs' => 'ture',

API 实现

在 app/Utils 下新建 SmsCodeUtil.php,并在里面实现验证码发送和校验功能。这样其他类可以随时调用,提高代码的复用性。

发送模块

发送前需要对手机号进行校验,包括:

validateSendable() :验证是否满足发送间隔

validateFields() :验证数据合法性

通过验证后,再使用 requestVerifySms() 发送验证码。

具体代码如下:

  1. use SmsManager; 
  2. trait SmsCodeUtil { 
  3.  public function sendSmsCode() 
  4.  { 
  5.  $result = SmsManager::validateSendable(); 
  6.  if(!$result['success']) { 
  7.   return respondUnprocessable($result['message']); 
  8.  } 
  9.  $result = SmsManager::validateFields(); 
  10.  if(!$result['success']) { 
  11.   return respondUnprocessable($result['message']); 
  12.  } 
  13.  $result = SmsManager::requestVerifySms(); 
  14.  if(!$result['success']) { 
  15.   return respondUnprocessable($result['message']); 
  16.  } 
  17.  return respondSuccess($result['message']); 
  18.  } 
  19.  
  20. use SmsManager; 
  21. trait SmsCodeUtil { 
  22.  public function sendSmsCode() 
  23.  { 
  24.  $result = SmsManager::validateSendable(); 
  25.  if(!$result['success']) { 
  26.   return respondUnprocessable($result['message']); 
  27.  } 
  28.  $result = SmsManager::validateFields(); 
  29.  if(!$result['success']) { 
  30.   return respondUnprocessable($result['message']); 
  31.  } 
  32.  $result = SmsManager::requestVerifySms(); 
  33.  if(!$result['success']) { 
  34.   return respondUnprocessable($result['message']); 
  35.  } 
  36.  return respondSuccess($result['message']); 
  37.  } 

校验模块

登入时,可能需要校验手机号和验证码。所以需要在 SmsCodeUtil.php 中添加验证码校验功能。这里官方 Github 上已经给出了代码,稍作修改即可。

  1. public function validateSmsCode() 
  2.  //验证数据 
  3.  $validator = Validator::make(inputAll(), [ 
  4.  'phone_number' => 'required|confirm_mobile_not_change|confirm_rule:mobile_required'
  5.  'sms_code'  => 'required|verify_code'
  6.  ]); 
  7.  
  8.  if ($validator->fails()) { 
  9.  //验证失败后建议清空存储的发送状态,防止用户重复试错 
  10.  SmsManager::forgetState(); 
  11.  respondUnprocessable(formatValidationErrors($validator)); 
  12.  } 
  13. public function validateSmsCode() 
  14.  //验证数据 
  15.  $validator = Validator::make(inputAll(), [ 
  16.  'phone_number' => 'required|confirm_mobile_not_change|confirm_rule:mobile_required'
  17.  'sms_code'  => 'required|verify_code'
  18.  ]); 
  19.  if ($validator->fails()) { 
  20.  //验证失败后建议清空存储的发送状态,防止用户重复试错 
  21.  SmsManager::forgetState(); 
  22.  respondUnprocessable(formatValidationErrors($validator)); 
  23.  } 

功能测试

接下来配置路由和控制器,测试下功能是否正常。

可以同时打开 host-domain/laravel-sms/info 查看验证码短信发送和校验状态。

若启用了数据库日志,可以在 laravel_sms 表中查看短信发送结果的详细信息。

先在 api.php 中添加:

  1. $api->post('/auth/send-sms-code''Auth\LoginController@sendSmsCode'); 
  2. $api->post('/auth/validate-sms-code''Auth\LoginController@validateSmsCode'); 
  3. $api->post('/auth/send-sms-code''Auth\LoginController@sendSmsCode'); 
  4. $api->post('/auth/validate-sms-code''Auth\LoginController@validateSmsCode'); 

再在 LoginController.php 中添加:

  1. use App\Utils\SmsCodeUtil; 
  2. class LoginController extends Controller { 
  3.  use SmsCodeUtil; 
  4.  ... 
  5. use App\Utils\SmsCodeUtil; 
  6. class LoginController extends Controller { 
  7.  use SmsCodeUtil; 
  8.    
  9.  ... 

然后使用 Postman 或其他类似工具测试 Api 功能。

发送验证码

  1. POST 服务器地址/api/auth/send-sms-code 
  2.   "phone_number""手机号" 
  3. POST 服务器地址/api/auth/send-sms-code 
  4.   "phone_number""手机号" 

若通过验证并发送成功,则会返回:

  1.   "message""短信验证码发送成功,请注意查收"
  2.   "status_code": 200 
  3.   "message""短信验证码发送成功,请注意查收"
  4.   "status_code": 200 

同时填写的手机号接受到验证码。

若验证失败或发送失败,则会返回对应的错误信息。

校验验证码

POST 服务器地址/api/auth/validate-sms-code

  1.   "phone_number""手机号"
  2.   "sms_code""验证码" 

POST 服务器地址/api/auth/validate-sms-code

  1.   "phone_number""手机号"
  2.   "sms_code""验证码" 

若通过验证,则无返回。

若验证失败,则会返回对应的错误信息。

本地化提示信息语言

在 laravel-sms.php 中提供了部分提示信息的自定义,想要将剩余部分的提示信息转换为本地语言,需要另行处理。

首先确保 config/app.php 中的语言设置正确,这里设置为 zh_cn。

'locale' => 'zh_cn',

'locale' => 'zh_cn',

然后在 resources\lang\zh_cn 文件夹下新建 validation.php,并填入本地化信息:

  1. return [ 
  2.  'required' => '缺少:attribute参数'
  3.  'zh_mobile'         => '非标准的中国大陆手机号'
  4.  'confirm_mobile_not_change' => '提交的手机号已变更'
  5.  'verify_code'        => '验证码不合法或无效'
  6.  'attributes' => [ 
  7.   'phone_number' => '手机号'
  8.   'sms_code'  => '验证码'
  9.  ], 
  10. ]; 
  11. return [ 
  12.  'required' => '缺少:attribute参数'
  13.  'zh_mobile'         => '非标准的中国大陆手机号'
  14.  'confirm_mobile_not_change' => '提交的手机号已变更'
  15.  'verify_code'        => '验证码不合法或无效'
  16.  'attributes' => [ 
  17.   'phone_number' => '手机号'
  18.   'sms_code'  => '验证码'
  19.  ], 
  20. ]; 

重新 POST 相关地址,可以看到对应的提示信息语言已经本地化。

Tags: laravel sms php短信验证码

分享到: