实现第三方登录——qq
现在有很多应用网站等等都支持第三方登录,例如我们都在用的qq、微信、支付宝等都能实现一键登录方便了很多,我们今天来讲一下QQ登录
第三方登录其实就是获取用户授权后的的头像账号等等,作为登陆的一个凭证。
要想实现QQ第三方登录需要要到腾讯的相应的站的去申请,qq互联申请
个人审核时的页面不好找,点击你自己的名字就可以找到了 ,提交相应的资料审核就OK了
首先通过上边的个人审核,在创建应用,填写相应的信息,提交审核,等待审核通过以后就能 使用了
步骤就是这样 等待申请通过就可以使用腾讯提供给你的接口了
他会给你提供app_id和app_key
接下来就是代码流程了 在说代码之前首先要知道逻辑流程,
一般都是这样的,你要先按放好图标,(这个可以自己下载 也可以使给你提供好的 可以看自己)写好连接点击后会弹出这样的页面让你选择登录方式,确认后他就会登陆成功。
登录后我们看一看获取的参数他给的是json格式的,包含了基本信息 还有头像等等,这些json需要转换。
在这个登陆过程中他一共走了几步流程呢?让我们来分析一下
以tpshop为例,client_id 就是你的app_id, client_secret就是app_key,
他首先通过https://graph.qq.com/oauth2.0/authorize获得code值
第二部通过https://graph.qq.com/oauth2.0/token获取token
第三部通过token 获取open_id https://graph.qq.com/oauth2.0/me
最后就是获取用户信息了。每一步里边的参数请看测试的代码吧
了解的差不多自己先去测试测试吧 相信你应该差不多了。
<?php
//应用的APPID
$app_id = "";
//应用的APPKEY
$app_key = "";
//成功授权后的回调地址
$my_url = "http://callback.gaoxin520.top/callback.php";
//获取Authorization Code 的code值
session_start();//开启session
$code = $_REQUEST["code"];//存放Authorization Code
if(empty($code))
{
//state参数用于防止CSRF攻击,成功授权后回调时会原样带回
$_SESSION['state'] = md5(uniqid(rand(), TRUE));
//拼接url
$url = "https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url) . "&state=" . $_SESSION['state'];
echo("<script> top.location.href='" . $url . "'</script>");
exit;
}
if($_REQUEST['state'] == $_SESSION['state'] || 1)
{
//拼接URL
$token_url = "https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&" . "client_id=" . $app_id . "&redirect_uri=" . $my_url . "&client_secret=" . $app_key . "&code=" . $code;
$response = file_get_contents($token_url);
//print_r($response);
if (strpos($response, "callback") !== false)//如果登录用户临时改变主意取消了,返回true!==false,否则执行step3
{
$lpos = strpos($response, "(");
$rpos = strrpos($response, ")");
$response = substr($response, $lpos + 1, $rpos - $lpos -1);
$msg = json_decode($response);
if (isset($msg->error))
{
echo "<h3>error:</h3>" . $msg->error;
echo "<h3>msg :</h3>" . $msg->error_description;
exit;
}
}
//Step3:使用Access Token来获取用户的OpenID
$params = array();
parse_str($response, $params);//把传回来的数据参数变量化
$graph_url = "https://graph.qq.com/oauth2.0/me?access_token=".$params['access_token'];
$str = file_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);//存放返回的数据 client_id ,openid
if (isset($user->error))
{
echo "<h3>error:</h3>" . $user->error;
echo "<h3>msg :</h3>" . $user->error_description;
exit;
}
// echo("Hello " . $user->openid);
//echo("Hello " . $params['access_token']);
//Step4:使用<span >openid,</span><span >access_token来获取所接受的用户信息。</span>
$user_data_url = "https://graph.qq.com/user/get_user_info?access_token={$params['access_token']}&oauth_consumer_key={$app_id}&openid={$user->openid}&format=json";
$user_data = file_get_contents($user_data_url);//此为获取到的user信息
echo $user_data;//查看返回的用户信息
}
else
{
echo("The state does not match. You may be a victim of CSRF.");
}
?>