当前位置: 首页 > news >正文

JAVA实现公众号扫码登录和关注功能实战

前言

使用第三方插件
<dependency><groupId>com.github.binarywang</groupId><artifactId>weixin-java-mp</artifactId><version>4.6.0</version>
</dependency>

准备APPID和appSecet

扫码登录

公众号回调

  • 回调代码块实现

    /*** 验证微信服务器 此接口不调用*/@ApiOperation(value = "验证微信服务器 此接口不调用")@GetMapping(value = "/callback")public String checkSign(HttpServletRequest request) {String signature = request.getParameter("signature");String timestamp = request.getParameter("timestamp");String nonce = request.getParameter("nonce");String echostr = request.getParameter("echostr");log.info("\n接收到来自微信服务器的认证消息:[signature:{}, timestamp:{}, nonce:{}, echostr:{}]", signature, timestamp, nonce, echostr);if (!wxMpService.checkSignature(timestamp, nonce, signature)) {log.error("【无效的请求】");throw new ServiceException("无效的请求", -1);}return echostr;}/*** 响应微信,这一步是关注微信后,响应微信获取信息*/@ApiOperation(value = "微信扫码响应微信服务器")@PostMapping("/callback")public String scanQRCodesCallBack(HttpServletRequest request, @RequestBody String requestBody) {String signature = request.getParameter("signature");String timestamp = request.getParameter("timestamp");String nonce = request.getParameter("nonce");String echostr = request.getParameter("echostr");String openid = request.getParameter("openid");String encType = request.getParameter("encType");String msgSignature = request.getParameter("msgSignature");log.info("\n接收到来自微信服务器的认证消息:[signature:{}, timestamp:{}, nonce:{}, echostr:{},encType:{},msgSignature:{}]", signature, timestamp, nonce, echostr, encType, msgSignature);if (!wxMpService.checkSignature(timestamp, nonce, signature)) {log.error("【无效的请求】");throw new ServiceException("无效的请求", -1);}if (encType == null) {// 明文传输的消息WxMpXmlMessage inMessage = WxMpXmlMessage.fromXml(requestBody);log.debug("\n消息内容为:\n{} ", inMessage.toString());return weiXinService.scanQRCodesCallBack(inMessage);} else if ("aes".equalsIgnoreCase(encType)) {// aes加密的消息WxMpXmlMessage inMessage = WxMpXmlMessage.fromEncryptedXml(requestBody, wxMpService.getWxMpConfigStorage(),timestamp, nonce, msgSignature);log.debug("\n消息解密后内容为:\n{} ", inMessage.toString());return weiXinService.scanQRCodesCallBack(inMessage);}return "";}
    
    复制@Overridepublic String scanQRCodesCallBack(WxMpXmlMessage message) {log.info("总的message:" + JSON.toJSONString(message));// content 公众号回复用户的文本内容String content = "欢迎关注公众号!NatCross是内网穿透工具,也是免费的端口映射软件。解决80被封/动态IP/无公网ip问题;适用于发布网站、访问局域网服务器和应用服务。";String messageType = message.getMsgType();                                //消息类型String messageEvent = message.getEvent();                                    //消息事件String fromUser = message.getFromUser();                                 //发送者帐号String toUser = message.getToUser();                                       //开发者微信号String text = message.getContent();                                        //文本消息  文本内容String eventKey = message.getEventKey();                                    //二维码参数JSONObject businessParams = JSON.parseObject(eventKey);                    //从二维码参数中获取uuid通过该uuid可通过websocket前端传数据log.info("消息类型:{},消息事件:{},发送者账号:{},接收者微信:{},文本消息:{},二维码参数:{}", messageType, messageEvent, fromUser, toUser, text, eventKey);WxMpUser wxMpUser = null;try {wxMpUser = wxMpService.getUserService().userInfo(fromUser);} catch (WxErrorException e) {e.printStackTrace();}log.info("通过用户openid获取用户信息:" + JSON.toJSONString(wxMpUser));if (StringUtils.equalsAnyIgnoreCase(WechatEventEnum.unsubscribe.getType(), messageEvent)) {//取消订阅log.info("取消订阅");return this.msgStr(message, "取消关注成功!");}String uuid = businessParams.containsKey("uuid") ? businessParams.getString("uuid") : null;if (StringUtils.isEmpty(uuid)) {//未知关注公众号,默认提示log.info("未知关注公众号,默认提示");return this.msgStr(message, content);}String redisData = Objects.toString(stringRedisTemplate.opsForValue().get(RedisKey.WECHAT_SCAN_UUID_FLAG + uuid), null);if (StringUtils.isNotEmpty(redisData) && wxMpUser != null) {if (StringUtils.equalsAnyIgnoreCase(WechatEventEnum.SCAN.getType(), messageEvent)) {String eventType = businessParams.getString("eventType");if (StringUtils.equalsAnyIgnoreCase(MsgEventTypeEnum.ADD_WARNING_RECEIVER.getEventType(), eventType)) {content = DateUtils.dateTimeNow(DateUtils.YYYY_MM_DD_HH_MM_SS) + "添加告警接收人成功!";} else if (StringUtils.equalsAnyIgnoreCase(MsgEventTypeEnum.USER_LOGIN.getEventType(), eventType)) {content = DateUtils.dateTimeNow(DateUtils.YYYY_MM_DD_HH_MM_SS) + "扫描登录成功!";}JSONObject dataMap = JSON.parseObject(redisData);dataMap.put("openid", wxMpUser.getOpenId());dataMap.put("unionid", wxMpUser.getUnionId());dataMap.put("nickName", wxMpUser.getNickname());dataMap.put("headImgUrl", wxMpUser.getHeadImgUrl());stringRedisTemplate.opsForValue().set(RedisKey.WECHAT_SCAN_UUID_RESULT_FLAG + uuid, dataMap.toString());}}// 根据来时的信息格式,重组返回。(注意中间不能有空格)final String msgStr = this.msgStr(message, content);return msgStr;}@Overridepublic NatMemberWechat getScanResult(String uuid) {String redisData = Objects.toString(stringRedisTemplate.opsForValue().get(RedisKey.WECHAT_SCAN_UUID_RESULT_FLAG + uuid), null);if (StringUtils.isEmpty(redisData)) {log.debug("redisData is null");return null;}JSONObject jsonObject = JSONObject.parseObject(redisData);NatMemberWechat natMemberWechat = natMemberWechatService.selectNatMemberWechatByOpenId(jsonObject.getString("openid"));if(natMemberWechat==null){natMemberWechat=new NatMemberWechat();natMemberWechat.setOpenId(jsonObject.getString("openid"));natMemberWechat.setUserId(null);}return natMemberWechat;}private String msgStr(WxMpXmlMessage message, String content) {// 根据来时的信息格式,重组返回。(注意中间不能有空格)final String msgStr = "<xml>"+ "<ToUserName><![CDATA[" + message.getFromUser() + "]]></ToUserName>"+ "<FromUserName><![CDATA[" + message.getToUser() + "]]></FromUserName>"+ "<CreateTime>" + new Date().getTime() + "</CreateTime>"+ "<MsgType><![CDATA[text]]></MsgType>"+ "<Content><![CDATA[" + content + "]]></Content>"+ "</xml>";return msgStr;}
    
  • 回调日志​​​​​​​测试通过后,如果是vue前后端分离,可以把接口给前端调用。
    以上是JAVA实现公众号扫码登录和关注的开发流程。

相关文章:

JAVA实现公众号扫码登录和关注功能实战

前言 使用第三方插件 <dependency><groupId>com.github.binarywang</groupId><artifactId>weixin-java-mp</artifactId><version>4.6.0</version> </dependency>准备APPID和appSecet 登录微信公众号后台&#xff0c;复制ap…...

初识Mysql/备份,基础指令

1&#xff0c;MySQL登录指令&#xff1a; mysql -h 127.0.0.1 -P3306 -u -p 其中&#xff0c;-h指明登录部署了mysql服务的主机 -P指明要访问的端口号&#xff0c; -u指明登录用户 -p输入密码 2&#xff0c;数据库基础 mysql&#xff1a;表示的是客户端 mysqld&…...

没想到吧!线稿上色居然可以这么简单

前言 在创意无限的数字艺术世界里&#xff0c;艺术创作中的线稿上色&#xff0c;向来是件既费时又需技巧的活儿&#xff0c;寻找一款既能激发灵感又能简化繁琐流程的工具&#xff0c;是每位艺术家心中的向往。 今天&#xff0c;为大家推荐一款革命性的线稿上色AI工具——千鹿…...

修改Docker的默认存储路径

docker默认存储路径&#xff1a;/var/lib/docker/ 执行 docker info 查看&#xff0c;得到以下信息 Docker Root Dir: /var/lib/docker/Debug Mode: falseRegistry: https://index.docker.io/v1/Labels:Experimental: falseInsecure Registries: 1.修改docker配置 要修改默认…...

深入计算机语言之C++:C到C++的过度

&#x1f511;&#x1f511;博客主页&#xff1a;阿客不是客 &#x1f353;&#x1f353;系列专栏&#xff1a;从C语言到C语言的渐深学习 欢迎来到泊舟小课堂 &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 一、什么是C C&#xff08;c plus plus&#xff…...

HR面试篇

一.面试中被问职业规划 HR感兴趣的不是你的职业规划,感兴趣的是你的职业规划和他们公司有没有关系。 或者说他们公司能不能去帮助你去实现你的职业规划。 切忌不要讲不合实际的,比如要在公司赚多少钱等等。 要根据公司的特点,找到切入点,只要讲得积极向上就可以。 二.…...

深度探索Kali Linux的精髓与实践应用

Kali Linux简介 Kali Linux作为全球网络安全领域的首选操作系统之一&#xff0c;其强大的功能性及广泛的适用范围令人瞩目。除了上述基础介绍外&#xff0c;让我们深入探究Kali Linux的几个关键特性及其在实际操作中的具体应用案例。 Kali工具集成&#xff1a;全面的安全工具…...

【在Linux世界中追寻伟大的One Piece】DNS与ICMP

目录 1 -> DNS(Domain Name System) 1.1 -> DNS背景 2 -> 域名简介 2.1 -> 域名解析过程 3 -> 使用dig工具分析DNS 4 -> ICMP协议 4.1 -> ICMP功能 4.2 -> ICMP报文格式 4.3 -> Ping命令 4.4 -> traceroute命令 1 -> DNS(Domain Na…...

信息安全工程师(41)VPN概述

前言 VPN&#xff0c;即Virtual Private Network&#xff08;虚拟专用网络&#xff09;的缩写&#xff0c;是一种通过公共网络&#xff08;如互联网&#xff09;创建私密连接的技术。 一、定义与工作原理 定义&#xff1a;VPN是依靠ISP&#xff08;Internet Service Provider&…...

算法:双指针系列(一)

双指针系列 一、移动零&#xff08;一&#xff09;题目分析&#xff08;二&#xff09;代码展示二、复写零&#xff08;一&#xff09;题目分析&#xff08;二&#xff09;代码展示三、快乐数&#xff08;一&#xff09;题目分析&#xff08;二&#xff09;代码展示&#xff08…...

跟《经济学人》学英文:2024年09月28日这期 The curse of the Michelin star

The curse of the Michelin star Restaurants awarded the honour are more likely to close, research finds 原文&#xff1a; The twelve new restaurants added to the New York Michelin Guide this month, serving up cuisine ranging from “haute French” to “eco…...

Java Set 的介绍与实现原理

什么是 Set 在 Java 中&#xff0c;Set 是一种集合类型&#xff0c;它不允许重复的元素。Set 接口是 Java Collections Framework 的一部分&#xff0c;主要用于存储不重复的值。常见的实现类包括 HashSet、LinkedHashSet 和 TreeSet。 实现原理 1. HashSet HashSet 是最常…...

我谈均值平滑模板——给均值平滑模板上升理论高度

均值平滑&#xff08;Mean Smoothing&#xff09;&#xff0c;也称为盒状滤波&#xff08;Box Filter&#xff09;&#xff0c;通过计算一个像素及其周围像素的平均值来替换该像素的原始值&#xff0c;从而达到平滑图像的效果。 均值平滑通常使用一个模板&#xff08;或称为卷…...

WordPress添加https协议致使后台打不开解决方法

由于删除WordPress缓存插件后操作不当&#xff0c;在加上升级处理&#xff0c;致使茹莱神兽博客的首页出现了https不兼容问题&#xff0c;WordPress后台也无法登陆&#xff0c;链接被误认为是定向重置次数过多&#xff0c;在网上找了好久的答案。 还有就是求助了好些人&#xf…...

如何使用pymysql和psycopg2执行SQL语句

在Python中&#xff0c;pymysql和psycopg2是两个非常流行的库&#xff0c;用于与MySQL和PostgreSQL数据库进行交互。本文将详细介绍如何使用这两个库来执行SQL查询、插入、更新和删除操作。 1. 准备工作 首先&#xff0c;确保已经安装了pymysql和psycopg2库。如果尚未安装&a…...

linux无法使用ll命令

ll命令是ls -l的别名&#xff0c;无法使用通常是该用户没有该别名配置&#xff0c;只需要简单添加即可使用 修改~/.bashrc # 备份 cp ~/.bashrc ~/.bashrc.source # 编辑 vim ~/.bashrc添加如下内容 # 别名 alias llls -l加载配置 source ~/.bashrc...

STM32输入捕获模式详解(上篇):原理、测频法与测周法

1. 前言 在嵌入式系统的开发过程中&#xff0c;常常需要对外部信号进行精确的时间测量&#xff0c;如测量脉冲信号的周期、频率以及占空比等。STM32系列微控制器提供了丰富的定时器资源&#xff0c;其中的输入捕获&#xff08;Input Capture, IC&#xff09;模式能实现对信号的…...

面试中遇到的关于Transformer模型的问题有哪些?

Transformer是深度学习中极具影响力的模型架构之一&#xff0c;广泛应用于自然语言处理、计算机视觉等领域。它通过自注意力机制和并行计算等特点&#xff0c;取得了比传统模型&#xff08;如RNN、LSTM&#xff09;更优异的性能。本文将针对Transformer的多个关键问题进行详细探…...

【UE】自动添加Megascans所有资产到自己的账户

1. 复制如下代码&#xff1a; ((async (startPage 0, autoClearConsole true) > {const getCookie (name) > {const value ; ${document.cookie};const parts value.split(; ${name});if (parts.length 2) return parts.pop().split(;).shift();}const callCacheA…...

【函数】4.函数的单调性

本节课没有笔记示例&#xff0c;自己做好笔记&#xff01; 复合函数的单调性 最值 没讲 提醒我...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​&#xff1a; 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​&#xff1a; // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

windows系统MySQL安装文档

概览&#xff1a;本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容&#xff0c;为学习者提供全面的操作指导。关键要点包括&#xff1a; 解压 &#xff1a;下载完成后解压压缩包&#xff0c;得到MySQL 8.…...

Ubuntu系统复制(U盘-电脑硬盘)

所需环境 电脑自带硬盘&#xff1a;1块 (1T) U盘1&#xff1a;Ubuntu系统引导盘&#xff08;用于“U盘2”复制到“电脑自带硬盘”&#xff09; U盘2&#xff1a;Ubuntu系统盘&#xff08;1T&#xff0c;用于被复制&#xff09; &#xff01;&#xff01;&#xff01;建议“电脑…...