前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >微信扫码登录网站实现案例(无需授权)

微信扫码登录网站实现案例(无需授权)

作者头像
小诸葛
发布2020-04-14 15:49:06
2.1K1
发布2020-04-14 15:49:06
举报
文章被收录于专栏:方法论方法论

前言

最近因业务需要,需要给网站增加一个扫描公众号二维码登录网站的功能,通过扫码登录,一来用户登录网站不需再输入账号密码,提升了用户体验,二来也可以作为公众号吸粉的一个渠道。

开发准备

实现微信扫码登录需要一个认证的服务号,因为实现这个功能需要调用微信提供的接口生成一个带参的公众号二维码,而这个带参二维码生成接口只有认证的服务号才拥有这个接口的使用权,接口说明如图1-1所示。

图1-1 微信接口说明

流程说明

扫码登录的具体过程是这样的:用户打开登录页面时,前端在页面加载完成后随即请求后台生成带参公众号二维码,后台向微信发送请求生成二维码,微信将生成后的二维码、ticket(唯一值)等信息返回给开发者后台,后台再将这些信息返回给前端,前端获取到这些信息后,首先将二维码显示在页面上,然后通过ticket作为id和后台建立websocket连接,并以此websocket连接来接收用户扫码事件的处理结果,当后台处理完成用户扫码事件后,通过websocket将处理结果发送至前端,前端根据处理结果进行相关业务操作,处理流程图如图1-2所示。

为什么使用websocket?

首先我们需要了解这样一个事实,用户扫描二维码后,微信会将扫码事件推送到开发者服务器,而前端是无法知道后台对用户扫码的处理结果的,那么我们要怎么将处理结果通知前端呢?一种方式是轮询:前端不断向后台请求处理结果,这种方式明显不是很好,因而使用websocket刚好可以解决这个问题。

图1-2 微信扫码处理流程图

因相关业务代码较多,在此仅展示关键代码。

1.生成公众号带参二维码代码如代码清单1所示。

代码清单1 生成公众号带参二维码

代码语言:javascript
复制
        //此处getToken方法内的参数需换成自己的服务号appid和secret
        Token pubtoken = CommonUtil.getToken(WxConstant.FUWUHAO__APPID, WxConstant.FUWUHAO__SECRET);
        JSONObject params = new JSONObject();
        params.put("action_name", "QR_SCENE");
        params.put("expire_seconds", 30000);

        JSONObject action_info = new JSONObject();
        JSONObject action_info_result = new JSONObject();
        action_info_result.put("scene_id", 8);

        action_info.put("scene", action_info_result);
        params.put("action_info", action_info);

        Map<String,Object> result = new HashMap<>();
        try {
            JSONObject res = JSON.parseObject(MyHttpRequestUtil.sendPost(CommonUtil.CONTAIN_PARAMS_QRCODE + pubtoken.getAccessToken(), params.toString()));
            String ticket = URLEncoder.encode(res.getString("ticket"),"UTF-8");
            String picUrl = CommonUtil.MP_QRCODE_PRE_URL + ticket;
            log.info("二维码地址:picUrl:"+picUrl);
            result.put("qrCodeUrl",picUrl);
            result.put("ticket",ticket);
            return ServerResponse.createBySuccess(result);
        } catch (Exception e) {
            e.printStackTrace();
        }

2.用户扫码事件回调处理代码如代码清单2所示,需要说明的一点是,此回调函数即公众号配置的URL,如不了解如何配置的可参考我的另一篇文章:

Spring Boot微信公众号服务器配置案例。

代码清单2 用户扫描二维码回调事件处理

代码语言:javascript
复制
    @ApiOperation("1.3:用户与公众号交互事件处理")
    @RequestMapping("/getUserFocus")
    public String handlePubFocus(HttpServletRequest request,HttpServletResponse response){
        log.info("1.3:用户与公众号交互事件处理");
        try{
            Map<String ,String > requestMap = WxMessageUtil.parseXml(request);
            Set<String> keys = requestMap.keySet();
            String messageType = requestMap.get("MsgType");
            String eventType = requestMap.get("Event");
            String openid = requestMap.get("FromUserName");
            if(messageType.equals("event")){
                //判断消息类型是否是事件消息类型
                log.info("公众号====>事件消息");
                log.info("openid:" + openid);
                log.info("Event:" + eventType);
                if(eventType.equals("subscribe")){
                    log.info("公众号====>新用户关注");
                }else if(eventType.equals("unsubscribe")){
                    log.info("公众号====>用户取消关注");
                }else if(eventType.equals("SCAN")){
                    log.info("公众号===>用户扫码动态二维码");
                }else{
                    log.info("公众号===>其他");
                }
            }

            keys.forEach(item->{
                String value = requestMap.get(item);
                log.info(item + "===>" + value);
                if(item.equals("Ticket")){
                    //当前用户进行了扫描动态二维码登录pc管理端操作
                    log.info("==>开始处理扫码登录");
                    log.info("当前用户openid:" + openid);
                    log.info("当前用户Ticket:" + value);
                    ldkjWxApiService.handleScanQrcode(openid,value);
                }
            });

        }catch (Exception e){
            e.printStackTrace();
        }
        return "";
    }

运行结果:

1.登录首页生成二维码如图1-3所示。

1-3 登录首页生成公众号二维码

2.用户扫码后自动登录到系统首页,如图1-4所示。

图1-4 用户扫码登录到系统首页

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小诸葛的博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Spring Boot微信公众号服务器配置案例。
相关产品与服务
云服务器
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档