admin管理员组

文章数量:1656243

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;

}

 

本文标签: 后端代码网页微信扫码