开发阶段(偏前端的同学可以查看 JS版 教程)
3.1. QQ互联 官网提供了 SDK 以及对应的 示例代码,但是为了帮助同学们更好理解,我进行了部分删减,力求最简单的方法实现目的。
官方SDK
3.2. 因为是写教程,所以代码就尽量简单明了一点。实际上 'PHP' 网站接入 'QQ登录' 非常简单,原则上只需要自己编辑如下图所示的 2个 'PHP' 脚本:
Code
callback.php # 用于【QQ互联】中已经通过审核的回调地址
index.php # 用于需要接入【QQ登录】的网站入口
3.3. 复制 QQ互联 官方 SDK 包中的 'API' 目录到自己的 'Web根目录',生成如下所示的 'Web目录' 结构:
# 'D:/www/website/'
..............other statis................
~~~~~/API <<<<<< 官方 SDK 中的文件夹
......................other statis..............
~~~~~callback.php <<<<<< 回调地址文件
~~~~~index.php <<<<<< 网站入口
3.4. 在 'API' 的子目录 '/comm' 下新建 'inc.php',输入以下内容:
<?php die('forbidden'); ?> // 防止恶意访问文件内容,下面的内容不能使用换行符
{"appid":"改成你自己的AppID","appkey":"改成你自己的AppKey","callback":"改成你已经通过审核的回调地址","scope":"get_user_info,add_share,list_album,add_album,upload_pic,add_topic,add_one_blog,add_weibo,check_page_fans,add_t,add_pic_t,del_t,get_repost_list,get_info,get_other_info,get_fanslist,get_idolist,add_idol,del_idol,get_tenpay_addr","errorReport":false,"storageType":"file","host":"localhost","user":"root","password":"root","database":"test"}
3.5. 在 'index.php' 文件中输入以下内容:
require_once('./API/qqConnectAPI.php'); // 'qqConnectAPI.php'中已经启用了 session
if (!empty($_SESSION['user_info'])) // 检查是否使用'QQ登录'过网站
{
$qc=new QC;
$qc->qq_login(); // 跳转到'QQ登录'的界面
exit;
}
$user=json_decode($_SESSION['user_info'],true);
var_dump($user);
?>
......................other HTML code..............
3.6. 在 'callback.php' 文件中输入以下内容:
require_once('./API/qqConnectAPI.php');
define('USERLIST','./userList.json'); // 本地缓存登录的、已经授权网站的'QQ用户'
$qc=new QC();
$access_token=$qc->qq_callback();
$open_id=$qc->get_openid();
/**
非常重要的一行代码,
因为后面需要获取QQ用户的信息,
所以需要使用前面确认登录的、已经授权网站的'QC'实例
**/
$qc=new QC($access_token,$open_id);
$storage=[];
if(is_file(USERLIST)) $storage=json_decode(file_get_contents(USERLIST),true);
if(count($storage)){
if (array_key_exists($open_id,$storage)) {
/**
检查当前用户是否自定义的过期时间
**/
if($storage[$open_id]['expires']>$_SERVER['REQUEST_TIME']){
$_SESSION['user_info']=json_encode([
'username'=>$storage[$open_id]['username'],
'_id'=>$storage[$open_id]['_id']
]);
header('location:http://www.example.com/index.php'); // 填写上面'index.php'对应的网站入口地址
exit;
}
}
}
$user_info=$qc->get_user_info(); // 获取'QQ用户'的基本信息
$storage[$open_id]=[
'accessToken'=>$access_token,
'username'=>$user_info["nickname"],
'expires'=>$_SERVER['REQUEST_TIME']+3600*3,
'_id'=>strval($_SERVER['REQUEST_TIME']) // 自建'QQ用户ID',用于网站内部查询缓存
];
$_SESSION['user_info']=json_encode([
'username'=>$user_info['nickname'],
'_id'=>$storage[$open_id]['_id']
]);
file_put_contents(USERLIST,json_encode($storage));
header('location:http://www.example.com/index.php'); // 填写上面'index.php'对应的网站入口地址
exit;
3.7. 最后,再回过头去检查 '3.4小节' 提到的 'inc.php' 中设置的 'appid'、'appkey'、'callback' 是否与 QQ互联 中通过审核的网站应用信息一致。