admin管理员组文章数量:1656245
由于我只研究了1天时间,可能有些地方认知错误
1:网页版微信扫码登录的流程
① 点击扫码登录按钮
② qrAuthorize(访问微信接口,如果微信接口判断有权限生成二维码的话,跳转到二维码页面。)
在这两个方法里面要有两个返回路径,第一个是获取权限以后生成二维码的页面,第二个是扫码用户授权以后要跳转 的方法
③ 在用户授权以后跳转到指定的方法,获取到code,根据code和openid访问微信接口,从而获取用户信息
2:要注意的地方
①:如果是测试的话需要用到内网穿透,这个网上的教程很多
②:获取用户信息的路径要注意
我这里是:https://api.weixin.qq/sns
3:下面是完整的代码:
① 创建一个访问用户信息的工具栏,返回的是一个jsonObject
public class HttpClientTools {
/**
* Http Get 请求方法
* @param url
* @return
* @throws Exception
*/
public static JSONObject doGet(String url){
JSONObject json = null;
HttpGet httpGet = new HttpGet(url);
// 创建httpClientBuilder
HttpClientBuilder clientBuilder = HttpClientBuilder.create();
// httpclient
CloseableHttpClient httpClient = clientBuilder.build();
try {
HttpResponse httpResponse = httpClient.execute(httpGet);
HttpEntity entity = httpResponse.getEntity();
if (entity != null) {
String result = EntityUtils.toString(entity, "UTF-8");
json = JSONObject.fromObject(result);
}
} catch (ClientProtocolException e) {
} catch (IOException e) {
}
return json;
}
}
② 创建一个实体类,用于将获取到的用户信息封装到实体当中去
public class WeixinUserInfo {
// 用户的标识
private String openId;
// 昵称
private String nickname;
// 用户的性别(1是男性,2是女性,0是未知)
private int sex;
// 用户所在国家
private String country;
// 用户所在省份
private String province;
// 用户所在城市
private String city;
// 用户的语言,简体中文为zh_CN
private String language;
// 用户头像
private String headImgUrl;
public String getOpenId() {
return openId;
}
public void setOpenId(String openId) {
this.openId = openId;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getLanguage() {
return language;
}
public void setLanguage(String language) {
this.language = language;
}
public String getHeadImgUrl() {
return headImgUrl;
}
public void setHeadImgUrl(String headImgUrl) {
this.headImgUrl = headImgUrl;
}
}
③ control方法的第一个,用户点击扫码登录的时候,也就是上面流程的第二步
@ApiOperation(value="登录跳转,调用微信开放平台二维码")
@GetMapping("/qrAuthorize")
public String qrAuthorize(@RequestParam("returnUrl") String returnUrl){
String url=projectUrlConfig.getWechatOpenAuthorize()+"要返回的路径";
String redirectUrl=wxOpenService.buildQrConnectUrl(url,WxConsts.QrConnectScope.SNSAPI_LOGIN, URLDecoder.decode(returnUrl,"UTF-8"));
return "redirect:"+redirectUrl;
}
④ control的第二个方法,获取用户的信息
@ApiOperation(value="获取用户扫码信息")
@GetMapping("/qrUserInfo")
public String qrUserInfo(@RequestParam("code") String code){
WxMpOAuth2AccessToken wxMpOAuth2AccessToken=new WxMpOAuth2AccessToken();
try{
wxMpOAuth2AccessToken=wxOpenService.oauth2getAccessToken(code);
}catch (WxErrorException e){
e.printStackTrace();
}
String returnUrl = "https://api.weixin.qq/sns/userinfo?";
String openId=wxMpOAuth2AccessToken.getOpenId();
String accessToken = wxMpOAuth2AccessToken.getAccessToken();
WeixinUserInfo user= getUserInfo(accessToken, openId);
System.out.println("OpenID:" + user.getOpenId());
System.out.println("昵称:" + user.getNickname());
System.out.println("性别:" + user.getSex());
System.out.println("国家:" + user.getCountry());
System.out.println("省份:" + user.getProvince());
System.out.println("城市:" + user.getCity());
System.out.println("语言:" + user.getLanguage());
System.out.println("头像:" + user.getHeadImgUrl());
System.out.println(wxMpOAuth2AccessToken);
return "redirect:"+returnUrl+"access_token="+accessToken+"&openid="+openId;
}
⑤ 这里是调用方法获取用户的信息,并且将用户信息封装到实体里面去
public static WeixinUserInfo getUserInfo(String accessToken, String openId) {
WeixinUserInfo weixinUserInfo = null;
// 拼接请求地址
String requestUrl = "https://api.weixin.qq/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
requestUrl = requestUrl.replace("ACCESS_TOKEN", accessToken).replace("OPENID", openId);
// 获取用户信息
JSONObject jsonObject = HttpClientTools.doGet(requestUrl);
if (jsonObject!=null) {
try {
weixinUserInfo = new WeixinUserInfo();
// 用户的标识
weixinUserInfo.setOpenId(jsonObject.getString("openid"));
// 昵称
weixinUserInfo.setNickname(jsonObject.getString("nickname"));
// 用户的性别(1是男性,2是女性,0是未知)
weixinUserInfo.setSex(jsonObject.getInt("sex"));
// 用户所在国家
weixinUserInfo.setCountry(jsonObject.getString("country"));
// 用户所在省份
weixinUserInfo.setProvince(jsonObject.getString("province"));
// 用户所在城市
weixinUserInfo.setCity(jsonObject.getString("city"));
// 用户的语言,简体中文为zh_CN
weixinUserInfo.setLanguage(jsonObject.getString("language"));
// 用户头像
weixinUserInfo.setHeadImgUrl(jsonObject.getString("headimgurl"));
} catch (Exception e) {
throw new RuntimeException();
}
}
return weixinUserInfo;
}
版权声明:本文标题:关于网页版微信扫码登录以及获取用户信息 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/xitong/1729732653a1211538.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论