laravel 实现短信验证码功能,搜索资料发现比较流行的有两个包:
一个是laravel sms 地址 http://github.com/toplan/laravel-sms
一个是easy sms 地址http://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::html' target='_blank'>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 相关地址,可以看到对应的提示信息语言已经本地化。
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP !
相关推荐:
关于Laravel中重写资源路由自定义URL的实现方法
Laravel5.2使用Captcha生成验证码实现登录的方法
通过 Laravel “规范” 的开发短信验证码发送功能
以上就是使用laravel sms 构建短信验证码发送校验的功能的详细内容,PHP教程
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。
新闻热点
疑难解答