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 相关文章推荐
用PHP写的MySQL数据库用户认证系统代码
Mar 22 PHP
PHP生成网页快照 不用COM不用扩展.
Feb 11 PHP
PHP操作mysql函数详解,mysql和php交互函数
May 19 PHP
PHP图片处理之图片背景、画布操作
Nov 19 PHP
php实现中文字符截取防乱码方法汇总
Apr 29 PHP
学习php设计模式 php实现状态模式
Dec 07 PHP
CodeIgniter表单验证方法实例详解
Mar 03 PHP
PHP针对多用户实现更换头像功能
Sep 04 PHP
php实现博客,论坛图片防盗链的方法
Oct 15 PHP
Zend Framework实现自定义过滤器的方法
Dec 09 PHP
Laravel构建即时应用的一种实现方法详解
Aug 31 PHP
PHP Class SoapClient not found解决方法
Jan 20 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 echo()和print()、require()和include()函数区别说明
2010/03/27 PHP
PHP连接SQLServer2005的方法
2015/01/27 PHP
thinkphp3.2.3版本的数据库增删改查实现代码
2016/09/22 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
2017/08/28 PHP
PHP 爬取网页的主要方法
2018/07/13 PHP
在javascript中关于节点内容加强
2013/04/11 Javascript
使用Math.floor与Math.random取随机整数的方法详解
2013/05/07 Javascript
Ajax异步提交表单数据的说明及方法实例
2013/06/22 Javascript
javascript 原型链维护和继承详解
2014/11/26 Javascript
JavaScript基础语法、dom操作树及document对象
2014/12/02 Javascript
jquery实现拖拽调整Div大小
2015/01/30 Javascript
以Python代码实例展示kNN算法的实际运用
2015/10/26 Javascript
浅析JavaScript中的对象类型Object
2016/05/26 Javascript
通用无限极下拉菜单的实现代码
2016/05/31 Javascript
React中的render何时执行过程
2018/04/13 Javascript
JavaScript实现创建自定义对象的常用方式总结
2018/07/09 Javascript
Angular 中使用 FineReport不显示报表直接打印预览
2019/08/21 Javascript
Python中有趣在__call__函数
2015/06/21 Python
python设计模式大全
2016/06/27 Python
Python基础之getpass模块详细介绍
2017/08/10 Python
解决PyCharm同目录下导入模块会报错的问题
2018/10/13 Python
python3 自动识别usb连接状态,即对usb重连的判断方法
2019/07/03 Python
python模拟点击网页按钮实现方法
2020/02/25 Python
HTML5实现一个能够移动的小坦克示例代码
2013/09/02 HTML / CSS
HTML 5 input placeholder 属性如何完美兼任ie
2014/05/12 HTML / CSS
墨西哥网上超市:Superama
2018/07/10 全球购物
世界上最大的乐谱选择:Sheet Music Plus
2020/01/18 全球购物
市场营销专业个人求职信范文
2013/12/14 职场文书
校园安全演讲稿
2014/05/09 职场文书
街道党工委党的群众路线教育实践活动对照检查材料思想汇报
2014/10/05 职场文书
2015年教师新年寄语
2014/12/08 职场文书
车间主任岗位职责范本
2015/04/08 职场文书
教师师德工作总结2015
2015/07/22 职场文书
消防演习感想
2015/08/10 职场文书
生日宴会祝酒词
2015/08/10 职场文书
深入讲解数据库中Decimal类型的使用以及实现方法
2022/02/15 MySQL