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+DBM的同学录程序(3)
Oct 09 PHP
php过滤危险html代码
Aug 18 PHP
在PHP中检查PHP文件是否有语法错误的方法
Dec 23 PHP
Base64在线编码解码实现代码 演示与下载
Jan 08 PHP
PHP CURL模拟登录新浪微博抓取页面内容 基于EaglePHP框架开发
Jan 16 PHP
PHP sprintf() 函数的应用(定义和用法)
Jun 29 PHP
解析如何通过PHP函数获取当前运行的环境 来进行判断执行逻辑(小技巧)
Jun 25 PHP
ECMall支持SSL连接邮件服务器的配置方法详解
May 19 PHP
使用配置类定义Codeigniter全局变量
Jun 12 PHP
PHP处理JSON字符串key缺少双引号的解决方法
Sep 16 PHP
10个对初学者非常有用的PHP技巧
Apr 06 PHP
PHP数据库编程之MySQL优化策略概述
Aug 16 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编程网上资源导航
2006/10/09 PHP
取得单条网站评论以数组形式进行输出
2014/07/28 PHP
PHP获取一年有几周以及每周开始日期和结束日期
2015/08/06 PHP
轻松掌握php设计模式之访问者模式
2016/09/23 PHP
php自定义函数实现汉字转换utf8编码的方法
2016/09/29 PHP
php判断str字符串是否是xml格式数据的方法示例
2017/07/26 PHP
Jsonp 跨域的原理以及Jquery的解决方案
2010/05/18 Javascript
jquery 实现checkbox全选,反选,全不选等功能代码(奇数)
2012/10/24 Javascript
jquery实现表格奇数偶数行不同样式(有图为证及实现代码)
2013/01/23 Javascript
浅谈JavaScript事件绑定的常用方法及其优缺点分析
2016/11/01 Javascript
jQuery图片切换动画效果
2017/02/28 Javascript
css和js实现弹出登录居中界面完整代码
2017/11/26 Javascript
angular 组件通信的几种实现方式
2018/07/13 Javascript
Angular脚手架开发的实现步骤
2019/04/09 Javascript
js设计模式之代理模式及订阅发布模式实例详解
2019/08/15 Javascript
详解element-ui中表单验证的三种方式
2019/09/18 Javascript
详解datagrid使用方法(重要)
2020/11/06 Javascript
使用Python的PEAK来适配协议的教程
2015/04/14 Python
OpenCV-Python 摄像头实时检测人脸代码实例
2019/04/30 Python
Python面向对象之继承和多态用法分析
2019/06/08 Python
Python3简单实现串口通信的方法
2019/06/12 Python
python顺序执行多个py文件的方法
2019/06/29 Python
django2.2安装错误最全的解决方案(小结)
2019/09/24 Python
详解Python中的format格式化函数的使用方法
2019/11/20 Python
详解python tkinter模块安装过程
2020/01/06 Python
Python编程快速上手——强口令检测算法案例分析
2020/02/29 Python
大学毕业后的十年规划
2014/01/07 职场文书
英语简历自我评价
2014/01/26 职场文书
财务人员求职自荐书范文
2014/02/10 职场文书
校园公益广告语
2014/03/13 职场文书
餐饮投资计划书
2014/04/25 职场文书
2014国庆黄金周超市促销活动方案
2014/09/21 职场文书
离婚协议书范文
2015/01/26 职场文书
MySQL update set 和 and的区别
2021/05/08 MySQL
在pycharm中无法import所安装的库解决方案
2021/05/31 Python
gateway与spring-boot-starter-web冲突问题的解决
2021/07/16 Java/Android