使用 laravel sms 构建短信验证码发送校验功能

2025-05-27 0 109

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 构建短信验证码发送校验模块,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对快网idc网站的支持!

原文链接:http://blog.qiji.tech/archives/16318?utm_source=tuicool&utm_medium=referral

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 使用 laravel sms 构建短信验证码发送校验功能 https://www.kuaiidc.com/71563.html

相关文章

发表评论
暂无评论