Java 实际开发中,实现微信小程序/微信公众号的微信注册登录

发布时间:2024年01月20日

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;
    }
文章来源:https://blog.csdn.net/qq_54386866/article/details/135713290
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。