首先得申请相应的应用 ID和key值。地址 是:http://connect.qq.com/intro/login/
下面是登录过程演示如图:
然后点击登录如下图所示:
这已经是地个绑定好关联账号的登录了。那么我们怎么用Spring mvc实现呢?
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这个是你申请后有的。跳转地址这个重要,如果在没有绑定账号情况下需要跳转到邦定的页面如图:
我这里做了注册绑定和已有账号绑定,所以需要提供2种情况。下面看验证过程代码。
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