@PostMapping("/member/member/oauth2/login")
R oauthlogin(@RequestBody SocialUser socialUser) throws Exception;
MemberRespVo
@ToString
@Data
public class MemberRespVo {
/**
* id
*/
private Long id;
/**
*
*/
private Long levelId;
/**
*
*/
private String username;
/**
*
*/
private String password;
/**
*
*/
private String nickname;
/**
*
*/
private String mobile;
/**
*
*/
private String email;
/**
* ͷ
*/
private String header;
/**
*
*/
private Integer gender;
/**
*
*/
private Date birth;
/**
*
*/
private String city;
/**
* ְҵ
*/
private String job;
/**
*
*/
private String sign;
/**
*
*/
private Integer sourceType;
/**
*
*/
private Integer integration;
/**
*
*/
private Integer growth;
/**
*
*/
private Integer status;
/**
* ע
*/
private Date createTime;
/**
* 社交登录唯一id
*/
private String socialUid;
/**
* 访问令牌
*/
private String accessToken;
/**
* 访问令牌的时间
*/
private Long expiresIn;
}
OAuth2Controller
/**
* 社交登录成功回调
* @param code
* @return
* @throws Exception
*/
@GetMapping("/oauth2.0/weibo/success")
public String weibo(@RequestParam("code") String code) throws Exception {
Map<String, String> map = new HashMap<>();
map.put("client_id", "2643514792");
map.put("client_secret", "9f5fa7f2d71667b211a6bc3a87b1ebb6");
map.put("grant_type", "authorization_code");
map.put("redirect_uri", "http://auth.gulimall.com/oauth2.0/weibo/success");
map.put("code", code);
//1、根据 code 换取 accessToken
HttpResponse response = HttpUtils.doPost("https://api.weibo.com", "/oauth2/access_token", "post", new HashMap<>(), map, new HashMap<>());
// 2、处理
if(response.getStatusLine().getStatusCode() == 200){
// 获取到accessToken
String json = EntityUtils.toString(response.getEntity());
SocialUser socialUser = JSON.parseObject(json, SocialUser.class);
//知道当前是哪个社交用户
//1)、当前用户如果是第一次进入网站,自动注册进来(为当前社交用户生成一个会员信息账号,以后这个社交账号就对应这个用户)
//登录或者注册这个社交用户
R oauthlogin = memberFeignService.oauthlogin(socialUser);
if(oauthlogin.getCode() == 0){
MemberRespVo data = oauthlogin.getData("data",new TypeReference<MemberRespVo>() {
});
log.info("登录成功:用户:{}", data.toString());
//2、登录成功就跳回首页
return "redirect:http://gulimall.com";
}else {
return "redirect:http://auth.gulimall.com/login.html";
}
} else {
return "redirect:http://auth.gulimall.com/login.html";
}
}
MemberServiceImpl
@Override
public MemberEntity login(SocialUser socialUser) throws Exception {
//登录和注册合并逻辑
String uid = socialUser.getUid();
//1、判断当前社交用户是否已经登陆过系统
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 {
//2、 没有查到当前社交用户对应记录,我们就需要注册一个
MemberEntity regist = new MemberEntity();
try {
//3、查询当前社交用户的社交账号信息(昵称,性别等)
Map<String, String> query = new HashMap<String, String>();
query.put("access_token", socialUser.getAccess_token());
query.put("uid", socialUser.getUid());
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;
}
}