下发短信验证码,除了注册就是验证手机号
简单实现原理就是
用手机号和一个键作为key存到缓存里,
用户请求的时候,验证这个手机号是不是已经申请过key*(即已手机号为缓存的key有没有,)如果有,并且当前时间与当时请求时间在60秒之内,那就不要在请求发送短信接口了。
另外,如果发送成功了,要设置一个验证码的时间有效期,一般10分钟。
然后在去对应的找回密码或者是注册中调用一下这个对应的memkey就可以。
下发代码如下。
if(is_numeric($mobile) && strlen($mobile)==11){
$sendtimekey = "Sendsmscode_mobile_sendtime_".$mobile;
$lastsendtime = (int) Mem($sendtimekey);
$now = time();
if($now - $lastsendtime < 60){
Error('请勿频繁下发验证码,两次验证码发送时间不能小于60秒!',-2003);
}
switch($action){
case 'register':
$this->checkRegister($mobile,$type) === true ? Error('您的手机号码注册过,请勿重复注册,谢谢!',-2001) : null;
break;
case 'findpassword':
$this->checkRegister($mobile,$type) === false ? Error('您的手机号码尚未注册过!',-2002) : null;
break;
default:
break;
}
$code = rand(1111,9999);
$content = "验证码:$code (任何索取行为均为诈骗),10分钟之内有效,请确保仅在登录时亲自填入,不告知他人。";
$data = sendsms($mobile,$content);
if($data!==false){
$key = "Sendsmscode_mobile_".$mobile;
Mem($key,$code,600); //缓存10分钟
Mem($sendtimekey,$now,60);
// Success('短信验证码下发成功!短信验证码是 '.$code,1001);
Success('短信验证码下发成功!',1001);
}else{
Error('短信下发失败!',-2001);
}
}
找回代码如下
$key = "Sendsmscode_mobile_".$mobile;
$mobilevercode = Mem($key);
if(empty($mobilevercode) || ($mobilevercode!=$vercode)){
Error('手机号或验证码错误!',-2003);