1.功能
实际开发中,实现微信小程序/微信公众号的微信注册登录
2.前置条件
这里只关注注册登录逻辑,所以前提是先对接好微信授权的相关接口。比如:
1. 获取微信公众号/小程序token接口
2. 获取微信公众号/小程序授权信息接口
3. 获取微信用户个人信息接口
4. …等相关接口
3.数据库表
user表,存放用户信息
user_token表,存放微信用户的openId,后面以此来判断微信用户是否已经注册过,可以直接登录
4.以微信公众号注册登录示例
/**
* 微信登录
*
* @author hcx
* @date 2024-01-20
* @return 登录所需token等信息
*/
@Override
public LoginResponse weChatAuthorizeLogin(String code, Integer spreadUid) {
// 1、通过code获取获取公众号授权信息,拿到登录本公众号的微信用户的OpenId
WeChatAuthorizeLoginGetOpenIdResponse response = weChatService.authorizeLogin(code);
// 2、校验该微信用户是否已经注册过
UserToken userToken = userTokenService.getByOpenidAndType(response.getOpenId(), 1);// type为1表示公众号
LoginResponse loginResponse = new LoginResponse();
if (ObjectUtil.isNotNull(userToken)) {// 已存在,正常登录
// 3、获取微信用户对应的user信息
User user = userService.getById(userToken.getUid());
if (!user.getStatus()) {
throw new CommonException("当前账户已禁用,请联系管理员!");
}
try {
// 使用user信息生成随机token(自己定一个生成规则,保证唯一即可)
String token = userService.token(user);
loginResponse.setToken(token);
} catch (Exception e) {
logger.error(StrUtil.format("公众号登录生成token失败,uid={}", user.getUid()));
e.printStackTrace();
}
loginResponse.setType("login");// login表示正常登录
loginResponse.setUid(user.getUid());
loginResponse.setNikeName(user.getNickname());
loginResponse.setPhone(user.getPhone());
return loginResponse;
}
// 4、没有注册,走创建用户流程
// 从微信获取用户信息,封装注册数据
WeChatAuthorizeLoginUserInfoResponse weChatUserInfo = weChatService.getUserInfo(response.getAccessToken(), response.getOpenId());
User newUser = new User();
newUser.setNickname(weChatUserInfo.getNickName());
newUser.setAvatar(weChatUserInfo.getHeadimgurl());
// ...省略封装User代码
userService.save(newUser);
UserToken newUserToken = new UserToken();
newUserToken.setUid(newUser.getUid());
newUserToken.setToken(response.getOpenId());// openId其实并不是正在的token,而且作为微信用户是否已经注册过的判断条件
newUserToken.setType(1);// type为1表示公众号
// ...省略封装UserToken代码
userTokenService.save(newUserToken);
try {
// 使用刚注册的user信息生成随机token(自己定一个生成规则,保证唯一即可)
String newToken = userService.token(newUser);
loginResponse.setToken(newToken);
} catch (Exception e) {
logger.error(StrUtil.format("公众号登录生成token失败,uid={}", newUser.getUid()));
e.printStackTrace();
}
loginResponse.setType("register");// register表示是刚注册,第一次登录
loginResponse.setUid(newUser.getUid());
loginResponse.setNikeName(newUser.getNickname());
loginResponse.setPhone(newUser.getPhone());
return loginResponse;
}