紧接着上次的第三方登陆文档,这一波又来了。php
1、使用qq登陆https://connect.qq.com/html
首次登陆的话会跳转到应用开发者注册,本身测试的话选择我的。下面的各项本身按真实状况填写。java
注册后添加应用,网址必定要是外网能访问的你的网站,不能随便填写的。点击验证会出现一部分代码,将代码复制粘贴在你网站首页或者一级目录下HTML代码的head标签中。完成代码粘贴 后点击弹出成的开始验证。验证成功会提示网站验证成功,下一步建立应用。 json
建立成功后自动跳转到应用,页面上会显示上一个博文中的APPID和APPKEY了。 安全
配置本地的项目的域名,将域名指向127.0.0.1;没有虚拟机的可使用localhost来配置,在本身的域名所指位置或者localhost建立一个接收返回值的php文件,如:code.php。在其中 接收$_GET[“code”]。并将其也配置在你添加的应用回调地址中(http://localhost/code.php)。(多个回调地址中间用英文分号隔开)cookie
QQ互联每修改一次配置都有验证一下网址才能够保存。session
2、引入官方SDKapp
从开放平台的文档资料下载SDKide
找个合适的版本,由于我作的是PHP,就下载PHP的,作java的小伙伴能够下载java的对应类型。函数
下载解压后会有一个connect2.1的文件夹,放在项目的根目录,API文件夹中放置了配置文件和接入类,开发中主要用的就是这个文件夹,doc文件夹是开发帮助文档,example中是一
些功能示例。Install文件夹是帮助配置的一个文件。
访问connect2.1文件夹,会显示下图的样子,按照提示填写配置,请求受权不建议选择太多,按照本身的需求选择就能够,由于选择的受权都会在用户登陆的OAuth页面显示给用户的,
给用户不安全感。配置以后除了API文件夹其余均可以删掉啦。
若是没有看上一篇博文的话要提早看一下,方便理解啊。
QQ互联http://wiki.connect.qq.com/这个页面中OAuth协议介绍中有开发攻略, Server_side 和 Client_side分别指的服务端语言和客户端语言分别是怎么接入的,php语言是服务端语言,因此使用
的是Server_side。
3、SDK核心类和重要方法
登陆受权相关的三个主要类(Connect2.1/class/*.class.php)
(1)、Recorder.class.php[配置读写与SESSION存取]
__construct方法中:
$incFileContents = file(ROOT."comm/inc.php");//读取配置文件json串inc.php是自动 生成的一个文件,里面包含有appid,appkey,callback等
$incFileContents = $incFileContents[1];
$this->inc = json_decode($incFileContents);//解析成PHP对象
readInc($name)方法中:
return $this->inc->$name;//->readInc("appid")即读取配置文件的appid
(2)、URL.classphp[基于CURL库的get与post请求]
public function combineURL($baseURL,$keysArr){ $combined = $baseURL."?";//拼接? $valueArr = array(); foreach($keysArr as $key => $val){
$valueArr[] = "$key=$val";//拼接参数 } $keyStr = implode("&",$valueArr);//使用&拼接参数键值对 $combined .= ($keyStr); return $combined; }
(3)、Oauth.class.php[Oauth相关URL动态拼接与token操做]
public function qq_login(){//拼接qq登陆页面URL $appid = $this->recorder->readInc("appid");//读取appid $callback = $this->recorder->readInc("callback");//读取回调地址 $scope = $this->recorder->readInc("scope");//读取受权列表 //-------生成惟一随机串防CSRF攻击 $state = md5(uniqid(rand(), TRUE));//原样返回参数 $this->recorder->write('state',$state);//state写入session中 //-------构造请求参数列表 $keysArr = array( "response_type" => "code", "client_id" => $appid, "redirect_uri" => $callback, "state" => $state, "scope" => $scope ); $login_url = $this->urlUtils->combineURL(self::GET_AUTH_CODE_URL, $keysArr); header("Location:$login_url"); }
4、SDK优化
SDK太长时间也没有新的版本,因此有的东西老了,要调整一下文件及目录。SDK中可能有常量名称太普通,与你本地的项目中常量名称重复了;因此能够批量替换SDK中的常量名称为不常见
的名称。能够将代码少的文件直接写在包含该文件的页面中,省去包含。而后能够将不用的文件删除。
下面呢有一个调试函数,能够新建一个php文件放进去,我这就放到了debug.php中了;在项目中引入这个文件用来调试。
function debug($val,$dump=false,$exit=true){ if($dump){ $zz = 'var_dump'; } else { $zz = (is_array($val)|| is_object($val))?'print_r':'printf'; } //输出到html、 header("Content-type:text/html;charst=utf-8"); echo '<pre>debug output:<hr/>'; $zz($val); echo '</pre>'; if($exit)exit; }
qqlogin.php页面
require_once 'debug.php';
require_once 'Connect2.1/qqConnectAPI.php';
//访问QQ登陆页面
$oauth = new Oauth();
$oauth->qq_login();
5、获取openId
QQ用户在第三方站点的惟一标识,同一个QQ用户在不一样站点登陆使用QQ登陆openID是同样的。能够直接判断openID是否是第一次登陆就能够知道用户是否是第一次登陆,能够作一些限制什 么的。
获取openID:
Callback.php页面
require_once 'debug.php';
require_once 'Connect2.1/qqConnectAPI.php';
//请求accesstoken
$oauth = new Oauth();
$accesstoken=$oauth->aa_callback();
$openid=$oauth->get_openid();
最后能够将$accesstoken和$openid存在cookie里,退出qq登陆时候也就是将cookie中存的数据删除掉。
在使用过程当中须要注意如下三点:
APPid申请以后3个月未申请上线将被回收。
申请上线须要使用官网提供的QQ登陆按钮素材。
站点里不能有违国家法律的东西。
接下来的开发能够参照官方给的流程:在这里-->http://wiki.connect.qq.com/
这个暂时告一段落了,后面还要继续新的方向......加油!