1. 一:到腾讯QQ互联上申请APPID和APPKEY。申请地址: http://connect.qq.com/ 如同,这里我们可以获取到需要跳转到的APPID和APPKEY。新浪微博的申请同理

    二:在Thinkphp官网下载 Thinkphp3.2版本的框架源码

  2.  

    本地安装好Thinkphp后,找到应用下的,Common/conf/config.php文件里加上。QQ互联对应的APPID和APPKEY等QQ_AUTH配置信息:

    'QQ_AUTH'                 => array(

    'APP_ID'         => '1XDXXXXX', //你的QQ互联APPID

    'APP_KEY'   => '2XXXXXXXXXXXXXXXXXXXXX',

    'SCOPE'          => 'get_user_info,get_repost_list,add_idol,add_t,del_t,add_pic_t,del_idol',

    'CALLBACK'       => 'http://www.baidu.com/user/oauth/callback/type/qq.html',

    ),

    //新浪微博的配置同理一样。

  3.  

    在Common目录下建立一个文件夹api。创建文件QQConnect.class.php ,添加如下代码,这里是 我们写好的一个类:

    <?php

    namespace Common\Api;

    class QQConnect{

    /**

    * 获取QQconnect Login 跳转到的地址值

    * @return array 返回包含code state

    *

    **/

    public function login($app_id, $callback, $scope){

    $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection

    $login_url = "https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id="

    .$app_id. "&redirect_uri=" . urlencode($callback)

    . "&state=" . $_SESSION['state']

    . "&scope=".urlencode($scope);

    //显示出登录地址

    header('Location:'.$login_url);

    }

    /**

    * 获取access_token值

    * @return array 返回包含access_token,过期时间的数组

    * */

    private function get_token($app_id,$app_key,$code,$callback,$state){

    if($state !== $_SESSION['state']){

    return false;

    exit();

    }

    $url = "https://graph.qq.com/oauth2.0/token";

    $param = array(

    "grant_type"    =>    "authorization_code",

    "client_id"     =>    $app_id,

    "client_secret" =>    $app_key,

    "code"          =>    $code,

    "state"         =>    $state,

    "redirect_uri"  =>    $callback

    );

    $response = $this->get_url($url, $param);

    if($response == false) {

    return false;

    }

    $params = array();

    parse_str($response, $params);

    return $params["access_token"];

    }

    /**

    * 获取client_id 和 openid

    * @param $access_token access_token验证码

    * @return array 返回包含 openid的数组

    * */

    private  function get_openid($access_token) {

    $url = "https://graph.qq.com/oauth2.0/me";

    $param = array(

    "access_token"    => $access_token

    );

    $response  = $this->get_url($url, $param);

    if($response == false) {

    return false;

    }

    if (strpos($response, "callback") !== false) {

    $lpos = strpos($response, "(");

    $rpos = strrpos($response, ")");

    $response  = substr($response, $lpos + 1, $rpos - $lpos -1);

    }

    $user = json_decode($response);

    if (isset($user->error) || $user->openid == "") {

    return false;

    }

    return $user->openid;

    }

    /**

    * 获取用户信息

    * @param $client_id

    * @param $access_token

    * @param $openid

    * @return array 用户的信息数组

    * */

    public function get_user_info($app_id,$token,$openid){

    $url = 'https://graph.qq.com/user/get_user_info?oauth_consumer_key='.$app_id.'&access_token='.$token.'&openid='.$openid.'&format=json';

    $str = $this->get_url($url);

    if($str == false) {

    return false;

    }

    $arr = json_decode($str,true);

    return $arr;

    }

    /**

    * 请求URL地址,返回callback得到返回字符串

    * @param $url qq提供的api接口地址

    * */

    public function callback($app_id, $app_key, $callback) {

    $code = $_GET['code'];

    $state = $_GET['state'];

    $token = $this->get_token($app_id,$app_key,$code,$callback,$state);

    $openid = $this->get_openid($token);

    if(!$token || !$openid) {

    return false;

    exit();

    }

    return array('openid' => $openid, 'token' => $token);

    }

    /*

    * HTTP GET Request

    */

    private  function get_url($url, $param = null) {

    if($param != null) {

    $query = http_build_query($param);

    $url = $url . '?' . $query;

    }

    $ch = curl_init();

    if(stripos($url, "https://") !== false){

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

    }

    curl_setopt($ch, CURLOPT_URL, $url);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );

    $content = curl_exec($ch);

    $status = curl_getinfo($ch);

    curl_close($ch);

    if(intval($status["http_code"]) == 200) {

    return $content;

    }else{

    echo $status["http_code"];

    return false;

    }

    }

    /*

    * HTTP POST Request

    */

    private  function post_url($url, $params) {

    $ch = curl_init();

    if(stripos($url, "https://") !== false) {

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

    }

    curl_setopt($ch, CURLOPT_URL, $url);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );

    curl_setopt($ch, CURLOPT_POST, true);

    curl_setopt($ch, CURLOPT_POSTFIELDS, $params);

    $content = curl_exec($ch);

    $status = curl_getinfo($ch);

    curl_close($ch);

    if(intval($status["http_code"]) == 200) {

    return $content;

    } else {

    return false;

    }

    }

    }

  4.  

    在项目下创建一个User模板,然后再创建一个OauthConnect.class.php文件,用户调用 QQConnect.class.php。

    OauthConnect.class.php里面加入如下,

    <?php

    namespace User\Controller;

    use Think\Controller;

    class OauthController extends Controller {

    /*

    * Type类型,初始化

    * QQConnet  WeiboConnect

    */

    public function index(){

    switch ($_GET['type']) {

    /* QQ互联登录 */

    case qq:

    $app_id = C('QQ_AUTH.APP_ID');

    $scope = C('QQ_AUTH.SCOPE');

    $callback = C('QQ_AUTH.CALLBACK');

    $sns = new \Common\Api\QQConnect;

    $sns->login($app_id, $callback, $scope);

    break;

    /* 新浪微博登录 */

    case sina:

    $app_id = C('SINA_AUTH.APP_ID');

    $scope = C('SINA_AUTH.SCOPE');

    $callback = C('SINA_AUTH.CALLBACK');

    $sns = new \Common\Api\WeiboConnect;

    $sns->login($app_id, $callback, $scope);

    break;

    /* 默认无登录 */

    default:

    $this->error("无效的第三方方式",U('/user/login/index'));

    break;

    }

    }

    /*

    * 互联登录返回信息

    * 获取code 和 state状态,查询数据库

    *  */

    public function callback() {

    switch ($_GET['type']) {

    /* 接受QQ互联登录返回值 */

    case qq:

    empty($_GET['code']) && $this->error("无效的第三方方式",U('/user/login/index'));

    $app_id = C('QQ_AUTH.APP_ID');

    $app_key = C('QQ_AUTH.APP_KEY');

    $callback = C('QQ_AUTH.CALLBACK');

    $qq = new \Common\Api\QQConnect;

    /* callback返回openid和access_token */

    $back = $qq->callback($app_id , $app_key, $callback);

    //防止刷新

    empty($back) && $this->error("请重新授权登录",U('/user/login/index'));

    //此处省略数据库查询,查询返回的$back['openid']

    break;

    /* 接受新浪微博登录返回值     */

    case sina:

    empty($_GET['code']) && $this->error("无效的第三方方式",U('/user/login/index'));

    $app_id = C('SINA_AUTH.APP_ID');

    $app_key = C('SINA_AUTH.APP_KEY');

    $scope = C('SINA_AUTH.SCOPE');

    $callback = C('SINA_AUTH.CALLBACK');

    $weibo = new \Common\Api\WeiboConnect;

    /* callback返回openid和access_toke */

    $back = $weibo->callback($app_id , $app_key, $callback);

    empty($back) && $this->error("请重新授权登录",U('/user/login/index'));

    //此处省略数据库查询,查询返回的$back['openid']

    break;

    /* 默认错误跳转到登录页面  */

    default:

    $this->error("无效的第三方方式",U('/user/login/index'));

    break;

    }

    }

    }

新浪qq登录的更多相关文章

  1. php 解析 视频 信息 封面 标题 图片 支持 优酷, 土豆 酷6 56 新浪 qq播客 乐视 乐视

    原文地址:http://www.lianyue.org/2013/2497/ <?php /** * 解析 视频信息 类 * * 支持 优酷, 土豆 酷6 56 新浪 qq播客 乐视 乐视 ** ...

  2. 新浪API登录实例

    步骤一:添加网站 进入新浪微博开放平台,http://open.weibo.com/apps 进入“管理中心“,点击”创建应用”,选择“网页应用”,填写相应的信息后提交. 步骤二:Oauth2.0授权 ...

  3. 新浪授权认证(不用SDK)

    微博开放平台:http://open.weibo.com/ 微博开放接口的调用,如发微博.关注等,都是需要获取用户身份认证的.目前微博开放平台用户身份鉴权主要采用的是OAuth2.0.另外,为了方便开 ...

  4. 微信qq,新浪等第三方授权登录的理解

    偶们常说的第三方是指的微信,qq,新浪这些第三方,因为现在基本每个人都有qq或者微信,那么我们就可以通过这些第三方进行登录.而这些网站比如慕课网是通过第三方获取用户的基本信息 它会有个勾选按钮,提示是 ...

  5. QQ 微信 新浪 无法 分享 收集

    1.网络请求报错.升级Xcode 7.0发现网络访问失败.输出错误信息 The resource could not be loaded because the App Transport Secur ...

  6. VC POST表单——登录验证新浪邮箱

    1.本机环境: Windows XP SP3.ADSL 2.开发工具: WildPackets OmniPeek V5.1.4 Visual C++ 6.0 IE6.0 FlexEdit V2.3.1 ...

  7. Java Web(十三) 使用javamail进行发送邮件,(使用QQ,163,新浪邮箱服务器)

    加油加油. --WH 一.发送邮件的原理 在了解其原理之前,先要知道两个协议,SMTP和POP3 SMTP:Simple Mail Transfer Protocol,即简单邮件传输协议,发送邮件的协 ...

  8. 【公众号】微信第三方登录(静默授权和非静默授权)(具体代码:U盘 新浪云SAE)

    一.微信联合登录是怎么登录的,有几种登录方式:微信联合登录和微信授权登录[授权登录(非静默授权)与静默授权] [主动授权]:需要用户确认登录,这样可以通过用户的个人确认,获取用户全面的信息,无论是否关 ...

  9. tp5集成淘宝,微信,网易,新浪等第三方登录

    tp5集成淘宝,微信,网易,新浪等第三方登录 一.总结 一句话总结: 接口 链接 实现的话就是这些平台给的一个接口(链接),你通过这些接口登录进去之后,它会给你返回用户名,头像之类的信息,我们的网站存 ...

随机推荐

  1. 嵌入式开发之davinci--- 8148 中dsp在dsp_drv.c中的processdata()加算法出现下边缘条纹问题

    (1)问题原因 dsp在alglink_priv.c中做灰度处理发现,下面出现条纹,后面发现是cache 缓存没及时写进内存问题 (2)解决办法 for(frameId=0; frameId<f ...

  2. android中init.rc文件的解析问题

    init.rc中文件里会通过import /init.${ro.hardware}.rc文件,这个ro.hardware应该是某个详细的属性.而这个ro.hardware赋值应该是在Init进程中赋值 ...

  3. 头文件与cpp文件为什么要分开写

    最表面的机制是: 头文件是程序的界面(是代码界面),提供给程序员以  类.模版.函数等一系列的声明,让程序员知道应该怎么调用里面的"东西". 从动态链接库的角度看: 头文件提供界面 ...

  4. ARM WFI和WFE指令【转】

    本文转载至:http://www.wowotech.net/armv8a_arch/wfe_wfi.html 1. 前言 蜗蜗很早以前就知道有WFI和WFE这两个指令存在,但一直似懂非懂.最近准备研究 ...

  5. 原生js写简单轮播图方式1-从左向右滑动

    轮播图就是让图片每隔几秒自动滑动,达到图片轮流播放的效果.轮播图从效果来说有滑动式的也有渐入式的,滑动式的轮播图就是图片从左向右滑入的效果,渐入式的轮播图就是图片根据透明度渐渐显示的效果,这里说的是实 ...

  6. 单纯形 BZOJ3112: [Zjoi2013]防守战线

    题面自己上网查. 学了一下单纯形.当然 证明什么的 显然是没去学.不然估计就要残废了 上学期已经了解了 什么叫标准型. 听起来高大上 其实没什么 就是加入好多松弛变量+各种*(-1),使得最后成为一般 ...

  7. 就是要第一个出场的albus 【BZOJ】 线性基

    就是我代码里读入之后的那一部分. 1.(一下a[]为原数组 a'[]为线性基) 线性基 中的a'[i]其实 是 原来的a[]中的某个子集(2^n个子集中的某个) 异或出来的  可能会有其他的子集与它异 ...

  8. Ajax 异步查询 ,刷新页面的一部分

    调用的过程是,通过Jquery注册单击事件,当单击分部视图中的按钮,就取得分部视图中文本框的值,然后调用$.Get()函数以Get形式调用控制器SearchPeople方法,参数为searchText ...

  9. UVa 1161 Objective: Berlin (最大流)

    题意:给定一些航班,每个航班有人数,和起始终止时间,每次转机要花半小时,问限制时间内最多能有多少人从起始城市到终点城市. 析:差不多是裸板网络流的最大流问题,把每个航班都拆成两个点,这两个点之间连接一 ...

  10. Logrotate日志切割

    日志切割Logrotate 关于日志切割 logrotate程序是一个日志文件管理工具.用于分割日志文件,删除旧的日志文件,并创建新的日志文件,起到"转储"作用. 可以节省磁盘空间 ...