微信授权登录

这块功能搞了好几天,其实最后实现起来不难,只是文档写的不太清楚。之前没写过授权登录,都是web端先注册用户名、邮箱、密码,之后实现用户登录


刚开始写,没注意微信的接口更新这么快,用uni.loginuni.getUserProfile,先登录,然后获取用户信息,一开始在Hbuilder里用web端访问,没什么反应,可能web端没有支持。后面在微信开发者工具里访问,打印出日志了,都是匿名信息,才发现他已经废弃了,新的头像和昵称获取方式是使用

open-type="chooseAvatar"
@chooseavatar="onChooseAvatar"
// 获取头像

可以先看下登录的效果
请添加图片描述

实现的过程
需要用户同意底下两个政策,当点击登录的时候,需要判断用户是否同意,即复选框的值是否为true
只有当用户同意,才能继续
添加一个复选框

<checkbox class="custom-checkbox" :checked="isChecked" v-if="!islogin" @click="check"/>

check(){
		this.isChecked=!this.isChecked
 },

登录之后就跳转到头像获取按钮,获取用户头像,将信息缓存到localcache中,成功则跳转到个人中心页面,之后从缓存里获取数据并渲染

后端使用springboot(也可以直接使用云开发的方式)
具体流程为

  • 先使用wx.login()获取一个code码
  • 将这个码发送给后端,后端接受之后调用微信另一个接口生成一个openId和token(token使用openId进行加密,后期需要检验token是否合理,就用该token再解密)
  • 前端接收到openId和token之后将用户信息存储到缓存里
  • 下次登录的时候,服务器会根据openid检查用户是否已经注册,如果已经有,则直接返回token
  • 这里有一个重点就是,用户重新登陆,再次生成的openId是不会变的,因为后期使用该id作为唯一键提交很多用户数据,如果发生变化,之前的用户记录都会丢失,想了很久试了好几次发现openId不会变

后端主要的实现方式

@PostMapping("/userInfo/login")
    public ResponseEntity<?> login(@RequestBody Map<String, String> body){
        String code = body.get("code");
        String avatarUrl = body.get("avatarUrl");

        RestTemplate restTemplate = new RestTemplate();
        String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + appId +
                "&secret=" + appSecret +
                "&js_code=" + code +
                "&grant_type=authorization_code";

        String response = restTemplate.getForObject(url, String.class);
        Map<String, Object> result = new Gson().fromJson(response, Map.class);
        String openid = (String) result.get("openid");
        if(openid==null){
            return ResponseEntity.status(401).body("登录失败");
        }
        String sessionKey = (String) result.get("session_key");
        System.out.println("openId:"+openid);
// 根据 openid 查询或创建用户
        User user = userService.findByOpenId(openid);
        if (user == null) {
            user = new User();
            user.setOpenId(openid);
            user.setAvatarUrl(avatarUrl);
            userService.save(user);
        }else{
            // 更新头像
            user.setAvatarUrl(avatarUrl);
            userService.update(user);
        }

        // 生成 token 并返回
        String token = JwtUtil.generateToken(user);
        
        long expiresIn = 7200; // 假设 token 有效期为 2 小时
        Map<String,String> map = new HashMap<>();
        map.put("token",token);
        map.put("openId",openid);

        return ResponseEntity.ok().body(map);
    }

上述即可完成一个完整的微信授权登录的方式,测试了其他用户登录也没有问题,当前用户登录退出后再次登录之前的信息也不会丢失

更多推荐