当前位置:首页 > 开发教程 > Web前端 >

j2ee中实现QQ第三方登陆

时间:2016-09-26 16:36 来源:互联网 作者:源码搜藏 收藏

最近接触了一些第三方登陆的东西,弄的真是一个头,两个大. 今天,终于把腾讯第三方登陆调试通了,做一个记录,顺便发发牢骚。 QQ互联官网:http://connect.qq.com/ 申请之类的就不多说了,没什么难点,主要记录一下代码方面的东西。 看官方文档的时候写的太

最近接触了一些第三方登陆的东西,弄的真是一个头,两个大>.<

今天,终于把腾讯第三方登陆调试通了,做一个记录,顺便发发牢骚。

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/authorizeresponse_type=token&client_id=[YOUR_APPID]&redirect_uri=[YOUR_REDIRECT_URI]&scope=[THE_SCOPE]


QQ登陆示例代码:

 

[html] view plain copy
 
 print
  1. <a href="https://graph.qq.com/oauth2.0/authorizeresponse_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这时就可以将?之前的路径换成本地环境,进行本地调试,

 

[plain] view plain copy
 
 print
  1. http://jishanjia.lanbaoo.com/login/bind#access_token=F2B24AABBF5D69995C52D9007D1DBCE6&expires_in=7776000  
换成

 

 

[plain] view plain copy
 
 print
  1. 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/meaccess_token=YOUR_ACCESS_TOKEN

2. 获取到用户OpenID,返回包如下:

示例代码:

 

[javascript] view plain copy
 
 print
  1. var accessToken = window.location.hash.substring(1);//获取路径中的access_token  
  2.     $.ajax({  
  3.           type: 'GET',  
  4.           url: 'https://graph.qq.com/oauth2.0/me'+accessToken,  
  5.           async: false,  
  6.           dataType: "jsonp",  
  7.           jsonp: "callback",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback)  
  8.           jsonpCallback:"callback",  
  9.           success: function(o){  
  10.               console.log(o);//o就是上面提到的返回包  
  11.               $.ajax({  
  12.                   type: 'POST',  
  13.                   url:$CONFIG.base_url+"/third/qq/get_user_info",  
  14.                   data:{url: 'https://graph.qq.com/user/get_user_info'+accessToken+'&oauth_consumer_key=101009536&openid='+o.openid},  
  15.                   async: false,  
  16.                   dataType: "json",  
  17.                   success: function(e){  
  18.                       alert(e.nickname);  
  19.                       console.log(e);  
  20.                       $("#userImg").attr("src",e.figureurl_qq_2);  
  21.                   }  
  22.             });  
  23.           }  
  24.     });  

获取到OpenID后就可以获取用户信息了(get_user_info)详情参照api文档

 

获取user_info的时候jsonp就有点不对头了,虽然可以获取到,但是要报错,可能时jsonp用的不够熟练吧。然后我有采用后台获取用户信息的方式进行了一次中转。

代码如下:

 

[java] view plain copy
 
 print
  1. @RequestMapping(value = "/qq/get_user_info", method = RequestMethod.POST)  
  2.     public ResponseEntity<HttpEntity> qqGetUserInfo(HttpServletRequest request) {  
  3.   
  4.         String url = request.getParameter("url");  
  5.         System.out.println(url);  
  6.         HttpClient httpClient = new HttpClient();  
  7.         // 创建GET方法的实例  
  8.         GetMethod getMethod = new GetMethod(url);  
  9.         // 使用系统提供的默认的恢复策略  
  10.         getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,  
  11.                 new DefaultHttpMethodRetryHandler());  
  12.         try {  
  13.             // 执行getMethod  
  14.             int statusCode = httpClient.executeMethod(getMethod);  
  15.             if (statusCode != 200) {  
  16.                 System.err.println("Method failed: "  
  17.                         + getMethod.getStatusLine());  
  18.             }  
  19.             // 读取内容  
  20.             byte[] responseBody = getMethod.getResponseBody();  
  21.             // 处理内容  
  22.             return new ResponseEntity(responseBody,HttpStatus.OK);  
  23.         } catch (HttpException e) {  
  24.             // 发生致命的异常,可能是协议不对或者返回的内容有问题  
  25.             System.out.println();  
  26.             e.printStackTrace();  
  27.             return new ResponseEntity("Please check your provided http address!",HttpStatus.BAD_REQUEST);  
  28.         } catch (IOException e) {  
  29.             // 发生网络异常  
  30.             e.printStackTrace();  
  31.             return new ResponseEntity("Time out!",HttpStatus.BAD_GATEWAY);  
  32.         } finally {  
  33.             // 释放连接  
  34.             getMethod.releaseConnection();  
  35.         }  
  36.           
  37.     }  

这样一次QQ登陆然后获取用户信息就完成了。

相关各语言对接qq快捷登录教程

[C#]QQ开放平台(QQ站外登录)_流程和源码示例

j2ee中实现QQ第三方登陆

web实现QQ第三方登录

asp.net网站接入QQ登录

php实现qq第三方登录


Web前端阅读排行

最新文章