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之apc
May 15 PHP
PHP字符串中特殊符号的过滤方法介绍
Feb 18 PHP
CI框架开发新浪微博登录接口源码完整版
May 28 PHP
ThinkPHP模板范围判断输出In标签与Range标签用法详解
Jun 30 PHP
php获取用户浏览器版本的方法
Jan 03 PHP
PHP使用Face++接口开发微信公众平台人脸识别系统的方法
Apr 17 PHP
PHP排序算法类实例
Jun 17 PHP
thinkPHP自动验证机制详解
Dec 05 PHP
php7 安装yar 生成docker镜像
May 09 PHP
PHP中的函数声明与使用详解
May 27 PHP
Laravel5.1框架路由分组用法实例分析
Jan 04 PHP
PHP编程一定要改掉的5个不良习惯
Sep 18 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 daddslashes 使用方法介绍
2012/10/26 PHP
php sybase_fetch_array使用方法
2014/04/15 PHP
Laravel学习教程之IOC容器的介绍与用例
2017/08/15 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
2020/03/27 PHP
网页中实现浏览器的最大,最小化和关闭按钮
2007/03/12 Javascript
Jquery实现列表(隔行换色,全选,鼠标滑过当前行)效果实例
2013/06/09 Javascript
jqGrid随窗口大小变化自适应大小的示例代码
2013/12/28 Javascript
jquery自定义滚动条插件示例分享
2014/02/21 Javascript
jquery实现多行文字图片滚动效果示例代码
2014/10/10 Javascript
使用javascript实现Iframe自适应高度
2014/12/24 Javascript
论JavaScript模块化编程
2016/03/07 Javascript
JavaScript模块化之使用requireJS按需加载
2017/04/12 Javascript
JavaScript中document.referrer的用法详解
2017/07/04 Javascript
详谈Node.js之操作文件系统
2017/08/29 Javascript
浅谈vue-router 路由传参的方法
2017/12/27 Javascript
说说Vue.js中的functional函数化组件的使用
2019/02/12 Javascript
使用vue-cli4.0快速搭建一个项目的方法步骤
2019/12/04 Javascript
vue element-ui实现input输入框金额数字添加千分位
2019/12/29 Javascript
JS数组转字符串实现方法解析
2020/09/04 Javascript
基于JavaScript实现随机点名器
2021/02/25 Javascript
[03:06]V社市场总监Dota2项目负责人Erik专访:希望更多中国玩家加入DOTA2
2014/07/11 DOTA
[54:43]DOTA2-DPC中国联赛 正赛 CDEC vs Dynasty BO3 第一场 2月22日
2021/03/11 DOTA
Python实现删除当前目录下除当前脚本以外的文件和文件夹实例
2015/07/27 Python
Python Flask前后端Ajax交互的方法示例
2018/07/31 Python
深入了解和应用Python 装饰器 @decorator
2019/04/02 Python
Python OpenCV实现视频分帧
2019/06/01 Python
简单了解Django应用app及分布式路由
2019/07/24 Python
python发qq消息轰炸虐狗好友思路详解(完整代码)
2020/02/15 Python
html如何对span设置宽度
2019/10/30 HTML / CSS
医学院学生的自我评价分享
2013/11/19 职场文书
人力资源部培训专员岗位职责
2014/01/02 职场文书
企业党员一句话承诺
2014/05/30 职场文书
个人对照检查剖析材料
2014/10/13 职场文书
德能勤绩廉个人总结
2015/02/14 职场文书
银行安全保卫工作总结
2015/08/10 职场文书
九年级语文教学反思
2016/03/03 职场文书