QQ登錄實現功能
<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登錄實現功能的更多相关文章
- Flask從入門到入土(四)——登錄實現
表單介紹 1.表單標籤 聲明表單的範圍,位於表單標籤中的元素將被提交 語法: <form> </form> 屬性: Method(提交方式get,post) , Enctyp ...
- Firefox修復QQ快速登錄
中了一次毒,然後火狐裏面就不能用QQ的快捷登錄了,後找到修復方法: 將QQ的四個文件放入火狐的插件文件夾裏面即可. 1.QQ文件目錄: C:\Program Files (x86)\Tencent\Q ...
- 開玩樹莓派(二):配置IP,實現無顯示器局域網內Putty連接和RDP遠程
目錄: 開玩樹莓派(一):安裝Raspbian系統 開玩樹莓派(二):配置IP,實現無顯示器局域網內Putty連接和RDP遠程 開玩樹莓派(三):Python編程 開玩樹莓派(四):GPIO控制和遠程 ...
- PHP微信登錄(網頁授權)之後的獲取用戶的信息
//這部峯代碼是封裝的庫文件,<?php /** * Created by PhpStorm. * User: root * Date: 16-6-23 * Time: 下午3:29 */ cl ...
- Jquery scrollTop animate 實現動態滾動到頁面頂部
這個方法之前都是用的錨點實現的,但是效果僵硬,動感不足! 之後參考了一些網站,發現都是用的js,於是自己想到用jquery 來做一個插件也來實現以下這個小功能. $.fn.backTop = func ...
- .Net使用微軟自帶的用戶驗證和登錄授權
使用微軟的用戶驗證,權限管理的方法 一.使用配置好的數據庫, 1.首先建立想定的數據庫(只填寫名字不加載任何表,如:Login數據庫) 2.使用vs兼容工具命令提示.如圖: 3.導入數據庫所需要的ta ...
- iOS开发——实用篇Swift篇&QQ登入界面实现
QQ登入界面实现 我们知道在App Store中几乎所有软件都设计到账户的登入,而我们最常见的就是QQ,微信,在没有踏入程序员这条不归路之前,看到一个个的界面都感觉好高大上的样子. 在学习的过程中,自 ...
- linux下c++實現簡單的生產者消費者隊列模式
引言 生產者消費者是一個經典的模式 利用生產者,消費者和緩衝區降低了生產者和消費者之間的的耦合度 便於對生產者和消費者的修改 下面記錄的是一個經典的單一生產者多消費者的模式 設計思路 以隊列做為緩衝區 ...
- Microsoft.Jet.Oledb.4.0 提供者並未登錄於本機電腦上
最近把一些 .NET2.0 的專案從 x86 的 Server 搬到 x64 的 Server 上,一直都相安無事,直到今天才發現使用 Oledb 讀取 Excel 的時候會跳出「'Microsoft ...
随机推荐
- vue子路由设置、全局组件、局部组件的原生写法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- jdk中使用的设计模式
在JDK(Java Development Kit)类库中,开发人员使用了大量设计模式,正因为如此,我们可以在不修改JDK源码的前提下开发出自己的应用软件,研究JDK类库中的模式实例也不失为学习如何使 ...
- [心得]暑假DAY1 | 7-7考试总结
呼.. 正式开始暑假集训. 今天一上午还在搞7-7的考试改题 然而,该来该去,TLE48过不去了 不知道哪的问题,loj上1w3ms(卡常都没能救得了) 至于T1和T3,简单总结一下算了 排序 感觉很 ...
- (一)C语言的四大数据类型
- Android新项目GBSS:第1篇 搭建开发环境
最近接手一个Android新项目,之前也没做过这方面的开发,算是边学边干,这两天看了一下Android开发的书,大致入门了一点,今天把所需要的软件都下了下来,准备开工,先列一下开发环境: 所有的软件都 ...
- modprobe 和 insmod 区别
1 关于内核加载方式 1) insmod : insmod一次只能加载特定的一个设备驱动,且需要驱动的具体地址 举例说明: insmod pblk.ko // 需要制定pbl ...
- ThreadPoolExecutor 优雅关闭线程池的原理.md
经典关闭线程池代码 ExecutorService executorService = Executors.newFixedThreadPool(10); executorService.shutdo ...
- RN在Mac环境下开发环境搭建
1.推荐使用Homebrew来安装 Node 和 Watchman.在命令行中执行下列命令安装: brew install node brew install watchman 如果你已经安装了 No ...
- IEDA 实现自动生成序列化号(serialVersionUID)
完整操作流程:Setting->Editor->Inspections->Java->Serialization issues->Serializable class w ...
- springboot2.0数据制作为excel表格
注意:由于公司需要大量导出数据成excel表格,因此在网上找了方法,亲测有效. 声明:该博客参考于https://blog.csdn.net/long530439142/article/details ...