之前博客也写过Oauth2的,不过没有和新浪qq等做整合,具体的也可以看https://www.cnblogs.com/dalianpai/p/12423982.html.
首先要跟着视频开通我的应用,然后看对应的API,反正也比较简单。是Oauth2的授权码模式,很完善。
具体的流程图:
下面就是简单的代码整合:
<ul>
<li>
<a href="https://api.weibo.com/oauth2/authorize?client_id=31031789&response_type=code&redirect_uri=http://auth.gulimall.com/oauth2.0/weibo/success">
<img style="width: 50px;height: 18px" src="/static/login/JD_img/weibo.png"/>
</a>
</li>
<li class="f4"> |</li>
<li>
<a href="/static/login/">
<img src="/static/login/JD_img/weixin.png"/>
<span>微信</span>
</a>
</li>
</ul>
具体的业务逻辑代码
@GetMapping("/oauth2.0/weibo/success")
public String weibo(@RequestParam("code") String code) throws Exception {
System.out.println(code);
Map<String, String> map = new HashMap<>();
map.put("client_id","31031789");
map.put("client_secret","38c9571dd37d99d7f3d6aab02a77d14d");
map.put("grant_type","authorization_code");
map.put("redirect_uri","http://auth.gulimall.com/oauth2.0/weibo/success");
map.put("code",code);
HttpResponse response = HttpUtils.doPost("https://api.weibo.com", "/oauth2/access_token", "post", new HashMap<>(), new HashMap<>(), map);
System.out.println(response);
//2.处理
if(response.getStatusLine().getStatusCode()==200){
String json = EntityUtils.toString(response.getEntity());
SocialUser socialUser = JSON.parseObject(json, SocialUser.class);
R oauthLogin = memberFeignService.oauthLogin(socialUser);
if(oauthLogin.getCode() == 0){
MemberRespVo data = oauthLogin.getData("data", new TypeReference<MemberRespVo>() {
});
System.out.println("登录成功"+data);
return "redirect:http://gulimall.com";
}else{
return "redirect:http://auth.gulimall.com/login.html";
}
}else{
return "redirect:http://auth.gulimall.com/login.html";
}
}
具体的实现:
@Override
public MemberEntity login(SocialUser socialUser) throws Exception {
String uid = socialUser.getUid();
MemberDao memberDao = this.baseMapper;
MemberEntity memberEntity = memberDao.selectOne(new QueryWrapper<MemberEntity>().eq("social_uid", uid));
if(memberEntity != null){
MemberEntity update = new MemberEntity();
update.setId(memberEntity.getId());
update.setAccessToken(socialUser.getAccess_token());
update.setExpiresIn(socialUser.getExpires_in());
memberDao.updateById(update);
memberEntity.setAccessToken(socialUser.getAccess_token());
memberEntity.setExpiresIn(socialUser.getExpires_in());
return memberEntity;
}else{
MemberEntity regist = new MemberEntity();
try {
Map<String, String> query = new HashMap<>();
query.put("access_token",socialUser.getAccess_token());
query.put("uid",uid);
HttpResponse response = HttpUtils.doGet("https://api.weibo.com", "/2/users/show.json", "get", new HashMap<String, String>(), query);
if(response.getStatusLine().getStatusCode() == 200) {
String json = EntityUtils.toString(response.getEntity());
JSONObject jsonObject = JSON.parseObject(json);
String name = jsonObject.getString("name");
String gender = jsonObject.getString("gender");
regist.setNickname(name);
regist.setGender("m".equals(gender) ? 1 : 0);
}
}catch (Exception e){
}
regist.setSocialUid(socialUser.getUid());
regist.setAccessToken(socialUser.getAccess_token());
regist.setExpiresIn(socialUser.getExpires_in());
memberDao.insert(regist);
return regist;
}
}
结果:
原文:https://www.cnblogs.com/dalianpai/p/13326607.html