微信公众号接入chatGPT自动回复(2)

news2024/12/23 17:35:04

微信公众平台

配置自动回复的服务器

application.properties中的配置

验证服务器接口配置

其实就两个接口(相同的url地址,只不过请求方式不一样)

1.验证接口(get请求)

2.自动回复接口(post请求)

完整代码  这个地址就是上面URL配置的地址  如果使用Nginx的话自动配置

将该代码先部署到服务器才可以验证通过

@RestController
@RequestMapping("/xxxx")
@Slf4j
public class WeChatController {


    @Value("${weixin.token}")
    private String token;

    @GetMapping("/XXXXX")
    public String handleMessage(@RequestParam("signature") String signature,
                                @RequestParam("timestamp") String timestamp,
                                @RequestParam("nonce") String nonce,
                                @RequestParam("echostr") String echostr) throws AesException {
        log.info("signature:{},timestamp{},nonce:{},echostr:{}", signature, timestamp, nonce, echostr);
        String[] params = new String[]{token, timestamp, nonce};
        Arrays.sort(params);
        StringBuilder sb = new StringBuilder();
        for (String param : params) {
            sb.append(param);
        }

        String checkSignature = getSHA1(sb.toString());
        if (checkSignature.equals(signature)) {
            log.info("校验成功");
            return echostr; // 确认请求来自微信服务器
        } else {
            log.info("校验失败");
            return "error";
        }
    }

    private static String getSHA1(String str) {
        try {
            MessageDigest md = MessageDigest.getInstance("SHA-1");
            md.update(str.getBytes());
            byte[] bytes = md.digest();

            StringBuilder hexStr = new StringBuilder();
            for (byte b : bytes) {
                String shaHex = Integer.toHexString(b & 0xFF);
                if (shaHex.length() < 2) {
                    hexStr.append(0);
                }
                hexStr.append(shaHex);
            }
            return hexStr.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }

}

第二部编写自动回复的代码

这里我只看了文本

   @PostMapping("/xxxx")//和get验证请求相同的path只不过请求方式变了
    public String receiveMessage(@RequestBody String requestBody,
                                                 @RequestParam("signature") String signature,
                                                 @RequestParam("timestamp") String timestamp,
                                                 @RequestParam("nonce") String nonce,
                                                 @RequestParam("openid") String openid,
                                                 @RequestParam(name = "encrypt_type", required = false) String encryptType,
                                                 @RequestParam(name = "msg_signature", required = false) String msgSignature) throws Exception{
        // 记录接收到的消息和参数
        log.info("Received message with requestBody: {}, signature: {}, timestamp: {}, nonce: {}, openid: {}, encryptType: {}, msgSignature: {}",
                requestBody, signature, timestamp, nonce, openid, encryptType, msgSignature);
//        WXBizMsgCrypt wxBizMsgCrypt = new WXBizMsgCrypt(token, encodingAesKey, appid);
//        String decryptedMessage = "";
//
//        if ("aes".equals(encryptType)) {
//            decryptedMessage = wxBizMsgCrypt.decryptMsg(msgSignature, timestamp, nonce, requestBody);
//            log.info("解密后的消息是:{}", decryptedMessage);
//        } else {
//            decryptedMessage = requestBody;  // 非加密模式,直接使用请求体
//        }
//
//        // 从解密后的消息中解析出 FromUserName 和 ToUserName
//        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
//        DocumentBuilder db = dbf.newDocumentBuilder();
//        Document doc = db.parse(new InputSource(new StringReader(decryptedMessage)));
//        String fromUserName = doc.getElementsByTagName("FromUserName").item(0).getTextContent();
//        String toUserName = doc.getElementsByTagName("ToUserName").item(0).getTextContent();
//        String userMessage = doc.getElementsByTagName("Content").item(0).getTextContent(); // 用户发送的内容
//        log.info("fromUserName:{},toUserName:{},userMessage:{}",fromUserName,toUserName,userMessage);
//        String response = TYQWUtils.callWithMessage(userMessage);
//
//
//        // 解析XML、处理消息并构建响应消息
//        String responseContent = "Hello, this is a response";
//
//
//        log.info("调用通义千问的结果:{}", response);
//
//        //这里解析通义千问的结果
//        Pattern pattern = Pattern.compile("content=([^,]+),");
//        Matcher matcher = pattern.matcher(response);
//        //matcher.find()必须要留
//        if (matcher.find()) {
//            System.out.println("匹配: " + matcher.group(1));
//            responseContent= matcher.group(1);
//        } else {
//            System.out.println("不匹配");
//        }
//
//
//        String responseXml = "<xml>" +
//                "<ToUserName><![CDATA[" + fromUserName + "]]></ToUserName>" +  // 发送到原消息的发送者
//                "<FromUserName><![CDATA[" + toUserName + "]]></FromUserName>" +  // 您的公众号
//                "<CreateTime>" + System.currentTimeMillis() / 1000 + "</CreateTime>" +
//                "<MsgType><![CDATA[text]]></MsgType>" +
//                "<Content><![CDATA[" + responseContent + "]]></Content>" +
//                "</xml>";
//
//        // 加密响应消息
//        if ("aes".equals(encryptType)) {
//            String encryptedResponse = wxBizMsgCrypt.encryptMsg(responseXml, timestamp, nonce);
//            log.info("返回的加密内容是:{}", encryptedResponse);
//            return encryptedResponse;
//        } else {
//            return responseXml;  // 非加密模式,直接返回
//        }

如果用上面这种回复方式  时间不能超过5秒  微信会连续3次   超过5秒就会断开连接

因此调用大模型回答的话建议是用异步客服消息方式   这也是官方给出的合理方式

关于这个加解密文档

关于加密文档   里面明确了Base64需要覆盖原先的   要用 1.8或者1.9

因为这里我调用了通义千问测试

引入通义千问依赖时候  发生了两种日志依赖冲突的问题

通义千问依赖中  和SpringBoot web依赖里的日志依赖冲突  需要排除下

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

根据蛋白质序列,计算其分子量(molecular weight),在线工具,原理和python代码

蛋白质分子量 蛋白质是由许多氨基酸残基通过肽键&#xff08;一个氨基酸的 α-羧基与另一个氨基酸的 α-氨基脱水缩合形成的化学键&#xff09;连接而成。蛋白质的分子量&#xff08;molecular weight&#xff09;为各个氨基酸的分子量之和&#xff0c;是蛋白质的重要理化参数…

sqli-labs靶场第十四关

目录 1&#xff1a;分析 找闭合符&#xff1a; 2&#xff1a;开始注入 报错注入&#xff1a; 注入数据库名&#xff1a; 注入表名&#xff1a; 注入列名&#xff1a; 注入具体值&#xff1a; 1&#xff1a;分析 经过我们的实验发现当我们输入的密码后面存在双引号时会报…

[数据结构]动画详解单链表

&#x1f496;&#x1f496;&#x1f496;欢迎来到我的博客&#xff0c;我是anmory&#x1f496;&#x1f496;&#x1f496; 又和大家见面了 欢迎来到动画详解数据结构系列 用通俗易懂的动画的动画使数据结构可视化 先来自我推荐一波 个人网站欢迎访问以及捐款 推荐阅读 如何低…

数据分析的统计推断

数据分析的统计推断 前言一、提出问题二、统计归纳方法三、统计推断四、统计推断步骤如何进行统计推断统计推断的基本问题点估计区间估计总体方差已知总体方差未知 假设检验假设检验的假设显著性水平 五、检验统计量常见的检验统计量 六、检验方法七、拒绝域八、假设检验步骤九…

嵌入式C语言高级教程:实现基于STM32的环境监测系统

⬇帮大家整理了单片机的资料 包括stm32的项目合集【源码开发文档】 点击下方蓝字即可领取&#xff0c;感谢支持&#xff01;⬇ 点击领取更多嵌入式详细资料 问题讨论&#xff0c;stm32的资料领取可以私信&#xff01; 环境监测系统通过实时收集和分析环境数据&#xff0c;如温度…

外观模式详解

外观模式 1 概述 有些人可能炒过股票&#xff0c;但其实大部分人都不太懂&#xff0c;这种没有足够了解证券知识的情况下做股票是很容易亏钱的&#xff0c;刚开始炒股肯定都会想&#xff0c;如果有个懂行的帮帮手就好&#xff0c;其实基金就是个好帮手&#xff0c;支付宝里就…

【STM32+HAL+Proteus】系列学习教程---中断(NVIC、EXTI、按键)

实现目标 1、掌握STM32的中断知识 2、学会STM32CubeMX软件关于中断的配置 3、具体目标&#xff1a;1、外部中断检测按键&#xff0c;每按一次计一次数&#xff0c;满5次LED1状态取反。 一、中断概述 1.1、中断定义 CPU执行程序时&#xff0c;由于发生了某种随机的事件(包括…

weblogic 任意文件上传 CVE-2018-2894

一、漏洞简介 在 Weblogic Web Service Test Page 中存在一处任意文件上传漏洞&#xff0c; Web Service Test Page 在"生产模式"下默认不开启&#xff0c;所以该漏洞有一定限制。利用该 漏洞&#xff0c;可以上传任意 jsp 文件&#xff0c;进而获取服务器权限。 二…

【WebGPU】WebGPU 中的反应扩散计算着色器

在本教程中&#xff0c;我们将使用 WebGPU 技术中的计算着色器实现图像效果。更多精彩内容尽在数字孪生平台。 程序结构 主要构建两个 WebGPU 管道&#xff1a; 运行反应扩散算法多次迭代的计算管道&#xff08;js/rd-compute.js 和 js/shader/rd-compute-shader.js&#xff…

java项目之汽车资讯网站源码(springboot+mysql+vue)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的汽车资讯网站。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 汽车资讯网站的主要使用者管…

小学拼音弄一下

import re from xpinyin import Pinyindef remove_middle_characters(text):# 仅保留汉字chinese_chars re.findall(r[\u4e00-\u9fff], text)cleaned_text .join(chinese_chars)# 如果字符数为偶数&#xff0c;则在中间添加空格if len(cleaned_text) % 2 0:middle_index le…

maven找不到依赖,in offline mode

问题描述&#xff1a; [ERROR] Plugin org.jetbrains.kotlin:kotlin-maven-plugin:1.2.71 or one of its dependencies could not be resolved: Failed to read artifact descriptor for org.jetbrains.kotlin:kotlin-maven-plugin:jar:1.2.71: Cannot access aliyunmaven (ht…

JVM从1%到99%【精选】-类加载子系统

目录 1.类的生命周期 1.加载 2.连接 3.初始化 2.类的加载器 1.类加载器的分类 2.双亲委派机制 3.面试题&#xff1a;类的双亲委派机制是什么&#xff1f; 4.打破双亲委派机制 1.类的生命周期 类加载过程&#xff1a;加载、链接&#xff08;验证、准备、解析&a…

VMware Workstation 16 Pro安装教程

文章目录 1、下载2、安装 1、下载 复制到迅雷下载&#xff1a;https://download3.vmware.com/software/wkst/file/VMware-workstation-full-16.0.0-16894299.exe 2、安装 秘钥&#xff1a; ZF3R0-FHED2-M80TY-8QYGC-NPKYF YF390-0HF8P-M81RQ-2DXQE-M2UT6 ZF71R-DMX85-08DQY-…

易图讯科技三维电子沙盘系统

深圳易图讯科技有限公司&#xff08;www.3dgis.top&#xff09;创立于2013年&#xff0c;专注二三维地理信息、三维电子沙盘、电子地图、虚拟现实、大数据、物联网和人工智能技术研发&#xff0c;获得20多项软件著作权和软件检测报告&#xff0c;成功交付并实施了1000多个项目&…

商业数据分析--时间序列图及趋势分析

绘制时间序列图,并指出存在什么样的状态如上两图: 可见状态:从时间序列图可以看出,这些数据存在明显的季节性波动,每年的第4季度值都最高,而第2季度值最低。同时也存在一些下降的趋势。 通过引进虚拟变量,建立多元线性回归模型。答: 通过引入虚拟变量,我们可以建立如下的…

【初级数据结构】队列

目录 前言队列的概念及结构队列的实现队列的结构队列的初始化队列的销毁入队出队取队头元素取队尾元素判断队列是否为空取出队列中元素个数代码测试 完整代码Queue.hQueue.ctest.c 前言 前面我们已经学习了栈&#xff0c;栈是一种后进先出的结构&#xff0c;即LIFO&#xff0c;…

22、Flink 背压下的 Checkpoint处理

1.概述 通常&#xff0c;对齐 Checkpoint 的时长主要受 Checkpointing 过程中的同步和异步两个部分的影响&#xff1b;但当 Flink 作业正运行在严重的背压下时&#xff0c;Checkpoint 端到端延迟的主要影响因子将会是传递 Checkpoint Barrier 到 所有的算子/子任务的时间&…

乡村振兴与农村基础设施建设:加大农村基础设施建设投入,提升农村公共服务水平,改善农民生产生活条件,构建宜居宜业的美丽乡村

一、引言 乡村振兴是我国现代化进程中的重要战略&#xff0c;而农村基础设施建设则是乡村振兴的基石。随着城市化进程的加快&#xff0c;农村基础设施建设滞后的问题日益凸显&#xff0c;成为制约乡村发展的瓶颈。因此&#xff0c;加大农村基础设施建设投入&#xff0c;提升农…

Docker需要代理下载镜像

systemctl status docker查看docker的状态和配置文件是/usr/lib/systemd/system/docker.service vi /usr/lib/systemd/system/docker.service&#xff0c; 增加如下配置项 [Service] Environment"HTTP_PROXYhttp://proxy.example.com:8080" "HTTPS_PROXYhttp:…