微信扫码登录


这是官方的文档
对接之前至少要先看下流程图

效果:用户点击微信登录跳出一个二维码,用户扫码授权后登录进去
1.
2.

需要做的事情

1.需要在微信开放平台上面注册账号,并认证企业,创建网站应用

2.认证网站应用300块每年,每个应用,也就是说如果你还同时开发小程序,公众号,app这些的话每个都要认证,而且是每个每年300;
认证成功的状态:
3.需要填写授权回调域:直接写域名就行,不用带方法的url。如果是本地调试的话需要用内网穿透工具。

准备工作完成,开始写代码了。
我用的是第三方的工具类JustAuth

me.zhyd.oauth
JustAuth
1.15.7

1.用户点击微信登录

@GetMapping("/render")
@ApiOperation("微信pc端扫码授权登录")
public void renderAuth(HttpServletResponse response) throws IOException {
AuthRequest authRequest = getAuthRequest();
response.sendRedirect(authRequest.authorize());
}
private AuthRequest getAuthRequest() {
return new AuthWeChatOpenRequest(AuthConfig.builder()
.clientId("wxca5e*****5c3a")
.clientSecret("efe7fc4200cd6******aa69af4fa2f")
.redirectUri("http://192.168.1.80:8881/callback")
.ignoreCheckState(true)
.build());
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
redirectUri 为回调地址填写具体的请求你后端接口回调的地址。
成功后微信会返回一个html
将html渲染后是上面图中的二维码。
用户扫码授权后微信会根据你填写的回调地址申请你的接口也就是这个接口:

@GetMapping("/callback")
@ApiOperation("微信pc端扫码授权登录")
public QueryResult login(@RequestParam("code")String code,@RequestParam("state")String state) {
AuthCallback callback=new AuthCallback();
callback.setCode(code);
callback.setState(state);
log.info("进入callback:" + " callback params:" + JSONObject.toJSONString(callback));
AuthRequest authRequest = getAuthRequest();
AuthResponse login = authRequest.login(callback);
log.info("-------------------------------------------------login="+JSONObject.toJSONString(login));
String result = JSONObject.toJSONString(login);
Map parse = (Map) JSON.parse(result);
Map hashMap=(Map) parse.get("data");

Map wxInfo=(Map)hashMap.get("rawUserInfo");

WhatCatData whatCat=new WhatCatData();
whatCat.setCity((String)wxInfo.get("city"));
whatCat.setSex((Integer)wxInfo.get("sex"));
whatCat.setHeadimgurl((String)wxInfo.get("headimgurl"));
whatCat.setNickname((String)wxInfo.get("nickname"));
whatCat.setOpenid((String)wxInfo.get("openid"));
whatCat.setUnionid((String)wxInfo.get("unionid"));
whatCat.setState((String)callback.getState());
whatCat.setWxId(SnowflakeIdWorker.generateId()+"");
log.info("-----------------------------------whatCat="+whatCat.toString());

resWhatcatDataDao.save(whatCat);
//查询该用户是否注册过账号
User user=new User();
user.setWxPcOpenid(whatCat.getOpenid());
UserDTO userDTO =new UserDTO();
try {
userDTO = userClient.getUserByUserInfo(user).getData();
} catch (Exception e) {
ExceptionUtil.tryHandle(e);
}
//如果用户用pcOpenId登录过,则将其信息更新
if (null!=userDTO){
// userDTO.setUnionid(whatCat.getUnionid());
// userDTO.setGender(whatCat.getSex()+"");
// userDTO.setAvatarUrl(whatCat.getHeadimgurl());
// userDTO.setCity(whatCat.getCity());
// userDTO.setNickName(whatCat.getNickname());
// try {
// userClient.updateUserInfo(userDTO);
// } catch (Exception e) {
// ExceptionUtil.tryHandle(e);
// }
// LoginRequest loginRequest=new LoginRequest();
// loginRequest.setPassword(userDTO.getPassword());
// loginRequest.setSite(userDTO.getSite());
// loginRequest.setUsername(userDTO.getUsername());
// LoginResult loginOne =new LoginResult();
// try {
// loginOne = authorityClient.login(loginRequest);
// } catch (Exception e) {
// ExceptionUtil.tryHandle(e);
// }
return new QueryResult<>(ResponseEnum.SUCCESS,userDTO);
}else {
//如果找不到该用户,则将微信返回的信息返回给前端,并告诉前端需绑定手机号
return new QueryResult<>(ResponseEnum.USER_BIND_PHONE, login);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
code码可以看做是微信给你发的一次性的钥匙,state是你自己在上一步生成的,用来校验,安全的,防止被恶意攻击。state在生成的同时存到session里面,在请求回调这个接口时会拿state校验。
若不想用state在这里加上这个.ignoreCheckState(true)

private AuthRequest getAuthRequest() {
return new AuthWeChatOpenRequest(AuthConfig.builder()
.clientId("wxca*******805c3a")
.clientSecret("efe7fc420*******9af4fa2f")
.redirectUri("http://192.168.1.80:8881/callback")
.ignoreCheckState(true)
.build());
}

WhatCatData 是我接收微信消息的对象也可以不写,至此微信pc端网站应用扫码授权登录就成功了。
注意点:
如果你的项目是前后端分离的,那么很有可能前端拿不到state和code。从而你没办法将获取到的信息返给前端。那么就需要让前端来写一个接收微信授权访问的接口来替代后端的callback回调接口(就是像后端一样写一个接口,然后微信根据这个接口将参数传给前端),然后让前端传code和state就行啦
————————————————
版权声明:本文为CSDN博主「晨曦雨落」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43748936/article/details/109471309


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM