• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    使用 laravel sms 构建短信验证码发送校验功能

    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.6
    composer require toplan/laravel-sms:~2.6 

    也可以在 composer.json 的 require 字段中添加:

    "toplan/laravel-sms": "2.6"
    "toplan/laravel-sms": "2.6" 

    然后在项目根目录下执行:

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

    您可能感兴趣的文章:
    • Laravel5.2使用Captcha生成验证码实现登录(session巨坑)
    • 用Laravel Sms实现laravel短信验证码的发送的实现
    • laravel中短信发送验证码的实现方法
    • Laravel下生成验证码的类
    • laravel5.4生成验证码的代码
    • laravel5.4生成验证码的实例讲解
    • Laravel8 使用图形验证码做登录功能的实现
    上一篇:PHP中危险的file_put_contents函数详解
    下一篇:php实现的生成迷宫与迷宫寻址算法完整实例
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

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