前言
前置条件:具备微信开发者资质。
通过微信开放平台注册、完善开发者资料、申请开发者资质认证(需要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>
使用到的工具类:
1、HttpClientUtils.java
二、操作步骤
1.生成微信登录二维码
所需前置参数: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;
}
此时,就可以根据接口,查看到到微信二维码了 。
2.获取微信用户信息并实现微信注册登录
注意:这里接口的请求地址,必须要和您配置的重定向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("请求失败!");
}
}
总结
到这里,就是项目整合微信登录的全过程啦~