j2ee中实现QQ第三方登陆
最近接触了一些第三方登陆的东西,弄的真是一个头,两个大>.<
今天,终于把腾讯第三方登陆调试通了,做一个记录,顺便发发牢骚。
QQ互联官网: http://connect.qq.com/
申请之类的就不多说了,没什么难点,主要记录一下代码方面的东西。
看官方文档的时候写的太详细,太复杂了。看了一堆没用的,和误导的。
由于项目中用的是自定义的图标,所以没有用Js SDK(后来才知道好像官方的js SDK也可以自定义图标)
之前看的是
OAuth2.0开发指引
中的“开发攻略_Server-side”光获取access_token就非了九牛二虎之力。
后来发现“开发攻略_Client-side”中的方法要简单的多。现在也没弄清楚为什么要分两个。
废话不多说,进入主题:
1. 打开浏览器,访问如下地址(请将client_id,redirect_uri,scope等 参数值替换为你自己的):
https://graph.qq.com/oauth2.0/authorize?response_type=token&client_id=[YOUR_APPID]&redirect_uri=[YOUR_REDIRECT_URI]&scope=[THE_SCOPE]
QQ登陆示例代码:
<a href="https://graph.qq.com/oauth2.0/authorize?response_type=token&client_id=101009536&redirect_uri=jishanjia.lanbaoo.com/login/bind&scope=get_user_info">腾讯QQ登录</a>
特别提示:
1. 请求时传入的recirect_uri必须与注册时填写的回调地址一致,用来进行第三方应用的身份验证。
2. 可通过js方法:window.location.hash来获取URL中#后的参数值,
授权成功后就跳转到recirect_uri这时就可以将?之前的路径换成本地环境,进行本地调试,
将
http://jishanjia.lanbaoo.com/login/bind?#access_token=F2B24AABBF5D69995C52D9007D1DBCE6&expires_in=7776000换成
http://localhost:8088/mercy/login/bind?#access_token=F2B24AABBF5D69995C52D9007D1DBCE6&expires_in=7776000
expires_in=7776000应该是access_token的有效时间
然后用获取到的access_token获取OpenID
发送请求到如下地址(请将access_token等参数值替换为你自己的):
https://graph.qq.com/oauth2.0/me?access_token=YOUR_ACCESS_TOKEN
2. 获取到用户OpenID,返回包如下:
1
|
callback({"client_id":"YOUR_APPID","openid":"YOUR_OPENID"});
|
示例代码:
var accessToken = window.location.hash.substring(1);//获取路径中的access_token $.ajax({ type: 'GET', url: 'https://graph.qq.com/oauth2.0/me?'+accessToken, async: false, dataType: "jsonp", jsonp: "callback",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback) jsonpCallback:"callback", success: function(o){ console.log(o);//o就是上面提到的返回包 $.ajax({ type: 'POST', url:$CONFIG.base_url+"/third/qq/get_user_info", data:{url: 'https://graph.qq.com/user/get_user_info?'+accessToken+'&oauth_consumer_key=101009536&openid='+o.openid}, async: false, dataType: "json", success: function(e){ alert(e.nickname); console.log(e); $("#userImg").attr("src",e.figureurl_qq_2); } }); } });
获取到OpenID后就可以获取用户信息了(get_user_info)详情参照 api文档
获取user_info的时候jsonp就有点不对头了,虽然可以获取到,但是要报错,可能时jsonp用的不够熟练吧。然后我有采用后台获取用户信息的方式进行了一次中转。
代码如下:
@RequestMapping(value = "/qq/get_user_info", method = RequestMethod.POST) public ResponseEntity<HttpEntity> qqGetUserInfo(HttpServletRequest request) { String url = request.getParameter("url"); System.out.println(url); HttpClient httpClient = new HttpClient(); // 创建GET方法的实例 GetMethod getMethod = new GetMethod(url); // 使用系统提供的默认的恢复策略 getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler()); try { // 执行getMethod int statusCode = httpClient.executeMethod(getMethod); if (statusCode != 200) { System.err.println("Method failed: " + getMethod.getStatusLine()); } // 读取内容 byte[] responseBody = getMethod.getResponseBody(); // 处理内容 return new ResponseEntity(responseBody,HttpStatus.OK); } catch (HttpException e) { // 发生致命的异常,可能是协议不对或者返回的内容有问题 System.out.println(); e.printStackTrace(); return new ResponseEntity("Please check your provided http address!",HttpStatus.BAD_REQUEST); } catch (IOException e) { // 发生网络异常 e.printStackTrace(); return new ResponseEntity("Time out!",HttpStatus.BAD_GATEWAY); } finally { // 释放连接 getMethod.releaseConnection(); } }
这样一次QQ登陆然后获取用户信息就完成了。
Zemo手打,转载标明出处:http://blog.csdn.net/zemochen/article/details/19049357
参考文档: QQ互联文档资料
http://www.ibm.com/developerworks/cn/opensource/os-httpclient/