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,返回包如下:

示例代码:

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互联文档资料

                jsonp跨域访问

                http://www.ibm.com/developerworks/cn/opensource/os-httpclient/





阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq245282209/article/details/19049357
想对作者说点什么? 我来说一句

java qq第三方登陆

2013年12月26日 3.9MB 下载

第三方QQ授权登录

2016年07月14日 4.22MB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭