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 相关文章推荐
一个简单的自动发送邮件系统(三)
Oct 09 PHP
Discuz 5.0 中读取纯真IP数据库函数分析
Mar 16 PHP
IP攻击升级,程序改进以对付新的攻击
Nov 23 PHP
php读取txt文件组成SQL并插入数据库的代码(原创自Zjmainstay)
Jul 31 PHP
PHP写的加密函数,支持私人密钥(详细介绍)
Jun 09 PHP
如何在Ubuntu下启动Apache的Rewrite功能
Jul 05 PHP
php加密解密函数authcode的用法详细解析
Oct 28 PHP
详解PHP数组赋值方法
Nov 07 PHP
php简单实现文件或图片强制下载的方法
Dec 06 PHP
php二维码生成以及下载实现
Sep 28 PHP
PHP bin2hex()函数基础实例讲解
Feb 11 PHP
laravel withCount 统计关联数量的方法
Oct 10 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实现框架(一)
2006/10/09 PHP
PHP中Date()时间日期函数的使用方法小结
2011/04/20 PHP
php表单文件iframe异步上传实例讲解
2017/07/26 PHP
PHP一致性hash分布式算法封装类定义与用法示例
2018/08/04 PHP
一个多次搜索+多次传值的解决方案
2007/01/20 Javascript
js 判断浏览器类型 去全角、半角空格 自动关闭当前窗口
2009/04/10 Javascript
struts2+jquery+json实现异步加载数据(自写)
2013/06/24 Javascript
jquery.ajax之beforeSend方法使用介绍
2014/12/08 Javascript
jQuery制作仿Mac Lion OS滚动条效果
2015/02/10 Javascript
超赞的动手创建JavaScript框架的详细教程
2015/06/30 Javascript
通用javascript代码判断版本号是否在版本范围之间
2015/11/29 Javascript
javaScript生成支持中文带logo的二维码(jquery.qrcode.js)
2017/01/03 Javascript
bootstrap轮播图示例代码分享
2017/05/17 Javascript
bootstrap中日历范围选择插件daterangepicker的使用详解
2018/04/17 Javascript
vue 实现数字滚动增加效果的实例代码
2018/07/06 Javascript
微信小程序实现底部导航
2018/11/05 Javascript
vue项目配置同一局域网可使用ip访问的操作
2020/10/23 Javascript
为Python的Tornado框架配置使用Jinja2模板引擎的方法
2016/06/30 Python
Python连接数据库学习之DB-API详解
2017/02/07 Python
Mac中升级Python2.7到Python3.5步骤详解
2017/04/27 Python
Python输入二维数组方法
2018/04/13 Python
python判断一个集合是否为另一个集合的子集方法
2018/05/04 Python
python 3调用百度OCR API实现剪贴板文字识别
2018/09/04 Python
利用django+wechat-python-sdk 创建微信服务器接入的方法
2019/02/20 Python
python异步实现定时任务和周期任务的方法
2019/06/29 Python
PyCharm2020最新激活码+激活码补丁(亲测最新版PyCharm2020.2激活成功)
2020/11/25 Python
美国内衣品牌:Leonisa
2016/08/14 全球购物
英国拖鞋购买网站:Bedroom Athletics
2020/02/28 全球购物
介绍一下.net和Java的特点和区别
2012/09/26 面试题
课前三分钟演讲稿
2014/04/24 职场文书
住房租房协议书
2014/08/20 职场文书
机动车登记业务委托书
2014/10/08 职场文书
计划生育证明格式及范本
2014/10/09 职场文书
五年级下册复习计划
2015/01/19 职场文书
红与黑读书笔记
2015/06/29 职场文书
Mysql使用全文索引(FullText index)的实例代码
2022/04/03 MySQL