<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. 关于Additive Ensembles of Regression Trees模型的快速打分预测

    一.论文<QuickScorer:a Fast Algorithm to Rank Documents with Additive Ensembles of Regression Trees&g ...

  2. [CSP-S模拟测试]:联合权值·改(暴力)

    题目传送门(内部题143) 输入格式 输入文件的第一行为三个整数$n,m,t$.其中$t$是数据类型. 接下来$m$行,每行两个正整数$u,v$,表示图中的一条边.数据保证不存在重边或自环的情况.   ...

  3. Mybatis内置的日志工厂提供日志功能

    Mybatis内置的日志工厂提供日志功能,具体的日志实现有以下几种工具: SLF4J Apache Commons Logging Log4j 2 Log4j JDK logging 具体选择哪个日志 ...

  4. Mac os文件名大小写不敏感

    Mac os文件名大小写不敏感,但是linux是大小写敏感的. 让我们代入一个场景, 创建一个新文件,你习惯以小写字母开头,接着在其他module中import,看起来一切都正常,emmm,确实没有任 ...

  5. Windows10 修改键位映射

    https://blog.csdn.net/lhdalhd1996/article/details/90741092 1.为什么要修改键位我的笔记本键盘上下键是这样的: 很想捶死产品经理,你是从来不用 ...

  6. Odp.Net 连接Oracle

    1.C#连接Oracle可以不安装客户端,但是需要借助Odp.net 免安装Oracle客户端: 将5个Oracle客户端的类库文件提取出来,放到程序根目录下,分别是oci.dll.Oracle.Da ...

  7. [Hibernate]知识点

    本笔记只介绍注解的方法 一.准备工作: a.添加三个pojo类: Product: package pojo; import javax.persistence.*; import java.util ...

  8. shell 部分语法

    语法: variable_name=${variable_name:-xxxx} 如果variable 已经有值,则不被新值覆盖,否则将新值赋给variable split命令切割文件

  9. linux 基础 文件操作

    cat -A /etc/passwdnl -ba passwd cat -A man_db.conf more man_db.conf less man_db.conf head -n 5 /var/ ...

  10. 如何用 putty 连接远程 Linux 系统

    如何用 putty 连接远程 Linux 系统 Putty 简介 Putty 是一个免费的.Windows x86 平台下的 Telnet.SSH 和 Rlogin 客户端,但是功能丝毫不逊色于商业的 ...