基于Thinkphp3.2的qq第三方oauth认证登录扩展类,
由于腾讯oauth sdk写的太多,不能与thinkphp和好的结合,最终想法讲腾讯oauth sdk写成tp的扩展类
先看代码,将代码保存在/library/org/util/Qqconnect.class.php文件中
在__construct方法中你可以直接写你的app_id、app_key和回调地址
也可以根据自己的喜好,改一下代码传参或者写到配置文件。
调用方法:1. 在qq的登录按钮的方法中调用getAuthCode方法
例如:
$qqobj=new \Org\Util\Qqconnect();
$qqobj->getAuthCode();

2.在回调地址的方法中调用getUsrInfo方法
例如:
$qqobj=new \Org\Util\Qqconnect();
$result=$qqobj->getUsrInfo();
就可以了

3.getAuthCode方法中的参数scope根据自身需要添加值get_user_info,list_album,upload_pic,do_like。

  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | Copyright (c) 2015.
  4. // +----------------------------------------------------------------------
  5. // |
  6. // +----------------------------------------------------------------------
    1. namespace Org\Util;
    2. /**
    3. *  qq第三方登录认证
    4. */
    5. class Qqconnect {
    6. private static $data;
    7. //APP ID
    8. private $app_id="";
    9. //APP KEY
    10. private $app_key="";
    11. //回调地址
    12. private $callBackUrl="";
    13. //Authorization Code
    14. private $code="";
    15. //access Token
    16. private $accessToken="";
    17. public function __construct(){
    18. $this->app_id="";
    19. $this->app_key="";
    20. $this->callBackUrl="";
    21. //检查用户数据
    22. if(empty($_SESSION['QC_userData'])){
    23. self::$data = array();
    24. }else{
    25. self::$data = $_SESSION['QC_userData'];
    26. }
    27. }
      1. //获取Authorization Code
      2. public function getAuthCode(){
      3. $url="https://graph.qq.com/oauth2.0/authorize";
      4. $param['response_type']="code";
      5. $param['client_id']=$this->app_id;
      6. $param['redirect_uri']=$this->callBackUrl;
      7. //-------生成唯一随机串防CSRF攻击
      8. $state = md5(uniqid(rand(), TRUE));
      9. $_SESSION['state']=$state;
      10. $param['state']=$state;
      11. $param['scope']="get_user_info";
      12. $param =http_build_query($param,'','&');
      13. $url=$url."?".$param;
      14. header("Location:".$url);
      15. }
      16. //通过Authorization Code获取Access Token
      17. private function getAccessToken(){
      18. $url="https://graph.qq.com/oauth2.0/token";
      19. $param['grant_type']="authorization_code";
      20. $param['client_id']=$this->app_id;
      21. $param['client_secret']=$this->app_key;
      22. $param['code']=$this->code;
      23. $param['redirect_uri']=$this->callBackUrl;
      24. $param =http_build_query($param,'','&');
      25. $url=$url."?".$param;
      26. return $this->getUrl($url);
      27. }
      28. //获取openid
      29. private function getOpenID(){
      30. $rzt=$this->getAccessToken();
      31. parse_str($rzt,$data);
      32. $this->accessToken=$data['access_token'];
      33. $url="https://graph.qq.com/oauth2.0/me";
      34. $param['access_token']=$this->accessToken;
      35. $param =http_build_query($param,'','&');
      36. $url=$url."?".$param;
      37. $response=$this->getUrl($url);
      38. //--------检测错误是否发生
      39. if(strpos($response, "callback") !== false){
      40. $lpos = strpos($response, "(");
      41. $rpos = strrpos($response, ")");
      42. $response = substr($response, $lpos + 1, $rpos - $lpos -1);
      43. }
      44. $user = json_decode($response);
      45. if(isset($user->error)){
      46. exit("错误代码:100007");
      47. }
      48. return $user->openid;
      49. }
      50. //获取信息
      51. public function getUsrInfo(){
      52. if($_GET['state'] != $_SESSION['state']){
      53. exit("错误代码:300001");
      54. }
      55. $this->code=$_GET['code'];
      56. $openid=$this->getOpenID();
      57. if(empty($openid)){
      58. return false;
      59. }
      60. $url="https://graph.qq.com/user/get_user_info";
      61. $param['access_token']=$this->accessToken;
      62. $param['oauth_consumer_key']=$this->app_id;
      63. $param['openid']=$openid;
      64. $param =http_build_query($param,'','&');
      65. $url=$url."?".$param;
      66. $rzt=$this->getUrl($url);
      67. return $rzt;
      68. }
      69. //CURL GET
      70. private function getUrl($url){
      71. $ch = curl_init($url);
      72. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      73. curl_setopt($ch, CURLOPT_TIMEOUT, 5);
      74. if (!empty($options)){
      75. curl_setopt_array($ch, $options);
      76. }
      77. $data = curl_exec($ch);
      78. curl_close($ch);
      79. return $data;
      80. }
      81. //CURL POST
      82. private function postUrl($url,$post_data){
      83. $ch = curl_init();
      84. curl_setopt($ch, CURLOPT_POST, 1);
      85. curl_setopt($ch, CURLOPT_URL, $url);
      86. curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
      87. ob_start();
      88. curl_exec($ch);
      89. $result = ob_get_contents();
      90. ob_end_clean();
      91. return $result;
      92. }
      93. }

基于Thinkphp3.2的qq第三方oauth认证登录扩展类的更多相关文章

  1. 第三方OAuth授权登录,QQ、微信(WeChat)、微博、GitHub、码云(Gitee)、淘宝(天猫)、微软(Microsoft )、钉钉、谷歌(Google)、支付宝(AliPay)、StackOverflow

    Netnr.Login 第三方OAuth授权登录 支持第三方登录 三方 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 安装 ( ...

  2. laravel 的passport Oauth 认证登录请求 的 oauth_token 重置

    laravel 的passport Oauth 认证登录请求 的 oauth_token 重置    使用API登录认证是需要获取访问令牌,方法为: 参数: grant_type —— 密码模式固定为 ...

  3. 实现OAUTH协议 实现 QQ 第三方登录效果

    1.OAuth的简述 OAuth(Open Authorization,开放授权)是为用户资源的授权定义了一个安全.开放及简单的标准,第三方无需知道用户的账号及密码,就可获取到用户的授权信息,并且这是 ...

  4. 一步一步搭建 OAuth 认证服务器

    http://www.fising.cn/2011/03/%E4%B8%80%E6%AD%A5%E4%B8%80%E6%AD%A5%E6%90%AD%E5%BB%BA-oauth-%E8%AE%A4% ...

  5. Oauth认证简介

    Oauth是什么: 1.Oauth是一种安全认证的协议: 2.Oauth为用户资源的授权提供了一个安全的.开放而又简易的标准: 3.Oauth的授权不会使第三方触及到用户的账号信息(用户名和密码). ...

  6. 服务端API的OAuth认证实现

    http://stackoverflow.com/questions/12499602/body-joints-angle-using-kinect?rq=1 新浪微博跟update相关的api已经挂 ...

  7. Oauth认证协议

    原文地址腾讯QQ第三方登录的实现原理? Oauth当中的角色: 1.Service Provider(服务提供方): 服务提供方通常是网站,在这些网站当中存储着一些受限制的资源,如照片.视频.联系人列 ...

  8. 基于Springboot集成security、oauth2实现认证鉴权、资源管理

    1.Oauth2简介 OAuth(开放授权)是一个开放标准,允许用户授权第三方移动应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容,OAu ...

  9. Android OAuth认证

    OAuth认证 为了安全地访问在线服务,用户需要在服务上进行身份验证,即要提供他们的身份的证明.对于一个要访问第三方服务的程序来说,安全问题甚至更复杂.不仅仅是用户需要在访问服务前要进行身份验证,而且 ...

随机推荐

  1. 动态规划:POJ 3616 Milking Time

    #include <iostream> #include <algorithm> #include <cstring> #include <cstdio> ...

  2. Git之版本回退及回滚

    应用场景 当开发某个项目时,会有多次提交记录,如A版本àB版本àC版本,假如目前处于C版本状态,我想回退到A版本,该如何操作:而当回退到A版本后,我又想回滚到B版本,又该如何操作,见下文分解!

  3. 三个你不知道的CSS技巧

    各种浏览器之间的竞争的白热化意味着越来越多的人现在开始使用那些支持最新.最先进的W3C Web标准的设备,以一种更具交互性的方式来访问互联网.这意味着我们终于能够利用更强大更灵活的CSS来创造更简洁, ...

  4. 判别式模型 vs. 生成式模型

    1. 简介 生成式模型(generative model)会对\(x\)和\(y\)的联合分布\(p(x,y)\)进行建模,然后通过贝叶斯公式来求得\(p(y|x)\), 最后选取使得\(p(y|x) ...

  5. C语言入门教程-(2)基本程序结构

    1.简单的C语言程序结构 要建造房屋,首先需要打地基.搬砖搭建框架(这大概就是为什么叫搬砖的原因).学习计算机语言的时候也一样,应该从基本的结构开始学起.下面,我们看一段简单的源代码,这段代码希望大家 ...

  6. HDU 1160 FatMouse's Speed (最长上升子序列)

    题目链接 题意:n个老鼠有各自的重量和速度,要求输出最长的重量依次严格递增,速度依次严格递减的序列,n最多1000,重量速度1-10000. 题解:按照重量递增排序,找出最长的速度下降子序列,记录序列 ...

  7. python模块-logging的智商上限

    logging,故名肆意就是正在进行日志,我艹,这个文化底蕴! logging是python内置的日志模块,便于日常程序的日志写入和输出 logging共分为5个日志等级,分别是: debug , i ...

  8. Python练习-不知道弄个什么鬼

    Alex大神,今天丢过来一个PDF,结果就成了这个样子! 1.  执行 Python 脚本的两种方式 交互方式:                   命令行 文件方式:                 ...

  9. web项目启动首页能访问接口报404

    这个问题如果控制台没有报错,然后看一下日志,看看spring容器是否加载: 如果是一直卡在这里了,多半是resources文件下的配置有问题,或者是resources目录不是源文件,工具无法识别 我遇 ...

  10. 被我误解的max_connect_errors【转】

    实为吾之愚见,望诸君酌之!闻过则喜,与君共勉 第一节  什么是max_connect_errors 一开始接触这个参数的时候,感觉他和max_connections的含义差不多,字面意思简单明了,这个 ...