新浪qq登录
一:到腾讯QQ互联上申请APPID和APPKEY。申请地址: http://connect.qq.com/ 如同,这里我们可以获取到需要跳转到的APPID和APPKEY。新浪微博的申请同理
二:在Thinkphp官网下载 Thinkphp3.2版本的框架源码

本地安装好Thinkphp后,找到应用下的,Common/conf/config.php文件里加上。QQ互联对应的APPID和APPKEY等QQ_AUTH配置信息:
'QQ_AUTH' => array(
'APP_ID' => '1XDXXXXX', //你的QQ互联APPID
'APP_KEY' => '2XXXXXXXXXXXXXXXXXXXXX',
'SCOPE' => 'get_user_info,get_repost_list,add_idol,add_t,del_t,add_pic_t,del_idol',
'CALLBACK' => 'http://www.baidu.com/user/oauth/callback/type/qq.html',
),
//新浪微博的配置同理一样。
在Common目录下建立一个文件夹api。创建文件QQConnect.class.php ,添加如下代码,这里是 我们写好的一个类:
<?php
namespace Common\Api;
class QQConnect{
/**
* 获取QQconnect Login 跳转到的地址值
* @return array 返回包含code state
*
**/
public function login($app_id, $callback, $scope){
$_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection
$login_url = "https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id="
.$app_id. "&redirect_uri=" . urlencode($callback)
. "&state=" . $_SESSION['state']
. "&scope=".urlencode($scope);
//显示出登录地址
header('Location:'.$login_url);
}
/**
* 获取access_token值
* @return array 返回包含access_token,过期时间的数组
* */
private function get_token($app_id,$app_key,$code,$callback,$state){
if($state !== $_SESSION['state']){
return false;
exit();
}
$url = "https://graph.qq.com/oauth2.0/token";
$param = array(
"grant_type" => "authorization_code",
"client_id" => $app_id,
"client_secret" => $app_key,
"code" => $code,
"state" => $state,
"redirect_uri" => $callback
);
$response = $this->get_url($url, $param);
if($response == false) {
return false;
}
$params = array();
parse_str($response, $params);
return $params["access_token"];
}
/**
* 获取client_id 和 openid
* @param $access_token access_token验证码
* @return array 返回包含 openid的数组
* */
private function get_openid($access_token) {
$url = "https://graph.qq.com/oauth2.0/me";
$param = array(
"access_token" => $access_token
);
$response = $this->get_url($url, $param);
if($response == false) {
return false;
}
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) || $user->openid == "") {
return false;
}
return $user->openid;
}
/**
* 获取用户信息
* @param $client_id
* @param $access_token
* @param $openid
* @return array 用户的信息数组
* */
public function get_user_info($app_id,$token,$openid){
$url = 'https://graph.qq.com/user/get_user_info?oauth_consumer_key='.$app_id.'&access_token='.$token.'&openid='.$openid.'&format=json';
$str = $this->get_url($url);
if($str == false) {
return false;
}
$arr = json_decode($str,true);
return $arr;
}
/**
* 请求URL地址,返回callback得到返回字符串
* @param $url qq提供的api接口地址
* */
public function callback($app_id, $app_key, $callback) {
$code = $_GET['code'];
$state = $_GET['state'];
$token = $this->get_token($app_id,$app_key,$code,$callback,$state);
$openid = $this->get_openid($token);
if(!$token || !$openid) {
return false;
exit();
}
return array('openid' => $openid, 'token' => $token);
}
/*
* HTTP GET Request
*/
private function get_url($url, $param = null) {
if($param != null) {
$query = http_build_query($param);
$url = $url . '?' . $query;
}
$ch = curl_init();
if(stripos($url, "https://") !== false){
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
}
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );
$content = curl_exec($ch);
$status = curl_getinfo($ch);
curl_close($ch);
if(intval($status["http_code"]) == 200) {
return $content;
}else{
echo $status["http_code"];
return false;
}
}
/*
* HTTP POST Request
*/
private function post_url($url, $params) {
$ch = curl_init();
if(stripos($url, "https://") !== false) {
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
}
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
$content = curl_exec($ch);
$status = curl_getinfo($ch);
curl_close($ch);
if(intval($status["http_code"]) == 200) {
return $content;
} else {
return false;
}
}
}

在项目下创建一个User模板,然后再创建一个OauthConnect.class.php文件,用户调用 QQConnect.class.php。
OauthConnect.class.php里面加入如下,
<?php
namespace User\Controller;
use Think\Controller;
class OauthController extends Controller {
/*
* Type类型,初始化
* QQConnet WeiboConnect
*/
public function index(){
switch ($_GET['type']) {
/* QQ互联登录 */
case qq:
$app_id = C('QQ_AUTH.APP_ID');
$scope = C('QQ_AUTH.SCOPE');
$callback = C('QQ_AUTH.CALLBACK');
$sns = new \Common\Api\QQConnect;
$sns->login($app_id, $callback, $scope);
break;
/* 新浪微博登录 */
case sina:
$app_id = C('SINA_AUTH.APP_ID');
$scope = C('SINA_AUTH.SCOPE');
$callback = C('SINA_AUTH.CALLBACK');
$sns = new \Common\Api\WeiboConnect;
$sns->login($app_id, $callback, $scope);
break;
/* 默认无登录 */
default:
$this->error("无效的第三方方式",U('/user/login/index'));
break;
}
}
/*
* 互联登录返回信息
* 获取code 和 state状态,查询数据库
* */
public function callback() {
switch ($_GET['type']) {
/* 接受QQ互联登录返回值 */
case qq:
empty($_GET['code']) && $this->error("无效的第三方方式",U('/user/login/index'));
$app_id = C('QQ_AUTH.APP_ID');
$app_key = C('QQ_AUTH.APP_KEY');
$callback = C('QQ_AUTH.CALLBACK');
$qq = new \Common\Api\QQConnect;
/* callback返回openid和access_token */
$back = $qq->callback($app_id , $app_key, $callback);
//防止刷新
empty($back) && $this->error("请重新授权登录",U('/user/login/index'));
//此处省略数据库查询,查询返回的$back['openid']
break;
/* 接受新浪微博登录返回值 */
case sina:
empty($_GET['code']) && $this->error("无效的第三方方式",U('/user/login/index'));
$app_id = C('SINA_AUTH.APP_ID');
$app_key = C('SINA_AUTH.APP_KEY');
$scope = C('SINA_AUTH.SCOPE');
$callback = C('SINA_AUTH.CALLBACK');
$weibo = new \Common\Api\WeiboConnect;
/* callback返回openid和access_toke */
$back = $weibo->callback($app_id , $app_key, $callback);
empty($back) && $this->error("请重新授权登录",U('/user/login/index'));
//此处省略数据库查询,查询返回的$back['openid']
break;
/* 默认错误跳转到登录页面 */
default:
$this->error("无效的第三方方式",U('/user/login/index'));
break;
}
}
}

新浪qq登录的更多相关文章
- php 解析 视频 信息 封面 标题 图片 支持 优酷, 土豆 酷6 56 新浪 qq播客 乐视 乐视
原文地址:http://www.lianyue.org/2013/2497/ <?php /** * 解析 视频信息 类 * * 支持 优酷, 土豆 酷6 56 新浪 qq播客 乐视 乐视 ** ...
- 新浪API登录实例
步骤一:添加网站 进入新浪微博开放平台,http://open.weibo.com/apps 进入“管理中心“,点击”创建应用”,选择“网页应用”,填写相应的信息后提交. 步骤二:Oauth2.0授权 ...
- 新浪授权认证(不用SDK)
微博开放平台:http://open.weibo.com/ 微博开放接口的调用,如发微博.关注等,都是需要获取用户身份认证的.目前微博开放平台用户身份鉴权主要采用的是OAuth2.0.另外,为了方便开 ...
- 微信qq,新浪等第三方授权登录的理解
偶们常说的第三方是指的微信,qq,新浪这些第三方,因为现在基本每个人都有qq或者微信,那么我们就可以通过这些第三方进行登录.而这些网站比如慕课网是通过第三方获取用户的基本信息 它会有个勾选按钮,提示是 ...
- QQ 微信 新浪 无法 分享 收集
1.网络请求报错.升级Xcode 7.0发现网络访问失败.输出错误信息 The resource could not be loaded because the App Transport Secur ...
- VC POST表单——登录验证新浪邮箱
1.本机环境: Windows XP SP3.ADSL 2.开发工具: WildPackets OmniPeek V5.1.4 Visual C++ 6.0 IE6.0 FlexEdit V2.3.1 ...
- Java Web(十三) 使用javamail进行发送邮件,(使用QQ,163,新浪邮箱服务器)
加油加油. --WH 一.发送邮件的原理 在了解其原理之前,先要知道两个协议,SMTP和POP3 SMTP:Simple Mail Transfer Protocol,即简单邮件传输协议,发送邮件的协 ...
- 【公众号】微信第三方登录(静默授权和非静默授权)(具体代码:U盘 新浪云SAE)
一.微信联合登录是怎么登录的,有几种登录方式:微信联合登录和微信授权登录[授权登录(非静默授权)与静默授权] [主动授权]:需要用户确认登录,这样可以通过用户的个人确认,获取用户全面的信息,无论是否关 ...
- tp5集成淘宝,微信,网易,新浪等第三方登录
tp5集成淘宝,微信,网易,新浪等第三方登录 一.总结 一句话总结: 接口 链接 实现的话就是这些平台给的一个接口(链接),你通过这些接口登录进去之后,它会给你返回用户名,头像之类的信息,我们的网站存 ...
随机推荐
- grep命令最经常使用的功能总结
1. grep最简单的用法,匹配一个词:grep word filename 2. 能够从多个文件里匹配:grep word filename1 filenam2 filename3 3. 能够使用正 ...
- 有oracle 10g,但没有安装arcgis,又想使用空间数据库的解决方案
我在一台虚拟机中部署系统进行测试,配置如下: OS:WIN2008 R2 SP1 X64 DB: oracle 12c 结果系统报错,查找原因,原来是oracle里还不支持arcgis的一些所谓的空间 ...
- BindException 无法指定被请求的地址
Caused by: java.net.BindException: Problem binding to [hadoop3:8096] java.net.BindException: 无法指定被请求 ...
- 关于前端js拼接字符串的一点小经验
1.今天在做项目的时候遇到一个问题,就是使用onclick="xxx()" 点击事件的时候,参数如果为全数字就会出现点击无反应的问题.但是当参数为字符串或者动态内容的时候就会出现 ...
- LEA指令与MOV指令的区别——发现一本汇编好书
一.汇编语言中PTR的含义及作用mov ax,bx ;是把BX寄存器“里”的值赋予AX,由于二者都是word型,所以没有必要加“WORD”mov ax,word ptr [bx];是把内存地址等于“B ...
- 两大数相乘 -- javascript 实现
(function (){ var addLarge = function(n1,n2){ var carry = 0; var ret = ""; n1=n1.toString( ...
- mysql17---增量备份
mysql增量备份: 全备份是: (增量备份一定要看日志的时间和位置节点) mysql数据库会以二进制的形式,把用户对mysql数据库的操作记录到文件中,不用使用定时器了.当用户希望恢复的时候,可以使 ...
- java元组-泛型
需要组合对象的时候使用元组可以简化代码,不需要每当需要组合类的时候都去创建一个新的对象.单元素就是常见的泛型,可以两个三个到多个元素:元组可以继承:java泛型不能使用基本类型如int long 必须 ...
- C++ 多线程与并发
1. 非原子操作 这些非原子操作在被编译为汇编代码后不止一条指令. 自加.自减少: new 关键字: 申请内存: 调用构造函数: pInst = new T; // 对于这样一个赋值语句,更是包含了如 ...
- bzoj4196 [Noi2015]软件包管理器——树链剖分
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4196 树链剖分. 代码如下: #include<iostream> #inclu ...