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实现网站插件机制的方法
Nov 10 PHP
PHP定时执行计划任务的多种方法小结
Dec 19 PHP
php后门URL的防范
Nov 12 PHP
php实现把数组按指定的个数分隔
Feb 17 PHP
CentOS 安装 PHP5.5+Redis+XDebug+Nginx+MySQL全纪录
Mar 25 PHP
PHP+Mysql基于事务处理实现转账功能的方法
Jul 08 PHP
ThinkPHP数据操作方法总结
Sep 28 PHP
非集成环境的php运行环境(Apache配置、Mysql)搭建安装图文教程
Apr 12 PHP
PHP MySql增删改查的简单实例
Jun 21 PHP
php版微信开发之接收消息,自动判断及回复相应消息的方法
Sep 23 PHP
ThinkPHP打水印及设置水印位置的方法
Oct 14 PHP
PHP接口类(interface)的定义、特点和应用示例
May 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中三个等号(===)和两个等号(==)的区别
2013/08/06 PHP
Destoon实现多表查询示例
2014/08/21 PHP
php使用PDO获取结果集的方法
2017/02/16 PHP
基于jQuery的自动完成插件
2011/02/03 Javascript
javascript实现全局匹配并替换的方法
2015/04/27 Javascript
类似于QQ的右滑删除效果的实现方法
2016/10/16 Javascript
JS制作适用于手机和电脑的通知信息效果
2016/10/28 Javascript
JavaScript实现拖拽元素对齐到网格(每次移动固定距离)
2016/11/30 Javascript
js实现导航栏中英文切换效果
2017/01/16 Javascript
vue.js实现数据动态响应 Vue.set的简单应用
2017/06/15 Javascript
jQuery实现简单的手风琴效果
2020/04/17 jQuery
js通过Date对象实现倒计时动画效果
2017/10/27 Javascript
用最少的JS代码写出贪吃蛇游戏
2018/01/12 Javascript
JS脚本加载后执行相应回调函数的操作方法
2018/02/28 Javascript
使用Vue开发动态刷新Echarts组件的教程详解
2018/03/22 Javascript
nodejs图片处理工具gm用法小结
2018/12/12 NodeJs
一个手写的vue放大镜效果
2019/08/09 Javascript
js实现右键弹出自定义菜单
2020/09/08 Javascript
JavaScript中如何调用Java方法
2020/09/16 Javascript
解决vue打包 npm run build-test突然不动了的问题
2020/11/13 Javascript
python中的decorator的作用详解
2018/07/26 Python
wxpython+pymysql实现用户登陆功能
2019/11/19 Python
python pip安装包出现:Failed building wheel for xxx错误的解决
2019/12/25 Python
python GUI库图形界面开发之PyQt5复选框控件QCheckBox详细使用方法与实例
2020/02/28 Python
在spyder IPython console中,运行代码加入参数的实例
2020/04/20 Python
python Zmail模块简介与使用示例
2020/12/19 Python
Web前端页面跳转并取到值
2017/04/24 HTML / CSS
食堂员工工作职责
2013/12/18 职场文书
给老婆的婚前保证书
2014/02/01 职场文书
求职自我推荐信
2014/06/25 职场文书
信用卡工作证明模板
2014/09/14 职场文书
银行会计主管岗位职责
2014/10/01 职场文书
银行业务授权委托书
2014/10/10 职场文书
加强干部作风建设整改方案
2014/10/24 职场文书
2014年物业管理工作总结
2014/11/21 职场文书
Windows10安装Apache2.4的方法步骤
2022/06/25 Servers