php实现第三方登录,thinkphp实现qq第三方登录

最近实现了QQ登录,qq第三方登录步骤就是首先获取appid,appkey,填写callback;

拼接登录url,带上自己的应用信息,

通过callback地址获取token,通过token获取登陆者openid,通过openid获取用户信息。详细的可以去qq互联上看。

接下来说thinkphp3.2如何使用,首先我封装了自己的qqAuth类,代替了官方的SDK。很简洁实用。

这个类就长这个样子:<?php

namespace Vendor\qq;

class qqAuth{

//申请到的appid

private $appid='';

//申请到的appkey

private $appkey='';

//QQ登录成功后跳转的地址,请确保地址真实可用,否则会导致登录失败。

private $callback='';

//QQ授权api接口.按需调用

private $scope='';

public function __construct($appid,$appkey,$callback,$scope=''){

$this->appid=$appid;

$this->appkey=$appkey;

$this->callback=$callback;

if(empty($scope)){

$this->scope='get_user_info,add_share,list_album,add_album,

upload_pic,add_topic,add_one_blog,add_weibo';

}else{

$this->scope=$scope;

}

}

/**

* QQ登录

*/

function qqLogin(){

$_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF 保护

$login_url = "https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id="

. $this->appid . "&redirect_uri=" . urlencode($this->callback)

. "&state=" . $_SESSION['state']

. "&scope=".$this->scope;

header("Location:$login_url");

}

/**

* 回调函数

*/

function qqCallback(){

if($_REQUEST['state'] == $_SESSION['state']){

$token_url = "https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&"

. "client_id=" . $this->appid. "&redirect_uri=" . urlencode($this->callback)

. "&client_secret=" . $this->appkey. "&code=" . $_REQUEST["code"];

$response = file_get_contents($token_url);

if (strpos($response, "callback") !== false){

$lpos = strpos($response, "(");

$rpos = strrpos($response, ")");

$response = substr($response, $lpos + 1, $rpos - $lpos -1);

$msg = json_decode($response);

if (isset($msg->error)){

echo "

error:

" . $msg->error;

echo "

msg :

" . $msg->error_description;

exit;

}

}

$params = array();

parse_str($response, $params);

$_SESSION["access_token"] = $params["access_token"];

}else{

echo("The state does not match. You may be a victim of CSRF.");

}

}

/**

* 获取用户openid

*/

function getOpenid(){

$graph_url = "https://graph.qq.com/oauth2.0/me?access_token="

. $_SESSION['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);

if (isset($user->error)){

echo "

error:

" . $user->error;

echo "

msg :

" . $user->error_description;

exit;

}

$_SESSION["openid"] = $user->openid;

}

/**

* 获取用户信息

*/

function getUserInfo(){

$get_user_info = "https://graph.qq.com/user/get_user_info?"

. "access_token=" . $_SESSION['access_token']

. "&oauth_consumer_key=" . $this->appid

. "&openid=" . $_SESSION["openid"]

. "&format=json";

$info = file_get_contents($get_user_info);

$arr = json_decode($info, true);

return $arr;

}

}

将这个类放到ThinkPHP/Library/Vendor/qq目录下,然后再需要用到的地方useuse \Vendor\qq\qqAuth;

接下来就是登陆方法了,首先在页面上放置在qq登陆按钮:

59488867dfdd7.png未登录?

qqlogin.pngfunction toQzoneLogin(){

var _url='/index/qqlogin'; //转向网页的地址;

var name='TencentLogin'; //网页名称,可为空;

var iWidth=450; //弹出窗口的宽度;

var iHeight=320; //弹出窗口的高度;

//获得窗口的垂直位置

var iTop = (window.screen.availHeight - 30 - iHeight) / 2;

//获得窗口的水平位置

var iLeft = (window.screen.availWidth - 10 - iWidth) / 2;

window.open(_url, name, 'height=' + iHeight +

',innerHeight=' + iHeight + ',width=' + iWidth +

',innerWidth=' + iWidth + ',top=' + iTop + ',left=' + iLeft +

',status=1,toolbar=no,menubar=no,location=1,resizable=no,scrollbars=0,titlebar=no');

}

然后写qqlogin方法:/**

* QQ登陆

* @return [type] [description]

*/

public function qqLogin(){

$qqlogin=new qqAuth(F('webSet')['appid'],F('webSet')['appkey'],F('webSet')['callback']);

$qqlogin->qqLogin();

}

/**

* QQ登陆回调函数

* @return [type] [description]

*/

public function qqlogincallback(){

$qqlogin=new qqAuth(F('webSet')['appid'],F('webSet')['appkey'],F('webSet')['callback']);

$qqlogin->qqCallback();

$qqlogin->getOpenid();

//此处是为了跳转到saveVisitor方法,此方法记录登陆者信息,然后把小窗口关掉

echo "";

}

实例化qqAuth类需要传三个参数,就是你在qq互联上申请到的appid,appkey,填写的callback地址。

在saveVisitor函数里我获取了用户信息,用以下代码获取:$qqlogin=new qqAuth(F('webSet')['appid'],F('webSet')['appkey'],F('webSet')['callback']);

$visitor=$qqlogin->getUserInfo();

至于获取到了什么信息,就是昵称,openid,birthyear,地址等信息,根据个人需要处理吧。

效果图如下:

594889e1b14e9.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值