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 相关文章推荐
在字符串中把网址改成超级链接
Oct 09 PHP
FCKeditor的安装(PHP)
Jan 13 PHP
PHP 冒泡排序算法的实现代码
Aug 08 PHP
php UBB 解析实现代码
Nov 27 PHP
thinkPHP实现MemCache分布式缓存功能
Mar 23 PHP
PHP的Yii框架中Model模型的学习教程
Mar 29 PHP
PHP7常量数组用法分析
Sep 26 PHP
php 微信公众平台开发模式实现多客服的实例代码
Nov 07 PHP
浅谈PHP的$_SERVER[SERVER_NAME]
Feb 04 PHP
PHP之认识(二)关于Traits的用法详解
Apr 11 PHP
Laravel Validator 实现两个或多个字段联合索引唯一
May 08 PHP
Laravel 前端资源配置教程
Oct 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
PHP4 与 MySQL 数据库操作函数详解
2006/10/09 PHP
基于session_unset与session_destroy的区别详解
2013/06/03 PHP
PHP根据两点间的经纬度计算距离
2014/10/31 PHP
php中使用session防止用户非法登录后台的方法
2015/01/27 PHP
PHP SplObjectStorage使用实例
2015/05/12 PHP
mod_php、FastCGI、PHP-FPM等PHP运行方式对比
2015/07/02 PHP
php中isset与empty函数的困惑与用法分析
2019/07/05 PHP
JavaScript 学习笔记(十一)
2010/01/19 Javascript
如何用jquery控制表格奇偶行及活动行颜色
2014/04/20 Javascript
为什么JS中eval处理JSON数据要加括号
2015/04/13 Javascript
简介JavaScript中POSITIVE_INFINITY值的使用
2015/06/05 Javascript
tuzhu_req.js 实现仿百度图片首页效果
2015/08/11 Javascript
JavaScript sort数组排序方法和自我实现排序方法小结
2016/06/06 Javascript
jQuery ajaxForm()的应用
2016/10/14 Javascript
vue-cli如何添加less 以及sass
2017/07/06 Javascript
JavaScript使用Ajax上传文件的示例代码
2017/08/10 Javascript
深入理解js A*寻路算法原理与具体实现过程
2018/12/13 Javascript
javascript json对象小技巧之键名作为变量用法分析
2019/11/11 Javascript
原生js实现自定义消息提示框
2020/11/19 Javascript
[05:09]2016国际邀请赛中国区预选赛淘汰赛首日精彩回顾
2016/06/29 DOTA
Python中的pass语句使用方法讲解
2015/05/14 Python
Python实现比较扑克牌大小程序代码示例
2017/12/06 Python
用python3教你任意Html主内容提取功能
2018/11/05 Python
python实现桌面壁纸切换功能
2019/01/21 Python
python调用摄像头拍摄数据集
2019/06/01 Python
讲解Python3中NumPy数组寻找特定元素下标的两种方法
2019/08/04 Python
Python实现网络聊天室的示例代码(支持多人聊天与私聊)
2021/01/27 Python
美国女士时尚珠宝及配饰购物网站:Icing
2018/07/02 全球购物
俄罗斯大型在线书店:Читай-город
2019/10/10 全球购物
入党转预备思想汇报
2014/01/07 职场文书
2014年元旦促销活动方案
2014/02/22 职场文书
面试通知单大全
2015/04/20 职场文书
电话营销开场白
2015/05/29 职场文书
2019新员工心得体会
2019/06/25 职场文书
使用python向MongoDB插入时间字段的操作
2021/05/18 Python
PyCharm 配置SSH和SFTP连接远程服务器
2022/05/11 Python