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登录类的更多相关文章

  1. 使用Java的Frame类编写的QQ登录界面

    public static void main(String[] args) { Frame f = new Frame(); //关闭窗体 f.addWindowListener(new Windo ...

  2. android实现第三方登录之QQ登录

    首先,当然是在腾讯开放平台(http://open.qq.com/)注册成为开发者,然后获取APP ID 1.下载SDK http://wiki.open.qq.com/wiki/mobile/SDK ...

  3. Android(java)学习笔记209:采用get请求提交数据到服务器(qq登录案例)

    1.GET请求:    组拼url的路径,把提交的数据拼装url的后面,提交给服务器. 缺点:(1)安全性(Android下提交数据组拼隐藏在代码中,不存在安全问题)  (2)长度有限不能超过4K(h ...

  4. 界面编程模仿篇(QQ登录界面逼真篇)

    写了好多天的爬虫,偷空前前后后用了两天的时间(排除吃饭睡觉)写完了这个QQ登录界面,看起来还凑和着吧,如果是的大神的,莫见笑,纯属业余作品,废话先不多说,截图如下,其中第二幅图片中的红色方框部份有待完 ...

  5. Android(java)学习笔记213:开源框架post和get方式提交数据(qq登录案例)

    1.前面提到Http的get/post方式  . HttpClient方式,实际工作的时候不常用到,因为这些方式编写代码是很麻烦的 2.Android应用会经常使用http协议进行传输,网上会有很完善 ...

  6. 用SignalR做类似QQ登录的应用

    原文:用SignalR做类似QQ登录的应用 首先通过NuGet下载signalr包 在工程下新建一个类,继承Hub public class DemoHub:Hub { public class Us ...

  7. IdentityServer4(10)- 添加对外部认证的支持之QQ登录

    前言 前面我们提到过IdentityServer4是可以添加外部认证的,如果外部认证支持OAuth2,那么添加到IdentityServer4是非常简单的,在ASP.NET Core下提供了非常多的外 ...

  8. 使用SpringSocial开发QQ登录

    ⒈编写QQ用户对应的数据结构 package cn.coreqi.social.qq.entities; /** * 封装QQ的用户信息 */ public class QQUserInfo { /* ...

  9. 第三方登录:QQ登录实现(OAuth2.0)

    一.创建应用 1.在 QQ互联 创建应用 地址:https://connect.qq.com/manage.html#/ 然后进行实名认证,创建应用,审核通过 然后点击查看,可以获得 APP ID 和 ...

随机推荐

  1. 将excel文件中的数据导入到mysql

    ·在你的表格中增加一列,利用excel的公式自动生成sql语句,具体方法如下:          1)增加一列(假设是D列)          2)在第一行的D列,就是D1中输入公式:=CONCATE ...

  2. Storm:最火的流式处理框架

    伴随着信息科技日新月异的发展,信息呈现出爆发式的膨胀,人们获取信息的途径也更加多样.更加便捷,同时对于信息的时效性要求也越来越高.举个搜索场景中的例子,当一个卖家发布了一条宝贝信息时,他希望的当然是这 ...

  3. _ATTRIBUTE__ 你知多少?

    from:http://www.cnblogs.com/astwish/p/3460618.html __ATTRIBUTE__ 你知多少? GNU C 的一大特色就是__attribute__ 机制 ...

  4. 用一个简单的例子来理解python高阶函数

    ============================ 用一个简单的例子来理解python高阶函数 ============================ 最近在用mailx发送邮件, 写法大致如 ...

  5. nyoj 613 免费馅饼 广搜

    免费馅饼 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy ...

  6. javascript 正则表达式使用

    切记:js 正则表达式无需用双引号,正则表达式不是字符串. 参考网址:http://www.w3school.com.cn/jsref/jsref_obj_regexp.asp 个人用于查找字条串匹配 ...

  7. git上传github上

    1.git init --初始化git   (选择文件夹) 2.git add README  --添加项目(项目的文件夹) 3.git commit -m "SSM(360)" ...

  8. iOS 图片 的 聊天气泡显示 Objective-C

    - (void)viewDidLoad { [super viewDidLoad]; UIImageView *ImageView01 = [[UIImageView alloc] init]; [I ...

  9. 日期的js插件DatePicker

    官网:http://my97.net/dp/index.asp 百度网盘:http://pan.baidu.com/s/1c20y7uC 只显示月份 <input name="cost ...

  10. [转载]Web 研发模式演变

    原文链接:https://github.com/lifesinger/blog/issues/184 前不久徐飞写了一篇很好的文章:Web 应用的组件化开发.本文尝试从历史发展角度,说说各种研发模式的 ...