<?php
/**
 * http://wiki.open.qq.com/wiki/
 * Date: 14-6-18
 * Time: 下午18:04
 */
class Model_Login_QqConnect extends Model_Abstract
{
    public $qq_config = array(
        'qq_k' => '10112****', //QQ应用APP ID
        'qq_s' => 'c3e5a337b1c8b82adafa80e5********', //QQ应用APP KEY
        'callback_url' => 'www.haitaohua.com/interface/login/qc', //授权回调网址
        'scope' => 'get_user_info,add_share' //权限列表,具体权限请查看官方的api文档
    );

function __construct($appid =null, $appkey=null, $access_token=NULL){
        $this->appid= $this->qq_config['qq_k'];
        $this->appkey=$this->qq_config['qq_s'];
        $this->access_token=$access_token;
    }

function login_url($callback_url, $scope=''){
        $params=array(
            'client_id'=>$this->appid,
            'redirect_uri'=>$callback_url,
            'response_type'=>'code',
            'scope'=>$scope
        );
        return 'https://graph.qq.com/oauth2.0/authorize?'.http_build_query($params);
    }

function access_token($callback_url, $code){
        $params=array(
            'grant_type'=>'authorization_code',
            'client_id'=>$this->appid,
            'client_secret'=>$this->appkey,
            'code'=>$code,
            'state'=>'',
            'redirect_uri'=>$callback_url
        );
        $url='https://graph.qq.com/oauth2.0/token?'.http_build_query($params);
        $result_str=$this->http($url);
        $json_r=array();
        if($result_str!='')parse_str($result_str, $json_r);
        return $json_r;
    }

/**
    function access_token_refresh($refresh_token){
    }
     **/

function get_openid(){
        $params=array(
            'access_token'=>$this->access_token
        );
        $url='https://graph.qq.com/oauth2.0/me?'.http_build_query($params);
        $result_str=$this->http($url);
        $json_r=array();
        if($result_str!=''){
            preg_match('/callback\(\s+(.*?)\s+\)/i', $result_str, $result_a);
            $json_r=json_decode($result_a[1], true);
        }
        return $json_r;
    }

  // 需要调用什么方法可以自己加
    function get_user_info($openid){
        $params=array(
            'openid'=>$openid
        );
        $url='https://graph.qq.com/user/get_user_info';
        return $this->api($url, $params);
    }

function add_share($openid, $title, $url, $site, $fromurl, $images='', $summary=''){
        $params=array(
            'openid'=>$openid,
            'title'=>$title,
            'url'=>$url,
            'site'=>$site,
            'fromurl'=>$fromurl,
            'images'=>$images,
            'summary'=>$summary
        );
        $url='https://graph.qq.com/share/add_share';
        return $this->api($url, $params, 'POST');
    }

function api($url, $params, $method='GET'){
        $params['access_token']=$this->access_token;
        $params['oauth_consumer_key']=$this->appid;
        $params['format']='json';
        if($method=='GET'){
            $result_str=$this->http($url.'?'.http_build_query($params));
        }else{
            $result_str=$this->http($url, http_build_query($params), 'POST');
        }
        $result=array();
        if($result_str!='')$result=json_decode($result_str, true);
        return $result;
    }

function http($url, $postfields='', $method='GET', $headers=array()){
        $ci=curl_init();
        curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ci, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, 30);
        curl_setopt($ci, CURLOPT_TIMEOUT, 30);
        if($method=='POST'){
            curl_setopt($ci, CURLOPT_POST, TRUE);
            if($postfields!='')curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);
        }
        $headers[]="User-Agent: qqPHP(piscdong.com)";
        curl_setopt($ci, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ci, CURLOPT_URL, $url);
        $response=curl_exec($ci);
        curl_close($ci);
        return $response;
    }
}

qc.php (callback.php回调页面)

<?php
/**
 * QQ账号合作登陆
 * User: xuxiang
 * Date: 14-6-18
 * Time: 上午17:43
 */
class Controller_Interface_Login_Qc extends Controller_Interface_AbstractE
{
    //http://www.haitaohua.com/interface/login/qc
    public function run()
    {
        try {
            //授权回调页面,即配置文件中的$callback_url
            session_start();
            // Step1:获取Authorization Code
            $code = $_REQUEST["code"];
            $qq = new Model_Login_QqConnect();
            if(empty($code))
            {
                //state参数用于防止CSRF攻击,成功授权后回调时会原样带回
                $_SESSION['state'] = md5(uniqid(rand(), TRUE));
                //拼接URL
                $dialog_url = "https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id="
                    . $qq->qq_config['qq_k'] . "&redirect_uri=" . urlencode($qq->qq_config['callback_url']) . "&state="
                    . $_SESSION['state'];
                echo("<script> top.location.href='" . $dialog_url . "'</script>");
            }

$ret = $qq->access_token($qq->qq_config['callback_url'], $code);

if( !empty($ret) ) {
                $qq = new Model_Login_QqConnect($qq->qq_config['qq_k'], $qq->qq_config['qq_s'], $ret['access_token']);

$open_id = $qq->get_openid();
                if( !empty($open_id) ) {
                    $user_info = $qq->get_user_info($open_id['openid']);
                    echo "<pre>";
                    print_r($user_info);die;
                } else {
                    Tool_Redirect::redirect_info($_SERVER['HTTP_REFERER'], 2, '授权失败');
                }
            } else {
                Tool_Redirect::redirect_info($_SERVER['HTTP_REFERER'], 2, '授权失败');
            }

} catch (Exception $e) {
            throw $e;
        }
    }
}

QQ互联登陆的最简洁代码的更多相关文章

  1. QQ互联登陆(Java)

    一.准备部分 1.账户注册 腾讯开放平台网址: https://connect.qq.com/index.html 首先需要到开放平台注册QQ互联开发者身份.注册之后创建一个网站应用,注意,需要备案成 ...

  2. QQ互联登陆出现(1054) Unknown column “conuintoken” in “field list”

    在dz论坛中打开了QQ互联登录功能之后提示(1054) Unknown column conuintoken in field list 错误 我们看到sql 错误就是说没有conuintoken字了 ...

  3. 【Discuz】-QQ互联登陆提示错误信息:Unknown column 'conuintoken' in 'field list'

    提示信息 discuz! Database Error(1054) Unknown column 'conuintoken' in 'field list'REPLACE INTO common_co ...

  4. qq互联登陆开发流程

    宋正河整理 百度文库在线观看: http://wenku.baidu.com/view/96da9744e518964bcf847c47.html?st=1 csdn免积分下载: http://dow ...

  5. QQ互联OAuth2.0 .NET SDK 发布以及网站QQ登陆示例代码(转)

    OAuth: OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容. QQ登录OAuth2 ...

  6. QQ互联OAuth2.0 .NET SDK 发布以及网站QQ登陆示例代码

    OAuth: OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容. QQ登录OAuth2 ...

  7. QQ登录整合/oauth2.0认证-02-跳转到QQ互联页

    ---------------------------目录---------------------------------- QQ登录整合/oauth2.0认证-01-申请appkey和appid ...

  8. 腾讯QQ快捷登陆

    腾讯QQ快捷 相关各语言对接qq快捷登录教程 [C#]QQ开放平台(QQ站外登录)_流程和源码示例 j2ee中实现QQ第三方登陆 web实现QQ第三方登录 asp.net网站接入QQ登录 php实现q ...

  9. 登陆整合实现-QQ互联认证(ASP.NET版本)

    原文:登陆整合实现-QQ互联认证(ASP.NET版本) 首先 我们创建一个qq.ashx的页面,这个页面会跳转到QQ的请求界面 代码如下: QQSettingConfig qqSettingConfi ...

随机推荐

  1. Vue node.js商城-购物车模块

      一.渲染购物车列表页面 新建src/views/Cart.vue获取cartList购物车列表数据就可以在页面中渲染出该用户的购物车列表数据 data(){   return {      car ...

  2. iOS9全新的联系人相关框架——Contacts Framework

    iOS9全新的联系人相关框架——Contacts Framework 一.引言 在以前iOS开发中,涉及联系人相关的编程,代码都非常繁琐,并且框架的设计也不是Objective-C风格的,这使开发者用 ...

  3. Sass 基础(三)

    扩展/继承 继承对于了解css 的同学来说一点都不陌生,先来看一张图 在Sass 中也具有继承一说,也就是继承类中的样式代码块,在Sass中时通过关键词“@extend”来 继承已经存在的类样式块,从 ...

  4. JQuery实现注册表单验证

    效果图如下: 注册页面HTML代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &qu ...

  5. mysqldump备份与基于bin-log实现完全恢复

    MySQL数据库备份是一项非常重要的工作,mysql的备份主要分为逻辑备份和物理备份,同时,不同的生产环境要备份的策略也不会不同.下面先说一说备份时要考虑到的一些因素,然后再实际操作进行不同方式的数据 ...

  6. 打造自己的JavaScript武器库(转)

    作者: SlaneYang https://segmentfault.com/a/1190000011966867 前言 作为战斗在业务一线的前端,要想少加班,就要想办法提高工作效率.这里提一个小点, ...

  7. JDK8 新特性

    JDK8 新特性目录导航: Lambda 表达式 函数式接口 方法引用.构造器引用和数组引用 接口支持默认方法和静态方法 Stream API 增强类型推断 新的日期时间 API Optional 类 ...

  8. 在pythonanywhere上部署Django应用

    参考:https://tutorial.djangogirls.org/zh/deploy/ 资料讲的很明了,仅在设置上做几点补充. 1.设置相对路径 import os BASE_DIR = os. ...

  9. Qt on Android 蓝牙通信开发

    版权声明:本文为MULTIBEANS ORG研发跟随文章,未经MLT ORG允许不得转载. 最近做项目,需要开发安卓应用,实现串口的收发,目测CH340G在安卓手机上非常麻烦,而且驱动都是Java版本 ...

  10. python系列7进程线程和协程

    目录 进程 线程 协程  上下文切换 前言:线程和进程的关系图 由下图可知,在每个应用程序执行的过程中,都会去产生一个主进程和主线程来完成工作,当我们需要并发的执行的时候,就会通过主进程去生成一系列的 ...