流程:
1、用户登录时会将当前用户的授权码传递到后端
2、远程请求微信的服务器,携带参数:小程序ID、密钥、授权码、authorzation_code
3、使用HttpClient请求方式,将微信服务器请求路径和请求携带参数用Get方式发送请求
4、获取响应回来的json字符串,解析得到里面的OpenId,这是每个用户独有的标识
5、判断OpenId是否为空,不为空则根据OpenId去数据库查找是否存在对应记录
6、如果存在说明是老用户,直接返回查找到的数据。不存在则说明是新用户,将用户数据插入数据库
7、响应数据并下发令牌
Controller层:
/**
* 微信用户登录
* @param userLoginDTO
* @return
*/
@ApiOperation("微信用户登录")
@PostMapping("/login")
public Result<UserLoginVO> login(@RequestBody UserLoginDTO userLoginDTO){
/*
日志记录操作
调用service层login方法查询数据库和微信服务器
下放令牌
封装VO
返回result
*/
log.info("微信用户登录:{}",userLoginDTO);
//调用service层login方法
User user = userService.login(userLoginDTO);
//创建负载内容
HashMap<String, Object> claims = new HashMap<>();
claims.put(JwtClaimsConstant.USER_ID,user.getId());
//创建令牌
String token = JwtUtil.createJWT(jwtProperties.getUserSecretKey(), jwtProperties.getUserTtl(), claims);
//封装VO
UserLoginVO userLoginVO = UserLoginVO.builder()
.id(user.getId())
.openid(user.getOpenid())
.token(token)
.build();
return Result.success(userLoginVO);
}
UserLoginDTO中唯一属性code,用于接收微信用户的授权码
日志打印操作
调用service层方法获取到返回的user
创建jwt令牌
将令牌和userId封装进VO返回给前端
Service层
@Override
public User login(UserLoginDTO userLoginDTO) {
/*
调用httpClient发送get方式请求到微信服务器
获取微信服务器返回的openid
去数据库根据openid查询是否存在对应的user
如果存在,说明是老用户直接返回查询到的user
如果不存在,说明是新用户创建新的user补充信息插入到数据库
返回user
*/
String url = "https://api.weixin.qq.com/sns/jscode2session";
HashMap<String, String> map = new HashMap<>();
map.put("appid",weChatProperties.getAppid());
map.put("secret",weChatProperties.getSecret());
map.put("js_code",userLoginDTO.getCode());
map.put("grant_type","authorization_code");
String json = HttpClientUtil.doGet(url, map);
JSONObject jsonObject = JSON.parseObject(json);
String openid = jsonObject.getString("openid");
if(openid == null){
throw new BaseException("未获取到openid,登录失败");
}
User user = userMapper.getByOpenid(openid);
if(user != null) return user;
user = new User();
user.setOpenid(openid);
user.setCreateTime(LocalDateTime.now());
userMapper.insert(user);
return user;
}
编写调用微信服务器的地址
创建请求携带的map,其中携带小程序授权码、密钥、用户授权码、固定的grant_type : authorization_code
调用get请求方式,将url和map传入
将获取到的返回字符串json解析得到里面的openId
根据openId去数据库查询是否存在用户
存在则直接返回用户数据
不存在则新插入用户数据