近期实现的一个功能,实现不同站点之间如何共用一个QQ互联登录。
众所周知,一个QQ互联应用只能绑定一个域名做回调。
我们就可以以此作为跳板。
业务逻辑:发起站点带着信息到跳板,完成登录后回调,再根据之前信息带着相关数据再次跳转回来。
现在开始代码
//代码出现是qqxz_encode和qqxz_decode是我封装的一种可逆加密解密函数。
发起站:
[PHP] 纯文本查看 复制代码
//发起请求
public function qqsend(){
$damain = $_SERVER['SERVER_NAME'];
$str = 'url='.$damain.'&rand='.time();
$url = 'https://***.cn/plugin/qq_connect/index/qqsend?key='.urlencode(qqxz_encode($str));//跳板站点
//var_dump($url);
header("location:".$url);
exit;
}
跳板站点接收信息
[PHP] 纯文本查看 复制代码 public function qqsend(){
session('domain',null);
session('domain_time',null);
if(!empty($_GET['key'])){
$data = $_GET['key'];
$key = qqxz_decode($data);//如果被改动就会解密失败
if (!$key) {
exit( 'key格式不正确');
}else{
parse_str($key, $key_data );
}
session('domain',$key_data['url']);//记录发起登录站点的url
session('domain_time',time());//记录发起登录的时间简单判断是否超时
$qqconfig=$this->getPlugin()->getConfig();
$oauth=new Oauth();
$oauth->qq_login($qqconfig);
exit;
}
//后边是原始站点正常QQ登录
}
跳板站点回调部分
[PHP] 纯文本查看 复制代码 //回调
public function qqback(){
if(!empty(session('domain'))){
$time = time();
if((session('domain_time')-$time)>300){
exit('登录超时,请重新发起登录');
}
$oauth = new Oauth();
$accesstoken = $oauth->qq_callback();
$openid = $oauth->get_openid();
$qc = new QC($accesstoken,$openid);
$userinfo = $qc->get_user_info();
$userInfo['nickname'] = $userinfo['nickname'];//昵称
$userInfo['avatar'] = $userinfo['figureurl_1'];//头像
$userInfo['openid'] = $openid;//昵称
$userInfo['time'] = session('domain_time');
$url = 'http://'.session('domain').'/plugin/qq_connect/index/qqback?key='.urlencode(qqxz_encode(http_build_query($userInfo)));//我们再把得到的数据进行加密回调给发起站点
header("location:".$url);
exit;
}
}
发起站点回调
[PHP] 纯文本查看 复制代码 public function qqback(){
if(!empty(input('get.key'))){
$data = input('get.key');
$time = time();
$str =qqxz_decode($data);
if(!$str){
exit( '非法请求');
}
parse_str($str, $data);
if(($time-$data['time'])>300){
exit('登录超时,请重新发起登录');
}
}else{
exit('非法请求');
}
$qq_openId =$data['openid'];
$qq_nickname = $data["nickname"];
$qq_avatar = $data["avatar"];
}
大致就是这样,记录一个时间用于时间范围判断,这样就能避免同一个URL,能重复使用。
当然,这个不是最好的解决方法,只是我目前能想到的唯一方法。
你好,我是勤勤学长,欢迎讨论。 |