当前位置:首页 > PHP > 正文内容

php对接七牛云短信验证码实战

陈杰3年前 (2020-12-01)PHP2548

短信验证码登录的用处非常的大,登录,注册,修改密码,安全相关的啥都可以干。

选定的七牛云短信是因为存储也是用的七牛云,七牛的sdk都加载进来了,也懒得去换其他的厂家了。

下面上代码:


Controller层

/**
* 发送验证码
*/
public function send_code(Request $request, LoginService $loginService, LoginValidator $loginValidator)
{
   $params = $loginValidator->checkValidate($request->all(), 'send_code');
   if (!$this->encryption($params['phone'], $params['time'], $params['check']))
       return self::error('小朋友,你是否有很多问号?');
   $ip           = $request->ip();
   $params['ip'] = $ip;
   $code         = $loginService->send_code($params);
   return self::success();
}


有个验证器,验证规则如下

public $rules = [
   'send_code'          => [
       'phone' => 'required|regex:/^1[23456789][0-9]{9}$/',
       'check' => 'required|regex:/^[\_a-z0-9]{32}$/',
       'time'  => 'required|integer|min:1000000'
   ]
];

主要是正则表达式验证phone是否为手机号码。


然后一个encryption方法,主要是用于验证每次点击发送验证码的人为真人,前端没有用老掉牙的输入验证码那种方法,还是点击一下智能验证,然后前端生成一个check字段和time时间戳一起请求服务器。

方法代码和逻辑如下

public function encryption($phone, $time, $check)
{
   /**
    * 发送验证码带验证加密字段
    * 1、发送之前请求服务器,计算服务器和本地时间差
    * 2、加密字段check 加密方式 当前时间戳(加上时间差) + *&^haha66%$#@! + 待发送手机号码
    *      check = md5(time + "*&^haha66%$#@!" + phone)
    * 3、倒序排列 check = check.reverse()
    *      例如 abcdefg  倒序为 gfedcba
    * 4、转换所有的a_  a.replace('a','_')
    *      例如 gfedcba  转换为 gfedcb_
    * 5、请求发送验证码接口 参数为
    *      {phone,check,time}
    */
   if ($time < time() - 120)
       self::returnError('人机验证超时', 401);

   $check = strrev(str_replace('_', 'a', $check));
   $token = md5("{$time}*&^haha66%$#@!{$phone}");
   if ($check == $token)
       return true;
   return false;
}


如果那个人来盗刷我们的短信量,做成什么短信轰炸机的话,就提示他

小朋友,你是否有很多问号?


前面的都是验证器,验证变量的逻辑

最后去service层看实现代码

/**
* 发送验证码
*/
public function send_code(array $params)
{
   $cache = Cache::get('send_code_ip_' . $params['ip'], false);
   if ($cache)
       self::returnError('请勿重复发送验证码');
   $data = QiniuModel::get_first();
   $code = rand(1000, 9999);

   $prod = env('APP_PROD');
   if ($prod) {
       //正式服
       $ret = $this->sendMessage($data, '1315598288451289088', $params['phone'], ['code' => $code]);
       Cache::put('send_code_phone_' . $params['phone'], $code, 300);
       Cache::put('send_code_ip_' . $params['ip'], true, 40);
       return true;
   } else {
       Cache::put('send_code_phone_' . $params['phone'], $code, 300);
       Cache::put('send_code_ip_' . $params['ip'], true, 40);
       self::returnError('操作成功', 200, $code);
   }
}

记得缓存一下ip,记录一下该ip是不是一直在点击发送验证码。


扫描二维码至手机访问

扫描二维码推送至手机访问。

版权声明:本文由何烦过虎溪发布,如需转载请注明出处。

转载请注明出处:http://95shouyou.com/?id=16

分享给朋友:

相关文章

php接淘宝联盟,阿里妈妈,实现淘宝客功能

php接淘宝联盟,阿里妈妈,实现淘宝客功能

需要用到的sdk在淘宝开放平台自行下载生成淘宝需要用到的配置文件private function get_tb_config(){    $config = ConfigModel...

php接拼多多的多多进宝,实现淘客功能

php接拼多多的多多进宝,实现淘客功能

在项目中有一个板块是接拼多多的多多进宝,实现多多客的功能,主要就是拉取商品列表,拉取商品详情,生成推广链接。composer require justmd5/duoduoke-sd...

Laravel带条件查询多个count

Laravel带条件查询多个count

在一个数据表中,我们需要用到聚合函数count来查询符合条件的总数。举例一个场景:我们有一个帖子,这个帖子可以分别被好中差评,好中差评记录用一个单独的记录表来存储。如果用户点击好评,那么该帖子作者的经...

laravel实现微信公众号授权登录实战

微信公众号授权登录实战框架:laravel依赖:overtrue/wechat首先安装一下easywechat依赖composer require overtrue/wechat:...

lavel对接个推别名推送

lavel对接个推别名推送

新项目采用uniapp开发,需要用到推送功能,之前接过极光,其中的一些坑都踩过了,但是unipush用的是个推的推送,那就只有重写踩坑了。composer  require&nbs...

Lumen框架报错Class session does not exist

Lumen框架报错Class session does not exist

由于lumen框架是为速度而生的 Laravel 框架,所以移除了session的支持,虽然在ide中代码提示可以敲出Session::put()方法出来,但是最终还是提示的是Class sessio...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。