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 相关文章推荐
兼容性比较好的PHP生成缩略图的代码
Jan 12 PHP
PHP实现时间轴函数代码
Oct 08 PHP
基于curl数据采集之正则处理函数get_matches的使用
Apr 28 PHP
获取PHP警告错误信息的解决方法
Jun 03 PHP
解析PHP计算页面执行时间的实现代码
Jun 18 PHP
PHP防止post重复提交数据的简单例子
Jun 07 PHP
ecshop实现smtp发送邮件
Feb 03 PHP
php递归遍历多维数组的方法
Apr 18 PHP
php对二维数组进行相关操作(排序、转换、去空白等)
Nov 04 PHP
Linux下快速搭建php开发环境
Mar 13 PHP
PHP生成随机码的思路与方法实例探索
Apr 11 PHP
laravel5.1框架model类查询的实现方法
Oct 08 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使用sql数据库 获取字段问题介绍
2013/08/12 PHP
PHP基于SPL实现的迭代器模式示例
2018/04/22 PHP
jscript之Read an Excel Spreadsheet
2007/06/13 Javascript
javascript同步Import,同步调用外部js的方法
2008/07/08 Javascript
javascript 密码强弱度检测万能插件
2009/02/25 Javascript
修改jquery里的dialog对话框插件为框架页(iframe) 的方法
2010/09/14 Javascript
js 跳出页面的frameset框架示例介绍
2013/12/23 Javascript
使用javaScript动态加载Js文件和Css文件
2015/10/24 Javascript
javascript实现无缝上下滚动特效
2015/12/16 Javascript
js密码强度实时检测代码
2016/03/02 Javascript
jQuery实现最简单实用的分秒倒计时
2017/02/05 Javascript
如何使用angularJs
2017/05/08 Javascript
深入理解Angular.JS中的Scope继承
2017/06/04 Javascript
分享19个JavaScript 有用的简写写法
2017/07/07 Javascript
Vue2.0学习之详解Vue 组件及父子组件通信
2017/12/12 Javascript
在vue-cli搭建的项目中增加后台mock接口的方法
2018/04/26 Javascript
Vue-router的使用和出现空白页,路由对象属性详解
2018/09/03 Javascript
Node.js 使用axios读写influxDB的方法示例
2018/10/26 Javascript
Vue中JS动画与Velocity.js的结合使用
2019/02/13 Javascript
Vue3.0结合bootstrap创建多页面应用
2019/05/28 Javascript
基于webpack4+vue-cli3项目实现换肤功能
2019/07/17 Javascript
微信小程序wxml列表渲染原理解析
2019/11/27 Javascript
[26:50]2018完美盛典DOTA2表演赛
2018/12/17 DOTA
Python Paramiko模块的使用实际案例
2018/02/01 Python
对Python使用mfcc的两种方式详解
2019/01/09 Python
python函数局部变量、全局变量、递归知识点总结
2019/11/15 Python
pytorch之ImageFolder使用详解
2020/01/06 Python
Python实现遗传算法(二进制编码)求函数最优值方式
2020/02/11 Python
Python GUI编程学习笔记之tkinter界面布局显示详解
2020/03/30 Python
土耳其时尚潮流在线购物网站:Trendyol
2017/10/10 全球购物
为什么要优先使用同步代码块而不是同步方法?
2013/01/30 面试题
股东合作协议书
2014/09/12 职场文书
房屋买卖协议书范本
2014/09/27 职场文书
MySQL系列之八 MySQL服务器变量
2021/07/02 MySQL
如何解决flex文本溢出问题小结
2022/07/15 HTML / CSS
Win11无法安装更新补丁KB3045316怎么办 附KB3045316补丁修复教程
2022/08/14 数码科技