微信用户登录
1、微信扫码功能是目前第三方登录常见功能,前不久有个项目刚好用上。这里抽取出来演示下,仁者见仁,智者见智。不要喷。大神直接跳过。哈哈
2、调用的过程和原理参考微信官方接口,这里只给出自己项目后端的一些逻辑。
3、接口controller层。参数code 是前端传过来的,这个需要前端同事提前获取到用户的微信扫码code
@GetMapping("/userWeChatLogin")
@ApiOperation(notes = "通过微信扫描登录", value = "/userWeChatLogin")
ResultData<?> userWeChatLogin(@Param(value = "code") String code) {
try {
log.info("userWeChatLogin->code:{}", code);
//用户登录
return new ResultData<>(ResultCode.SUCCESS, usersService.userWeChatLogin(code));
} catch (Exception ex) {
Map<String, Object> map = new HashMap<>();
ex.printStackTrace();
log.info("error:{}", ex.getMessage());
map.put("msg", ex.getMessage());
return new ResultData<>(ResultCode.FAIL, "", map);
}
}
/**
* 微信用户登录
*
* @param code
* @return
*/
String userWeChatLogin(String code) throws Exception;
4、实现服务类:
/**
* 微信用户登录
*
* @param weCode
* @return
* @throws Exception
*/
@Override
public String userWeChatLogin(String weCode) throws Exception {
if (weCode == null || weCode.isEmpty()) {
throw new Exception("微信code请求参数为空");
}
//通过微信注册用户信息
return this.weChartUserRegister(weCode);
}
5、服务类的具体实现,微信用户自动注册:
/**
* 微信用户自动注册
*
* @param weCode
* @return
*/
private String weChartUserRegister(String weCode) throws Exception {
WeCharUserInfo weCharUserInfo = weChatService.getWeChartUserInfo(weCode);
if (weCharUserInfo == null) {
throw new Exception("微信用户登录验证失败");
}
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq("open_id", weCharUserInfo.getOpenid());
Users users = this.baseMapper.selectOne(queryWrapper);
if (users != null) {
//写登录日志
saveUserLoginLogger(users);
return users.getToken();
}
//注册一个用户信息
users = new Users();
//设置电话信息
if (weCharUserInfo.getPhone() != null && !weCharUserInfo.getPhone().isEmpty()) {
users.setPhone(weCharUserInfo.getPhone());
}
//设置昵称
if (weCharUserInfo.getNickname() != null && !weCharUserInfo.getNickname().isEmpty()) {
users.setUserName("微信用户" + weCharUserInfo.getNickname());
} else {
users.setUserName("微信用户");
}
log.info("user head img:{}", weCharUserInfo.getHeadimgurl());
//头像
if (weCharUserInfo.getHeadimgurl() != null && !weCharUserInfo.getHeadimgurl().isEmpty()) {
users.setAvator(weCharUserInfo.getHeadimgurl());
} else {
//设置资源服务上的微信头像
users.setAvator(this.weCharHeaderUrl);
}
log.info("user head img:{}", users.getAvator());
//微信昵称
if (weCharUserInfo.getNickname() != null && !weCharUserInfo.getNickname().isEmpty()) {
users.setWechatNickName(weCharUserInfo.getNickname());
}
//昵称
if (weCharUserInfo.getNickname() != null && !weCharUserInfo.getNickname().isEmpty()) {
users.setNickName(weCharUserInfo.getNickname());
}
//添加默认头像
users.setToken("");
//微信唯一标识
users.setOpenId(weCharUserInfo.getOpenid());
users.setStatus("1");
users.setRegistTime(new Date());
users.setMetamask("");
users.setMemo("微信注册用户");
users.setCreateTime(new Date());
users.setUpdateTime(new Date());
//写入用户信息
this.baseMapper.insert(users);
users.setToken(EncodeUtils.encryptToMD5(users.getOpenId()));
users.setMetamask("");
users.setUpdateTime(new Date());
//保存token到用户信息
this.saveOrUpdate(users);
//写登录日志
this.saveUserLoginLogger(users);
return users.getToken();
}