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 常用函数库和一些实用小技巧
Jan 01 PHP
php设计模式 Adapter(适配器模式)
Jun 26 PHP
php中用加号与用array_merge合并数组的区别深入分析
Jun 03 PHP
Laravel 5 框架入门(三)
Apr 09 PHP
PHP永久登录、记住我功能实现方法和安全做法
Apr 27 PHP
PHP生成plist数据的方法
Jun 16 PHP
php metaphone()函数的定义和用法
May 15 PHP
thinkPHP自定义类实现方法详解
Nov 30 PHP
PHPExcel导出2003和2007的excel文档功能示例
Jan 04 PHP
PHP实现数组的笛卡尔积运算示例
Dec 15 PHP
thinkPHP5.0框架事务处理操作简单示例
Sep 07 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
Dec 01 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(7) php 字符串相关应用
2010/03/05 PHP
Laravel 5.0 发布 新版本特性详解
2015/02/10 PHP
PHP编译安装时常见错误解决办法
2015/05/28 PHP
浅谈PHP中output_buffering
2015/07/13 PHP
php字符串操作常见问题小结
2016/10/11 PHP
PHP面向对象程序设计继承用法简单示例
2018/12/28 PHP
TP5框架实现签到功能的方法分析
2020/04/05 PHP
js RuntimeObject() 获取ie里面自定义函数或者属性的集合
2010/11/23 Javascript
javascript计算当月剩余天数(天数计算器)示例代码
2014/01/09 Javascript
Ajax局部更新导致JS事件重复触发问题的解决方法
2014/10/14 Javascript
jQuery中insertBefore()方法用法实例
2015/01/08 Javascript
javascript委托(Delegate)blur和focus用法实例分析
2015/05/26 Javascript
js去除浏览器默认底图的方法
2015/06/08 Javascript
AngularJS  $on、$emit和$broadcast的使用
2016/09/05 Javascript
微信小程序 wxapp内容组件 progress详细介绍
2016/10/31 Javascript
JavaScript截屏功能的实现代码
2017/07/28 Javascript
React组件重构之嵌套+继承及高阶组件详解
2018/07/19 Javascript
vue实现一个炫酷的日历组件
2018/10/08 Javascript
JavaScript代码调试方法实例小结
2019/01/05 Javascript
2019年度web前端面试题总结(主要为Vue面试题)
2020/01/12 Javascript
vue 组件销毁并重置的实现
2020/01/13 Javascript
JavaScript 如何计算文本的行数的实现
2020/09/14 Javascript
[02:35]DOTA2英雄基础教程 狙击手
2014/01/14 DOTA
[47:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第二场 3月4日
2021/03/11 DOTA
详解tensorflow实现迁移学习实例
2018/02/10 Python
python 编码规范整理
2018/05/05 Python
python 中Arduino串口传输数据到电脑并保存至excel表格
2019/10/14 Python
马耳他航空公司官方网站:Air Malta
2019/05/15 全球购物
设计师大码女装:11 Honoré
2020/05/03 全球购物
大四学年自我鉴定
2013/11/13 职场文书
土木工程专业个人求职信
2013/12/05 职场文书
建筑人员岗位职责
2013/12/25 职场文书
公益活动邀请函
2014/02/05 职场文书
新春联欢会主持词
2014/03/24 职场文书
反腐倡廉学习心得体会范文
2015/08/15 职场文书
Python自然语言处理之切分算法详解
2021/04/25 Python