Laravel实现短信注册的示例代码


Posted in PHP onMay 29, 2018

正在公司做一个商城项目,由于只有一个后台,所以注册用短信注册也就轮到我来做的。刚刚开始,我内心还是有点虚的,还好有 Laravel-china 社区的 summer 大神,写的书。在里面参考了它的写法和思路,并且用了 easy-sms 包,这才用了半个下午的时间,顺利的做出来了,晚上赶紧和大家分享一波了。

1、确定短信运营商

我看到大佬都是用的云片,我也就毫不犹豫的大力推荐公司用这个短信平台了,不过其他的也可以咯。

首先自己注册一个帐号,然后找到这个

Laravel实现短信注册的示例代码 

点击开始接入,完成新手引导过程。

Laravel实现短信注册的示例代码 

第二部的签名和模板必须填写,类似我下面填写的这样

Laravel实现短信注册的示例代码 

Laravel实现短信注册的示例代码

值得注意的是这个模板必须和你到时候用 easy-sms 包的时候,设定的短信内容必须和这个一模一样,不然会报错的。

还有就是记得一定得拿到APIKEY。到时候,在env里进行配置。

# 云片
YUNPIAN_API_KEY=9c60bdd**********

2、安装 easy-sms

利用这个包,可以快速的实现短信发送功能。

composer require "overtrue/easy-sms"

由于该组件还没有 Laravel 的 ServiceProvider ,为了方便使用,我们可以自己封装一下。

首先在 config 目录中增加 easysms.php 文件

config/easysms.php 填写如下内容。

<?php
return [
 // HTTP 请求的超时时间(秒)
 '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 Overtrue\EasySms\EasySms;
use Illuminate\Support\ServiceProvider;

class EasySmsServiceProvider extends ServiceProvider
{
 /**
  * Bootstrap the application services.
  *
  * @return void
  */
 public function boot()
 {
  //
 }

 /**
  * Register the application 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.phpproviders 里增加刚刚创建的服务写进去,App\Providers\EasySmsServiceProvider::class,

App\Providers\AppServiceProvider::class,
App\Providers\AuthServiceProvider::class,
// App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,

App\Providers\EasySmsServiceProvider::class, //easy-sms

3、创建路由和对应的控制器

首先创建路由,我们需要一个ajax请求短信验证码的方法,和一个进行确认注册的逻辑方法,如下:

Route::group(['prefix' => 'verificationCodes', 'as' => 'verificationCodes.'], function() {
  Route::post('register', 'VerificationCodesController@register')->name('register');
  Route::get('ajaxregister', 'VerificationCodesController@ajaxregister')->name('ajaxregister');
 });

路由创建好了,我们用命令生成controller了

php artisan make:controller Home\VerificationCodesController

再直接在里面写 registerajaxregister 方法了

代码逻辑

修改文件

app/Home/VerificationCodesController.php

<?php
.
.
.
use Overtrue\EasySms\EasySms;
use App\Models\System\User;
class VerificationCodesController extends Controller
{
 // 这里验证就不写了。
 public function ajaxregister(VerificationCodeRequest $request, EasySms $easySms)
 {
  //获取前端ajax传过来的手机号
  $phone = $request->phone;
  
  // 生成4位随机数,左侧补0
  $code = str_pad(random_int(1, 9999), 4, 0, STR_PAD_LEFT);
  
  try {
   $result = $easySms->send($mobile, [
    'content' => "【安拾商城】您的验证码是{$code}。如非本人操作,请忽略本短信"
   ]);
  } catch (Overtrue\EasySms\Exceptions\NoGatewayAvailableException $exception) {
   $response = $exception->getExceptions();
   return response()->json($response);
  }
  
  //生成一个不重复的key 用来搭配缓存cache判断是否过期
  $key = 'verificationCode_' . str_random(15);
  $expiredAt = now()->addMinutes(10);
  
  // 缓存验证码 10 分钟过期。
  \Cache::put($key, ['mobile' => $mobile, 'code'=> $code], $expiredAt);
  
  return response()->json([
   'key' => $key,
   'expired_at' => $expiredAt->toDateTimeString(),
  ], 201);
 }

这样,用户就能收到短信,并且前端应该保存这个 key ,提交注册表单的时候传递给后台,判断是否已经过期。下面就是判断是否过期,验证码是否错误。

public function register(VerificationCodeRequest $request)
{
 //获取刚刚缓存的验证码和key
 $verifyData = \Cache::get($request->verification_key);
 
 //如果数据不存在,说明验证码已经失效。
 if(!$verifyData) {
  return response()->json(['status' =>0, 'message'=> '短信验证码已失效'], 422);
 }
 
 // 检验前端传过来的验证码是否和缓存中的一致
 if (!hash_equals($verifyData['code'], $request->verification_code) {
  return redirect()->back()->with('warning', '短信验证码错误');
 }
 
 $user = User::create([
  'mobile' => $verifyData['mobile'],
  'password' => bcrypt($request->password),
 ]);

 // 清除验证码缓存
 \Cache::forget($request->verification_key);

 return redirect()->route('login')->with('success', '注册成功!');
 
}

上面的 hash_equals 是可防止时序攻击的字符串比较的~

以上就是我整个的过程。

PHP 相关文章推荐
网站加速 PHP 缓冲的免费实现方法
Oct 09 PHP
用PHP和ACCESS写聊天室(一)
Oct 09 PHP
简化php模板页面中分页代码的解析
Feb 06 PHP
Laravel中使用阿里云OSS Composer包分享
Feb 10 PHP
php session实现多级目录存放实现代码
Feb 03 PHP
PHP6新特性分析
Mar 03 PHP
Yii2.0预定义的别名功能小结
Jul 04 PHP
php自定义扩展名获取函数示例
Dec 12 PHP
PHP获取表单数据与HTML嵌入PHP脚本的实现
Feb 09 PHP
laravel手动创建数组分页的实现代码
Jun 07 PHP
Laravel框架在本地虚拟机快速安装的方法详解
Jun 11 PHP
laravel框架查询数据集转为数组的两种方法
Oct 10 PHP
PHP abstract 抽象类定义与用法示例
May 29 #PHP
thinkPHP中U方法加密传递参数功能示例
May 29 #PHP
在Laravel中使用DataTables插件的方法
May 29 #PHP
ThinkPHP实现的rsa非对称加密类示例
May 29 #PHP
PHP中实现中文字串截取无乱码的解决方法
May 29 #PHP
php实现表单提交上传文件功能
May 28 #PHP
PHP封装的非对称加密RSA算法示例
May 28 #PHP
You might like
默默小谈PHP&amp;MYSQL分页原理及实现
2007/01/02 PHP
在PHP中PDO解决中文乱码问题的一些补充
2010/09/06 PHP
php强制下载文件函数
2016/08/24 PHP
JavaScript flash复制库类 Zero Clipboard
2011/01/17 Javascript
js判断变量是否未定义的代码
2020/03/28 Javascript
js toFixed()方法的重写实现精度的统一
2014/03/06 Javascript
JavaScript函数详解
2015/02/27 Javascript
JS创建事件的三种方法(实例代码)
2016/05/12 Javascript
node.js中express-session配置项详解
2017/05/31 Javascript
JS简单实现查看文档创建日期、修改日期和文档大小的方法示例
2018/04/08 Javascript
微信小程序开发问题之wx.previewImage
2018/12/25 Javascript
基于 vue-skeleton-webpack-plugin 的骨架屏实战
2019/08/05 Javascript
JS基础之逻辑结构与循环操作示例
2020/01/19 Javascript
vue项目查看vue版本及cli版本的实现方式
2020/10/24 Javascript
CentOS 8.2服务器上安装最新版Node.js的方法
2020/12/16 Javascript
[03:55]2014DOTA2国际邀请赛 Fnatic经理采访赢DK在情理之中
2014/07/10 DOTA
python数据结构树和二叉树简介
2014/04/29 Python
python文件和目录操作函数小结
2014/07/11 Python
理解生产者消费者模型及在Python编程中的运用实例
2016/06/26 Python
解决python Markdown模块乱码的问题
2019/02/14 Python
Python字符串匹配之6种方法的使用详解
2019/04/08 Python
Django实现跨域请求过程详解
2019/07/25 Python
Python基础之字符串操作常用函数集合
2020/02/09 Python
python3 实现口罩抽签的功能
2020/03/11 Python
澳大利亚排名第一的露营和户外设备在线零售商:Outbax
2020/05/06 全球购物
世界经理人咨询有限公司面试
2014/09/23 面试题
大二法学专业职业生涯规划范文
2014/02/12 职场文书
开学典礼演讲稿
2014/05/23 职场文书
公务员诚信承诺书
2014/05/26 职场文书
机械电子工程专业自荐书
2014/06/10 职场文书
2014年度考核工作总结
2014/12/24 职场文书
2015年预防青少年违法犯罪工作总结
2015/05/22 职场文书
小学开学典礼新闻稿
2015/07/17 职场文书
商业计划书如何写?关键问题有哪些?
2019/07/11 职场文书
CSS3通过var()和calc()函数实现动画特效
2021/03/30 HTML / CSS
详解nginx进程锁的实现
2021/06/14 Servers