佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > 使用 laravel sms 構(gòu)建短信驗(yàn)證碼發(fā)送校驗(yàn)功能

使用 laravel sms 構(gòu)建短信驗(yàn)證碼發(fā)送校驗(yàn)功能

熱門標(biāo)簽:銀行業(yè)務(wù) 科大訊飛語(yǔ)音識(shí)別系統(tǒng) Mysql連接數(shù)設(shè)置 電子圍欄 Linux服務(wù)器 團(tuán)購(gòu)網(wǎng)站 服務(wù)器配置 阿里云

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è)包替代。且配置和使用簡(jiǎn)單易學(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" 

會(huì)在 config 文件夾中生成兩個(gè)配置文件:phpsms.php 和 laravel-sms.php。

在 phpsms.php 中可以配置代理器信息及均衡調(diào)度方案。

在 laravel-sms.php 中可以配置驗(yàn)證碼的發(fā)送與驗(yàn)證方案。

同時(shí)會(huì)向 database\migrations 中復(fù)制 2015_12_21_111514_create_sms_table.php 文件。用于生成 laravel_sms 表。

配置

這里僅以云片為例。

配置 phpsms.php

設(shè)置 phpsms.php 中 agnets 數(shù)組中云片的代理器信息。

'YunPian' => [
 //用戶唯一標(biāo)識(shí),必須
 'apikey' => '在這里填寫你的 APIKEY',
],
'YunPian' => [
 //用戶唯一標(biāo)識(shí),必須
 '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è)置請(qǐng)求間隔,單位為秒。

'interval' => 60,
'interval' => 60, 

設(shè)置號(hào)碼驗(yàn)證規(guī)則。

'validation' => [
 'phone_number' => [ //需驗(yàn)證的字段
 'isMobile' => true, //本字段是否為手機(jī)號(hào)
 '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ī)號(hào)
 '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)證碼長(zhǎng)度
 'validMinutes' => 10, //驗(yàn)證碼有效時(shí)間長(zhǎng)度,單位為分鐘
 'repeatIfValid' => true, //驗(yàn)證碼有效期內(nèi)是否重復(fù)使用
 'maxAttempts' => 0, //驗(yàn)證碼最大嘗試驗(yàn)證次數(shù),0 或負(fù)數(shù)則不啟用
],
'code' => [
 'length'  => 4, //驗(yàn)證碼長(zhǎng)度
 'validMinutes' => 10, //驗(yàn)證碼有效時(shí)間長(zhǎng)度,單位為分鐘
 '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)有效,如非本人操作,請(qǐng)忽略)";
},
'content' => function ($code, $minutes, $input) {
 return "您的驗(yàn)證碼是:{$code} ({$minutes}分鐘內(nèi)有效,如非本人操作,請(qǐng)忽略)";
},

如果有需要,可以開啟數(shù)據(jù)庫(kù)日志。需要提前運(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ā)送前需要對(duì)手機(jī)號(hào)進(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ī)號(hào)和驗(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)證失敗后建議清空存儲(chǔ)的發(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)證失敗后建議清空存儲(chǔ)的發(fā)送狀態(tài),防止用戶重復(fù)試錯(cuò)
 SmsManager::forgetState();
 respondUnprocessable(formatValidationErrors($validator));
 }
}

功能測(cè)試

接下來(lái)配置路由和控制器,測(cè)試下功能是否正常。

可以同時(shí)打開 host-domain/laravel-sms/info 查看驗(yàn)證碼短信發(fā)送和校驗(yàn)狀態(tài)。

若啟用了數(shù)據(jù)庫(kù)日志,可以在 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 或其他類似工具測(cè)試 Api 功能。

發(fā)送驗(yàn)證碼 

POST 服務(wù)器地址/api/auth/send-sms-code
{
  "phone_number": "手機(jī)號(hào)"
}
POST 服務(wù)器地址/api/auth/send-sms-code
{
  "phone_number": "手機(jī)號(hào)"
}

若通過驗(yàn)證并發(fā)送成功,則會(huì)返回:

{
  "message": "短信驗(yàn)證碼發(fā)送成功,請(qǐng)注意查收",
  "status_code": 200
}
{
  "message": "短信驗(yàn)證碼發(fā)送成功,請(qǐng)注意查收",
  "status_code": 200
}

同時(shí)填寫的手機(jī)號(hào)接受到驗(yàn)證碼。

若驗(yàn)證失敗或發(fā)送失敗,則會(huì)返回對(duì)應(yīng)的錯(cuò)誤信息。

校驗(yàn)驗(yàn)證碼

POST 服務(wù)器地址/api/auth/validate-sms-code
{
  "phone_number": "手機(jī)號(hào)",
  "sms_code": "驗(yàn)證碼"
}

POST 服務(wù)器地址/api/auth/validate-sms-code
{
  "phone_number": "手機(jī)號(hào)",
  "sms_code": "驗(yàn)證碼"
}

若通過驗(yàn)證,則無(wú)返回。

若驗(yàn)證失敗,則會(huì)返回對(duì)應(yīng)的錯(cuò)誤信息。

本地化提示信息語(yǔ)言

在 laravel-sms.php 中提供了部分提示信息的自定義。想要將剩余部分的提示信息轉(zhuǎn)換為本地語(yǔ)言,需要另行處理。

首先確保 config/app.php 中的語(yǔ)言設(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)的中國(guó)大陸手機(jī)號(hào)',
 'confirm_mobile_not_change' => '提交的手機(jī)號(hào)已變更',
 'verify_code'        => '驗(yàn)證碼不合法或無(wú)效',
 'attributes' => [
  'phone_number' => '手機(jī)號(hào)',
  'sms_code'  => '驗(yàn)證碼',
 ],
];
return [
 'required' => '缺少:attribute參數(shù)',
 'zh_mobile'         => '非標(biāo)準(zhǔn)的中國(guó)大陸手機(jī)號(hào)',
 'confirm_mobile_not_change' => '提交的手機(jī)號(hào)已變更',
 'verify_code'        => '驗(yàn)證碼不合法或無(wú)效',
 'attributes' => [
  'phone_number' => '手機(jī)號(hào)',
  'sms_code'  => '驗(yàn)證碼',
 ],
];

重新 POST 相關(guān)地址,可以看到對(duì)應(yīng)的提示信息語(yǔ)言已經(jīng)本地化。

總結(jié)

以上所述是小編給大家介紹的使用 laravel-sms 構(gòu)建短信驗(yàn)證碼發(fā)送校驗(yàn)?zāi)K,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

您可能感興趣的文章:
  • Laravel5.2使用Captcha生成驗(yàn)證碼實(shí)現(xiàn)登錄(session巨坑)
  • 用Laravel Sms實(shí)現(xiàn)laravel短信驗(yàn)證碼的發(fā)送的實(shí)現(xiàn)
  • laravel中短信發(fā)送驗(yàn)證碼的實(shí)現(xiàn)方法
  • Laravel下生成驗(yàn)證碼的類
  • laravel5.4生成驗(yàn)證碼的代碼
  • laravel5.4生成驗(yàn)證碼的實(shí)例講解
  • Laravel8 使用圖形驗(yàn)證碼做登錄功能的實(shí)現(xiàn)

標(biāo)簽:棗莊 衢州 廣元 大理 萍鄉(xiāng) 蚌埠 衡水 江蘇

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《使用 laravel sms 構(gòu)建短信驗(yàn)證碼發(fā)送校驗(yàn)功能》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    宁武县| 宁强县| 新宁县| 赫章县| 砚山县| 遵义县| 大城县| 黑河市| 榆社县| 阳东县| 通化县| 衡南县| 兴和县| 天等县| 民和| 芦溪县| 古田县| 商丘市| 江达县| 甘肃省| 鹤岗市| 东莞市| 绥棱县| 满洲里市| 正镶白旗| 吴堡县| 阿克苏市| 和政县| 高平市| 宜都市| 武山县| 盐山县| 浦城县| 昂仁县| 八宿县| 宽城| 巫山县| 武定县| 兴业县| 光山县| 邵阳市|