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 構建短信驗證碼發送校驗模塊,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!
新聞熱點
疑難解答
圖片精選