PHP开发短信验证码,防止不停发送,有效期限制

技术QQ交流群:294088839

基于TP3.2

创建一个短信验证码记录表

CREATE TABLE `smscode` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `phone` varchar(255) NOT NULL,
  `code` varchar(12) NOT NULL,
  `sendtime` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


在获取验证码的方法中

//发送短信

    public function get_tel(){
        //手机号
        $mobile=I('post.mobile');
        //用户名
        $username=I('post.username');


        $sta=M('user')->where(array('user_name'=>$username))->field('user_id')->find();
        if($sta['user_id']!=null){
            $this->error('用户名已存在');
            exit;
        }

      //正则 判断手机号是否正确
        $stat=$this->checkphone($mobile);
        if($stat==false){
            $this->error('手机号不规范');
            exit;
        }

         
        //判断发送次数
        $Maxcount = 3;
        $todaytime = strtotime(date("Y-m-d"));
        M()->startTrans();
        $Code = D("smscode");


        $where = array();


        $where['phone'] = $mobile;


        $where['sendtime'] = array('GT',$todaytime);

     //查询今天此电话号发送了几次
        $count = $Code->where($where)->count();
        //$count 是undefined $Maxcount 等于3

       
        if($count >= $Maxcount){
            $this->error('验证码发送频繁,请明天再试');
            exit;
        }else{

            //发送内容
            $y1=rand(0,9);
            $y2=rand(0,9);
            $y3=rand(0,9);
            $y4=rand(0,9);
            $y5=rand(0,9);
            $y6=rand(0,9);
            $num=$y1.$y2.$y3.$y4.$y5.$y6;
            $aaa= $Code->add(array(
                'phone'    => $mobile,

                'code'     => $num,

                'sendtime' => time()

            ));
            //对汉字进行转码
            $msg  =urlencode(mb_convert_encoding('您的验证码为【'.$num.'】',"gb2312","UTF-8"));
            //查询短信配置信息
            $sys=M('tel_sys')->where(array('tel_id'=>1))->field('tel_text')->find();


            $sys=json_decode($sys['tel_text'],true);


            //功能:发送短信
            //用户名
            $name = $sys['username'];
            //密码
            $pwd  = $sys['password'];
            //目标手机号
            $dst = $mobile;

            //地址
            $url=$sys['url']."?name=$name&pwd=$pwd&dst=$dst&msg=$msg";
            
           //通过curl 进行发送
            $status=$this->urlGet($url);
            //返回格式  num=1&success=电话&faile=&err=发送成功!&errid=0
            //parse_str 转换成数组
            parse_str($status, $arr);


            if($aaa && $arr['errid']==0){
                M()->commit();
                $this->success('发送成功');
            }else{
                M()->rollback();
                $this->error('发送失败');
            }

        }
    }


   //在点击注册的方法中

    public function registered(){

            $form = I('post.');
            //电话
            $phone= trim($form['user_tel']);
            //验证码
            $verify=trim($form['verify']);
    
                //查询验证码
                $Code = D("smscode");
                $info = $Code->where(array('phone' => $phone))->order("sendtime desc")->find();

               //判断验证码过期
                if( (time()-5*60) > $info['sendtime']){
                    $this->error('验证码获取超时');
                    exit;
                }

                //判断验证码是否正确
                if(!$info || $info['code'] != $verify){
                    $this->error('验证码错误');
                    exit;
                }
             
     
            }
    }

你可能感兴趣的:(学习总结)