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实现的随机广告显示代码
Jun 14 PHP
php5新改动之短标记启用方法
Sep 11 PHP
使用PHP备份MYSQL数据的多种方法
Jan 15 PHP
PHP中soap的用法实例
Oct 24 PHP
Symfony页面的基本创建实例详解
Jan 26 PHP
php遍历类中包含的所有元素的方法
May 12 PHP
PHP网站建设的流程与步骤分享
Sep 25 PHP
为你总结一些php系统类函数
Oct 21 PHP
详解WordPress开发中用于获取分类及子页面的函数用法
Jan 08 PHP
PHP自带方法验证邮箱是否存在
Feb 01 PHP
PHP封装cURL工具类与应用示例
Jul 01 PHP
TP3.2框架分页相关实现方法分析
Jun 03 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详解ASCII码对照表与字符转换
2011/12/05 PHP
php.ini-dist 和 php.ini-recommended 的区别介绍(方便开发与安全的朋友)
2012/07/01 PHP
php配置php-fpm启动参数及配置详解
2013/11/04 PHP
thinkPHP交易详情查询功能详解
2016/12/02 PHP
基于JQUERY的两个ListBox子项互相调整的实现代码
2011/05/07 Javascript
JS获取select-option-text_value的方法
2013/12/26 Javascript
javascript的解析执行顺序在各个浏览器中的不同
2014/03/17 Javascript
jQuery创建自定义的选择器用以选择高度大于100的超链接实例
2015/03/18 Javascript
原生js与jQuery实现简单的tab切换特效对比
2015/07/30 Javascript
基于jQuery实现的无刷新表格分页实例
2016/02/17 Javascript
js控制TR的显示隐藏
2016/03/04 Javascript
jQuery遍历DOM元素与节点方法详解
2016/04/14 Javascript
jQuery通用的全局遍历方法$.each()用法实例
2016/07/04 Javascript
多功能jQuery树插件zTree实现权限列表简单实例
2016/07/12 Javascript
jQuery实现的简单百分比进度条效果示例
2016/08/01 Javascript
jquery.uploadifive插件怎么解决上传限制图片或文件大小问题
2017/05/08 jQuery
判断div滑动到底部的scroll实例代码
2017/11/15 Javascript
jquery+css3实现熊猫tv导航代码分享
2018/02/12 jQuery
JavaScript继承与多继承实例分析
2018/05/26 Javascript
详解vue.js下引入百度地图jsApi的两种方法
2018/07/27 Javascript
[jQuery] 事件和动画详解
2019/03/05 jQuery
jQuery属性选择器用法实例分析
2019/06/28 jQuery
javascript跳转与返回和刷新页面的实例代码
2019/11/20 Javascript
跟老齐学Python之折腾一下目录
2014/10/24 Python
通过5个知识点轻松搞定Python的作用域
2016/09/09 Python
Python 使用生成器代替线程的方法
2020/08/04 Python
用python-webdriver实现自动填表的示例代码
2021/01/13 Python
台湾森森购物网:U-mall
2017/10/16 全球购物
日本最佳原创设计品牌:Felissimo(芬理希梦)
2019/03/19 全球购物
行政助理求职自荐信
2013/10/26 职场文书
高中毕业自我鉴定
2013/12/16 职场文书
财务经理的岗位职责
2013/12/17 职场文书
战略合作意向书范本
2014/04/01 职场文书
繁星春水读书笔记
2015/06/30 职场文书
电力企业职工培训心得体会
2016/01/11 职场文书
mysql中DCL常用的用户和权限控制
2022/03/31 MySQL