首页    资源分享   程序源码

QQ一键登陆接入流程以及php实例代码说明

219 人浏览 | 来源:红心 | 发布时间:2016-08-09 14:27

QQ登陆网站接入大致分为以下三个步骤:

1、提交网站接入申请


    1.1 注册开发者帐号  http://connect.qq.com/

    1.2 添加网站

    1.3 网站信息完善 网站申请后会获得appidappkey


2、网站添加QQ登陆程序接口,调试测试。提交审核后等待应用审核通过

    2.1 在您的网站上添加QQ登陆入口,用户点击登陆会弹出QQ登陆窗口,若认证成功则显示授权页面

    请求URL:

 https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=[YOUR_APPID]&redirect_uri=[YOUR_REDIRECT_URI]&scope=[THE_SCOPE]
 
 参数说明:
         client_id:网站申请后得到的appid
         redirect_uri:回调地址
         scope:网站接入一般用 get_user_info
 返回结果:
         回调地址成功返回将得到Authorization Code值(也就是code值)

    2.2 通过Authorization Code获取Access Token

          请求URL:

https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&client_id=[YOUR_APP_ID]&client_secret=[YOUR_APP_Key]&code=[The_AUTHORIZATION_CODE]&state=[The_CLIENT_STATE]&redirect_uri=[YOUR_REDIRECT_URI]
 参数说明:
         client_id:网站申请后得到的appid
         client_secret:网站申请后得到的appkey
         code:2.1接口中返回的code值
         redirect_uri:回调地址
 返回结果:
         access_token=YOUR_ACCESS_TOKEN&expires_in=3600

    2.3 使用Access Token来获取用户的OpenID

        请求URL:

https://graph.qq.com/oauth2.0/me?access_token=YOUR_ACCESS_TOKEN
参数说明:
         access_token:2.2接口中返回的token值
 返回结果:
         callback({"client_id":"YOUR_APPID","openid":"YOUR_OPENID"});
         openid:用户的openid

    2.4 使用Access Token以及OpenID来访问和修改用户数据

        请求URL:

https://graph.qq.com/user/get_user_info?access_token=YOUR_ACCESS_TOKEN&oauth_consumer_key=YOUR_APP_ID&openid=YOUR_OPENID
参数说明:
         access_token:2.2接口中返回的token值
         oauth_consumer_key:网站申请后得到的appid
         openid:2.3接口中返回的用户openid
 返回结果:
         用户信息,具体信息请看下面图示

1470727414120106.png


3、当应用审核通过后,测试QQ登陆,没问题的话就可以上线应用了


php代码实例:

<?php
/**
*此示例是基于thinkphp3.2的代码,不过对于懂php的新手来说也是能看懂的
*/
namespace Home\Controller;

class PublicController extends CommonController{
	protected $qq_appid				= "";
	protected $qq_appkey			= "";
	protected $qq_redirect_uri		= "";

	public function _initialize()
	{
		parent::_initialize();

		$this->qq_appid				= "您申请的appid";
		$this->qq_appkey			= "您申请的appkey";
		$this->qq_redirect_uri		= urlencode("您的域名/Public/checkQqCode");//回调地址
	}
	//登陆入口
	public function authLogin(){
		$type = I('get.type');
		if($type == 'qq'){
			$_SESSION['state'] = md5(uniqid(rand(), TRUE));
			$jump_login_url = "https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id="
					. $this->qq_appid . "&redirect_uri=" . $this->qq_redirect_uri
					. "&state=" . $_SESSION['state']
					. "&scope=get_user_info";
			header("Location:$jump_login_url");
			exit();
		}
		}else{
			echo '非法操作';exit();
		}
	}
	/*QQ登陆验证开始*/
	public function checkQqCode(){
		$code	= I("get.code");
		$access_token = $this->getQqTokenInfo($code);
		$qq_open_id = $this->getQqOpenId($access_token);
		/*验证用户是否绑定过QQ*/
		$map['qq_openid']	= $qq_open_id;
		$qq_user_info = M("User")->where($map)->find();
		if($qq_user_info){
			$up_user['id']				= $qq_user_info['id'];
			$up_user['last_login_ip']	= get_client_ip(0);
			$up_user['last_login_time']	= time();
			M("User")->save($up_user);
			session("mx_user_id",$qq_user_info['id']);
			header("Location:".U("Order/index"));
			exit();
		}else{
			/*添加用户信息 保存QQ信息*/
			$user_data['wx_openid']		= '';
			$user_data['qq_openid']		= $qq_open_id;
			$user_data['reg_time']		= time();
			$user_data['reg_ip']		= get_client_ip(0);
			$user_data['last_login_ip']	= get_client_ip(0);
			$user_data['last_login_time']	= time();
			$user_data['user_status']		= 1;
			if($insert_userid = M("User")->add($user_data)){
				/*读取QQ用户信息 更新数据库*/
				$qq_userinfo = $this->getQqUserInfo($access_token,$qq_open_id);
				$userinfo['user_id']		= $insert_userid;
				$userinfo['user_nickname']	= $qq_userinfo['nickname']?$qq_userinfo['nickname']:'';
				$userinfo['user_sex']		= $qq_userinfo['gender']=='女'?'2':'1';
				$userinfo['user_province']	= $qq_userinfo['province']?$qq_userinfo['province']:'';
				$userinfo['user_city']		= $qq_userinfo['city']?$qq_userinfo['city']:'';
				M("UserInfo")->add($userinfo);
				session("mx_user_id",$insert_userid);
				header("Location:".U("Order/index"));
			}else{
				_alert_location('QQ登陆失败,请重试',U("Public/login"));
			}
		}

	}
	/*QQ获取token*/
	public function getQqTokenInfo($code){
		$qq_get_access_token_url = "https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&"
				. "client_id=" . $this->qq_appid. "&redirect_uri=" . $this->qq_redirect_uri
				. "&client_secret=" . $this->qq_appkey. "&code=" . $code;
		$qq_access_token_con = curl_get_contents($qq_get_access_token_url);
		if (strpos($qq_access_token_con, "callback") !== false)
		{
			$lpos = strpos($qq_access_token_con, "(");
			$rpos = strrpos($qq_access_token_con, ")");
			$qq_access_token_con  = substr($qq_access_token_con, $lpos + 1, $rpos - $lpos -1);
			$msg = json_decode($qq_access_token_con);
			if (isset($msg->error))
			{
				echo "<h3>code_error:</h3>" . $msg->error;
				echo "<h3>code_msg  :</h3>" . $msg->error_description;
				exit();
			}
		}
		$params = array();
		parse_str($qq_access_token_con, $params);
		return $params["access_token"];

	}
	/*QQ获取用户openid*/
	public function getQqOpenId($access_token){
		$graph_url = "https://graph.qq.com/oauth2.0/me?access_token="
				. $access_token;
		$str  = curl_get_contents($graph_url);
		if (strpos($str, "callback") !== false)
		{
			$lpos = strpos($str, "(");
			$rpos = strrpos($str, ")");
			$str  = substr($str, $lpos + 1, $rpos - $lpos -1);
		}
		$user = json_decode($str);
		if (isset($user->error))
		{
			echo "<h3>openid_error:</h3>" . $user->error;
			echo "<h3>openid_msg  :</h3>" . $user->error_description;
			exit;
		}
		return $user->openid;
	}

	/*QQ获取个人用户信息*/
	public function getQqUserInfo($access_token,$qq_open_id){
		$get_user_info = "https://graph.qq.com/user/get_user_info?"
				. "access_token=" . $access_token
				. "&oauth_consumer_key=" . $this->qq_appid
				. "&openid=" . $qq_open_id
				. "&format=json";

		$info = curl_get_contents($get_user_info);
		$arr = json_decode($info, true);
		return $arr;
	}
}
?>