QQ登录类
2015-3-31 22:02:09
(同一套代码, pc端不能登录, 但是, 手机和平板都可以正常登录.....)
1. 首先是库文件, 登录->授权->token->openid->获取用户信息
class QQ
{
public $appid = '';
public $appkey = '';
public $scope = 'get_user_info'; //权限用逗号隔开
public $callback = ''; public $get_auth_code_url = 'https://graph.qq.com/oauth2.0/authorize';
public $get_access_token_url = 'https://graph.qq.com/oauth2.0/token';
public $get_openid_url = 'https://graph.qq.com/oauth2.0/me';
public $get_user_info_url = 'https://graph.qq.com/user/get_user_info'; public $access_token = '';
public $openid = ''; public function __construct($callback_url)
{
$this->callback = $callback_url;
} public function login()
{
$objRedis = Fun::getInstance()->getRedis();
$ip = Fun::getInstance()->getIP(); //-------生成唯一随机串防CSRF攻击
$state = md5(uniqid(rand(), TRUE));
$objRedis->iset('qqsdk'.$ip, 'state', $state); //-------构造请求参数列表
$arrQueryArg = array(
'response_type' => 'code',
'client_id' => $this->appid,
'redirect_uri' => $this->callback,
'state' => $state,
'scope' => $this->scope
); $uri = http_build_query($arrQueryArg);
$login_url = $this->get_auth_code_url.'?'.$uri; header("Location:$login_url");
} public function callback()
{
$objRedis = Fun::getInstance()->getRedis();
$ip = Fun::getInstance()->getIP();
$state = $objRedis->iget('qqsdk'.$ip, 'state'); //--------验证state防止CSRF攻击
if($_GET['state'] != $state){
exit('30001');
} //-------请求参数列表
$arrTokenArg = array(
'grant_type' => 'authorization_code',
'client_id' => $this->appid,
'redirect_uri' => $this->callback,
'client_secret' => $this->appkey,
'code' => $_GET['code']
);
//------构造请求access_token的url
$uri = http_build_query($arrTokenArg);
$token_url = $this->get_access_token_url.'?'.$uri;
$response = Fun::getInstance()->curl_get($token_url);
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)){
var_dump($msg->error, $msg->error_description);
}
} $params = array();
parse_str($response, $params); //---------获取openid
$arrTokenArg = array(
'access_token' =>$params['access_token']
);
$uri = http_build_query($arrTokenArg);
$openid_url = $this->get_openid_url.'?'.$uri;
$response = Fun::getInstance()->curl_get($openid_url); //--------检测错误是否发生
if(strpos($response, 'callback') !== false){ $lpos = strpos($response, '(');
$rpos = strrpos($response, ')');
$response = substr($response, $lpos + 1, $rpos - $lpos -1);
} $user = json_decode($response);
if(isset($user->error)){
var_dump($user->error, $user->error_description);exit;
} return array(
'access_token' => $params['access_token'],
'openid' => $user->openid
); } public function get_user_info()
{
$qq_safe_info = $this->callback();
$access_token = $qq_safe_info['access_token'];
$openid = $qq_safe_info['openid'];
$user_info_url = "{$this->get_user_info_url}?access_token={$access_token}&oauth_consumer_key={$this->appid}&openid={$openid}&format=json";
$info = Fun::getInstance()->curl_get($user_info_url);
return array(
'openid' => $openid,
'user_info' => $info
);
// $json_user_info = Fun::getInstance()->curl_get($user_info_url);
// return json_decode($json_user_info);
}
}
2. 其次是控制器调用代码, 调用QQ登录库文件, 以及获取并记录QQ登录信息
public function login()
{
$this->getLib('QQ', $this->qq_callback_url)->login();
} public function callback()
{
$user_info = $this->getLib('QQ', $this->qq_callback_url)->get_user_info();
// $user_ip = Fun::getInstance()->getIP();
$objRedis = $this->getLib('iredis');
$objRedis->iset('qqsdk'.$this->cookierand, 'qquser', $user_info['user_info']);
$objUserInfo = json_decode($user_info['user_info']);
$this->loadBusiness('Bbs')->qqregister($user_info['openid'], $objUserInfo->nickname, $objUserInfo->figureurl_qq_1);
echo "<script>window.opener.location.reload();window.close();</script>";
}
其中第14行代码的作用是, 刷新父窗口&&关闭弹出的QQ登录窗口
3. 最后是HTML代码, 在网页上放一个QQ登录按钮
<a href="#" onclick='toQzoneLogin()'><img src="http://zbf-img.qiniudn.com/qq_login.png" alt="QQ登录^_^" title="QQ登录^_^"></a>
<script type="text/javascript">
//qq登录
var childWindow;
function toQzoneLogin()
{
childWindow = window.open("http://www.zhangzhibin.com/qq/index/login","TencentLogin","width=450,height=320,menubar=0,scrollbars=1, resizable=1,status=1,titlebar=0,toolbar=0,location=1");
}
</script>
QQ登录类的更多相关文章
- 使用Java的Frame类编写的QQ登录界面
public static void main(String[] args) { Frame f = new Frame(); //关闭窗体 f.addWindowListener(new Windo ...
- android实现第三方登录之QQ登录
首先,当然是在腾讯开放平台(http://open.qq.com/)注册成为开发者,然后获取APP ID 1.下载SDK http://wiki.open.qq.com/wiki/mobile/SDK ...
- Android(java)学习笔记209:采用get请求提交数据到服务器(qq登录案例)
1.GET请求: 组拼url的路径,把提交的数据拼装url的后面,提交给服务器. 缺点:(1)安全性(Android下提交数据组拼隐藏在代码中,不存在安全问题) (2)长度有限不能超过4K(h ...
- 界面编程模仿篇(QQ登录界面逼真篇)
写了好多天的爬虫,偷空前前后后用了两天的时间(排除吃饭睡觉)写完了这个QQ登录界面,看起来还凑和着吧,如果是的大神的,莫见笑,纯属业余作品,废话先不多说,截图如下,其中第二幅图片中的红色方框部份有待完 ...
- Android(java)学习笔记213:开源框架post和get方式提交数据(qq登录案例)
1.前面提到Http的get/post方式 . HttpClient方式,实际工作的时候不常用到,因为这些方式编写代码是很麻烦的 2.Android应用会经常使用http协议进行传输,网上会有很完善 ...
- 用SignalR做类似QQ登录的应用
原文:用SignalR做类似QQ登录的应用 首先通过NuGet下载signalr包 在工程下新建一个类,继承Hub public class DemoHub:Hub { public class Us ...
- IdentityServer4(10)- 添加对外部认证的支持之QQ登录
前言 前面我们提到过IdentityServer4是可以添加外部认证的,如果外部认证支持OAuth2,那么添加到IdentityServer4是非常简单的,在ASP.NET Core下提供了非常多的外 ...
- 使用SpringSocial开发QQ登录
⒈编写QQ用户对应的数据结构 package cn.coreqi.social.qq.entities; /** * 封装QQ的用户信息 */ public class QQUserInfo { /* ...
- 第三方登录:QQ登录实现(OAuth2.0)
一.创建应用 1.在 QQ互联 创建应用 地址:https://connect.qq.com/manage.html#/ 然后进行实名认证,创建应用,审核通过 然后点击查看,可以获得 APP ID 和 ...
随机推荐
- 将excel文件中的数据导入到mysql
·在你的表格中增加一列,利用excel的公式自动生成sql语句,具体方法如下: 1)增加一列(假设是D列) 2)在第一行的D列,就是D1中输入公式:=CONCATE ...
- Storm:最火的流式处理框架
伴随着信息科技日新月异的发展,信息呈现出爆发式的膨胀,人们获取信息的途径也更加多样.更加便捷,同时对于信息的时效性要求也越来越高.举个搜索场景中的例子,当一个卖家发布了一条宝贝信息时,他希望的当然是这 ...
- _ATTRIBUTE__ 你知多少?
from:http://www.cnblogs.com/astwish/p/3460618.html __ATTRIBUTE__ 你知多少? GNU C 的一大特色就是__attribute__ 机制 ...
- 用一个简单的例子来理解python高阶函数
============================ 用一个简单的例子来理解python高阶函数 ============================ 最近在用mailx发送邮件, 写法大致如 ...
- nyoj 613 免费馅饼 广搜
免费馅饼 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy ...
- javascript 正则表达式使用
切记:js 正则表达式无需用双引号,正则表达式不是字符串. 参考网址:http://www.w3school.com.cn/jsref/jsref_obj_regexp.asp 个人用于查找字条串匹配 ...
- git上传github上
1.git init --初始化git (选择文件夹) 2.git add README --添加项目(项目的文件夹) 3.git commit -m "SSM(360)" ...
- iOS 图片 的 聊天气泡显示 Objective-C
- (void)viewDidLoad { [super viewDidLoad]; UIImageView *ImageView01 = [[UIImageView alloc] init]; [I ...
- 日期的js插件DatePicker
官网:http://my97.net/dp/index.asp 百度网盘:http://pan.baidu.com/s/1c20y7uC 只显示月份 <input name="cost ...
- [转载]Web 研发模式演变
原文链接:https://github.com/lifesinger/blog/issues/184 前不久徐飞写了一篇很好的文章:Web 应用的组件化开发.本文尝试从历史发展角度,说说各种研发模式的 ...