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

來源:互聯網
上載者:User
本文通過範例程式碼給大家介紹了使用 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.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 相關地址,可以看到對應的提示資訊語言已經本地化。

以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.