首頁  >  文章  >  後端開發  >  使用laravel sms 建立簡訊驗證碼發送校驗的功能

使用laravel sms 建立簡訊驗證碼發送校驗的功能

不言
不言原創
2018-06-13 14:22:172181瀏覽

本文透過範例程式碼向大家介紹了使用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 中可以設定驗證碼的傳送與驗證方案。

同時會複製 2015_12_21_111514_create_sms_table.php 檔案到 database\migrations。用於產生 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 相关地址,可以看到对应的提示信息语言已经本地化。

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

关于Laravel中重写资源路由自定义URL的实现方法

Laravel5.2使用Captcha生成验证码实现登录的方法

通过 Laravel “规范” 的开发短信验证码发送功能

以上是使用laravel sms 建立簡訊驗證碼發送校驗的功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn