wechat-0052,微信公众号,第三方登录—扫码登录

本文介绍了一种微信扫码登录的实现方法,不同于常见的网页授权登录,该方法通过生成带参数的二维码,将用户的微信号与平台账号绑定,实现快速登录。文章详细讲解了二维码生成、扫码登录流程及登录状态检测的技术细节。

声明:这边所谓的第三方登录,不是通过网页授权的方式,而是利用生成带参数的二维码,将微信号和平台账号绑定实现。如果你要做的是授权登录,请查看

https://blog.youkuaiyun.com/wrongyao/article/details/80229986

紧接着0051扫码绑定之后,这边获取扫码登录操作

1、思路概括

注:用sessionid生成二维码,因为要区分不同终端的不同用户,所以需要带上他们的唯一标识sessionid

扫码以后,微信服务器会推送带有sessionid和openid的报文到我服务器,根据openid在关联关系表中找出userid,取出用户信息,放入缓存中,即为登录成功。

1、用同样的方式,获取带有sessionid的二维码

/**
     * 获取二维码
     *
     * @param sceneStr
     * @return
     */
    private String getQcode(String sceneStr) {
        String getTicketUrl = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=" + AccessToken.ACCESS_TOKEN + "";
        // 临时整形参数值
        String ticketParam = "{\"expire_seconds\": 120, \"action_name\": \"QR_STR_SCENE\", \"action_info\": {\"scene\": {\"scene_str\": \"" + sceneStr + "\"}}}";
        String ticketStr = HttpRequest.post(getTicketUrl, ticketParam, null, Constant.RequestType.APPLICATION_JSON);
        System.out.println(ticketStr);
        Map<String, String> ticketMap = GsonUtil.fromJson(ticketStr, Map.class);
        String ticket = ticketMap.get("ticket");
        return "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=" + ticket;
    }

    @Override
    public String getLoginQCode() {
        String sessionId = request.getSession().getId();
        return getQcode("login&" + sessionId);
    }

2、扫码登录

    @Override
    public String userLogin(HashMap<String, String> requestMap, String sessionId) {
        String res;
        String openId = requestMap.get("FromUserName");
        SysUser sysUser = sysWechatMapper.selectSysUserByOpenId(openId);
        // 未绑定用户
        if (null == sysUser) {
            res = WechatUtil.replyTextMessage(openId, requestMap.get("ToUserName"), wechatMessage.getUserUnbindReplyMessage());
        } else { //登录操作
            // 登录操作
            LoginJson loginJson = new LoginJson();
            loginJson.setCode(Code.success.getIndex());
            loginJson.setSysUser(sysUser);
            redisService.set("loginJson&" + sessionId, GsonUtil.toJson(loginJson));
            res = WechatUtil.replyTextMessage(openId, requestMap.get("ToUserName"), wechatMessage.getLoginSusccessReplyMessage());
        }
        return res;
    }

注:根据openid找到用户,将用户信息放入缓存中,就是登录成功,这边解释为什么不用session做登入,我们在前台请求登录二维码(session1),扫码后首先会到微信服务器,微信服务器向我服务器推送报文(session2),如果用session做登录理论上是要session1的但是此时已经取不到这个session了。所以用nosql数据库,用带过来的sessionid做为可以即可。

3、登录成功跳转。

上述代码只是把用户取出来放到了缓存中,这个方法就返回了,那我们的服务器怎么知道登录成功了呢?

思路:1、登录成功后,我们服务器向客户端推送这个状态,不易实现

           2、前端定时访问服务器,看是否登录成功,容易实现。

前端js

var time;
    // 获取登录二维码
    function getQcode() {
        var url = "/wechat/offical/account/getLoginQcode";
        $.ajax({
            url: url,
            type: "get",
            async: true,
            success: function (res) {
                $("#qrCode").attr("src", res);
                time = window.setInterval(isLogin, 1000);
            }
        });
}


//轮询判断是否登录
function isLogin() {
        var url = "/sysuser/islogin";
        $.ajax({
            url: url,
            type: "get",
            async: true,
            success: function (res) {
                var resObj = JSON.parse(res);
                if (resObj.code == 0) {
                    window.clearInterval(time);
                    window.location.href = "/crafts/adminindex";
                } else if (resObj.code == 1) {
                    window.clearInterval(time);
                }
            }
        });
    }

后端获取登录状态

/**
     * 判断是否登录,用于微信扫码后
     *
     * @return
     */
    @RequestMapping("/islogin")
    @ResponseBody
    public String isLogin() {
        Map<String, Object> resMap = new HashMap<>();
        String sessionId = request.getSession().getId();
        String loginJsonStr = redisService.get("loginJson&" + sessionId);
        LoginJson loginJson = GsonUtil.fromJson(loginJsonStr, LoginJson.class);
        // 未扫码
        if (null == loginJson) {
            resMap.put("code", -1);
            resMap.put("msg", "未扫码!");
        } else if (loginJson.getCode() == Code.success.getIndex()) {
            resMap.put("code", 0);
            resMap.put("msg", "成功");
        } else if (loginJson.getCode() == Code.fail.getIndex()) {
            resMap.put("code", 1);
            resMap.put("msg", "失败");
        }
        return GsonUtil.toJson(resMap);
    }

上述就是扫码登录的大致思路,如有不妥的地方,欢迎大家斧正,谢谢!

微信公众号授权登录功能通常涉及到OAuth2.0协议,Spring Boot作为Java Web应用的框架,可以利用其集成的第三方库如Spring Security OAuth来简化这个过程。以下是基本步骤: 1. **配置微信开发者中心**:首先,在微信公众平台注册并创建一个公众号,获取AppID和AppSecret。 2. **添加依赖**:在Spring Boot项目中引入Spring Security OAuth的相关依赖,例如`spring-security-oauth2-client`。 3. **设置客户端信息**:在`application.properties`或`application.yml`文件中配置微信客户端信息,包括`security.oauth2.client.id`(AppID)、`security.oauth2.client.secret`(AppSecret)等。 4. **创建回调URL**:在微信后台设置授权回调地址,这通常是`http://yourdomain.com/auth/wechat/callback`,Spring Boot会处理这个请求并完成授权流程。 5. **配置Security配置**:在Spring Security配置类中启用OAuth2ClientRegistrationRepository,并配置描特定的Controller用于处理授权换取access_token的请求。 6. **编写授权代**:创建一个控制器,如`WechatAuthenticationController`,实现OAuth2LoginEndpointResolver接口,处理用户点击授权链接后的流程。 7. **处理授权结果**:当用户授权后,Spring Boot将返回一个access_token,你需要解析该token并存储到数据库或JWT令牌中,以便后续验证。 8. **使用access_token**:在需要验证用户权限的地方,通过OAuth2UserService获取到用户的OAuth2User,以此来进行身份校验。
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值