PHP手机短信验证码实现流程详解


Posted in PHP onMay 17, 2018

本人在自己博客(Laravel)的注册部分 使用手机号注册,需要发送短信验证码。

使用云片的短信服务提供商,当然具体短信服务提供商大家可以自由选择。

1、实现流程

输入手机号,点击获取验证码
提交正确的短信验证码后,注册完成

2、实现思路图

PHP手机短信验证码实现流程详解

3、注册 云片,以及开发信息认证,模板设置,这里就不详细展开了

4、安装 easy-sms,easy-sms 是安正超写的一个短信发送组件,利用这个组件,我们可以快速的实现短信发送功能。

composer require "overtrue/easy-sms"
//新建配置文件
touch config/easysms.php

然后在 easysms.php 文件内 添加以下内容:

<?php

  return [

    'timeout'=>5.0,
    'default'=>[
      // 网关调用策略,默认:顺序调用
      'strategy' => \Overtrue\EasySms\Strategies\OrderStrategy::class,

      // 默认可用的发送网关
      'gateways' => [
        'yunpian',
      ],
    ],
    // 可用的网关配置
    'gateways' => [
      'errorlog' => [
        'file' => '/tmp/easy-sms.log',
      ],
      'yunpian' => [
        'api_key' => env('YUNPIAN_API_KEY'),
      ],
    ],

];

然后创建一个 ServiceProvider

php artisan make:provider EasySmsServiceProvider

修改文件

app/providers/EasySmsServiceProvider.php

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Overtrue\EasySms\EasySms;

class EasySmsServiceProvider extends ServiceProvider
{
  /**
   * Bootstrap services.
   *
   * @return void
   */
  public function boot()
  {
    //
  }

  /**
   * Register services.
   *
   * @return void
   */
  public function register()
  {
    $this->app->singleton(EasySms::class,function ($app){

      return new EasySms(config('easysms'));

    });

    $this->app->alias(EasySms::class,'easysms');
  }
}

最后 打开config/app.php 在 providers 中增加 App\Providers\EasySmsServiceProvider::class,

5、获取云片的API_KEY

在.env中配置 YUNPIAN_API_KEY,注意下面需要替换为你自己的 key

6、控制器代码 获取验证码(将code 以及key存入缓存)

public function getVerificationCode($request)
  {
    if(FALSE === $this->validateApiRequest($request->all(),
        ['mobile' => 'required|regex:/^1[34578]\d{9}$/|unique:users'],[
          'mobile.required'=>'请输入手机号',
          'mobile.regex'=>'手机号格式不正确',
          'mobile.unique'=>'手机号已存在'
        ])){
      return false;
    }

    $mobile = trim($request->get('mobile'));
    $code = str_pad(random_int(1,9999),4,0,STR_PAD_LEFT);


    try{
       $easySms->send($mobile,
        ['content'=>"【UKNOW】您的验证码是{$code}。如非本人操作,请忽略本短信"]       );

    }catch(\GuzzleHttp\Exception\ClientException $exception){

      $response = $exception->getResponse();
      $result =json_decode($response->getBody()->getContents(),true);
      $this->setMsg($result['msg']?? '短信发送异常');
      return false;
    }

    $key = 'verificationCode'.str_random(15);
    $expiredAt = now()->addMinutes(1);
    Cache::put($key,['mobile'=>$mobile,'code'=>$code],$expiredAt);

    return [
      'verification_key'=>$key,
      'expiredAt'=>$expiredAt->toDateTimeString(),
      'verification_code'=>$code
      ];
}

7、对比验证码

public function userStore($mobile, $verification_key,$code,$password,$password_confirmation)
 {

  $params = [
   'mobile'=>$mobile,
   'verification_key'=>$verification_key,
   'code'=>$code,
   'password'=>$password,
   'password_confirmation'=>$password_confirmation
  ];
  //参数判断
  if (
   FALSE === $this->validateApiRequest($params, [
    'mobile' => 'required|regex:/^1[34578]\d{9}$/|unique:users',
    'code' => 'required',
    'verification_key'=>'required',
    'password'  => 'required|min:6|confirmed',
    'password_confirmation' => 'required',
   ], [
    'mobile.required' => '请输入手机号',
    'mobile.regex' => '手机号格式不正确',
    'mobile.unique' => '手机号已存在',
    'code.required' => '请输入短信验证码',
    'password.required' => '请输入密码',
    'password.min'   => '密码不得小于6位',
    'password.confirmed' => '密码前后不一致',
    'password_confirmation.required'=>'请再次输入密码',
    'verification_key.required'=>'请输入短信验证码'
   ])
  ) {
   return false;
  }

  $verifyData = Cache::get($verification_key);
  if( !$verifyData){
   $this->setMsg('验证码已失效');
   return false;
  }
  if(!hash_equals($code,(string)$verifyData['code'])){
   $this->setMsg('验证码错误');
   return false;
  }

  Cache::forget($verification_key);
  $user = User::create([
   'mobile'=>$mobile,
   'password'=>bcrypt($password)
  ]);
  if(!$user){
   $this->setMsg('注册失败');
   return false;
  }
  return true;
}

以上流程就是手机验证码基本步骤。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
apache+mysql+php+ssl服务器之完全安装攻略
Sep 05 PHP
php array_intersect()函数使用代码
Jan 14 PHP
php 更新数据库中断的解决方法
Jun 05 PHP
PHP入门学习笔记之一
Oct 12 PHP
php检测图片木马多进制编程实践
Apr 11 PHP
浅析php中三个等号(===)和两个等号(==)的区别
Aug 06 PHP
PHP中加密解密函数与DES加密解密实例
Oct 17 PHP
php函数与传递参数实例分析
Nov 15 PHP
php操作(删除,提取,增加)zip文件方法详解
Mar 12 PHP
PHP学习笔记(二):变量详解
Apr 17 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
Feb 27 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
Mar 26 PHP
PHP实现多图上传和单图上传功能
May 17 #PHP
php实现姓名根据首字母排序的类与方法(实例代码)
May 16 #PHP
PHP多维数组指定多字段排序的示例代码
May 16 #PHP
php strftime函数获取日期时间(switch用法)
May 16 #PHP
Phpstorm+Xdebug断点调试PHP的方法
May 14 #PHP
Laravel 集成 Geetest验证码的方法
May 14 #PHP
PHP 多任务秒级定时器的实现方法
May 13 #PHP
You might like
PHP采用超长(超大)数字运算防止数字以科学计数法显示的方法
2016/04/01 PHP
JavaScript事件列表解说
2006/12/22 Javascript
js iframe跨域访问(同主域/非同主域)分别深入介绍
2013/01/24 Javascript
js调用css属性写法
2013/09/21 Javascript
js实现通用的微信分享组件示例
2014/03/10 Javascript
jQuery实现移动 和 渐变特效的点击事件
2015/02/26 Javascript
js插件设置innerHTML时在IE8下提示“未知运行时错误”解决方法
2015/04/25 Javascript
JavaScript中split与join函数的进阶使用技巧
2016/05/03 Javascript
JavaScript 链式结构序列化详解
2016/09/30 Javascript
JavaScript将base64图片转换成formData并通过AJAX提交的实现方法
2016/10/24 Javascript
JS FormData上传文件的设置方法
2017/07/05 Javascript
解决VUE框架 导致绑定事件的阻止冒泡失效问题
2018/02/24 Javascript
微信小程序实时聊天WebSocket
2018/07/05 Javascript
js数组去重的方法总结
2019/01/18 Javascript
React 条件渲染最佳实践小结(7种)
2020/09/27 Javascript
Swiper实现导航栏滚动效果
2020/10/16 Javascript
python连接sql server乱码的解决方法
2013/01/28 Python
Python实现115网盘自动下载的方法
2014/09/30 Python
Python简单进程锁代码实例
2015/04/27 Python
python基于ID3思想的决策树
2018/01/03 Python
Python获取当前公网ip并自动断开宽带连接实例代码
2018/01/12 Python
创建pycharm的自定义python模板方法
2018/05/23 Python
Python数据可视化之画图
2019/01/15 Python
python requests.get带header
2020/05/05 Python
python用tkinter实现一个gui的翻译工具
2020/10/26 Python
家得宝墨西哥官网:The Home Depot墨西哥
2019/11/18 全球购物
文员自我评价怎么写
2013/09/19 职场文书
正规的求职信范文分享
2013/12/11 职场文书
军训自我鉴定范文
2014/02/13 职场文书
培训讲师岗位职责
2014/04/13 职场文书
小学英语课后反思
2014/04/26 职场文书
细节决定成败演讲稿
2014/05/12 职场文书
党员群众路线学习心得体会
2014/11/04 职场文书
2014年优质护理服务工作总结
2014/11/14 职场文书
2014年档案管理工作总结
2014/11/17 职场文书
2014社会治安综合治理工作总结
2014/12/04 职场文书