uni-app微信小程序——对接Spring实现微信登录
观前提示
本文为我的随记,因此并不会扯太多基础的东西。
uni.login()
有的人会问:为什么不用uni.getUserProfile()
或uni.getUserInfo()
那我问你,
你的头顶怎么尖尖的
通过官方公告的表中,我们就可以发现,这两个函数已经被弃用!
这个故事告诉我们,不要盲目看别人的文章找自己想要的api,而是要多看看官方的文档!(
绝对不是我自己搜了老半天呢!)
从2.27.1以后,我们无法再通过这个函数来获取用户昵称等信息了,我们只能让用户手动输入等方法。
微信登录校验流程
了解uni.login
这个函数前,我们先来了解一下,微信登录校验流程:
按顺序流程就该是:
微信小程序发送请求(调用wx.login() uni中为 uni.login())
获取到code
将code作为参数,向后端服务器发送请求
后端服务器响应请求,向微信官方发送请求校验
需要的参数:code,开发者的appid和秘钥(appsecret)
微信官方返回openid等唯一标识微信身份(类似token)
后端自行的一些操作
返回给小程序(登录失败或成功等)
关于怎么使用参考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));
}
(自己格式化一下)
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 zxb
评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果