https://blog.csdn.net/uknow0904/article/details/80336941

本人在自己博客(Laravel)的注册部分 使用手机号注册,需要发送短信验证码。

 使用云片(https://www.yunpian.com/)的 短信服务提供商,当然具体短信服务提供商大家可以自由选择。

1,实现流程

输入手机号,点击获取验证码
提交正确的短信验证码后,注册完成

2,实现思路图

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 手机短信验证码 laravel 实现流程的更多相关文章

  1. Java调用WebService接口实现发送手机短信验证码功能,java 手机验证码,WebService接口调用

    近来由于项目需要,需要用到手机短信验证码的功能,其中最主要的是用到了第三方提供的短信平台接口WebService客户端接口,下面我把我在项目中用到的记录一下,以便给大家提供个思路,由于本人的文采有限, ...

  2. Atitit. 破解  拦截 绕过 网站 手机 短信 验证码  方式 v2 attilax 总结

    Atitit. 破解  拦截 绕过 网站 手机 短信 验证码  方式 v2 attilax 总结 1. 验证码的前世今生11.1. 第一代验证码 图片验证码11.2. 第二代验证码  用户操作 ,比如 ...

  3. 四:java调接口实现发送手机短信验证码功能

    1.点击获取验证码之前的样式: 2.输入正确的手机号后点击获取验证码之后的样式: 3.如果手机号已经被注册的样式: 4.如果一个手机号一天发送超过3次就提示不能发送: 二:前台的注册页面的代码:reg ...

  4. atitit.破解 拦截 绕过 网站 手机 短信 验证码 之自动获取手机短信方式 attilax 总结

    atitit.破解  拦截 绕过 网站 手机 短信 验证码 之自动获取手机短信方式 attilax 总结 1. 自动获取手机短信方式的原理 1 2. 调用api 1 3. ----核心代码 2 4.  ...

  5. java后台通过Servlet给用户发送手机短信验证码,第一次写勿喷,欢迎转载

    短信验证码跟自己在Servlet画的验证码不一样,我们不用管短信验证码是怎么产生的,我们只需要关注如何调用短信验证码,在短信验证码里面添加 自己需要的随机数或者其他的内容. 现在直接上流程 第一步找一 ...

  6. php短信验证码接口接入流程及代码示例

    对于绝大部分企业来说,所使用的短信验证码接口都是第三方短信服务商所提供,目前市场上短信服务商有很多,在此向大家推荐一家动力思维乐信,运营13年,值得信赖! 就拿动力思维乐信短信验证码接口为例,详细介绍 ...

  7. python 自动获取手机短信验证码

    需要一个有权限的 APK 在手机实时存储短信到手机内存 /sdcard/smslog.txt 里(外部SD卡也可以知道能通过adb命令访问到): /***** ...... try {long tim ...

  8. <自动化测试>之<自动获取手机短信验证码>

    第一次写博,最近解决了做自动化测试短信验证码自动获取填入的方法减少了脚本的人工干预,并非拦截短信,所以不存在安全警报提醒,拿出来分享给大家,有感兴趣的大家可以加Q1856100 目前在职测试开发,,写 ...

  9. django之集成阿里云通信(发送手机短信验证码)

    python3 + django2.0 集成 "阿里云通信" 服务: (SDK文档地址:https://help.aliyun.com/document_detail/55491. ...

随机推荐

  1. netbeans7.4 在项目内查找 快捷键 ctrl shift f

  2. ROWID的使用——快速删除重复的记录

    ROWID是数据的详细地址,通过rowid,oracle可以快速的定位某行具体的数据的位置.ROWID可以分为物理rowid和逻辑rowid两种.普通的表中的rowid是物理rowid,索引组织表(I ...

  3. NOIP模拟 6.30

    Problem 1 护花(flower.cpp/c/pas) [题目描述] 约翰留下他的N(N<=100000)只奶牛上山采木.他离开的时候,她们像往常一样悠闲地在草场里吃草.可是,当他回来的时 ...

  4. js实现使用递归来计算1~任意数字的和

    function getSum(n){ if(n==1){ return 1; } return n+getSum(n-1); } var res = getSum(100); console.log ...

  5. SQLyog12.0.9下载、安装和破解

    原文转载连接:https://blog.csdn.net/lihua5419/article/details/73881837/ sqlyog百度云链接(永久有效):http://pan.baidu. ...

  6. 助力深度学习!阿里开源可插拔 GPU 共享调度工具

    根据 Gartner 对全球 CIO 的调查结果显示,人工智能将成为 2019 年组织革命的颠覆性力量.对于人工智能来说,算力即正义,成本即能力,利用 Docker 和 Kubernetes 代表云原 ...

  7. CSS(中)篇

    1.1行高 行高属于文字的属性 行高=文字大小+上间距+下间距(默认行高=18px) 行高的作用: 设置文字垂直方向中有距离 文字垂直居中(行高=容器的高度) 影响行高的因素: 文字大小可以改变行高 ...

  8. 注解1 --- JDK内置的三个基本注解 --- 技术搬运工(尚硅谷)

    @Override: 限定重写父类方法, 该注解只能用于方法 @Deprecated: 用于表示所修饰的元素(类, 方法等)已过时.通常是因为所修饰的结构危险或存在更好的选择 @SuppressWar ...

  9. 强力Django+杀手级xadmin开发在线教育网站

    强力Django+杀手级xadmin开发在线教育网站采用 Python3.7全新开发 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的 ...

  10. 使用Redis管道提升性能

    首发于 樊浩柏科学院 Redis 的 管道 (pipelining)是用来打包多条无关命令批量执行,以减少多个命令分别执行带来的网络交互时间.在一些批量操作数据的场景,使用管道可以显著提升 Redis ...