admin管理员组文章数量:1656250
1.先获取到微信appId 和 appSecret 确定好 回调方法的域名。
2.获取生成微信二维的url
wxWebDomain:回调的域名,例如:https://www.baidu/
第一步获取到微信生成二维码的url;
第二步编写回调方法get请求并且要公开能访问,在回调方法中生成token令牌存入redis;
第三步前端通过state检查扫码状态码来轮询检查用户是否扫码成功,并且获取生成的令牌token;
/**
* 后台等-微信扫码登录 跳转到微信扫码的url 界面
*/
@GetMapping(value = "/wxLogin")
public AjaxResult wxLogin(){
AjaxResult ajax = AjaxResult.success();
String callBackMethod=wxWebDomain+"/weChatLoginCallBack";
String state=IdUtils.fastUUID().replace("-","");
String url = WeChatUtil.getWeChatUrl(wxAppId,state,callBackMethod);
ajax.put("wxCodeUrl",url);
ajax.put("state",state);
return ajax;
}
/**
* 微信扫码登录后 回调方法
*/
@GetMapping("/weChatLoginCallBack")
public void weChatLoginCallBack(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
String code = req.getParameter("code");
String state = req.getParameter("state").replace("STATE","");
//1.使用微信用户信息直接登录,无需注册和绑定
WeChatUserLoginInfoVo userInfo =WeChatUtil.getWeChatUserInfo(wxAppId,wxAppSecret,code);
//2.生成令牌-->将微信与当前系统的账号进行绑定
WxResultVo wxResultVo= loginService.loginByWxOpenId(userInfo);
//存到redis中
redisCache.setCacheObject("login:code:"+state,wxResultVo,5, TimeUnit.MINUTES);
}
/**
* 前端轮询判断用户是否登录了
*/
@GetMapping(value = "/wxLoginPolling")
public AjaxResult wxLoginPolling(@RequestParam String state){
//WxResultVo 自己构造返回给前端的数据
WxResultVo wxResultVoRedis=redisCache.getCacheObject("login:code:"+state);
WxResultVo wxResultVoResult=wxResultVoRedis!=null?wxResultVoRedis:new WxResultVo("0","","扫码登录中");
return AjaxResult.success(wxResultVoResult);
}
@Slf4j
public class WeChatUtil {
/***
* 获取网页版微信扫码url地址
* @param wxAppId 微信appid
* @param checkStateCore 扫码状态检查码
* @param callBackMethod 回调方法
*/
public static String getWeChatUrl(String wxAppId,String checkStateCore,String callBackMethod){
log.info("微信扫码后回调方法====="+callBackMethod);
return "https://open.weixin.qq/connect/qrconnect?appid="+wxAppId
+"&redirect_uri="+ URLEncoder.encode(callBackMethod)
+"&response_type=code"
+"&scope=snsapi_login&state=STATE"+checkStateCore
+"#wechat_redirect";
}
/**
* 获取微信用户的基本信息
* @param wxAppId 微信appid
* @param wxAppSecret 微信的secret
* @param code 对应扫码得到的code
*/
public static WeChatUserLoginInfoVo getWeChatUserInfo(String wxAppId, String wxAppSecret, String code){
//获取用户openid
String url="https://api.weixin.qq/sns/oauth2/access_token?appid="+wxAppId
+ "&secret="+wxAppSecret
+ "&code="+code
+ "&grant_type=authorization_code";
String jsonString=OkHttpUtils.getInstance().doGet(url);
JSONObject jsonObject =JSONObject.parseObject(jsonString) ;
String openid = jsonObject.getString("openid");
String accessToken = jsonObject.getString("access_token");
//微信公开的用户信息
String infoUrl = "https://api.weixin.qq/sns/userinfo?access_token="+accessToken
+"&openid="+openid
+"&lang=zh_CN";
String userInfoString=OkHttpUtils.getInstance().doGet(infoUrl);
log.info("回调后获取微信用户信息: "+userInfoString);
return JSON.toJavaObject(JSONObject.parseObject(userInfoString),WeChatUserLoginInfoVo.class);
}
}
@Data
public class WeChatUserLoginInfoVo {
/**
* 用户唯一的unionid
*/
private String unionid;
/**
* 用户对应的应用的openid
*/
private String openid;
// /**
// * 手机号,登录扫码是没有手机号的
// */
// private String phone;
/**
* 呢称
*/
private String nickname;
/**
* 头像
*/
private String headimgurl;
/**
* 性别 1-女 2-男
*/
private String sex;
/**
* 使用语言
*/
private String language;
/**
* 所属城市
*/
private String city;
/**
* 所属省份
*/
private String province;
/**
* 所属国家
*/
private String country;
/**
* 权限
*/
private String privilege;
}
版权声明:本文标题:网页微信扫码登录代码实现,前后端分离 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1729733169a1211562.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论