腾讯开发文档入口
今天实现了web应用第三方QQ登入,由于我当时只看了开发文档中实现登入的流程,没有看SDK中的demo,所以SDK中的工具我没有用到。其实只要知道流程,完全可以不借助它的SDK也能实现第三方登入。当然,既然是别人自家开发的,用起来一般比我们自己编写要高效得多。下面我就将实现的流程及遇到的问题分享一下,由于代码涉及到个人应用私密信息故没有上传,望谅解
下面五步是准备工作:
第一步:在腾讯开发平台注册成为开发者,这里不多说
第二步:创建应用等待审核通过:
网站地址:你的网站域名或ip
回调地址:当用户QQ登入成功时会请求你指定处理数据的URL
主办单位名称:你的服务器备案的主办单位名称
网站备案号:服务器的备案号
第三步:审核通过后就会给你的应用分配APP ID和APP Key,这些是后续申请要用的,不要轻易透露给他人
第四步:在开发平台下载java SDK,将里面的jar包放到web应用的lib文件夹,qqconnectconfig.properties为配置文件放到src下就行(如图)
ps:如果你懂得了登入的流程并可以自己实现其实可以忽略第4步和第5步,实现登入的流程在后面。
第五步:修改qqconnectconfig.properties配置文件的前四行:
app_ID和app_KEY:你申请到的APP ID和APP Key
redirect_URL:你前面应用申请时填写的回调地址
scope:获取用户的哪些权限,一般没有额外申请权限就只能获取用户的基本信息,即get_user_info
准备工作完成了,接下来就要开始操作了!
第一步:自己写个简单的网页,实现QQ登入的跳转,图标可以在腾讯开放平台下载;
跳转的链接为:
https://graph.qq.com/oauth2.0/authorize?response_type=code&
client_id=你的APPID&
redirect_uri=回调地址& //纯数字英文可以不编码,但还是推荐编码,用URLEncoder.encode(url);
state=test& //state可以自定义值,它是用来防止CSRF攻击,如果成功会原样带回
scope=get_user_info
第二步:跳转后进入到请求登入界面:
用户登入成功后QQ会请求回调地址并在后面带回参数,如:
http://xxxxxxx/qqlogin?code=9A5F************************06AF&state=test
参数说明:
code:就是Authorization Code,后面申请授权令牌要用到,有效期为10分钟
state:是在第一步中传入的state,我们一定要判断这个state是否和第一步的state相等
第三步:获得了Authorization Code后,我们在后台请求下面的URL来获取到access_token授权令牌,可以用来获取openID的
https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&
client_id=你的APPID&
client_secret=你的APPKEY&
code=上一步得到的AuthorizationCode&
redirect_uri=你的回调地址 //纯英文数字可以不编码
请求成功后会返回一个数据包(腾讯开发文档上写的是请求成功后会再次跳转到回调地址,测试后并不会跳转而是返回数据包),如下:
access_token=FE04************************CCE2& //得到授权令牌
expires_in=7776000& //令牌有效时间(默认3个月)
refresh_token=88E4************************BE1 //重新获取新的授权令牌需要提供的参数
第四步:获取access_token后,我们再次在后台请求下面的URL来获取openid
https://graph.qq.com/oauth2.0/me?access_token=上一步获取的授权令牌
请求成功后会返回一个数据包,如下:
callback( {"client_id":"YOUR_APPID","openid":"YOUR_OPENID"} );
这个openid是与用户QQ号唯一对应的,也是我们最终要得到,我们可以将它绑定到用户从而来识别用户;
同时我们可以用这个openid来获取用户QQ上的信息。
第五步:通过openid来获取用户的基本信息,请求URL如下:
https://graph.qq.com/user/get_user_info?access_token=用户授权令牌&
oauth_consumer_key=你的APPID&
openid=上一步获取到的openid
请求成功返回以下JSON数据包:
{
"ret": 0,
"msg": "",
"is_lost":0,
"nickname": "可乐配鸡翅_", //用户昵称
"gender": "男", //性别
"province": "广东",
"city": "深圳",
"year": "1999",
"constellation": "",
"figureurl": "http:\/\/qzapp.qlogo.cn\/qzapp\/xxxxxxx\/30",
"figureurl_1": "http:\/\/qzapp.qlogo.cn\/qzapp\/101759515\/xxxxxxxx\/50",
"figureurl_2": "http:\/\/qzapp.qlogo.cn\/qzapp\/101759515\/xxxxxx\/100",
"figureurl_qq_1": "http://thirdqq.qlogo.cn/g?b=xx&k=xxxx&s=xx&t=xxxxxx", //这个是用户40x40像素的头像URL
"figureurl_qq_2": "http://thirdqq.qlogo.cn/g?b=xxx&k=xxxxx&s=xx&t=xxxxxx", //这个是用户100x100像素的头像URL
"figureurl_qq": "http://thirdqq.qlogo.cn/g?b=xxx&k=xxxx&s=xxxx&t=xxxxxxx",
"figureurl_type": "1",
"is_yellow_vip": "0",
"vip": "0",
"yellow_vip_level": "0",
"level": "0",
"is_yellow_year_vip": "0"
}
我们就可以获取到用户的基本信息了,实现统一登入体验;
如需获取用户更多信息可以在腾讯开放平台申请,具体操作自行查看。
腾讯开放平台入口
PS:同一QQ用户的移动应用和网站应用的openid是不一样的,如果我们有移动和网站应用时就不能区别是否是同一用户。
如果要实现用户统一登入体验,可以获取用户的unionid,同一QQ用户下它在移动应用和网站应用都是一样的,请求URL如下:
https://graph.qq.com/oauth2.0/me?access_token=用户的授权令牌&unionid=1
请求成功返回数据包:
callback(
{
"client_id":"YOUR_APPID",
"openid":"YOUR_OPENID",
"unionid":"YOUR_UNIONID"
}
);
我是程序小白,每次进步一丢丢。