php对接七牛云短信验证码实战
短信验证码登录的用处非常的大,登录,注册,修改密码,安全相关的啥都可以干。
选定的七牛云短信是因为存储也是用的七牛云,七牛的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是不是一直在点击发送验证码。
