Spring MVC实现QQ第三方登录

首先得申请相应的应用 ID和key值。地址 是:http://connect.qq.com/intro/login/

 

下面是登录过程演示如图:

QQ登录

然后点击登录如下图所示:

QQ登录

 

这已经是地个绑定好关联账号的登录了。那么我们怎么用Spring mvc实现呢?

code
1
2
3
4
5
6
7
8
9
10
11
12
/**
* qq登录页面
* @param session
* @param map
* @return
* @throws IOException
*/
@RequestMapping ( "qq/login" )
public String qqLoginUrl(HttpSession session,ModelMap map) throws IOException{
OauthConfig oc=oauthService.getOauthConfig( "qq" );
return "redirect:" +String.format( "%s?response_type=code&client_id=%s&redirect_uri=%s" ,oc.getAuthorizeUrl(),oc.getClientId(),oc.getRedirectUri());
}

这是一个验证过程,需要qq的authorize url和client_id以及跳转地址redirecturi。authorize url地址的参数是什么,详细请看qq登录的第三方API文档那里有地址。client_id这个是你申请后有的。跳转地址这个重要,如果在没有绑定账号情况下需要跳转到邦定的页面如图:

QQ绑定页面

我这里做了注册绑定和已有账号绑定,所以需要提供2种情况。下面看验证过程代码。

 

?
code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/**
* qq登录数据验证
* @param code
* @param map
* @param session
* @param request
* @return
*/
@SuppressWarnings ( "unchecked" )
@RequestMapping ( "qq/authorizationCode" )
public String qqAuthorizationCode(String code,ModelMap map,HttpSession session,HttpServletRequest request){
if (session.getAttribute( "openId" )== null ){
OauthConfig oc=oauthService.getOauthConfig( "qq" );
//String clientId=systemConfigService.getByVarName("cms_qqClientId", 0).getValue();
//String suffix=systemConfigService.getByVarName("core_dynamicSuffix", 0).getValue();
String url=String.format( "%s?grant_type=authorization_code&client_id=%s&client_secret=%s&code=%s&state=%s&redirect_uri=%s" ,oc.getTokenUrl(),oc.getClientId(),oc.getClientSecret(),code,UUID.randomUUID().toString(),oc.getRedirectUri());
DefaultHttpClient httpclient = HttpClientUtils.getHttpClient();
Map<String,String> obj= null ;
//String client_id=null;
String openid= null ;
try {
String request_token = HttpClientUtils.getHtml(httpclient, url, "UTF-8" );
System.out.println(request_token);
// if(request_token.indexOf("\"error\"")>=0){
// return "redirect:login"+suffix;
// }
HashMap<String, String> access_token = ParseString.parseTokenString(request_token);
String url2=String.format( "%s?access_token=%s" ,oc.getMeUrl(),access_token.get( "access_token" ));
String s = HttpClientUtils.getHtml(httpclient, url2, "UTF-8" );
openid=s.substring(s.indexOf( "\"openid\":\"" )+ 10 ,s.indexOf( "\"}" ));
String url3=String.format( "https://graph.qq.com/user/get_user_info?access_token=%s&oauth_consumer_key=%s&openid=%s" ,access_token.get( "access_token" ),oc.getClientId(),openid);
System.out.println(HttpClientUtils.getHtml(httpclient, url3, "UTF-8" ));
obj=JsonUtil.conventJsonToObject(HttpClientUtils.getHtml(httpclient, url3, "UTF-8" ), Map. class );
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// if(qqObj.getRet()!=0){
// throw new MessageException(300,"出现异常新重新登陆");
// }
map.addAttribute( "w" ,webConfigDAO.findById( "1" ));
if (oauthService.getByOpenId(openid, 1 )!= null ){
try {
if (oauthService.oauthLogin(openid, 1 , session,request)){
return "/WEB-INF/cms/system/member/loginCallback.html" ;
}
} catch (MessageException e) {
// TODO Auto-generated catch block
e.printStackTrace();
map.addAttribute( "msg" , e.getMessage());
return "/WEB-INF/cms/system/member/memberError.html" ;
}
}
session.setAttribute( "openId" , openid);
session.setAttribute( "loginType" , 1 );
session.setAttribute( "userInfo" , new String[]{obj.get( "nickname" ),obj.get( "gender" ),obj.get( "figureurl_1" ),obj.get( "figureurl_2" )});
} else {
session.removeAttribute( "openId" );
session.removeAttribute( "loginType" );
session.removeAttribute( "userInfo" );
}
return "/WEB-INF/cms/system/member/oauthPage.html" ;
}

用DefaultHttpClient类进行访问验证的页面,我们需要以下参数

 

 

Step1:获取Authorization Code

 

如果用户成功登录并授权,则会跳转到指定的回调地址,并在redirect_uri地址后带上Authorization Code和原始的state值

 

Step2:通过Authorization Code获取Access Token

 

这里是参数,大家可以结合上面的代码分析。

如果成功返回,即可在返回包中获取到Access Token。
返回如下字符串:access_token=FE04************************CCE2&expires_in=7776000&state=test 。

上面的代码url3主要是获取key和value存到map对你里面。然后通过freemarker框架来调用从qq那里得到的数据展示到页面。

那我们的数据库设计呢,我们只需要下面几个就行。

只需要一个qq返回的一个唯一ID值存到数据库然后在存会员的ID即可完成邦定。通过ID找到会员ID,在通过会员ID找到相应的会员。

好了教程就说到这里,有不懂的可以下载微骏CMS查看相应的代码以及数据库脚本。

登录表的结构如下:http://www.vijun.com/reference/vj_database/table/vj_oauth.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值