微信pc端网站应用扫码授权登录

这是官方的文档
对接之前至少要先看下流程图
在这里插入图片描述
效果:用户点击微信登录跳出一个二维码,用户扫码授权后登录进去
1.在这里插入图片描述
2.在这里插入图片描述

需要做的事情

1.需要在微信开放平台上面注册账号,并认证企业,创建网站应用
在这里插入图片描述
2.认证网站应用300块每年,每个应用,也就是说如果你还同时开发小程序,公众号,app这些的话每个都要认证,而且是每个每年300;
认证成功的状态:在这里插入图片描述
3.需要填写授权回调域:直接写域名就行,不用带方法的url。如果是本地调试的话需要用内网穿透工具。
在这里插入图片描述
准备工作完成,开始写代码了。
我用的是第三方的工具类JustAuth

me.zhyd.oauth
JustAuth
1.15.7

1.用户点击微信登录

 @GetMapping("/render")
    @ApiOperation("微信pc端扫码授权登录")
    public void renderAuth(HttpServletResponse response) throws IOException {
        AuthRequest authRequest = getAuthRequest();
        response.sendRedirect(authRequest.authorize());
    }
private AuthRequest getAuthRequest() {
        return new AuthWeChatOpenRequest(AuthConfig.builder()
                .clientId("wxca5e*****5c3a")
                .clientSecret("efe7fc4200cd6******aa69af4fa2f")
                .redirectUri("http://192.168.1.80:8881/callback")
                .ignoreCheckState(true)
                .build());
    }

redirectUri 为回调地址填写具体的请求你后端接口回调的地址。
成功后微信会返回一个html
将html渲染后是上面图中的二维码。
用户扫码授权后微信会根据你填写的回调地址申请你的接口也就是这个接口:

 @GetMapping("/callback")
    @ApiOperation("微信pc端扫码授权登录")
    public QueryResult login(@RequestParam("code")String code,@RequestParam("state")String state) {
        AuthCallback callback=new AuthCallback();
        callback.setCode(code);
        callback.setState(state);
        log.info("进入callback:"  + " callback params:" + JSONObject.toJSONString(callback));
        AuthRequest authRequest = getAuthRequest();
        AuthResponse login = authRequest.login(callback);
        log.info("-------------------------------------------------login="+JSONObject.toJSONString(login));
        String result = JSONObject.toJSONString(login);
        Map parse = (Map) JSON.parse(result);
        Map hashMap=(Map) parse.get("data");

        Map wxInfo=(Map)hashMap.get("rawUserInfo");

        WhatCatData whatCat=new WhatCatData();
        whatCat.setCity((String)wxInfo.get("city"));
        whatCat.setSex((Integer)wxInfo.get("sex"));
        whatCat.setHeadimgurl((String)wxInfo.get("headimgurl"));
        whatCat.setNickname((String)wxInfo.get("nickname"));
        whatCat.setOpenid((String)wxInfo.get("openid"));
        whatCat.setUnionid((String)wxInfo.get("unionid"));
        whatCat.setState((String)callback.getState());
        whatCat.setWxId(SnowflakeIdWorker.generateId()+"");
        log.info("-----------------------------------whatCat="+whatCat.toString());

        resWhatcatDataDao.save(whatCat);
        //查询该用户是否注册过账号
        User user=new User();
        user.setWxPcOpenid(whatCat.getOpenid());
        UserDTO userDTO =new UserDTO();
        try {
             userDTO = userClient.getUserByUserInfo(user).getData();
        } catch (Exception e) {
            ExceptionUtil.tryHandle(e);
        }
        //如果用户用pcOpenId登录过,则将其信息更新
        if (null!=userDTO){
//            userDTO.setUnionid(whatCat.getUnionid());
//            userDTO.setGender(whatCat.getSex()+"");
//            userDTO.setAvatarUrl(whatCat.getHeadimgurl());
//            userDTO.setCity(whatCat.getCity());
//            userDTO.setNickName(whatCat.getNickname());
//            try {
//                userClient.updateUserInfo(userDTO);
//            } catch (Exception e) {
//                ExceptionUtil.tryHandle(e);
//            }
//            LoginRequest loginRequest=new LoginRequest();
//            loginRequest.setPassword(userDTO.getPassword());
//            loginRequest.setSite(userDTO.getSite());
//            loginRequest.setUsername(userDTO.getUsername());
//            LoginResult loginOne =new LoginResult();
//            try {
//                 loginOne = authorityClient.login(loginRequest);
//            } catch (Exception e) {
//                ExceptionUtil.tryHandle(e);
//            }
            return new QueryResult<>(ResponseEnum.SUCCESS,userDTO);
        }else {
            //如果找不到该用户,则将微信返回的信息返回给前端,并告诉前端需绑定手机号
            return new QueryResult<>(ResponseEnum.USER_BIND_PHONE, login);
        }
    }

code码可以看做是微信给你发的一次性的钥匙,state是你自己在上一步生成的,用来校验,安全的,防止被恶意攻击。state在生成的同时存到session里面,在请求回调这个接口时会拿state校验。
若不想用state在这里加上这个.ignoreCheckState(true)

 private AuthRequest getAuthRequest() {
        return new AuthWeChatOpenRequest(AuthConfig.builder()
                .clientId("wxca*******805c3a")
                .clientSecret("efe7fc420*******9af4fa2f")
                .redirectUri("http://192.168.1.80:8881/callback")
                .ignoreCheckState(true)
                .build());
    }

WhatCatData 是我接收微信消息的对象也可以不写,至此微信pc端网站应用扫码授权登录就成功了。
注意点:
如果你的项目是前后端分离的,那么很有可能前端拿不到state和code。从而你没办法将获取到的信息返给前端。那么就需要让前端来写一个接收微信授权访问的接口来替代后端的callback回调接口(就是像后端一样写一个接口,然后微信根据这个接口将参数传给前端),然后让前端传code和state就行啦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值