PHP调用QQ互联接口实现QQ登录网站功能示例


Posted in PHP onOctober 24, 2019

本文实例讲述了PHP调用QQ互联接口实现QQ登录网站功能。分享给大家供大家参考,具体如下:

调用QQ登录接口,首先要到QQ互联完善开发者认证信息,并通过审核,然后创建一个网站应用,获得APP ID和APP Key,通过审核后即可调用基本接口get_user_info(获得用户信息),实现QQ登录网站功能。

PHP调用QQ互联接口实现QQ登录网站功能示例

PHP调用QQ互联接口实现QQ登录网站功能示例

废话不多,上示例代码(QQ登录李维山博客):

<?php
  header("Content-Type: text/html;charset=utf-8");
  //应用APP ID
  $app_id = "101486017";
  //应用APP Key
  $app_secret = "13a1811780f29d7a5b64e598c38a4494";
  //应用填写的网站回调域
  $my_url = "http://www.msllws.top/qqlogin";
  //Step1:获取Authorization Code
  session_start();
  $code = $_REQUEST["code"];//存放Authorization Code
  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=".$app_id."&redirect_uri=".urlencode($my_url)."&state=".$_SESSION['state'];
    echo("<script> top.location.href='".$dialog_url."'</script>");
  }
  //Step2:通过Authorization Code获取Access Token
  if($_REQUEST['state'] == $_SESSION['state'] || 1) {
    //拼接URL
    $token_url = "https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&"."client_id=".$app_id."&redirect_uri=".urlencode($my_url)."&client_secret=".$app_secret."&code=".$code;
    $response = file_get_contents($token_url);
    //如果用户临时改变主意取消登录,返回true!==false,否则执行step3 
    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)) {
        echo "<h3>error:</h3>".$msg->error;
        echo "<h3>msg :</h3>".$msg->error_description;
        exit;
      }
    }
    //Step3:使用Access Token来获取用户的OpenID
    $params = array();
    parse_str($response, $params);//把传回来的数据参数变量化
    $graph_url = "https://graph.qq.com/oauth2.0/me?access_token=".$params['access_token'];
    $str = file_get_contents($graph_url);
    if (strpos($str, "callback") !== false) {
      $lpos = strpos($str, "(");
      $rpos = strrpos($str, ")");
      $str = substr($str, $lpos + 1, $rpos - $lpos -1);
    }
    $user = json_decode($str);//存放返回的数据 client_id ,openid
    if (isset($user->error)) {
      echo "<h3>error:</h3>".$user->error;
      echo "<h3>msg :</h3>".$user->error_description;
      exit;
    }
    //Step4:使用openid和access_token获取用户信息
    $user_data_url = "https://graph.qq.com/user/get_user_info?access_token={$params['access_token']}&oauth_consumer_key={$app_id}&openid={$user->openid}&format=json";
    $user_data = file_get_contents($user_data_url);//获取到的用户信息
    //以下为授权成功后的自定义操作
    if($user_data){
      // ......
      echo("<script> top.location.href='http://www.msllws.top'</script>");
    }else{
      echo '未知错误';
    }
  }else{
    echo("The state does not match. You may be a victim of CSRF.");
  }

登录效果:

PHP调用QQ互联接口实现QQ登录网站功能示例

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
frename PHP 灵活文件命名函数 frename
Sep 09 PHP
PHP 存储文本换行实现方法
Jan 05 PHP
深入了解 register_globals (附register_globals=off 网站打不开的解决方法)
Jun 27 PHP
php内核解析:PHP中的哈希表
Jan 30 PHP
ThinkPHP3.1新特性之查询条件预处理简介
Jun 19 PHP
php获取文章上一页与下一页的方法
Dec 01 PHP
浅析THINKPHP的addAll支持的最大数据量
Feb 03 PHP
PHP中SESSION的注销与清除
Apr 16 PHP
php文件上传及下载附带显示文件及目录功能
Apr 27 PHP
利用PHP获取汉字首字母并且分组排序详解
Oct 22 PHP
JS(jQuery)实现聊天接收到消息语言自动提醒功能详解【提示“您有新的消息请注意查收”】
Apr 16 PHP
PHP+mysql防止SQL注入的方法小结
Apr 27 PHP
Laravel监听数据库访问,打印SQL的例子
Oct 24 #PHP
在laravel中实现ORM模型使用第二个数据库设置
Oct 24 #PHP
浅谈laravel aliases别名的原理
Oct 24 #PHP
Laravel 模型使用软删除-左连接查询-表起别名示例
Oct 24 #PHP
laravel model 两表联查示例
Oct 24 #PHP
Laravel框架之解决前端显示图片问题
Oct 24 #PHP
laravel中的fillable和guarded属性详解
Oct 23 #PHP
You might like
PHP中通过语义URL防止网站被攻击的方法分享
2011/09/08 PHP
php调用MySQL存储过程的方法集合(推荐)
2013/07/03 PHP
PHP提示Cannot modify header information - headers already sent by解决方法
2014/09/22 PHP
php在数据库抽象层简单使用PDO的方法
2015/11/03 PHP
PHP数组编码gbk与utf8互相转换的两种方法
2016/09/01 PHP
php使用file函数、fseek函数读取大文件效率对比分析
2016/11/04 PHP
PHP 500报错的快速解决方法
2016/12/14 PHP
基于jQuery捕获超链接事件进行局部刷新代码
2012/05/10 Javascript
图片img的src不变让浏览器重新加载实现方法
2013/03/29 Javascript
jQuery 重复加载错误以及修复方法
2014/12/16 Javascript
ExpressJS入门实例
2015/01/14 Javascript
jQuery中ajax的load()与post()方法实例详解
2016/01/05 Javascript
jQuery hover事件简单实现同时绑定2个方法
2016/06/07 Javascript
laydate日历控件使用方法详解
2017/11/20 Javascript
Angularjs Promise实例详解
2018/03/15 Javascript
vue中img src 动态加载本地json的图片路径写法
2019/04/25 Javascript
vue+elementUI实现表格关键字筛选高亮
2020/10/26 Javascript
vue实现标签云效果的方法详解
2019/08/28 Javascript
Vue 实现复制功能,不需要任何结构内容直接复制方式
2019/11/09 Javascript
vue form表单post请求结合Servlet实现文件上传功能
2021/01/22 Vue.js
python 图片验证码代码
2008/12/07 Python
python写xml文件的操作实例
2014/10/05 Python
Python环境下安装使用异步任务队列包Celery的基础教程
2016/05/07 Python
python如何在终端里面显示一张图片
2016/08/17 Python
Python3实现简单可学习的手写体识别(实例讲解)
2017/10/21 Python
linux环境下Django的安装配置详解
2019/07/22 Python
如何利用python之wxpy模块玩转微信
2020/08/17 Python
localstorage和sessionstorage使用记录(推荐)
2017/05/23 HTML / CSS
HolidayLettings英国:预订最好的度假公寓、别墅和自助式住宿
2019/08/27 全球购物
肯尼迪就职演说稿
2013/12/31 职场文书
委托书如何写
2014/08/30 职场文书
我爱祖国演讲稿
2014/09/02 职场文书
2015年全国助残日活动方案
2015/05/04 职场文书
被告代理词范文
2015/05/25 职场文书
2016年党员公开承诺书格式范文
2016/03/24 职场文书
详解如何在Canvas中添加事件的方法
2021/04/17 Javascript