<?php
// 写几个函数,分别用于获取code,token,openid,用户信息 // 跳转到QQ授权登录页面
function code(){
$response_type='code';
$client_id='101353491';
$redirect_uri='http://www.iwebshop.com/index.php';
$state='dfs343df'; $url="https://graph.qq.com/oauth2.0/authorize?response_type=$response_type&client_id=$client_id&redirect_uri=$redirect_uri&state=$state";
// 使用header函数跳转
header("location:$url");
} function token(){
// 1 请求的参数
$grant_type='authorization_code';
$client_id='101353491';
$client_secret='df4e46ba7da52f787c6e3336d30526e4';
$code=$_GET['code']; // 接收地址栏的code参数,这个就是Authorization Code
$redirect_uri='http://www.iwebshop.com/index.php'; // 2 构造出完整的、正确的接口地址
$url="https://graph.qq.com/oauth2.0/token?grant_type=$grant_type&client_id=$client_id&client_secret=$client_secret&code=$code&redirect_uri=$redirect_uri"; // 3 向上面的$url发请求(请求接口),获取数据
$str=file_get_contents($url);
// 上面代码得到的值(接口返回的数据)是:access_token=DC5C4AF94719CB5DE6A6EF1570A1B968&expires_in=7776000&refresh_token=8E946C30FC46D6BD2C4CC17055B6532D ,我们只需要access_token的值,即 DC5C4AF94719CB5DE6A6EF1570A1B968 ,那怎么办,我们先找到左侧第1个“=”符号的位置(strpos函数),再找到左侧第1个“&”的位置(strpos函数),之后使用substr函数截取出需要的值
$left=strpos($str,'='); // 从字符串$str左侧开始获取第一个“=”符号的位置
$right=strpos($str,'&');
$token=substr($str,$left+1,$right-$left-1); // 获取“=”符号和“&”符号之间的内容,即access token的值
//echo $token; // 4 调用openid函数,进一步使用access token来获取openid值
openid($token); } function openid($token){
$url="https://graph.qq.com/oauth2.0/me?access_token=$token";
// 向上面的$url发请求,获取数据
$str=file_get_contents($url);
// 请求接口后,得到的值是:callback( {"client_id":"101353491","openid":"7429C3FDC8FA70FEF3252FF47D6CDDA3"} ); ,我们只需要openid的值,即 7429C3FDC8FA70FEF3252FF47D6CDDA3 ,那我们怎么办?先获取左侧“(”的位置,再获取右侧“)”的位置,之后使用substr获取“(”与“)”之间的字符串,这个字符串是一个json格式的字符串,接着使用json_decode将此字符串转换成PHP数组,即可获取到openid的值
$left=strpos($str,'(');
$right=strrpos($str,')');
$str=substr($str,$left+1,$right-$left-1); // 截取出了完整的json格式字符串 {"client_id":"101353491","openid":"7429C3FDC8FA70FEF3252FF47D6CDDA3"}
$data=json_decode($str,true);
// echo '<pre/>';
// print_r($data);die;
/*
Array
(
[client_id] => 101353491
[openid] => 7429C3FDC8FA70FEF3252FF47D6CDDA3
)
*/
$openid=$data['openid'];
// 调用userInfo函数,进一步获取用户信息
userInfo($openid,$token);
} function userInfo($openid,$token){
$client_id='101353491';
$url="https://graph.qq.com/user/get_user_info?access_token=$token&oauth_consumer_key=$client_id&openid=$openid";
// 向上面的$url发请求,获取数据
$str=file_get_contents($url);
//echo $str;
/*{ "ret": 0, "msg": "", "is_lost":0, "nickname": "白雪峰", "gender": "男", "province": "辽宁", "city": "大连", "year": "1983", "constellation": "", "figureurl": "http:\/\/qzapp.qlogo.cn\/qzapp\/101353491\/7429C3FDC8FA70FEF3252FF47D6CDDA3\/30", "figureurl_1": "http:\/\/qzapp.qlogo.cn\/qzapp\/101353491\/7429C3FDC8FA70FEF3252FF47D6CDDA3\/50", "figureurl_2": "http:\/\/qzapp.qlogo.cn\/qzapp\/101353491\/7429C3FDC8FA70FEF3252FF47D6CDDA3\/100", "figureurl_qq_1": "http:\/\/thirdqq.qlogo.cn\/qqapp\/101353491\/7429C3FDC8FA70FEF3252FF47D6CDDA3\/40", "figureurl_qq_2": "http:\/\/thirdqq.qlogo.cn\/qqapp\/101353491\/7429C3FDC8FA70FEF3252FF47D6CDDA3\/100", "is_yellow_vip": "0", "vip": "0", "yellow_vip_level": "0", "level": "0", "is_yellow_year_vip": "0" } */
$data=json_decode($str,true);
// echo '<pre/>';
// print_r($data);die;
/*
Array
(
[ret] => 0
[msg] =>
[is_lost] => 0
[nickname] => 紅腹棘
[gender] => 男
[province] => 辽宁
[city] => 大连
[year] => 1983
[constellation] =>
[figureurl] => http://qzapp.qlogo.cn/qzapp/101353491/7429C3FDC8FA70FEF3252FF47D6CDDA3/30
[figureurl_1] => http://qzapp.qlogo.cn/qzapp/101353491/7429C3FDC8FA70FEF3252FF47D6CDDA3/50
[figureurl_2] => http://qzapp.qlogo.cn/qzapp/101353491/7429C3FDC8FA70FEF3252FF47D6CDDA3/100
[figureurl_qq_1] => http://thirdqq.qlogo.cn/qqapp/101353491/7429C3FDC8FA70FEF3252FF47D6CDDA3/40
[figureurl_qq_2] => http://thirdqq.qlogo.cn/qqapp/101353491/7429C3FDC8FA70FEF3252FF47D6CDDA3/100
[is_yellow_vip] => 0
[vip] => 0
[yellow_vip_level] => 0
[level] => 0
[is_yellow_year_vip] => 0
)
*/
$nickname=$data['nickname']; // 昵称
$figure=$data['figureurl_qq_1']; // 头像
echo $nickname;
echo '<br/>';
echo "<img src='$figure'>";
} // 函数或方法,他不会自己执行,需要调用一下
if(isset($_GET['code'])){
token();
}else{
code();
}
 <html>
<head>
<title></title>
</head>
<body>
<form>
<p>用户名 <input type='text' name='name'></p>
<p>密码 <input type='text' name='password'></p>
<p><input type='submit' value='登录'>
<!-- QQ图标 -->
<img src="qq.png" onclick='login();'> </p>
</form>
</body>
</html> <script>
function login(){
// 单击QQ登录图标后,跳转到index.php页面
location.href='index.php';
}
</script>

最新文章

  1. Moon.Orm 5.0(MQL版)及之前版本的开源计划
  2. Could not load file or assembly Microsoft.Web.Infrastructure
  3. css使 同一行内的 文字和图片 垂直居中对齐?
  4. Java中的泛型
  5. Codeforces 711 C. Coloring Trees (dp)
  6. Java中jar命令详解
  7. xcode - 移动手势
  8. C++多继承的好处是增加了弹性和灵活性,Delphi类强迫单继承TObject是为了提供许多强大功能
  9. 思维导图(自己整理,希望对大家有用):JavaScript函数+canvas绘图+Array数组
  10. gradle测试与线上打包
  11. 【bzoj 2303】【Apio2011】方格染色
  12. c/c++ 多线程 多个线程等待同一个线程的一次性事件
  13. HDU 1277全文检索(字典树)
  14. 第2讲——wiz
  15. C/C++中int128的那点事
  16. Recover InnoDB dictionary
  17. 【Python】多线程
  18. Android——检测TXT文件中是否含有双字节字符
  19. Javascript/jQuery常用方法
  20. Python168的学习笔记8

热门文章

  1. java实现大文件上传
  2. Fastdfs 单机安装 教程
  3. Ubuntu访问samba共享文件方法
  4. MyBatis中的JdbcType映射介绍
  5. spring-sevlet简单配置
  6. 第八周课程总结 &amp; 实验报告(六)
  7. html实现高亮检索
  8. leetcode-easy-math-13 Roman to Integer
  9. HSV颜色识别-HSV基本颜色分量范围
  10. Python 基础语法_Python脚本文件结构