腾讯QQ第三方平台接入指南

之前还没有弄过QQ第三方登陆接口的经历,所以今天就折腾了一下,不知道是自己的问题还是腾讯官方没有具体明确说明,

让我一直以为在 http://op.open.qq.com/manage_centerv2/pc 申请得appid和appkey就可以了,

白俊遥博客

后面我就从这里获取到了这两个参数,于是折腾来了,

100019用code换取access token值失败。

接着我使用网上介绍的方法逐一调试

  • 第一步:获取 code

https://graph.qq.com/oauth2.0/authorize?response_type=code      //固定写法&client_id=" . $app_id . " //腾讯给的APPID&redirect_uri=" . urlencode($my_url) . "   //回调地址&state=". $_SESSION['state'];$Scope="get_user_info" 这个是     //网站申请获取用户的信息123456123456
  • 第二步:根据 code 获取 access_token

https://graph.qq.com/oauth2.0/token?grant_type=authorization_code       //固定写法&client_id=[YOUR_APP_ID]        //APP_ID&client_secret=[YOUR_APP_Key]       //APP_KEY&code=[The_AUTHORIZATION_CODE]  //Authorization Code 的值&state=[The_CLIENT_STATE]       //防止攻击&redirect_uri=[YOUR_REDIRECT_URI]   //回调12345671234567
  • 第三步:使用Access Token来获取用户的OpenID

/me?access_token=YOUR_ACCESS_TOKEN 11
  • 第四步:使用Access Token和的OpenID 获取get_user_info信息

以OAuth2.0协议为例(敏感信息都用*号进行了处理,实际请求中需要替换成真实的值):
https://graph.qq.com/user/get_user_info? 
access_token=*************&
& 
openid=****************&
format=json

openID用户是在这个网站的标识,用户第一次登录还是再次登录就是用这个标识的。通过openID和appID和access_token使用OpenAPI接口来获取用户的信息。具体API的使用请阅读第三方提供方的开发文档

调试过程中出现的Bug :

100009client_secret(即appkey)非法。

原因:appkey未正确填写,少一个或多一个空格都不行,更别说多一个非法字符

100020code被重复使用。

原因:两次或两次以上使用上述第一步方法调试获取code都会被接口检测到重复使用code

100031第三方应用没有对该api操作的权限。请发送邮件进行OpenAPI权限申请

获取用户信息失败:app has no privilege to use this api

好了答案很明显了。OpenAPI权限申请 自己点击去看吧

应用接入前,需首先进行申请,获得对应的appid与appkey,以保证后续流程中可正确对网站与用户进行验证与授权。

真是难,他们把新旧网站都放在一起了,旧的网站去申请获取得appKey没有任何流程,但是到后面给我的结果是app has no privilege to use this api

后来去网上度娘了许久,也没有这部分的解决方案。但我英文也算是可以了,可以看得懂这几个单词是啥意思,最终还是求助于官方网站开发文档了,

回头找到100031错误,我晕,那后面出现了这个OpenAPI权限申请 我怀疑这是在跟我开玩笑吗,之前一直在http://op.open.qq.com/manage_centerv2/pc

这个网址逗留,也没找到哪个入口说是要申请啊。好了废话不多说了,你们自己点OpenAPI看吧。


接着说一下基于thinkphp框架使用QQ接口获取用户信息的设计于实现

一、)首先,得建立一个数据表,用来存储qq登陆后获取的信息

如下字段:

CREATE TABLE `user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `nickname` varchar(30) NOT NULL DEFAULT '' COMMENT '第三方昵称',
  `head_img` varchar(255) NOT NULL DEFAULT '' COMMENT '头像',
  `openid` varchar(40) NOT NULL DEFAULT '' COMMENT '第三方用户id',
  `access_token` varchar(255) NOT NULL DEFAULT '' COMMENT 'access_token token',
  `create_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '绑定时间',
  `last_login_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最后登录时间',
  `last_login_ip` varchar(16) NOT NULL DEFAULT '' COMMENT '最后登录ip',
  `login_times` int(6) unsigned NOT NULL DEFAULT '0' COMMENT '登录次数',
  `status` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '状态',
  `email` varchar(255) NOT NULL DEFAULT '' COMMENT '邮箱',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;


上面的数据表设计是按照你能从腾讯那获取到这两部分信息

白俊遥博客

更多参数见qq的API开发文档

但如果你有需要可以申请获取其他信息的权限,要不要钱我不清楚,但我知道天上不会白白掉馅饼^ - ^。

二、)thinkphp获取code ->acess_token ->openAPI->get_user_info的流程和实现代码:

   因为我实在不解,网上的没有一个详细的案例,分享还要各种积分,无语了,我就是要刨根解底地给有需要的人详解一遍,破破这风气。

   1.在前台设置qq按钮点击跳转到处理该请求的方法

<li class="b-nav-cname b-nav-login">
   <a  
href="{:U('Home/User/oauth_login',array('type'=>'qq'))}"><img src="__HOME_IMAGE__/qq_top_default.png" width="20" alt="QQ登录" title="QQ登录" /></a>
</li>


   2.处理方法

// 第三方平台登录
public function oauth_login(){
   
$type=I('get.type');
   
import("Org.ThinkSDK.ThinkOauth");
   
$sdk=\ThinkOauth::getInstance($type);
   
redirect($sdk->getRequestCodeURL());
}//会跳转到第三方平台

如下带上APPkey, callback回调方法,响应类型等参数去请求获取得code

/**
*
请求code
*/
public function getRequestCodeURL(){
 
$this->config();
 
//Oauth 标准参数
 
$params = array(
     
'client_id'     => $this->AppKey,
     
'redirect_uri'  => $this->Callback,
     
'response_type' => $this->ResponseType,
 
);

 
//获取额外参数
 
if($this->Authorize){
     parse_str(
$this->Authorize, $_param);
     
if(is_array($_param)){
       
$params = array_merge($params, $_param);
     
} else {
       
throw new Exception('AUTHORIZE配置不正确!');
     
}
  }
 
return $this->GetRequestCodeURL . '?' . http_build_query($params);
}

得到code和type类型之后会跳转到接受该请求回来的参数处理的方法,我的是/Api/index/oauth (模块名/控制器/方法名)

接着获取access_token,不要问我获取token要带什么参数去,上面讲得很清楚,自己回头看

$type=I('get.type');
$code=I('get.code');
//加载ThinkOauth类并实例化一个对象
import("Org.ThinkSDK.ThinkOauth");
$sns  = \ThinkOauth::getInstance($type);
//腾讯微博需传递的额外参数
$extend = null;
if($type == 'tencent'){
   
$extend = array('openid' => $this->_get('openid'), 'openkey' => $this->_get('openkey'));
}
$token = $sns->getAccessToken($code , $extend);

得到token之后就可以去获取用户信息了,刚才说了,这个要申请审核通过才能获取得到,不然就像我一样在这里遇到app has no privilege to use this api

接着看获取token得函数,不知道那个获取url的地址,请回头看上面

if(is_array($token)){
   
// 获取第三方账号数据
   
$user_info = $this->$type($token);
   
$data=array(
       
'uid'=>0,
       
'type'=>$user_info['type'],
       
'nickname'=>$user_info['nickname'],
       
'head_img'=>$user_info['head_img'],
       
'openid'=>$token['openid'],
       
'access_token'=>$token['access_token'],
       
);
   
// 获取本地数据库的用户数据
   
$user_data=D('OauthUser')->getDataByOpenid($data['openid']);
   
// 如果登录过 则覆盖;没有登录这添加数据
   
if(empty($user_data)){
       
$id=D('OauthUser')->addData($data);
   
}else{
       
$id=D('OauthUser')->editData($data);
   
}

上面那个$this->$type() ,其$type='qq',就是跳转到qq()方法,不要问我为什么,如果这都不懂,回去巩固php基础知识吧

//登录成功,获取腾讯QQ用户信息
public function qq($token){
   import(
"Org.ThinkSDK.ThinkOauth");
   
$qq   = \ThinkOauth::getInstance('qq', $token);
   
$data = $qq->call('user/get_user_info');
   
if($data['ret'] == 0){
       
$userInfo['type'] = 1;
       
$userInfo['name'] = $data['nickname'];
       
$userInfo['nickname'] = $data['nickname'];
       
$userInfo['head_img'] = $data['figureurl_2'];
       
return $userInfo;
   
} else {
       throw_exception(
"获取腾讯QQ用户信息失败:{$data['msg']}");
   
}
}

上面写得很清楚了,之前建的得数据表用途就在这里了,没有登录过的用户信息就把他插入到数据表中,若数据表已经存有的就修改之前的数据。具体的添加插入方法我觉得没有必要说了,哎呀既然说是详细篇就附上代码吧

// 添加数据
public function addData($data){
   
if($create=$this->create($data)){
       
$id=$this->add($create);
       
return $id;
   
}
}
// 修改数据
public function editData($data){
   
$openid=$data['openid'];
   
if($create=$this->create($data)){
       
$create['login_times']=array('exp','login_times+1');
       
unset($create['status']);
       
unset($create['create_time']);
       
$this->where(array('openid'=>$openid))->save($create);
       
return $this->getFieldByOpenid($openid,'id');
   
}
}

好了说完了,也就那样了。,拿去用吧,免费的

白俊遥博客
请先登录后发表评论
  • 最新评论
  • 总共0条评论