使用 laravel sms 構(gòu)建短信驗(yàn)證碼發(fā)送校驗(yàn)功能
laravel 實(shí)現(xiàn)短信驗(yàn)證碼功能,搜索資料發(fā)現(xiàn)比較流行的有兩個(gè)包:
一個(gè)是laravel sms 地址 https://github.com/toplan/laravel-sms
一個(gè)是easy sms 地址https://github.com/overtrue/easy-sms,
項(xiàng)目中需要實(shí)現(xiàn)一個(gè)發(fā)送和驗(yàn)證短信驗(yàn)證碼的功能。以前的辦法稍顯繁瑣。經(jīng)高人指點(diǎn),發(fā)現(xiàn)可以用 laravel-sms 這個(gè)包替代。且配置和使用簡單易學(xué)。故有了這篇示例。
本例使用了Laravel 5.5、 Api Starter Kit 以及 Laravel Sms 2.6。
本例使用的短信服務(wù)商為云片。
安裝
在項(xiàng)目根目錄下執(zhí)行(推薦):
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"
然后在項(xiàng)目根目錄下執(zhí)行:
composer update composer update
在 config/app.php 的 providers 數(shù)組中添加:
Toplan\PhpSms\PhpSmsServiceProvider::class, Toplan\Sms\SmsManagerServiceProvider::class, Toplan\PhpSms\PhpSmsServiceProvider::class, Toplan\Sms\SmsManagerServiceProvider::class,
并在 aliases 數(shù)組里添加:
'PhpSms' => Toplan\PhpSms\Facades\Sms::class, 'SmsManager' => Toplan\Sms\Facades\SmsManager::class, 'PhpSms' => Toplan\PhpSms\Facades\Sms::class, 'SmsManager' => Toplan\Sms\Facades\SmsManager::class,
在項(xiàng)目根目錄下執(zhí)行:
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 文件夾中生成兩個(gè)配置文件:phpsms.php 和 laravel-sms.php。
在 phpsms.php 中可以配置代理器信息及均衡調(diào)度方案。
在 laravel-sms.php 中可以配置驗(yàn)證碼的發(fā)送與驗(yàn)證方案。
同時(shí)會向 database\migrations 中復(fù)制 2015_12_21_111514_create_sms_table.php 文件。用于生成 laravel_sms 表。
配置
這里僅以云片為例。
配置 phpsms.php
設(shè)置 phpsms.php 中 agnets 數(shù)組中云片的代理器信息。
'YunPian' => [ //用戶唯一標(biāo)識,必須 'apikey' => '在這里填寫你的 APIKEY', ], 'YunPian' => [ //用戶唯一標(biāo)識,必須 'apikey' => '在這里填寫你的 APIKEY', ],
設(shè)置 scheme 數(shù)組,配置均衡調(diào)度方案。
'scheme' => [ 'YunPian', ], 'scheme' => [ 'YunPian', ],
配置 laravel-sms.php
設(shè)置內(nèi)置路由。
'route' => [ 'enable' => true, 'prefix' => 'laravel-sms', 'middleware' => ['api'], ], 'route' => [ 'enable' => true, 'prefix' => 'laravel-sms', 'middleware' => ['api'], ],
設(shè)置請求間隔,單位為秒。
'interval' => 60, 'interval' => 60,
設(shè)置號碼驗(yàn)證規(guī)則。
'validation' => [ 'phone_number' => [ //需驗(yàn)證的字段 'isMobile' => true, //本字段是否為手機(jī)號 'enable' => true, //是否需要驗(yàn)證 'default' => 'mobile_required', //默認(rèn)的靜態(tài)規(guī)則 'staticRules' => [ //全部靜態(tài)規(guī)則 'mobile_required' => 'required|zh_mobile', ], ], ], 'validation' => [ 'phone_number' => [ //需驗(yàn)證的字段 'isMobile' => true, //本字段是否為手機(jī)號 'enable' => true, //是否需要驗(yàn)證 'default' => 'mobile_required', //默認(rèn)的靜態(tài)規(guī)則 'staticRules' => [ //全部靜態(tài)規(guī)則 'mobile_required' => 'required|zh_mobile', ], ], ],
設(shè)置驗(yàn)證碼規(guī)則。
'code' => [ 'length' => 4, //驗(yàn)證碼長度 'validMinutes' => 10, //驗(yàn)證碼有效時(shí)間長度,單位為分鐘 'repeatIfValid' => true, //驗(yàn)證碼有效期內(nèi)是否重復(fù)使用 'maxAttempts' => 0, //驗(yàn)證碼最大嘗試驗(yàn)證次數(shù),0 或負(fù)數(shù)則不啟用 ], 'code' => [ 'length' => 4, //驗(yàn)證碼長度 'validMinutes' => 10, //驗(yàn)證碼有效時(shí)間長度,單位為分鐘 'repeatIfValid' => true, //驗(yàn)證碼有效期內(nèi)是否重復(fù)使用 'maxAttempts' => 0, //驗(yàn)證碼最大嘗試驗(yàn)證次數(shù),0 或負(fù)數(shù)則不啟用 ],
設(shè)置驗(yàn)證碼內(nèi)容短信。
'content' => function ($code, $minutes, $input) { return "您的驗(yàn)證碼是:{$code} ({$minutes}分鐘內(nèi)有效,如非本人操作,請忽略)"; }, 'content' => function ($code, $minutes, $input) { return "您的驗(yàn)證碼是:{$code} ({$minutes}分鐘內(nèi)有效,如非本人操作,請忽略)"; },
如果有需要,可以開啟數(shù)據(jù)庫日志。需要提前運(yùn)行 php artisan migrate 生成 laravel_sms 表。
'dbLogs' => 'ture', 'dbLogs' => 'ture',
API 實(shí)現(xiàn)
在 app/Utils 下新建 SmsCodeUtil.php,并在里面實(shí)現(xiàn)驗(yàn)證碼發(fā)送和校驗(yàn)功能。這樣其他類可以隨時(shí)調(diào)用,提高代碼的復(fù)用性。
發(fā)送模塊
發(fā)送前需要對手機(jī)號進(jìn)行校驗(yàn),包括:
validateSendable() :驗(yàn)證是否滿足發(fā)送間隔 validateFields() :驗(yàn)證數(shù)據(jù)合法性
通過驗(yàn)證后,再使用 requestVerifySms() 發(fā)送驗(yàn)證碼。
具體代碼如下:
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']); } }
校驗(yàn)?zāi)K
登入時(shí),可能需要校驗(yàn)手機(jī)號和驗(yàn)證碼。所以需要在 SmsCodeUtil.php 中添加驗(yàn)證碼校驗(yàn)功能。這里官方 Github 上已經(jīng)給出了代碼,稍作修改即可。
public function validateSmsCode() { //驗(yàn)證數(shù)據(jù) $validator = Validator::make(inputAll(), [ 'phone_number' => 'required|confirm_mobile_not_change|confirm_rule:mobile_required', 'sms_code' => 'required|verify_code', ]); if ($validator->fails()) { //驗(yàn)證失敗后建議清空存儲的發(fā)送狀態(tài),防止用戶重復(fù)試錯(cuò) SmsManager::forgetState(); respondUnprocessable(formatValidationErrors($validator)); } } public function validateSmsCode() { //驗(yàn)證數(shù)據(jù) $validator = Validator::make(inputAll(), [ 'phone_number' => 'required|confirm_mobile_not_change|confirm_rule:mobile_required', 'sms_code' => 'required|verify_code', ]); if ($validator->fails()) { //驗(yàn)證失敗后建議清空存儲的發(fā)送狀態(tài),防止用戶重復(fù)試錯(cuò) SmsManager::forgetState(); respondUnprocessable(formatValidationErrors($validator)); } }
功能測試
接下來配置路由和控制器,測試下功能是否正常。
可以同時(shí)打開 host-domain/laravel-sms/info
查看驗(yàn)證碼短信發(fā)送和校驗(yàn)狀態(tài)。
若啟用了數(shù)據(jù)庫日志,可以在 laravel_sms 表中查看短信發(fā)送結(jié)果的詳細(xì)信息。
先在 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 功能。
發(fā)送驗(yàn)證碼
POST 服務(wù)器地址/api/auth/send-sms-code { "phone_number": "手機(jī)號" } POST 服務(wù)器地址/api/auth/send-sms-code { "phone_number": "手機(jī)號" }
若通過驗(yàn)證并發(fā)送成功,則會返回:
{ "message": "短信驗(yàn)證碼發(fā)送成功,請注意查收", "status_code": 200 } { "message": "短信驗(yàn)證碼發(fā)送成功,請注意查收", "status_code": 200 }
同時(shí)填寫的手機(jī)號接受到驗(yàn)證碼。
若驗(yàn)證失敗或發(fā)送失敗,則會返回對應(yīng)的錯(cuò)誤信息。
校驗(yàn)驗(yàn)證碼
POST 服務(wù)器地址/api/auth/validate-sms-code { "phone_number": "手機(jī)號", "sms_code": "驗(yàn)證碼" } POST 服務(wù)器地址/api/auth/validate-sms-code { "phone_number": "手機(jī)號", "sms_code": "驗(yàn)證碼" }
若通過驗(yàn)證,則無返回。
若驗(yàn)證失敗,則會返回對應(yīng)的錯(cuò)誤信息。
本地化提示信息語言
在 laravel-sms.php 中提供了部分提示信息的自定義。想要將剩余部分的提示信息轉(zhuǎn)換為本地語言,需要另行處理。
首先確保 config/app.php 中的語言設(shè)置正確。這里設(shè)置為 zh_cn。
'locale' => 'zh_cn', 'locale' => 'zh_cn',
然后在 resources\lang\zh_cn 文件夾下新建 validation.php,并填入本地化信息:
return [ 'required' => '缺少:attribute參數(shù)', 'zh_mobile' => '非標(biāo)準(zhǔn)的中國大陸手機(jī)號', 'confirm_mobile_not_change' => '提交的手機(jī)號已變更', 'verify_code' => '驗(yàn)證碼不合法或無效', 'attributes' => [ 'phone_number' => '手機(jī)號', 'sms_code' => '驗(yàn)證碼', ], ]; return [ 'required' => '缺少:attribute參數(shù)', 'zh_mobile' => '非標(biāo)準(zhǔn)的中國大陸手機(jī)號', 'confirm_mobile_not_change' => '提交的手機(jī)號已變更', 'verify_code' => '驗(yàn)證碼不合法或無效', 'attributes' => [ 'phone_number' => '手機(jī)號', 'sms_code' => '驗(yàn)證碼', ], ];
重新 POST 相關(guān)地址,可以看到對應(yīng)的提示信息語言已經(jīng)本地化。
總結(jié)
以上所述是小編給大家介紹的使用 laravel-sms 構(gòu)建短信驗(yàn)證碼發(fā)送校驗(yàn)?zāi)K,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Symfony2使用第三方庫Upload制作圖片上傳實(shí)例詳解
這篇文章主要介紹了Symfony2使用第三方庫Upload制作圖片上傳的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Symfony2使用第三方庫Upload的具體步驟與相關(guān)使用技巧,需要的朋友可以參考下2016-02-02微信公眾號實(shí)現(xiàn)會員卡領(lǐng)取功能
這篇文章主要介紹了微信公眾號實(shí)現(xiàn)會員卡領(lǐng)取功能的相關(guān)資料,需要的朋友可以參考下2017-06-06PHP中加速、緩存擴(kuò)展的區(qū)別和作用詳解(eAccelerator、memcached、xcache、APC )
這篇文章主要介紹了PHP中eAccelerator、memcached、xcache、APC 4個(gè)加速、緩存擴(kuò)展的區(qū)別的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07php通過GD庫實(shí)現(xiàn)驗(yàn)證碼功能
這篇文章主要介紹了php通過GD庫實(shí)現(xiàn)驗(yàn)證碼功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-07-07PHP全概率運(yùn)算函數(shù)(優(yōu)化版) Webgame開發(fā)必備
PHP全概率運(yùn)算函數(shù)(優(yōu)化版) Webgame開發(fā)必備,需要的朋友可以參考下。2011-07-07Laravel Eloquent ORM 實(shí)現(xiàn)查詢表中指定的字段
今天小編就為大家分享一篇Laravel Eloquent ORM 實(shí)現(xiàn)查詢表中指定的字段,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-10-10Laravel Reponse響應(yīng)客戶端示例詳解
這篇文章主要給大家介紹了關(guān)于Laravel Reponse響應(yīng)客戶端的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09