整合第三方登录之微信扫码登录
🎓前言
前置条件:具备微信开发者资质。
通过微信开放平台注册、完善开发者资料、申请开发者资质认证(需要300大洋,大概7个工作日内审核)
申请完成之后,在微信开发平台配置扫码登录成功后的重定向url地址即可。
提示:以下是本篇文章正文内容,下面案例可供参考
🏷️引入相关依赖
<!--httpclient-->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<!--commons-io-->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
</dependency>
<!--gson-->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
加粗样式使用到的工具类:
🧱操作步骤
📔生成微信登录二维码
所需前置参数:app_id、app_secret、redirect_url(资质申请完成后,获取到相应参数信息)
代码如下(示例):
@ApiOperation("生成微信登录二维码")
@GetMapping("/login")
public String getWxCode() {
// 生成微信二维码的固定写法
String baseUrl = "https://open.weixin.qq.com/connect/qrconnect" +
"?appid=%s" +
"&redirect_uri=%s" +
"&response_type=code" +
"&scope=snsapi_login" +
"&state=zbinyds" +
"#wechat_redirect";
String redirectUrl = '您配置的扫码登录成功后的重定向url地址';
try {
// 对url进行编码
redirectUrl = URLEncoder.encode(redirectUrl, "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new QiHangException("20001", "url编码异常");
}
String url = String.format(baseUrl, '您的app_id', redirectUrl);
return "redirect:" + url;
}
📔获取微信用户信息并实现微信注册登录
注意:这里接口的请求地址,必须要和您配置的重定向url一致,扫码成功之后就会调用这个接口。
代码如下(示例):
@ApiOperation("获取微信用户信息并实现微信注册登录")
@GetMapping("/callback")
public String getUserInfo(@ApiParam("临时票据") String code, @ApiParam("请求状态") String state) {
// 获取扫描二维码的微信用户信息
try {
/**
* 第一步:根据code响应码,请求官方提供的指定接口,得到access_token(接口调用凭证)。
*/
// 拼接好指定接口的参数信息
String AccessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token" +
"?appid=%s" +
"&secret=%s" +
"&code=%s" +
"&grant_type=authorization_code";
AccessTokenUrl = String.format(
AccessTokenUrl,
'您的app_id',
'您的app_secret',
code
);
// 发送请求,获取到accessTokenInfo,里面包含了我们需要的字段access_token和openid。
String accessTokenInfo = HttpClientUtils.get(AccessTokenUrl); // 此时类型为String
log.info("accessTokenInfo:" + accessTokenInfo);
// 使用Gson进行类型转换,从String转换成Map类型。
Gson gson = new Gson();
HashMap accessTokenMap = gson.fromJson(accessTokenInfo, HashMap.class);
String accessToken = (String) accessTokenMap.get("access_token");
String openId = (String) accessTokenMap.get("openid"); // 微信用户唯一标识
// 查询该用户是否已注册
Member member = memberService.getOpenIdMember(openId);
// 未注册进行注册
if (Objects.isNull(member)) {
/**
* 第二步:根据access_token,请求官方提供的指定接口,得到微信登录用户的基本信息。
*/
// 拼接获取用户基本信息的url
String userInfoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openId;
String userInfo = HttpClientUtils.get(userInfoUrl);
log.info("当前登录微信用户的基本信息(用户昵称、头像):" + userInfo);
// 进行类型转换,从String转换成Map类型。
HashMap userInfoMap = gson.fromJson(userInfo, HashMap.class);
// 将微信登录用户进行注册
String headImgUrl = (String) userInfoMap.get("headimgurl"); // 用户头像
String nickName = (String) userInfoMap.get("nickname"); // 用户昵称
member = new Member();
member.setNickname(nickName);
member.setAvatar(headImgUrl);
member.setOpenid(openId);
memberService.save(member);
}
// 根据member对象,生成token字符串。
String token = JwtUtils.getJwtToken(member.getId(), member.getNickname());
// 登录成功,携带token并跳转到首页面。
return "redirect:http://localhost:3000?token=" + token;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("请求失败!");
}
}
💗总结
到这里,就是项目整合微信登录的全过程啦~
1.如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “
👍点赞”
“✍️评论
” “💙收藏”
一键三连哦!
2.💗【👇🏻👇🏻👇🏻关注我| 💬获取更多源码 | 优质文章】
带您学习各种前端插件、3D炫酷效果、图片展示、文字效果、以及整站模板 、大学生毕业HTML模板 、期末大作业模板 、等! 「在这里有好多
前端 开发者,一起探讨 前端 Node 知识,互相学习」!