zoukankan      html  css  js  c++  java
  • 微信扫码登录

    /*
         * 红包问卷,扫码登录
         * example:问卷链接为http://cc/s/qwer
         * 用户点击上述连接,没有$GET['esurvey_token']就跳转到这里
         * 跳转到User/esurvey_scan_code,携带2个参数,1个是问卷链接,一个是问卷token=md5(pid.'sunjiuyang'),然后跳转去扫二维码。
         * 之后跳转到User/esurvey_scan_code_redirect
         */
        public function esurvey_scan_code($esurvey_url,$esurvey_token){
            $callback = C('USER_HOST')."/user.php/home/Wechat/esurvey_scan_code_redirect?esurvey_url=".$esurvey_url."&esurvey_token=".$esurvey_token;
            $callback = urlencode($callback);
    
            $state  = md5(uniqid(rand(100,999), TRUE)); //-------生成唯一随机串防CSRF攻击
            $_SESSION["wx_state"] = $state; //存到SESSION
    
            $wxurl = "https://open.weixin.qq.com/connect/qrconnect?appid=".self::APPID_SITE."&redirect_uri=".$callback."&response_type=code&scope=snsapi_login&state=".$state."#wechat_redirect";
    
            header("Location: $wxurl");
        }
    
        /*
         * js形式 扫码答问卷
         */
        public function esurvey_scan_code_by_js($esurvey_url,$esurvey_token){
            $callback = C('USER_HOST')."/user.php/home/Wechat/esurvey_scan_code_redirect?esurvey_url=".$esurvey_url."&esurvey_token=".$esurvey_token;
            $callback = urlencode($callback);
    
            $state  = md5(uniqid(rand(100,999), TRUE)); //-------生成唯一随机串防CSRF攻击
            $_SESSION["wx_state"] = $state; //存到SESSION
    
            $this->assign('callback',$callback);
            $this->assign('state',$state);
            $this->display();
        }
        /*
         * 红包问卷 扫码登录回调地址
         * 根据get的code参数,拿到openid和unionid
         * 若user表中没有unionid,说明是全新的微信用户,add到user表中.
         * 若有unionid,则取出user_id值
         * 跳转到答题页面,携带参数有2个,一个是uid,一个是esurvey_token
         * 答题页面首先验证esurvey_token是否正确,正确则可以答题。
         */
        public function esurvey_scan_code_redirect(){
    
            //防CSRF攻击
            if ($_GET['state'] != $_SESSION["wx_state"]) {
                exit("501");
            }
            if(!$_GET['code']){
                exit("微信回调没有code参数");
            }
            $esurvey_url = I('get.esurvey_url','','strval');
            $esurvey_token = I('get.esurvey_token','','strval');
    
            //调用http方法 得到access_token与openid与unionid
            $url = 'https://api.weixin.qq.com/sns/oauth2/access_token';
            $para['appid'] = self::APPID_SITE;
            $para['secret'] = self::SECRET_SITE;
            $para['code'] = $_GET['code'];
            $para['grant_type'] = 'authorization_code';
            $accessInfo = http($url,$para,$method = 'GET', $header = array(), $multi = false);
    
            //添加到数据库中用来调试
            $data['text'] = '扫码得access_token:'.$accessInfo;
            $data['time'] = date('Y-m-d H:i:s',time());
            M('aaa')->add($data);
    
            $accessInfo = json_decode($accessInfo);
            //验证user中是否有unionid
            $unionid = $accessInfo->unionid;
            if(!$unionid){
                $url = base64_decode(base64_decode($esurvey_url));
                $this->success('扫码登录失败,请重试',$url);
                exit;
            }
    
            $userInfo = M('user')->where("unionid = '%s' and status != 2",array($unionid))->find();
    
            if(!$userInfo){ //没有此unionid,新用户。
                $data['openid_user'] = $accessInfo->openid;
                $data['unionid'] = $accessInfo->unionid;
                $data['xcode']= md5(rand(100000,999999));
                $data['role_id'] = 1;
                $data['status'] = 1;
                $data['addtime'] = time();
                $data['login_num'] = 1;
                $data['last_login'] = time();
                $data['regist_type'] = 4;    //扫码
                $data['is_mobile'] = 2;      //没绑定手机
                $data['wx_type'] = 1;        //没有关注公众号
    
                $user_id = M('user')->add($data);
                $xcode = $data['xcode'];
                $role_id = 1;
            }else {//有unionid,
                if(!$userInfo['openid_user']){//没有user网站的openid,保存到user表中
                    $data['openid_user'] = $accessInfo->openid;
                    $data['status'] = 1;
                    M('user')->where("unionid = '%s' and status != 2",array($unionid))->save($data);
                }
                $user_id = $userInfo['user_id'];
                $xcode = $userInfo['xcode'];
                $role_id = $userInfo['role_id'];
            }
    
            $row['uid'] = $user_id;
            $row['xcode'] = $xcode;
            $row['role_id'] = $role_id;
            $row['status'] = 1;
            $sid = md5($user_id.$xcode.time());
            $datas['sid'] = $sid;
            $datas['data'] = json_encode($row);
            M("sessions")->add($datas);
    
            //添加到数据库中用来调试
            $data['text'] = '扫码得sessions:'.json_encode($row);
            $data['time'] = date('Y-m-d H:i:s',time());
            M('aaa')->add($data);
    
            $_SESSION['sid'] = $sid;
            $_SESSION['xcode'] = $xcode;
            $_SESSION['user_id'] = $user_id;
            $_SESSION['regist_type'] = 4;
            $_SESSION['entry_login'] = 1;
    
            $domain = C("domain");
            setcookie("xcode",$xcode,time()+3156000,'/',$domain);
            setcookie("user_id",$user_id,time()+3156000,'/',$domain);
            setcookie("regist_type",4,time()+3156000,'/',$domain);
            setcookie('EYUID',$sid,time()+3156000,'/',$domain);
            setcookie('ENTRY_LOGIN',1,time()+3156000,'/',$domain);
            setcookie('GUID',$user_id,time()+3156000,'/',$domain);
            setcookie('role_id',1,time()+3156000,'/',$domain);
    
            //问卷链接解码后,添加esurvey_token参数
            $esurvey_url = base64_decode(base64_decode($esurvey_url));
            if(strpos($esurvey_url,'?')){
                $esurvey_url .= "&esurvey_token=".$esurvey_token;
            }else{
                $esurvey_url .= "?esurvey_token=".$esurvey_token;
            }
    
            header('location:'.$esurvey_url);
        }
  • 相关阅读:
    数据库——数据操作——数据的增删改(8)
    数据库——完整性约束(7)
    数据库——数据类型(6)
    生成代码的代码 之 POJO生成器 之二 模板实现
    生成代码的代码 之 错误代码类生成器
    生成代码的代码 之 POJO生成器
    [翻译] Trident-ML:基于storm的实时在线机器学习库
    Vim实用技巧系列
    基于循环数组的无锁队列
    Vim实用技巧系列
  • 原文地址:https://www.cnblogs.com/feiwu123/p/5786949.html
Copyright © 2011-2022 走看看