观前提示


本文为我的随记,因此并不会扯太多基础的东西。

uni.login()


有的人会问:为什么不用uni.getUserProfile()uni.getUserInfo()

那我问你,你的头顶怎么尖尖的

通过官方公告的表中,我们就可以发现,这两个函数已经被弃用!

这个故事告诉我们,不要盲目看别人的文章找自己想要的api,而是要多看看官方的文档!(绝对不是我自己搜了老半天呢!)

从2.27.1以后,我们无法再通过这个函数来获取用户昵称等信息了,我们只能让用户手动输入等方法。

微信登录校验流程

了解uni.login 这个函数前,我们先来了解一下,微信登录校验流程:

按顺序流程就该是:

  1. 微信小程序发送请求(调用wx.login() uni中为 uni.login())

    1. 获取到code

  2. 将code作为参数,向后端服务器发送请求

  3. 后端服务器响应请求,向微信官方发送请求校验

    1. 需要的参数:code,开发者的appid和秘钥(appsecret)

  4. 微信官方返回openid等唯一标识微信身份(类似token)

  5. 后端自行的一些操作

  6. 返回给小程序(登录失败或成功等)

关于怎么使用参考uni.login(OBJECT) | uni-app官网

实现代码参考


小程序端:

// 微信登录
		const wechatLogin = () => {
			changeLoading(true)
			uni.login({
				success(res) {
					if (res.code) {
						request({
								url: '/user/login',
								method: 'POST',
								data: {
									code: res.code
								},
								header: {
									'Content-Type': 'application/x-www-form-urlencoded'
								}
							})
							.then((res) => {
								uni.showToast({
									title: "登录成功",
									icon: 'success'
								})
								changeToken(res.data.data);
								changeLoading(false);
								console.log(token.value);
							})
							.catch((err) => {
								console.error(err);
								uni.showToast({
									title: "登录失败",
									icon: 'error'
								})
								wechatLogin()
							});
					}
				}
			})
		};

(懒得删空格了,自己删下)

后端(Spring):

controller

/**
 * 登录
 *
 * @param code
 * @return
 */
@Operation(summary = "微信登录")
@PostMapping("/login")
Result<String> login(String code) {
  String result = userService.handleWechatLogin(code);
  return Result.success(result);
}

serviceImpl (service就不贴了):

public String handleWechatLogin(String code) {
        String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + appid + "&secret=" + appsecret + "&js_code=" + code + "&grant_type=authorization_code";
        WebClient webClient = WebClient.create();
        // 发送请求
        Mono<String> responseMono = webClient.get().uri(url).retrieve().bodyToMono(String.class);
        String response = responseMono.block();
        log.info("request: {}", response);

        try {
            ObjectMapper mapper = new ObjectMapper();
            HashMap<String, Object> result = mapper.readValue(response, HashMap.class);
            String openid = (String) result.get("openid");
            String sessionKey = (String) result.get("session_key");

            if (openid == null) return "微信登录失败!";

            // 根据OpenId查找用户
            User user = findByOpenId(openid);

            // 判断是否存在,存在就查询,不存在就新建
            if (user == null) {
                user = new User();
                user.setOpenId(openid);
                user.setUsername("微信用户_" + UUID.randomUUID().toString().replace("-", "").substring(0, 8));
                user.setPassword(RandomStringUtils.random(6, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"));
                user.setAge(18);
                user.setAvatar("https://picgo.cn-sy1.rains3.com/2025/02/a3afdbb7f0c3ada619fdfe7d16692fab.png");
                save(user);
            }
            user.setSessionKey(sessionKey);
            // 更新时间
            user.setUpdateTime(LocalDateTime.now());
            updateById(user);
            String token = JwtUtils.generateToken(user.getId() + "");
            log.info("token: {}", token);
            return token;
        } catch (JsonProcessingException e) {
            log.error("error:", e);
            return "登录失败";
        }
    }

    @Override
    public User findByOpenId(String openId) {
        return getOne(new QueryWrapper<User>().eq("open_id", openId));
    }

(自己格式化一下)