【Java项目】SpringBoot项目完成微信公众号收到用户消息自动回复功能附带视频(超详细)(一)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 【Java项目】SpringBoot项目完成微信公众号收到用户消息自动回复功能附带视频(超详细)

视频讲解

视频讲解

基础注册

首先你需要先注册一个你的微信公众号

微信公众号平台

然后打开下面的自动回复功能

之后进入到你的开发者中心

开发者中心基本配置

然后生成你的开发者密码,开发者id,以及设置你的IP白名单。

这里的IP白名单中的IP必须是一个公网IP,因为微信官方会把他们的请求发送到公网上,然后你接受到请求之后需要给这个请求做一个响应才能实现消息互通的功能。

之后开始配置你的服务器信息

首先是URL,这里的URL需要填写的是

http://ip:80/path(这里的path满足请求路径的格式即可)

或者是

https://ip:443/path

之后你的SpringBoot项目中就需要用到这些配置了

Java部分代码

我们首先对pom文件进行配置,因为微信的数据格式为xml,

所以我们需要引入能解析xml和转换xml的依赖,如下

这里我的springboot版本为2.7.7,但是这个影响应该不大,如果出现一些问题可以尝试换一下依赖版本

<!-- XML 文件读写 -->
        <dependency>
            <groupId>org.dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>2.0.0</version>
        </dependency>
        <!-- java对象转换为xml字符串 -->
        <dependency>
            <groupId>com.thoughtworks.xstream</groupId>
            <artifactId>xstream</artifactId>
            <version>1.4.19</version>
        </dependency>
        <dependency>
            <groupId>com.github.liyiorg</groupId>
            <artifactId>weixin-popular</artifactId>
            <version>2.8.30</version>
        </dependency>
        <dependency>
            <groupId>com.github.binarywang</groupId>
            <artifactId>weixin-java-mp</artifactId>
            <version>3.7.0</version>
        </dependency>

之后在项目中配置你的这些微信官方给你的信息即可

然后我刚才说过,微信会向公网上你刚才输入的地址发送请求,是一个get请求,并且会携带上一些参数,我们要做的就是解析这些参数,代码如下

下面是Controller层的代码

import lombok.extern.java.Log;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Log
@RestController
@RequestMapping("/wx")
public class TokenCheckController {
    @Value("${wechat.mp.token}")
    private String token;
  @GetMapping("/")
    public String index(HttpServletResponse response, HttpServletRequest request) throws Exception {
        String echostr = TokenCheckUtil.checkToken(request, token);
        return echostr;
    }
}
   @PostMapping("/")
    public String chatGPTproxy(
            HttpServletResponse response,
            HttpServletRequest request,
            @RequestBody String requestBody, @RequestParam("signature") String signature,
            @RequestParam("timestamp") String timestamp, @RequestParam("nonce") String nonce,
            @RequestParam(name = "encrypt_type", required = false) String encType,
            @RequestParam(name = "msg_signature", required = false) String msgSignature) {
        System.out.println("requestbody:----"+requestBody);
        return requestBody;
}

下面是TokenCheckUtil工具包的代码

import javax.servlet.http.HttpServletRequest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import static cn.hutool.crypto.SecureUtil.sha1;
/**
 * @author: 张锦标
 * @date: 2023/4/2 15:10
 * TokenCheckUtil类
 */
public class TokenCheckUtil {
    public static String checkToken(HttpServletRequest request, String token) throws NoSuchAlgorithmException {
        String method = request.getMethod();
        //微信token验证get请求
        if ("GET".equals(method)) {
            //微信加密签名
            String echostr = request.getParameter("echostr");//时阅鲛
            String signature = request.getParameter("signature");//随机宁符串
            String timestamp = request.getParameter("timestamp");//随机数
            String nonce = request.getParameter("nonce");
            String[] str = {token, timestamp, nonce};
            //字典排序
            Arrays.sort(str);
            String bigStr = str[0] + str[1] + str[2];// SHA1加密
            String digest = sha1(bigStr);//对比签名
            if (digest.equals(signature)) {
                return echostr;
            } else {
                return "";
            }
        }
        return "";
    }
}

上面两个完成之后,只要你点击测试,微信就会向这个接口发送一个Get请求,并且其请求参数如上代码,需要对这些参数进行校验对比之后返回一个echostr,代码只需要直接按照上面的照抄即可。

然后继续看controller层的代码,有一个post请求,微信官方会将接收到的用户消息发送到这个post请求上,你只需要把get请求改为post,路径不变即可。

其请求数据在请求体中,因此需要使用的是@RequestBody注解

测试

这里我们先简单的做一个测试,把项目使用maven进行打包,然后部署到你的云服务器上面去

微信公众号测试号管理

这里由于只是先做了一个测试,所以使用的是测试号管理,这里就不需要端口一定设定为80了,但是等真的变成上线了,那么就需要使用80端口,不过,你可以进行一下代理,比如使用nginx

之后你就可以点击提交,然后如果说按照上面的步骤的话,是没有问题的,就会出现如下情况

上面的URL配置成功之后,就可以让你的朋友去扫你的测试号二维码然后让他们关注后给你发消息了。

当他们给你发消息之后,你会接收到如下的消息,其格式为XML

首先你会收到一个订阅公众号的消息,可以看到有一个Event标签,然后当用户给你发送消息的时候,你还会收到一个Content标签,其中的内容就是用户给你发送的内容

那么此时你需要做的就是去解析XML并且获得你需要的数据

解析XML并取得需要的数据

Java实体类,用于接受请求并且封装

import lombok.Data;
/**
 * @author: 张锦标
 * @date: 2023/4/2 15:03
 * ReceiveMessage类
 */
@Data
public class ReceiveMessage {
    /**
     * 开发者微信号
     */
    private String ToUserName;
    /**
     * 发送方账号(一个openid)
     */
    private String FromUserName;
    /**
     * 消息创建时间(整形)
     */
    private String CreateTime;
    /**
     * 消息类型
     */
    private String MsgType;
    /**
     * 文本消息内容
     */
    private String Content;
    /**
     * 消息ID 64位
     */
    String MsgId;
    /**
     * 消息的数据ID 消息来自文章才有
     */
    private String MsgDataId;
    /**
     * 多图文时第几篇文章,从1开始 消息如果来自文章才有
     */
    private String Idx;
    /**
     * 订阅事件 subscribe订阅 unsbscribe取消订阅
     */
    private String Event;
}

XML工具包

import com.towelove.file.domain.wechat.ReceiveMessage;
import com.towelove.file.domain.wechat.ReplyMessage;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringWriter;
import java.io.StringWriter;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.XMLWriter;
/**
 * @author: 张锦标
 * @date: 2023/4/2 15:13
 * XMLUtil类
 */
public class XMLUtil {
    public static void main(String[] args) {
        String str = "" +
                "<xml><ToUserName><![CDATA[gh_71a0837d69a6]]></ToUserName>\n" +
                "<FromUserName><![CDATA[oy__X6O4BjH9QyyOcQaj55-O5Awo]]></FromUserName>\n" +
                "<CreateTime>1680533388</CreateTime>\n" +
                "<MsgType><![CDATA[text]]></MsgType>\n" +
                "<Content><![CDATA[123]]></Content>\n" +
                "<MsgId>24059451823534879</MsgId>\n" +
                "</xml>";
        System.out.println(XMLUtil.XMLTOModel(str));
    }
    public  static ReceiveMessage XMLTOModel(String str) {
        ReceiveMessage receiveMessage = new ReceiveMessage();
        try {
            Document document = DocumentHelper.parseText(String.valueOf(str));
            Element root = document.getRootElement();
            receiveMessage.setToUserName(root.elementText("ToUserName"));
            receiveMessage.setFromUserName(root.elementText("FromUserName"));
            receiveMessage.setMsgType(root.elementText("MsgType"));
            receiveMessage.setContent(root.elementText("Content"));
            receiveMessage.setCreateTime(root.elementText("CreateTime"));
            receiveMessage.setMsgId(root.elementText("MsgId"));
            //receiveMessage.setMsgDataId(root.elementText("MsgDataId"));
            //receiveMessage.setIdx(root.elementText("Idx"));
            关注
            //receiveMessage.setEvent(root.elementText("Event"));
        } catch (Exception e) {
            System.out.println(e);
        }
        return receiveMessage;
    }
    public static String ObjToXml(ReplyMessage obj) throws Exception {
        Document document = DocumentHelper.createDocument();
        Element root = document.addElement(obj.getClass().getSimpleName());
        convertObjectToXml(obj, root);
        StringWriter stringWriter = new StringWriter();
        XMLWriter writer = new XMLWriter(stringWriter);
        writer.write(document);
        writer.close();
        return stringWriter.toString();
    }
    private static void convertObjectToXml(Object obj, Element element) throws Exception {
        Class<?> clazz = obj.getClass();
        for (java.lang.reflect.Field field : clazz.getDeclaredFields()) {
            field.setAccessible(true);
            Element child = element.addElement(field.getName());
            Object value = field.get(obj);
            if (value != null) {
                if (value.getClass().isPrimitive() || value.getClass() == java.lang.String.class) {
                    child.setText(value.toString());
                } else {
                    convertObjectToXml(value, child);
                }
            }
        }
    }
}

然后我们使用测试方法来测试一下这段解析代码是否有效


相关文章
|
2月前
|
小程序 JavaScript Java
基于SpringBoot的智慧停车场微信小程序源码分享
智慧停车场微信小程序主要包含管理端和小程序端。管理端包括停车场管理,公告信息管理,用户信息管理,预定信息管理,用户反馈管理等功能。小程序端包括登录注册,预约停车位,停车导航,停车缴费,用户信息,车辆信息,钱包充值,意见反馈等功能。
129 5
基于SpringBoot的智慧停车场微信小程序源码分享
|
2月前
|
人工智能 开发框架 机器人
AstrBot:轻松将大模型接入QQ、微信等消息平台,打造多功能AI聊天机器人的开发框架,附详细教程
AstrBot 是一个开源的多平台聊天机器人及开发框架,支持多种大语言模型和消息平台,具备多轮对话、语音转文字等功能。
3181 15
AstrBot:轻松将大模型接入QQ、微信等消息平台,打造多功能AI聊天机器人的开发框架,附详细教程
|
2月前
|
存储 小程序 前端开发
微信小程序与Java后端实现微信授权登录功能
微信小程序极大地简化了登录注册流程。对于用户而言,仅仅需要点击授权按钮,便能够完成登录操作,无需经历繁琐的注册步骤以及输入账号密码等一系列复杂操作,这种便捷的登录方式极大地提升了用户的使用体验
645 12
|
3月前
|
人工智能 自然语言处理
使用企业微信或公众号自动回复图片消息
AppFlow支持企业微信和公众号接收图片消息,并提供两种回复方式。方式一:直接回复图片消息,用户发送图片后立即收到回复,但无法继续追问。方式二:先保存图片,待用户发送文字后再一并处理并回复。配置步骤包括选择模板、配置鉴权信息、设置执行动作参数及发布连接流。详细操作可参考相关文档。
使用企业微信或公众号自动回复图片消息
|
3月前
|
机器人 API 语音技术
企业微信接收语音消息并自动回复
本文介绍如何在企业微信中通过应用机器人实现语音消息的自动回复。具体步骤包括:创建企业微信应用,获取AgentID和Secret;使用AppFlow模版创建连接流并配置鉴权凭证;选择语音识别模型和大模型应用(如通义系列)进行自动回复;配置企业微信应用接收消息API及可信IP;最后测试应用功能。通过这些步骤,用户可以高效地利用大模型技术提升企业微信的使用体验。
|
4月前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
164 34
|
5月前
|
安全 Java 测试技术
🎉Java零基础:全面解析枚举的强大功能
【10月更文挑战第19天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
168 60
|
5月前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
80 2
|
6月前
|
Java 程序员
在Java编程中,关键字不仅是简单的词汇,更是赋予代码强大功能的“魔法咒语”。
【10月更文挑战第13天】在Java编程中,关键字不仅是简单的词汇,更是赋予代码强大功能的“魔法咒语”。本文介绍了Java关键字的基本概念及其重要性,并通过定义类和对象、控制流程、访问修饰符等示例,展示了关键字的实际应用。掌握这些关键字,是成为优秀Java程序员的基础。
81 3
|
6月前
|
移动开发 小程序 数据可视化
基于npm CLI脚手架的uniapp项目创建、运行与打包全攻略(微信小程序、H5、APP全覆盖)
基于npm CLI脚手架的uniapp项目创建、运行与打包全攻略(微信小程序、H5、APP全覆盖)
838 3

热门文章

最新文章