微信登录功能

流程:

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去数据库查询是否存在用户

存在则直接返回用户数据

不存在则新插入用户数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值