当前位置: 首页 > 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; 复合函数的单调性 最值 没讲 提醒我...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...