ThinkCMF QQ互联插件教程3——QQ互联插件文件配置


接上一篇:

修改Oauth.php中的带代码:

原代码:

public function qq_login(){
    $appid = $this->recorder->readInc("appid");
    $callback = $this->recorder->readInc("callback");
    $scope = $this->recorder->readInc("scope");
    //-------生成唯一随机串防CSRF攻击
    $state = md5(uniqid(rand(), TRUE));
    $this->recorder->write('state',$state);
    //-------构造请求参数列表
    $keysArr = array(
        "response_type" => "code",
        "client_id" => $appid,
        "redirect_uri" => $callback,
        "state" => $state,
        "scope" => $scope
    );
    $login_url =  $this->urlUtils->combineURL(self::GET_AUTH_CODE_URL, $keysArr);
    header("Location:$login_url");
}

修改为:

public function qq_login($qqconfig){ 
    $appid = $qqconfig["appid"];
    $callback = $qqconfig["callback"];
    $scope = "get_user_info";
    //-------生成唯一随机串防CSRF攻击
    $state = md5(uniqid(rand(), TRUE));
    $this->recorder->write('state',$state);
    //-------构造请求参数列表
    $keysArr = array(
        "response_type" => "code",
        "client_id" => $appid,
        "redirect_uri" => $callback,
        "state" => $state,
        "scope" => $scope
    );
    $login_url =  $this->urlUtils->combineURL(self::GET_AUTH_CODE_URL, $keysArr);
    header("Location:$login_url");die();
}

修改Recorder.php文件

原代码:

public function __construct(){
    $this->error = new ErrorCase();
    //-------读取配置文件
    $incFileContents = file(ROOT."comm/inc.php");
    $incFileContents = $incFileContents[1];
    $this->inc = json_decode($incFileContents);
    if(empty($this->inc)){
        $this->error->showError("20001");
    }
    if(empty($_SESSION['QC_userData'])){
        self::$data = array();
    }else{
        self::$data = $_SESSION['QC_userData'];
    }
}

修改为:

public function __construct(){
    $this->error = new ErrorCase();
    //-------读取配置文件
    $incFileContents = '{"appid":"'.config('qq.appid').'","appkey":"'.config('qq.appkey').'","callback":"'.config('qq.callback').'",
    "scope":"'.config('qq.scope').'","errorReport":'.config('qq.errorReport').',"storageType":"'.config('qq.storageType').'",
    "host":"'.config('qq.host').'","user":"'.config('qq.user').'","password":"'.config('qq.password').'",
    "database":"'.config('qq.database').'"}';
    $this->inc = json_decode($incFileContents);
    if(empty($this->inc)){
        $this->error->showError("20001");
    }
    if(empty($_SESSION['QC_userData'])){
        self::$data = array();
    }else{
        self::$data = $_SESSION['QC_userData'];
    }
}

5、创建controller文件夹,在其下创建IndexController.php文件

protected $appid;
    protected $appkey;
    protected $callback;
    public function __construct(Request $request = null)
    {
        parent::__construct($request); 
        $qqconfig=$this->getPlugin()->getConfig();
        config("qq",$qqconfig);
        $this->appid=$qqconfig["appid"];
        $this->appkey=$qqconfig["appkey"];
        $this->callback=$qqconfig["callback"];
    }
    //发起请求
    public function qqsend(){
        $redirect = $this->request->param("redirect");
        if (empty($redirect)) {
            $redirect = $this->request->server('HTTP_REFERER');
        } else {
            if (strpos($redirect, '/') === 0 || 
            strpos($redirect, 'http') === 0) {
            } else {
                $redirect = base64_decode($redirect);
            }
        }
        if(!empty($redirect)){
            session('login_http_referer', $redirect);
        }
        if (cmf_is_user_login()) { //已经登录时直接跳到首页
            return redirect($this->request->root() . '/');
        } else {
            $qqconfig=$this->getPlugin()->getConfig();
            $oauth=new Oauth();
            $oauth->qq_login($qqconfig);
        }
    }
    //回调
    public function qqback(){
        //请求accesstoken
        $oauth = new Oauth();
        $accesstoken = $oauth->qq_callback();
        //获取open_id
        $openid = $oauth->get_openid();
        //设置有效时长(7天)
        cookie('accesstoken', $accesstoken, 24*60*60*7);
        cookie('openid', $openid, 24*60*60*7);
        //根据accesstoken和open_id获取用户的基本信息
        $qc = new QC($accesstoken,$openid);
        $userinfo = $qc->get_user_info();
        $openidfind=db("third_party_user")->where("openid",$openid)->find();
        hook_one("user_login_start", $hookParam);
        if ($openidfind)
        {
            $thirddata=[
                "access_token"=>$accesstoken,
                "nickname"=>$userinfo["nickname"],
                "login_times"=>$openidfind["login_times"]+1,
                "last_login_time"=>time(),
                "expire_time"=>time()+24*60*60*7,
                "last_login_ip"=>$this->getIp(),
                "third_party"=>"QQ",
            ];
            $userdata=[
                "last_login_ip"=>$thirddata["last_login_ip"],
                "last_login_time"=>$thirddata["last_login_time"],
            ];
            $thirddatares=db("third_party_user")
            ->where("openid",$openid)->update($thirddata);
            $userdatares=db("user")
            ->where("id",$openidfind["user_id"])->update($userdata);
            $userid=$openidfind["user_id"];
        }
        else
        {
            if ($userinfo["gender"]=="男")
                $sex=1;
            else if ($userinfo["gender"]=="女")
                $sex=2;
            else
                $sex=0;
            $userdata=[
                "last_login_ip"=>$this->getIp(),
                "last_login_time"=>time(),
                "create_time"=>time(),
                "sex"=>$sex,
                "user_nickname"=>$userinfo["nickname"],
                "avatar"=>$userinfo["figureurl_2"],
                "signature"=>$userinfo["msg"],
            ];
            $userdatares=db("user")->insertGetId($userdata);
            $thirddata=[
                "access_token"=>$accesstoken,
                "nickname"=>$userinfo["nickname"],
                "last_login_time"=>$userdata["last_login_time"],
                "expire_time"=>$userdata["last_login_time"]+24*60*60*7,
                "last_login_ip"=>$userdata["last_login_ip"],
                "create_time"=>$userdata["create_time"],
                "openid"=>$openid,
                "user_id"=>$userdatares,
                "third_party"=>"QQ",
                "login_times"=>1,
            ];
            $thirddatares=db("third_party_user")->insert($thirddata);
            $userid=$userdatares;
        }
            $res=db("user")->where("id",$userid)->find();
                session('user', $res);
            $token = cmf_generate_user_token($res["id"], 'web');
            if (!empty($token)) {
                session('token', $token);
            }
        $session_login_http_referer = session('login_http_referer');
        $redirect = empty($session_login_http_referer) ? $this->request->root() : $session_login_http_referer;
        $log=0;
        //拉黑判断。
        if ($res['user_status'] == 0) {
            $log=3;
        }
        switch ($log) {
            case 0:
                cmf_user_action('login');
                $this->redirect($redirect);
                break;
            case 1:
                $this->error(lang('PASSWORD_NOT_RIGHT'));
                break;
            case 2:
                $this->error('账户不存在');
                break;
            case 3:
                $this->error('账号被禁止访问系统');
                break;
            default :
                $this->error('未受理的请求');
        }
        var_dump($openidfind);
    }
    //获取访客ip
    public function getIp()
    {
        $request = request();
        $realip=$request->ip(0,true);
        return $realip;
    }

index控制器里__construct方法中的代码解释:

初始化插件配置,将配置加入config方便使用。

qqsend()方法中的代码解释:

获取登录前的地址,判断是否登录,已经登录就返回登录前的地址,未登录就跳转qq授权登录界面

回调方法qqback()中的代码解释:

获取token和openid判断code等信息是否正确,判断当前登录的qq用户是否已经存在,不存在就创建新用户并绑定,如果存在就直接登录所绑定的用户。

请登陆后在进行评论
  • 随机文章
  • 关于PHPstorm移动网络下不能够连接各大云服务器的解决办法(could not list the contents of folder)

    关于PHPstorm移动网络下不能够连接各大云服务器的解决办法(could not list the contents of folder)

    ThinkCMF QQ互联插件教程4——QQ互联插件安装使用

    ThinkCMF QQ互联插件教程4——QQ互联插件安装使用

    ThinkPHP5 一个字段对应多个条件查询的解决办法

    ThinkPHP5 一个字段对应多个条件查询的解决办法

    关于thinkcmf模板配置文件的值修改后无变化的解决办法

    关于thinkcmf模板配置文件的值修改后无变化的解决办法

    layui框架——表格详解(预告)

    layui框架——表格详解(预告)

    一台电脑如何同时访问外网和内网

    一台电脑如何同时访问外网和内网