基于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. nodejs出现events.js:72中抛出错误 Error: listen EADDRINUSE

    <pre>events.js:72 throw er; // Unhandled 'error' event ^ Error: listen EADDRINUSE at errnoExce ...

  2. python 9*9 乘法表

    row = 1 while row <= 9: col = 1 while col <= row: print('%d*%d=%d'%(col, row, row*col), end='\ ...

  3. python核心编程笔记——Chapter8

    Chapter8.条件和循环 这一章感觉有用的点并不多,在我眼里就只有迭代器,列表解析和生成器表达式值得研究而已. 8.2.循环,难度不大. #!usr/bin/env python #-*-codi ...

  4. golang sql.DB

    数据库 sql.DB连接池需知: sql.DB内置连接池,连接不足时会自动创建新连接,新创建的连接使用sql.Open()时传入的dsn来构造. sql.DBClose时只会关闭连接池中的连接,未归还 ...

  5. Visual Leak Detector原理剖析

    认识VLD VLD(Visual Leak Detector)是一款用于Visual C++的开源内存泄漏检测工具,我们只需要在被检测内存泄漏的工程代码里#include “vld.h”就可以开启内存 ...

  6. 容斥原理&&莫比乌斯专题

    A题:A - Eddy's爱好   HDU - 2204 具体思路:如果是求n中,为平方数的有多少个,那么答案肯定是sqrt(n),同理,如果是三次根号的话,那么答案肯定是n的三分之一次方.然后继续按 ...

  7. UNIX环境高级编程 第2章 UNIX标准及实现

    在过去的将近25年时间,人们为了UNIX的标准化做出了种种努力,这使得程序在不同版本的UNIX系统之间的移植相当容易. ISO C 1989年,C语言首个标准得到批准,其为C89.次年,一个带有小改动 ...

  8. 使用隐藏form表单下载文件,解决url方式下载,由于环境问题而限制url长度,满足不了所有的需求!

    一 对于某些环境导出是直接用wiondow.href=url直接导出下载,有些业务需求,如员工档案等字段比较多的时候,全选导出就会引发异常,由于Nginx转发长度限制的问题, 如果运维不愿意改变环境, ...

  9. bzoj 1014: 洛谷 P4036: [JSOI2008]火星人

    题目传送门:洛谷P4036. 题意简述: 有一个字符串,支持插入字符,修改字符. 每次需要查询两个后缀的LCP长度. 最终字符串长度\(\le 100,\!000\),修改和询问的总个数\(\le 1 ...

  10. Linux configure关于交叉编译的参数设置【转】

    转自:http://blog.csdn.net/darennet/article/details/9003005 configure的参数众多,一般包括如下 --srcdir=DIR 这个选项对安装没 ...