勤勤学长 发表于 2020-4-29 20:47

一个QQ互联如何实现不同域名不同站点的登录案例展示!微信同理

近期实现的一个功能,实现不同站点之间如何共用一个QQ互联登录。


众所周知,一个QQ互联应用只能绑定一个域名做回调。


我们就可以以此作为跳板。


业务逻辑:发起站点带着信息到跳板,完成登录后回调,再根据之前信息带着相关数据再次跳转回来。


现在开始代码
//代码出现是qqxz_encode和qqxz_decode是我封装的一种可逆加密解密函数。

发起站:

    //发起请求
    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;
    }

跳板站点接收信息
    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登录
    }


跳板站点回调部分
    //回调
    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;
       
}
}

发起站点回调
    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,能重复使用。
当然,这个不是最好的解决方法,只是我目前能想到的唯一方法。


你好,我是勤勤学长,欢迎讨论。

XinSong 发表于 2020-4-29 20:59

{:1_908:}你可以给他,加一个,加一个参数

chinaround 发表于 2020-4-29 21:37

学习了,辛苦了

bdanccd 发表于 2021-4-6 17:29

正需要这个 ,学习了,

残-梦 发表于 2021-10-25 15:31

有成品没
页: [1]
查看完整版本: 一个QQ互联如何实现不同域名不同站点的登录案例展示!微信同理