侯体宗的博客
  • 首页
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

ThinkPHP接入QQ互联实现登录的案例分析

ThinkPHP  /  管理员 发布于 9年前   258

本篇介绍了使用ThinkPHP接入qq互联实现第三方登录的方法,作为一个小案例来为各位讲解,希望对各位有帮助。

ThinkPHP接入QQ互联实现登录的案例分析

我的一个二级域名项目想在也想接入QQ第三方登录功能,该项目采用的thinkphp5框架开发的项目,在网上搜了一些接入的案例,个人觉得鱼龙混杂不太适合自己,现在自己重新在thinkphp5框架上开发这个功能,下面是详细的开发步骤。

(推荐教程:thinkphp教程)

第一步、下载QQ互联SDK,我们是基于thinkphp5框架下的,当然是要用PHP版的SDK,下载下来后的文件目录如下。

1.png

第二步、将SDK主要目录上传到服务器合适的目录下,先说下SDK的主要的目录是API文件夹里面的class目录,当初为了做配置设置项测试,我上传了install文件夹,然后再开发环境配置了APP ID、APP Key以及callback_url,配置好之后会在API/comm文件夹中多处一个inc.php配置文件,最后再recorder类中会引用这个配置文件。可是在后面的 开发过程中我发现会报这个错The state does not match. You may be a victim of CSRF。后面我把qqlogin方法里面的 state放到session中,对官网的DEMO SDK已经完全失去信心了,不在用QQ互联全部的文件而是挑几个重要的类文件来做开发。后面想想官方给的SDK只是普通的PHP代码格式,我应用到thinkphp那很多东西都已经变了,最后我选择上个类文件,QC.php、URL.php、Oauth.php上传到extend/qqlogin目录下。在thinkphp5的项目中扩展类一般上传到extend文件夹下,如下图所示我上次的目录位置。

2.png

第三步、改造上述三个类文件,因为QC.php是继承了Oauth.php,我们从后者改起,去掉require_once,加上命名空间如namespace qqlogin,首先看成员属性,类常量是腾讯平台的地址,不用管,原来有三个属性,recorder、error不需要,注释掉或直接删掉。下文同样,因为5个类文件我们只用到3个类文件,一个是报错类一个读取配置相关类。下面看Oauth.php成员属性、qqlogin跳转方法、qqcallback回调方法的,其他两个类文件没有太大的改大,按照上述规则改即可

<?php/* PHP SDK * @version 2.0.0 * @author [email protected] * @copyright © 2013, Tencent Corporation. All rights reserved. */namespace qqlogin;use qqlogin;class Oauth{    const VERSION = "2.0";    const GET_AUTH_CODE_URL = "https://graph.qq.com/oauth2.0/authorize";    const GET_ACCESS_TOKEN_URL = "https://graph.qq.com/oauth2.0/token";    const GET_OPENID_URL = "https://graph.qq.com/oauth2.0/me";    // protected $recorder;    public $urlUtils;    // protected $error;        function __construct(){        // $this->recorder = new Recorder();        $this->urlUtils = new URL();        // $this->error = new ErrorCase();    }    public function qq_login(){        // $appid = $this->recorder->readInc("appid");        // $callback = $this->recorder->readInc("callback");        // $scope = $this->recorder->readInc("scope");        $appid = $this->appid;        $callback = $this->callback;        $scope = $this->scope;        //-------生成唯一随机串防CSRF攻击        $state = md5(uniqid(rand(), TRUE));        // $this->recorder->write('state',$state);        session('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);        return $login_url;    }    public function qq_callback(){        // $state = $this->recorder->read("state");        //--------验证state防止CSRF攻击        if(input('state') != session('state')){            // $this->error->showError("30001");            exit('30001');        }        //-------请求参数列表        $keysArr = array(            "grant_type" => "authorization_code",            "client_id" => $this->appid,            "redirect_uri" => urlencode($this->callback),            "client_secret" => $this->appkey,            "code" => $_GET['code']        );        //------构造请求access_token的url        $token_url = $this->urlUtils->combineURL(self::GET_ACCESS_TOKEN_URL, $keysArr);        $response = $this->urlUtils->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)){            //     $this->error->showError($msg->error, $msg->error_description);            // }        }        $params = array();        parse_str($response, $params);        // $this->recorder->write("access_token", $params["access_token"]);        // return $params["access_token"];        session('access_token',$params["access_token"]);    }}

第四步、编写控制器调用函数和回调函数,同时检查回调地址是否正确(回调地址是当你添加QQ第三方登录QQ互联返回跳转的地址,该地址携带重要参数,能获取最后用户的数据),有些时候如果你在QQ互联填写的回调地址与你控制器的不一样,那么最后就会卡在那个QQ互联填写的回调地址那,如www.100txy.com/index.php?code=65B7668A4F1BBB71DD0DF52B55AC1FC1&state=804e921e18e3545ecdf690316639c067。下面是控制器方法

use qqlogin\QC;// 处理qq登录    public function qqlogin(){        $qq = new QC();        $url = $qq->qq_login();        $this->redirect($url);    }    // qq登录回调函数    public function qqcallback(){        $qq = new QC();        $qq->qq_callback();        $qq->get_openid();        $qq = new QC();        $datas = $qq->get_user_info();        die(var_dump($datas));//为用户数据    }

值得注意的是在回调函数里面要实例化两次QC才能拿到用户信息,第二次实例化的时候才有openid和access_token两个参数。

更多Thinkphp教程,请关注!

以上就是ThinkPHP接入QQ互联实现登录的案例分析的详细内容,更多请关注其它相关文章!


  • 上一条:
    yii和thinkphp的区别
    下一条:
    thinkphp5如何连接数据库
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • thinkphp + mongodb项目中数据加载慢问题分析及解决(0个评论)
    • thinkphp6框架中封装redis操作类(0个评论)
    • thinkphp6框架中实现定时任务功能流程步骤(0个评论)
    • Thinkphp5.1框架中实现Session+Redis会话共享流程步骤(0个评论)
    • TP5框架版本5.0.10安全漏洞根据官方补丁修复,也是本站安全漏洞修复(0个评论)
    • 近期文章
    • 在go语言中实现字符串可逆性压缩及解压缩功能(0个评论)
    • 使用go + gin + jwt + qrcode实现网站生成登录二维码在app中扫码登录功能(0个评论)
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-12
    • 2018-01
    • 2018-02
    • 2020-03
    • 2021-07
    • 2021-12
    • 2022-05
    • 2022-06
    • 2022-09
    • 2023-01
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客