ThinkPHP 3.2 使用QQ互联登录自己的网站代码分享

发布时间:2017年12月20日 10:25:46编辑:admin阅读(4016)评论(0)

    pc的使用好像越来越少了,但总不会消失的,笔记编程还是要用电脑的啊

    使用微信登录,微信扫码登录,就是没使用过pc的QQ登录,琢磨一下还是用QQ登录吧(微信个人审核要我盖公章,审核不过

    QQ登录其实跟微信登录没多大的区别,都是一家公司的,套路都差不多,哈哈哈

    首先先申请,这里有区别,

    QQ互联

    QQ开发平台

    QQ互联是pc端的操作,QQ开发平台是手机应用的操作,前者类似微信公众号,后者类似微信开发号,名字也差不多。

    总之我做的是PC端,不是APP,这里申请QQ互联就可以了,还有就是手机浏览器登录也是QQ互联。

    QQ互联注册地址:点击这里注册,注册之后创建应用,当然这里会叫你先个人身份审核,这里我们按照他们说的做就是,提交审核,等待审核通过

    等待审核之后就可以看到获得得权限就一个登录 get_user_info

    微信截图_20171220100715.png


    有这个就够了,我们就可以用来做登录插图一张怕看不到,放大一下字体

    然后就可以啃文档了,或者直接复制我的代码,(不知道是好是坏,时间足够的话还是自己慢慢啃一下吧,毕竟多学有益)

    第一步:获取  code

    第二步:通过 code 获取  Access Token

    第三步:通过 Access Token 获取 用户 OpenID,

    第四步: 通过 OpenID 获取 用户信息 user_info


    总结就是这四个步骤,啃文档的时候会发现 第二步第三步会有一个pc端请求地址,wap请求地址

    没错,这里分手机端和PC端的,我也做了。在使用的过程中发现并没卵用

    直接着pc端登录就可以了,手机端通这个连接也可以登录成功,如果你使用wap连接地址登录,第二步的时候就一直等待返回数据

    然而,QQ互联那边就是不给你数据,气死你


    好了,上干货

            /*
                author 逍客 1078576480@qq.com
            */
            /*
                system_id  公共模块查询APPID并返回,我这里是存在数据,个人可以自行修改放在config.php 配置文件内,我是存在数据库便于后台修改维护
                web_qq_redirect_uri  回调地址  这里是回调接口,跟你放在QQ互联配置回调地址一致。然后这里需要  URLEncode
            */
            public function qq_login(){
    		//$url = 'https://graph.qq.com/user/get_user_info';
    		$appid = system_id('web_qq_appid');
    		$appkey = system_id('web_qq_appkey');
    		$web_qq_redirect_uri = system_id('web_qq_redirect_uri');
    		/*
    			获取 code
    		*/
    		if(is_null($_GET["code"])){
    			$url = 'https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id='.$appid.'&redirect_uri='.$web_qq_redirect_uri.'&state='.C('project_name');
    			header("Location:".$url);
    		}else{
    			//dump('手机');die;
    			/*
    				isMobile() 判断是手机端还是PC端
    			*/
    			if(isMobile()){
    				$url = 'https://graph.z.qq.com/moc2/token';
    			}else{
    				$url = 'https://graph.qq.com/oauth2.0/token';
    			}
    			/*
    				获取 access_token
    			*/
    			$url = $url.'?grant_type=authorization_code&client_id='.$appid.'&client_secret='.$appkey.'&code='.$_GET["code"].'&redirect_uri='.$web_qq_redirect_uri;
    			//dump($url);;die;
    			$res = httprequest_get($url);
    			//dump($res);die;
    			$user_obj = explode_string('&',$res);
    			$user_obj = explode_string('=',$user_obj[0]);
    			/*
    				获取 APPID
    			*/
    			if(isMobile()){
    				$urls = 'https://graph.z.qq.com/moc2/me';
    			}else{
    				$urls = 'https://graph.qq.com/oauth2.0/me';
    			}
    			//dump($user_obj);
    			//dump($user_obj[1]);die;
    			$urls = $urls.'?access_token='.$user_obj[1];
    			//dump($urls);
    			$res = httprequest_get($urls);
    			$start = strpos($res, '{');
    			$end = strpos($res, '}');
    			
    			$va = substr($res,10,$end-9);
    			$user = json_decode($va,true);
    			if($user_object = find_model('web_grant_qq','openid="'.$user['openid'].'"')){
    				$user_id = find_model('web_users','id='.$user_object['user_id']);
    				$_SESSION['user_name'] = $user_id['username'];
    				$_SESSION['user_id'] = $user_id['id'];
    				$_SESSION['avatar'] = $user_id['avatar'];
    				update_model('web_users','id='.$user_id['id'],array('last_login_ip'=>get_user_ip(),'last_login_time'=>time()));
    				echo '<script>alert("登录成功");location.href="'.__MODULE__.'/index/index"</script>';
    			}else{
    				/*
    					获取 用户信息
    				*/
    				$url = 'https://graph.qq.com/user/get_user_info?access_token='.$user_obj[1].'&oauth_consumer_key='.$appid.'&openid='.$user['openid'];
    				$res = json_decode(httprequest_get($url),true);
    				//dump($res);die;
    				$user_ed = array(
    					'username' => $res['nickname'],
    					'avatar' => $res['figureurl_qq_2'],
    					'city' => $res['city'],
    					'province' => $res['province'],
    					'sex' => $res['gender']=='男'?1:2,
    					'statues' => 1,
    					'register_time' => time(),
    					'register_time' => time(),
    				);
    				if($user_id = add_model('web_users',$user_ed)){
    					$grant_qq = array(
    						'openid' => $user['openid'],
    						'user_id' => $user_id,
    						'create_time' => time(),
    					);
    					if(add_model('web_grant_qq',$grant_qq)){
    						$_SESSION['user_name'] = $res['nickname'];
    						$_SESSION['user_id'] = $user_id;
    						$_SESSION['avatar'] = $res['figureurl_qq_2'];
    						update_model('web_users','id='.$user_id,array('last_login_ip'=>get_user_ip(),'last_login_time'=>time()));
    						echo '<script>alert("登录成功");location.href="'.__MODULE__.'/index/index"</script>';
    					}else{
    						echo '<script>alert("操作异常");location.href="'.__MODULE__.'/index/index"</script>';
    					}
    				}else{
    					echo '<script>alert("操作异常");location.href="'.__MODULE__.'/index/index"</script>';
    				}
    			}
    			
    		}
    	}


    接口文件写完了,然后是公共类接口

            /*
                author 逍客 1078576480@qq.com
            */
            /*
                因后面手机端测试登录一直不自动跳转,查询之后发现pc端可以当手机端的使用,所以我这判断是否手机端的方法直接返回false
            */
            function isMobile(){
    		return false;
    			// 如果有Http_X_WAP_PROFILE则一定是移动设备
    		if (isset ($_SERVER['HTTP_X_WAP_PROFILE'])){
    			return true;
    		}
    			// 如果via信息含有wap则一定是移动设备,部分服务商会屏蔽该信息
    		if (isset ($_SERVER['HTTP_VIA'])){
    			// 找不到为flase,否则为true
    			return stristr($_SERVER['HTTP_VIA'], "wap") ? true : false;
    		}
    		// 脑残法,判断手机发送的客户端标志,兼容性有待提高
    		if (isset ($_SERVER['HTTP_USER_AGENT'])){
    			$clientkeywords = array ('nokia',
    				'sony',
    				'eriCSSon',
    				'mot',
    				'samsung',
    				'htc',
    				'sgh',
    				'lg',
    				'sharp',
    				'sie-',
    				'philips',
    				'panasonic',
    				'alcatel',
    				'lenovo',
    				'iphone',
    				'ipod',
    				'blackberry',
    				'meizu',
    				'android',
    				'netfront',
    				'symbian',
    				'ucweb',
    				'windowsce',
    				'palm',
    				'operamini',
    				'operamobi',
    				'openwave',
    				'nexusone',
    				'cldc',
    				'midp',
    				'wap',
    				'mobile'
    			);
    			// 从HTTP_USER_AGENT中查找手机浏览器的关键字
    			if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT']))){
    				return true;
    			}
    		}
    			// 协议法,因为有可能不准确,放到最后判断
    		if (isset ($_SERVER['HTTP_ACCEPT'])){
    			// 如果只支持wml并且不支持HTML那一定是移动设备
    			// 如果支持wml和html但是wml在html之前则是移动设备
    		if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html')))){
    			return true;
    			}
    		}
    			return false;
    		}
    	
    	/*
    	    配置信息
    	*/
    	function system_id($web_name){
    		$system = find_model('web_system','id=1');
    		return $system[$web_name]==''?'未知':$system[$web_name];
    	}

    QQ登录的代码就全部分享完了感谢支持


关键字QQ登录验证