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

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

陈杰4个月前 (12-01)PHP358

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

选定的七牛云短信是因为存储也是用的七牛云,七牛的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

分享给朋友:

相关文章

通过supervisor管理laravel的queue队列

通过supervisor管理laravel的queue队列

配置文件[program:queue]command=php artisan queue:work redis --tries=3 --delay=3directory=/www/wwwroot/sh...

laravel分表model映射的思路

预先估计会出现大数据量并且访问频繁的表,将其分为若干个表这种预估大差不差的,论坛里面发表帖子的表,时间长了这张表肯定很大,几十万,几百万都有可能。 聊天室里面信息表,几十个人在一起一聊一个晚上,时间长...

七牛云删除文件和批量删除文件

在项目中因为用到了七牛云的对象存储,价格公道,也降低我们的项目维护成本。但是在实际使用过程中,例如用户换了头像我们就需要删除用户之前的头像,以降低我们的存储成本。所以研究了一下七牛云的删除单个文件和批...

通过代码创建多个同样的mysql表

在分库分表中可能要同时创建多个结构相同但后缀不同的表,通过代码实现for ($i = 3; $i <= 20; $i++) {    DB::connection('...

Laravel记录SQL操作日志的方法

Laravel记录SQL操作日志的方法

在laravel中我们有一个需求就是,涉及到sql操作的update,insert,delete操作的语句,我们都要写一个日志来记录一下说说方法吧。在项目目录app/Providers/AppServ...

laravel跨库多态关联实战

laravel跨库多态关联实战

点赞记录表做了分库分表,位于副库里面表结构该点赞表关联了8个不同的表,因为业务原因,评论回复表有四个板块,所以做了4个评论记录表,4个回复记录表,且结构有细微不同。目标是用户获得被点赞记录,根据不同的...

发表评论

访客

看不清,换一张

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