开发者学堂课程【微服务+全栈在线教育实战项目演练(SpringCloud Alibaba+SpringBoot):微信扫描登录(功能完善)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/667/detail/11465
微信扫描登录(功能完善)
内容介绍:
一、功能完善
二、Application.propertier 代码演示
一、功能完善
1、已经登录过的用户不用重复录入,只录入新用户
将”拿着得到的 access_token 和 openid ,再去请求微信提供固定的地址,获取到扫描人信息,访问微信的资源服务器,获取用户信息”步骤移动到”判断数据表里面是否存在相同微信信息,根据 openid 判断”里面
代码如下:
//使用 json 转换工具
Gson Gson gson = new GsonO:
HashMap mapAccessToken =gson.fromJson(accessTokenInfo, HashMap.class) String access token=(
String)mapAccessTokenget( access token");
String openid =(String)mapAccessToken.get("openid);
//把扫描人信息添加数据库里面
//判断数据表里面是查存在相同微信信息,根据 openid 判断
Ucenterlember member =memberService.getOpenIdMember(openid): if(member == null){
//memeber 是空,表没有相同微信数据,进行酒加
//3拿着得到 accsesstoken 和 openid,再去请求微信提供固定的地址,获取到扫描人信息
//访问微信的资源服务器,获取用户信息
StringbaseUserInfoUrl ="https://api.weixin.qq.com/sns/userinfo"+
"?access_token-%s”+"&openid-%s”;
//拼接两个参数
String userInfoUrl = String.format(
baseUserInfoUrl,
access_token, openid):
//发送请求
String userInfo= HttpClientUtils.get(userInfoUrl);
//获取返回 userinfo 字符串扫描人信息
HashMap userInfoMap=gson.fromJson(userInfo,HashMap.class);
String nickname=(String)userInfoMap.get("nickname”);
//昵称
String headimaurl=(String)userInfoMap.get("beadimaurl");
//头像
member =new UcenterMember0: member.setOpenid(openid):
member. setNickname(nickname) member.setAvatar(headimgurl) memberService.save(member);
//最后:返回首页面
return "redirect:http://localhost:3000"}catch(Exception e){
throw new GuliException(20001,"登录失败):}
//1生成微信扫描二维码@GetMapping(-login)
public String getWxCode0{
//固定地址,后面拼接参数
String url="https://open.weÃxin.qg.com/”+
connect/arconnect?appid="+ConstantixUtils. RX OPEN APP ID+"&response type=code".
2、扫描之后,在首页面显示微信信息,比如昵称或者头像
之前登录之后显示,在首页面从 cookie 获取数据显示
代码如下:
Var userStr = cookie.get(‘guil_ucenter’)
//从 cookie 获取数据显示
现在也可以按照以上方式,把扫码之后的信息也放到 cookie 里面,跳转到首页面进行,但是把扫描数据放到 cookie 有问题,因为 cookie 无法实现跨域访问。
最终解决方案:
根据微信信息使用 jwt ,生成 token 字符串,把 token 字符串通过路径传播到首页面
代码如下:
String jwtToken = JwtUtils. get. Jwt Token(member. getId(), member. getNickname ()) ;
//做法:使用 jwt 根据 member 对象生成 token 字符串
代码如下:
return”redirect :http://localhost:3000?token="+jwtToken ;
} catch(Exception e) {
throw new GuliException(20001,"登录失败”) ;
}
}
//最后:返回首页面,通过路径传递 token 字符串
二、Application.propertier 代码演示
代码1-10
#服务端口
server.port=8150
#服务名
spring.application.name=service ucenter
# mysq1数据库连接
spring. datasource. driver-class name-com.mysql.cj.jdbc. Driver
spring.datasource.url=jdbc:mysql://localhost:3306/guliserverTimezoneGMT%2B8spring.datasource. username-root spring. datasource. password root