最近接触了一些第三方登陆的东西,弄的真是一个头,两个大>.<
今天,终于把腾讯第三方登陆调试通了,做一个记录,顺便发发牢骚。
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登陆示例代码:
-
<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这时就可以将?之前的路径换成本地环境,进行本地调试,
将
-
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/meaccess_token=YOUR_ACCESS_TOKEN
2. 获取到用户OpenID,返回包如下:
|
callback({"client_id":"YOUR_APPID","openid":"YOUR_OPENID"});
|
示例代码:
-
var accessToken = window.location.hash.substring(1);
-
$.ajax({
-
type: 'GET',
-
url: 'https://graph.qq.com/oauth2.0/me'+accessToken,
-
async: false,
-
dataType: "jsonp",
-
jsonp: "callback",
-
jsonpCallback:"callback",
-
success: function(o){
-
console.log(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();
-
-
GetMethod getMethod = new GetMethod(url);
-
-
getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
-
new DefaultHttpMethodRetryHandler());
-
try {
-
-
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登陆然后获取用户信息就完成了。
相关各语言对接qq快捷登录教程
上一篇: