微信掃碼登錄


這是官方的文檔
對接之前至少要先看下流程圖

效果:用戶點擊微信登錄跳出一個二維碼,用戶掃碼授權后登錄進去
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