springboot+vue实现微信公众号扫码登录

通常在个人网站中,都会有各种第三方登录,其中微信登录需要认证才能使用,导致个人开发者不能进行使用此功能,但是我们可以使用微信公众号回复特定验证码来进行登录操作。

微信关键词处理

微信公众号关键词自动回复,具体的处理方式可以查看这篇文章

1.微信公众号关键词处理中加登录逻辑


/**
 * 微信接口相关控制器
 * Created by PeakGao on 2023/8/5.
 */

@RestController
@RequestMapping("/wechat")
@RequiredArgsConstructor
public class ApiWeChatController extends BaseController {
    @Resource
    private ThirdService thirdService;

    private final WxMpService wxMpService;


    private final Pattern pattern = Pattern.compile("(?i)^PG\\d{4}$");

    /**
     * 关键字回复 + 登录逻辑
     *
     * @param request
     * @return
     */
    @PostMapping(produces = "application/xml; charset=UTF-8")
    public String handleMsg(HttpServletRequest request) {

        try {
            WxMpXmlMessage message = WxMpXmlMessage.fromXml(request.getInputStream());
            String content = message.getContent();
            logger.info("公众号请求类型:{};内容为:{}", message.getMsgType(), content);
            if (WxConsts.XmlMsgType.TEXT.equals(message.getMsgType())) {
                if ("验证码".equals(content)) {
                    String code = RandomUtils.generationNumberChar(6);
                    String msg = MessageFormat.format("您的本次验证码:{0},该验证码30分钟内有效。", code);
                    redisUtil.set(Constant.WECHAT_CODE + code, code, 1800);
                    return returnMsg(msg, message);
                }
                //登录逻辑
                Matcher matcher = pattern.matcher(content);
                if (!matcher.matches()) {
                    return returnMsg("验证不正确或已过期", message);
                } else {
                    //TODO 自己的登录逻辑
                    //String msg = thirdService.wechatLogin(message);
                    return returnMsg(msg, message);
                }

            }

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

    /**
     * 返回消息
     *
     * @param msg     消息内容
     * @param message
     * @return
     */
    private static String returnMsg(String msg, WxMpXmlMessage message) {
        WxMpXmlOutTextMessage outMessage = WxMpXmlOutTextMessage.TEXT().content(msg).fromUser(message.getToUser()).toUser(message.getFromUser()).build();
        return outMessage.toXml();
    }

}

2、wechatLogin判断用户是否微信登录成功(这里只是看验证码过期没)

   public String wechatLogin(WxMpXmlMessage message) {
        String content = message.getContent().toUpperCase();
        logger.info("微信扫码公众号登录验证码:{}", content);
        if (content.length() != 6) {
            return "验证码错误";
        }
        //先判断登录码是否已过期
        boolean loginFlag = redisUtil.hasKey(Constant.REDIS_KEY_PREFIX + Constant.WX_LOGIN_USER_STATUE + content);
        if (!loginFlag) {
            return "验证码已过期";
        }
        //TODO  doSoming
           //根据getFromUser查询用户是否已存在,fromUser就是微信的openid
        UserInfoVO userInfoVO = userMapper.selectByUserName(message.getFromUser());
    //新用户  写自己的逻辑
        if (userInfoVO == null) {
            
        }else{
    
    }

        //修改redis缓存 以便监听是否已经授权成功
        redisService.setCacheObject(RedisConstants.WX_LOGIN_USER + content, userInfoVO, 60, TimeUnit.SECONDS);
        return "网站登录成功!(若页面长时间未跳转请刷新验证码)";
    }

3、添加获取验证码方法

public R getWechatLoginCode() {
    String code = "PG" + RandomUtils.generationNumberChar(4);
    redisUtil.set(Constant.REDIS_KEY_PREFIX + Constant.WX_LOGIN_USER_STATUE + code, false, 60);
    return R.ok(code);
}

4、添加wxIsLogin方法

新增wxIsLogin方法用来监听是否已经回复验证码登录,其中logincode就是前端获取的登录验证码

public R wxIsLogin(String loginCode) {
        Object user = redisUtil.get(Constant.REDIS_KEY_PREFIX + Constant.WX_LOGIN_USER_STATUE + loginCode);
        if (user == null) {
            return R.error("用户未被授权");
        }
            //TODO 登录成功 这里生成token返回

        return R.ok(token);
    }

5、调用wxIsLogin

前端定时调用wxIsLogin方法来判断是否已经登录成功。这里需要注意的是先调用方法获取登录验证码后同时开始定时任务调用wxIsLogin
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/412516.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第四套CCF信息学奥赛c++ CSP-J认证初级组 中小学信奥赛入门组初赛考前模拟冲刺题(完善程序题)

第四套中小学信息学奥赛CSP-J考前冲刺题 三、完善程序题 第一题 田忌赛马 田忌赛马&#xff0c;田忌每赢一次齐王的马就得200金&#xff0c;,当然输了就扣200金币&#xff0c;平局则金币数 不变。 #include<iostream> using namespace std; int main(){int n;while(c…

ARM系列 -- 虚拟化(二)

上一篇介绍了虚拟化和hypervisor的基本概念。为了配合虚拟化&#xff0c;ARM做了许多工作&#xff0c;首先是定义了四个异常等级&#xff08;Exception Level&#xff0c;简称EL&#xff09;。 前面介绍异常和特权的文章中有介绍&#xff0c;此处再啰嗦几句。每个异常级别都有…

css transform 会影响position 定位

比如通过以下代码.实现导航条上的每个li栏目,以不同的时间间隔,从上向下移动进来并显示 .my-navbar ul li {position: relative;opacity: 0;transform: translateY(-30px);transition: transform .6s cubic-bezier(.165,.84,.44,1),opacity .6s cubic-bezier(.165,.84,.44,1);…

Delphi 报错 Type androidx.collection.ArraySet is defined multiple times

Delphi 11 建立一个新的 Multi-Device Application 编译成app的时候报错 报错信息 [PAClient Error] Error: E7688 Unable to execute "E:\Program\Java\jdk1.8.0_301\bin\java.exe" -cp "e:\program\embarcadero\studio\22.0\bin\Android\r8-3.3.28.jar"…

【学习笔记】Vue3源码解析:第二部分-实现响应式(2)

课程地址&#xff1a;【已完结】全网最详细Vue3源码解析&#xff01;&#xff08;一行行带你手写Vue3源码&#xff09; 第二部分-实现响应式&#xff08;2&#xff09;&#xff1a;&#xff08;对应课程的第6-9节&#xff09; 第6节&#xff1a;《实现proxy代理以及解决重复代…

基于DPU和HADOS-RACE加速Spark 3.x

背景简介 Apache Spark&#xff08;下文简称Spark&#xff09;是一种开源集群计算引擎&#xff0c;支持批/流计算、SQL分析、机器学习、图计算等计算范式&#xff0c;以其强大的容错能力、可扩展性、函数式API、多语言支持&#xff08;SQL、Python、Java、Scala、R&#xff09…

SAP PO接口行项目json缺少中括号[]问题

PO接口小问题问题&#xff1a;如果需要同时传输DATA与ITEM&#xff0c;此处选择很重要&#xff0c;如果选择&#xff1a;HTTP Header ITEM将缺少[].需要注意 PO接口小问题 问题&#xff1a;如果需要同时传输DATA与ITEM&#xff0c;此处选择很重要&#xff0c;如果选择&#…

一次奇怪的事故:机器网络连接打满,导致服务不可用

业务背景 发生事故的业务系统是一个toB业务&#xff0c;业务是服务很多中小企业进行某项公共信息指标查询。系统特点:业务处理相对简单&#xff0c;但是流量大&#xff0c;且对请求响应要求较高&#xff1a; 业务请求峰值qps达50w&#xff0c;平时流量达20w左右。 请求响应时…

中国专家主导的ISO隐私计算国际标准立项,蚂蚁链摩斯参与编写

蚂蚁集团联合阿里巴巴、中科院信工所等单位联合推动的ISO/IEC 4922-3&#xff08;Information security -- Secure multiparty computation -- Part 3: Mechanisms based on garbled circuit &#xff09;正式通过ISO/IEC JTC 1 SC27的International standard (IS, 国际标准&am…

电机效率MAP图

直接使用contourf&#xff0c;需要有[X,Y] meshgrid(x,y), 并用Zf(X,Y)来生成Z轴。但是如果一开始Z轴坐标就不是x,y用函数生成的&#xff0c;而是有个默认的测试数据&#xff0c;又该如何用来画MAP图呢? clc;clear;clf; data_ECO []; //具体数值可以自己填&#xff0c;此处…

浅谈JAVA中锁的优化机制

引言&#xff1a; 从JDK1.6版本之后&#xff0c;synchronized本身也在不断优化锁的机制&#xff0c;有些情况下他并不会是一个很重量 级的锁了。优化机制包括自适应锁、自旋锁、锁消除、锁粗化、轻量级锁和偏向锁。 锁的状态从低到高依次为 无锁->偏向锁->轻量级锁->重…

uniapp的微信小程序授权头像昵称(最新版)

前面我出过两期博客关于小程序授权登录,利用php实现一个简单的小程序授权登录并存储授权用户信息到数据库的完整流程。无奈&#xff0c;小程序官方又整幺蛾子了。wx.getUserInfo接口收回&#xff0c;wx.getUserProfile接口也不让用。导致我的个人小程序&#xff1a;梦缘 的授权…

(每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第12章 项目质量管理(一)

博主2023年11月通过了信息系统项目管理的考试&#xff0c;考试过程中发现考试的内容全部是教材中的内容&#xff0c;非常符合我学习的思路&#xff0c;因此博主想通过该平台把自己学习过程中的经验和教材博主认为重要的知识点分享给大家&#xff0c;希望更多的人能够通过考试&a…

系统攻防-WindowsLinux远程探针本地自检任意代码执行权限提升入口点

知识点&#xff1a; 1、远程漏扫-Nessus&Nexpose&Goby 2、本地漏扫(提权)-Wesng&Tiquan&Suggester 3、利用场景-远程利用&本地利用&利用条件 一、演示案例-操作系统-远程漏扫-Nessus&Nexpose&Goby Nessus Nessus号称是世界上最流行的漏洞扫描…

2024年江苏事业单位招聘报名指南

江苏事业单位目前已出的公告中&#xff0c;扬州和常州的报名时间相对较早&#xff0c;2月27日就开始报名了&#xff1b;其他大多在2月28日或3月1日起开始报名。 报名请移步<江苏人事考试网> 【报名时间】 2月28日9:00-3月4日16:00#图文万粉激励计划# 【资格初审】2月28…

Shiro反序列化漏洞原理代码分析(3)

最终POC transform链POC 由于我们要序列化的对象是PriorityQueue&#xff0c;所以我们就先实例化一个该对象 并且赋初值 PriorityQueue priorityQueue new PriorityQueue(2);priorityQueue.add(1);priorityQueue.add(2); 由于我们最后要调用的是ChainedTransformer对象的tr…

ADS-B Ground Receiver Radarcape

目录 Radarcape ADS-B MLAT Receiver Web Browser User Interface Radarcape Technical Data Radarcape Software Features Radarcape Basics Radarcape ADS-B MLAT Receiver Radarcape is a professional ADS-B receiver made for 24/7 operation. High performance rec…

C# TesseractOCR识别身份证号

https://github.com/tesseract-ocr/tessdata 新建控制台项目并添加包 Tesseract和Tesseract.Drawing 下载训练的模型 地址 代码实现 using Tesseract;var filePath "F:\\Desktop\\韦小宝.png"; var exePath AppDomain.CurrentDomain.BaseDirectory; var …

敏捷开发中如何写好用户故事?

什么是用户故事&#xff1f; 用户故事&#xff08;user story&#xff09;是一个用来确认用户和用户需求的简短描述&#xff0c;作为什么用户&#xff0c;希望如何&#xff0c;这样做的目的或者价值何在。用户故事在软件研发中又被描述为需求。用户故事通常的格式为&#xff1…

人工智能、机器学习和生成式人工智能之间有什么区别?

文 | BFT机器人 在这个数字的智能时代&#xff0c;大家对人工智能、机器学习和生成式人工智能这些名词字眼很熟悉&#xff0c;有些人或许对它们还有一些了解&#xff0c;但是当他们一起出现的时候&#xff0c;大家能够区别它们是什么意思吗&#xff1f;今天小编将带你们详细解…