uniapp微信小程序-微信授权登录
·
微信授权登录
这块功能搞了好几天,其实最后实现起来不难,只是文档写的不太清楚。之前没写过授权登录,都是web端先注册用户名、邮箱、密码,之后实现用户登录
刚开始写,没注意微信的接口更新这么快,用uni.login和uni.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);
}
上述即可完成一个完整的微信授权登录的方式,测试了其他用户登录也没有问题,当前用户登录退出后再次登录之前的信息也不会丢失
更多推荐


所有评论(0)