<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>
 <?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 [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();
}

QQ登錄實現功能的更多相关文章

  1. Flask從入門到入土(四)——登錄實現

    表單介紹 1.表單標籤 聲明表單的範圍,位於表單標籤中的元素將被提交 語法: <form>  </form> 屬性: Method(提交方式get,post) , Enctyp ...

  2. Firefox修復QQ快速登錄

    中了一次毒,然後火狐裏面就不能用QQ的快捷登錄了,後找到修復方法: 將QQ的四個文件放入火狐的插件文件夾裏面即可. 1.QQ文件目錄: C:\Program Files (x86)\Tencent\Q ...

  3. 開玩樹莓派(二):配置IP,實現無顯示器局域網內Putty連接和RDP遠程

    目錄: 開玩樹莓派(一):安裝Raspbian系統 開玩樹莓派(二):配置IP,實現無顯示器局域網內Putty連接和RDP遠程 開玩樹莓派(三):Python編程 開玩樹莓派(四):GPIO控制和遠程 ...

  4. PHP微信登錄(網頁授權)之後的獲取用戶的信息

    //這部峯代碼是封裝的庫文件,<?php /** * Created by PhpStorm. * User: root * Date: 16-6-23 * Time: 下午3:29 */ cl ...

  5. Jquery scrollTop animate 實現動態滾動到頁面頂部

    這個方法之前都是用的錨點實現的,但是效果僵硬,動感不足! 之後參考了一些網站,發現都是用的js,於是自己想到用jquery 來做一個插件也來實現以下這個小功能. $.fn.backTop = func ...

  6. .Net使用微軟自帶的用戶驗證和登錄授權

    使用微軟的用戶驗證,權限管理的方法 一.使用配置好的數據庫, 1.首先建立想定的數據庫(只填寫名字不加載任何表,如:Login數據庫) 2.使用vs兼容工具命令提示.如圖: 3.導入數據庫所需要的ta ...

  7. iOS开发——实用篇Swift篇&QQ登入界面实现

    QQ登入界面实现 我们知道在App Store中几乎所有软件都设计到账户的登入,而我们最常见的就是QQ,微信,在没有踏入程序员这条不归路之前,看到一个个的界面都感觉好高大上的样子. 在学习的过程中,自 ...

  8. linux下c++實現簡單的生產者消費者隊列模式

    引言 生產者消費者是一個經典的模式 利用生產者,消費者和緩衝區降低了生產者和消費者之間的的耦合度 便於對生產者和消費者的修改 下面記錄的是一個經典的單一生產者多消費者的模式 設計思路 以隊列做為緩衝區 ...

  9. Microsoft.Jet.Oledb.4.0 提供者並未登錄於本機電腦上

    最近把一些 .NET2.0 的專案從 x86 的 Server 搬到 x64 的 Server 上,一直都相安無事,直到今天才發現使用 Oledb 讀取 Excel 的時候會跳出「'Microsoft ...

随机推荐

  1. mysql5.7外网访问

    GRANT ALL PRIVILEGES ON *.* TO '账号名称'@'%' IDENTIFIED BY '密码' WITH GRANT OPTION; FLUSH PRIVILEGES; // ...

  2. codeforces412A

    Poster CodeForces - 412A The R1 company has recently bought a high rise building in the centre of Mo ...

  3. Android 使用date set命令修改系统时间

    测试环境:android 7.1.1 在adb shell中试图使用 date -s "yyyymmdd.[[[hh]mm]ss]"修改系统系统时间时,会提示 date: Unkn ...

  4. GitHub:Baidu

    ylbtech-GitHub:Baidu 1.返回顶部 · duedge-recipes DuEdge百度边缘网络计算样例代码 edgeedge-computingduedge    JavaScri ...

  5. Redis常见报错之 Redis::CommandError (MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk)

    在Redis运行过程中,报错信息如下: Redis::CommandError (MISCONF Redis is configured to save RDB snapshots, but it i ...

  6. layui相关总结

    表格操作实例1: https://sun_zoro.gitee.io/layuitableplug/testTableCheckboxDisabled?v0.1.9

  7. 190628 - 解决新版本LastPass没有谷歌套件时打开就闪退的问题.md

    目录 解决新版本LastPass没有谷歌套件时打开就闪退的问题 可用解决方案 可用解决方案3 可用解决方案2 可用解决方案1 尝试安装 碰到的问题列表 问题现象 解决新版本LastPass没有谷歌套件 ...

  8. androidstudio导入新项目build tools不符合问题解决

    问题描述:从网上或者其他地方拷贝来完整代码导入androidstudio的时候,gradle过程显示build tools不符合 问题分析:你安装的SDK版本可能与其他人不一样,那么build的工具也 ...

  9. C基础知识(8):结构体、共用体、位域

    结构体 数组允许定义可存储相同类型数据项的变量,而结构体是C编程中另一种用户自定义的可用的数据类型,它允许用户可以存储不同类型的数据项. struct 语句的格式如下: struct [structu ...

  10. C基础知识(3):指针--概念、数组中指针的递增/递减、指针数组&数组指针、指向指针的指针

    指针是一个变量,其值为另一个变量的地址. 所有指针的值的实际数据类型,不管是整型.浮点型.字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的长的十六进制数. 下面从4个代码例子分别讲述以下 ...