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。
本例使用的短信服务商为云片。
安装
在项目根目录下执行(推荐):
1
2
|
composer require toplan/laravel-sms:~2.6 composer require toplan/laravel-sms:~2.6 |
也可以在 composer.json 的 require 字段中添加:
1
2
|
"toplan/laravel-sms" : "2.6" "toplan/laravel-sms" : "2.6" |
然后在项目根目录下执行:
1
2
|
composer update composer update |
在 config/app.php 的 providers 数组中添加:
1
2
3
4
|
Toplan\PhpSms\PhpSmsServiceProvider:: class , Toplan\Sms\SmsManagerServiceProvider:: class , Toplan\PhpSms\PhpSmsServiceProvider:: class , Toplan\Sms\SmsManagerServiceProvider:: class , |
并在 aliases 数组里添加:
1
2
3
4
|
'PhpSms' => Toplan\PhpSms\Facades\Sms:: class , 'SmsManager' => Toplan\Sms\Facades\SmsManager:: class , 'PhpSms' => Toplan\PhpSms\Facades\Sms:: class , 'SmsManager' => Toplan\Sms\Facades\SmsManager:: class , |
在项目根目录下执行:
1
2
3
4
|
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 数组中云片的代理器信息。
1
2
3
4
5
6
7
8
|
'YunPian' => [ //用户唯一标识,必须 'apikey' => '在这里填写你的 APIKEY' , ], 'YunPian' => [ //用户唯一标识,必须 'apikey' => '在这里填写你的 APIKEY' , ], |
设置 scheme 数组,配置均衡调度方案。
1
2
3
4
5
6
|
'scheme' => [ 'YunPian' , ], 'scheme' => [ 'YunPian' , ], |
配置 laravel-sms.php
设置内置路由。
1
2
3
4
5
6
7
8
9
10
|
'route' => [ 'enable' => true, 'prefix' => 'laravel-sms' , 'middleware' => [ 'api' ], ], 'route' => [ 'enable' => true, 'prefix' => 'laravel-sms' , 'middleware' => [ 'api' ], ], |
设置请求间隔,单位为秒。
1
2
|
'interval' => 60, 'interval' => 60, |
设置号码验证规则。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
'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' , ], ], ], |
设置验证码规则。
1
2
3
4
5
6
7
8
9
10
11
12
|
'code' => [ 'length' => 4, //验证码长度 'validMinutes' => 10, //验证码有效时间长度,单位为分钟 'repeatIfValid' => true, //验证码有效期内是否重复使用 'maxAttempts' => 0, //验证码最大尝试验证次数,0 或负数则不启用 ], 'code' => [ 'length' => 4, //验证码长度 'validMinutes' => 10, //验证码有效时间长度,单位为分钟 'repeatIfValid' => true, //验证码有效期内是否重复使用 'maxAttempts' => 0, //验证码最大尝试验证次数,0 或负数则不启用 ], |
设置验证码内容短信。
1
2
3
4
5
6
|
'content' => function ( $code , $minutes , $input ) { return "您的验证码是:{$code} ({$minutes}分钟内有效,如非本人操作,请忽略)" ; }, 'content' => function ( $code , $minutes , $input ) { return "您的验证码是:{$code} ({$minutes}分钟内有效,如非本人操作,请忽略)" ; }, |
如果有需要,可以开启数据库日志。需要提前运行 php artisan migrate 生成 laravel_sms 表。
1
2
|
'dbLogs' => 'ture' , 'dbLogs' => 'ture' , |
API 实现
在 app/Utils 下新建 SmsCodeUtil.php,并在里面实现验证码发送和校验功能。这样其他类可以随时调用,提高代码的复用性。
发送模块
发送前需要对手机号进行校验,包括:
1
2
|
validateSendable() :验证是否满足发送间隔 validateFields() :验证数据合法性 |
通过验证后,再使用 requestVerifySms() 发送验证码。
具体代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
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 上已经给出了代码,稍作修改即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
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 中添加:
1
2
3
4
|
$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 中添加:
1
2
3
4
5
6
7
8
9
10
11
|
use App\Utils\SmsCodeUtil; class LoginController extends Controller { use SmsCodeUtil; ... } use App\Utils\SmsCodeUtil; class LoginController extends Controller { use SmsCodeUtil; ... } |
然后使用 Postman 或其他类似工具测试 Api 功能。
发送验证码
1
2
3
4
5
6
7
8
|
POST 服务器地址/api/auth/send-sms-code { "phone_number" : "手机号" } POST 服务器地址/api/auth/send-sms-code { "phone_number" : "手机号" } |
若通过验证并发送成功,则会返回:
1
2
3
4
5
6
7
8
|
{ "message" : "短信验证码发送成功,请注意查收" , "status_code" : 200 } { "message" : "短信验证码发送成功,请注意查收" , "status_code" : 200 } |
同时填写的手机号接受到验证码。
若验证失败或发送失败,则会返回对应的错误信息。
校验验证码
1
2
3
4
5
6
7
8
9
10
11
|
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。
1
2
|
'locale' => 'zh_cn' , 'locale' => 'zh_cn' , |
然后在 resources\lang\zh_cn 文件夹下新建 validation.php,并填入本地化信息:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
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 构建短信验证码发送校验模块,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
原文链接:http://blog.qiji.tech/archives/16318?utm_source=tuicool&utm_medium=referral