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下通过POST还是GET来传值
Jun 05 PHP
php模拟js函数unescape的函数代码
Oct 20 PHP
PHP flock 文件锁详细介绍
Dec 29 PHP
解析link_mysql的php版
Jun 30 PHP
php将字符串随机分割成不同长度数组的方法
Jun 01 PHP
thinkPHP内置字符串截取函数用法详解
Nov 15 PHP
PHP二维数组去重算法
Dec 17 PHP
Yii 2.0中场景的使用教程
Jun 02 PHP
php 删除一维数组中某一个值元素的操作方法
Feb 01 PHP
浅谈PHP封装CURL
Mar 06 PHP
php xhprof使用实例详解
Apr 15 PHP
PHP实现抽奖功能实例代码
Jun 30 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中使用Oracle数据库(4)
2006/10/09 PHP
php addslashes和mysql_real_escape_string
2010/01/24 PHP
CentOS6.5 编译安装lnmp环境
2014/12/21 PHP
使用PHPCMS搭建wap手机网站
2015/09/20 PHP
PHP错误Warning:mysql_query()解决方法
2015/10/24 PHP
PHP生成图像验证码的方法小结(2种方法)
2016/07/18 PHP
php微信公众号开发之现金红包
2018/04/16 PHP
ThinkPHP5&amp;5.1实现验证码的生成、使用及点击刷新功能示例
2020/02/07 PHP
一段利用WSH获取登录时间的jscript代码
2008/05/11 Javascript
在jquery中处理带有命名空间的XML数据
2011/06/13 Javascript
jquery实现多级下拉菜单的实例代码
2013/10/02 Javascript
通过Jquery的Ajax方法读取将table转换为Json
2014/05/31 Javascript
JavaScript indexOf方法入门实例(计算指定字符在字符串中首次出现的位置)
2014/10/17 Javascript
JavaScript简单判断复选框是否选中及取出值的方法
2015/08/13 Javascript
Javascript blur与click冲突解决办法
2017/01/09 Javascript
Node.js中用D3.js的方法示例
2017/01/16 Javascript
js实现功能比较全面的全选和多选
2017/03/02 Javascript
js判断手机系统是android还是ios
2017/03/07 Javascript
解决jQuery ajax动态新增节点无法触发点击事件的问题
2017/05/24 jQuery
JavaScript设计模式之观察者模式(发布订阅模式)原理与实现方法示例
2018/07/27 Javascript
[01:08:48]LGD vs OG 2018国际邀请赛淘汰赛BO3 第三场 8.25
2018/08/29 DOTA
Python查看多台服务器进程的脚本分享
2014/06/11 Python
在Heroku云平台上部署Python的Django框架的教程
2015/04/20 Python
Python爬虫实现百度图片自动下载
2018/02/04 Python
django使用xadmin的全局配置详解
2019/11/15 Python
美国牙科折扣计划:DentalPlans.com
2019/08/26 全球购物
error和exception有什么区别
2012/10/02 面试题
2014年应届大学生自我评价
2014/01/09 职场文书
教学实习自我评价
2014/01/28 职场文书
党校个人自我鉴定范文
2014/03/28 职场文书
气象学专业个人求职信
2014/04/22 职场文书
2014年自愿离婚协议书范本
2014/09/25 职场文书
2014年村支部书记四风对照检查材料思想汇报
2014/10/02 职场文书
幼儿园小班教师随笔
2015/08/14 职场文书
2019银行竞聘书
2019/06/21 职场文书
win10输入法不见了只能打出字母怎么解决?
2022/08/05 数码科技