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

微信公众平台

配置自动回复的服务器

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.mzph.cn/pingmian/10788.shtml

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

相关文章

11个免费的 android数据恢复应用程序功能分析

在手机上丢失数据是一个很大的错误。但是&#xff0c;在这种情况下&#xff0c;除了惊慌失措之外&#xff0c;最好开始使用android数据恢复应用程序搜索以查找将其取回的方法。您可以检查手机的备份存储以在Android上进行数据恢复&#xff0c;但是如果数据仍然无处可寻&#xf…

@PostConstruct

PostConstruct initializeBean方法–> PostProcessor.postProcessMergedBeanDefinition --> InitDestroyAnnotationBeanPostProcessor.postProcessBeforeDestruction 被PostConstruct注解的方法会在Bean初始化的时候被调用&#xff0c;如下图&#xff1a; 继承关系如下…

jenkins连接ubuntu普通用户节点

1.创建credentials 2.创建node 3.在jenkins服务器还需要进行的操作&#xff08;jenkins服务器中&#xff09; mkdir /var/lib/jenkins/.ssh ssh-keyscan -H 192.168.110.204 >> /var/lib/jenkins/.ssh/known_hosts chown -R jenkins:jenkins /var/lib/jenkins/.ssh/ 4.…

相交链表(数据结构)

160. 相交链表 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/intersection-of-two-linked-lists/description/ 题目 解决思路 1&#xff0c;找到相交的点 相交链表的关键也就是找到相交的点&#xff0c;所以我们需要首先判断有没有相交的节点&#…

最新的云渲染100活动有哪些?渲染100邀请码1a12

随着科技的进步&#xff0c;云渲染已经成为设计行业的必备工具&#xff0c;各个云渲染平台为了吸引用户也推出各种各样的活动&#xff0c;今天我们以广受好评的渲染100为例&#xff0c;来说下它们的活动体系。 1、新用户活动 渲染100对新用户很友好&#xff0c;提供了充足的测…

K-RTD01和利时FW248中控卡件

K-RTD01和利时FW248中控卡件。 系统概述 的全称为保护工程师站及录波分析后台”是利用现代计算机和网络技术&#xff0c;K-RTD01和利时FW248中控卡件。实时收集变电站运行和故障信息&#xff0c;并通过对变电站的故障信息进行综合分析&#xff0c;K-RTD01和利时FW248中控卡件。…

Ps 滤镜:便条纸

Ps菜单&#xff1a;滤镜/滤镜库/素描/便条纸 Filter Gallery/Sketch/Note Paper 便条纸 Note Paper滤镜用于模拟手工纸张的质感和视觉效果。此滤镜将图像简化并添加浮雕和颗粒效果&#xff0c;使图像看起来像是在手工制作的纸上绘制或打印。 “便条纸”滤镜通过结合使用浮雕效果…

Copilot for Microsoft 365 扩充新增 16 种语言

最近&#xff0c;微软公司发布公告&#xff0c;进一步扩大 Copilot for Microsoft 365 语言支持&#xff0c;新增 16 种&#xff0c;支持的语言总数达到 25 种。 新支持的语言如下&#xff1a; 阿拉伯语 捷克语 丹麦语 荷兰语 芬兰语 希伯来语 匈牙利语 韩语 挪威语&am…

云动态摘要 2024-05-12

给您带来云厂商的最新动态&#xff0c;最新产品资讯和最新优惠更新。 最新优惠与活动 [免费试用]即刻畅享自研SaaS产品 腾讯云 2024-04-25 涵盖办公协同、营销拓客、上云安全保障、数据分析处理等多场景 云服务器ECS试用产品续用 阿里云 2024-04-14 云服务器ECS试用产品续用…

【解决】Android Studio Toast点击不显示

问题描述 开发Android程序过程中&#xff0c;突然发现在Android studio的模拟机上&#xff0c;运行测试程序&#xff0c;Toast弹框不能使用了&#xff0c;但是解决方法非常粗暴和直接&#xff1a;重新加载一个新的虚拟机或清空当前虚拟机的数据&#xff0c;然后再重启。 明显&a…

mysql临时表

临时表 MySQL 什么时候会使用内部临时表&#xff1f; 1、如果语句执行过程可以一边读数据&#xff0c;一边直接得到结果&#xff0c;是不需要额外内存的&#xff0c;否则就需要额外的内存&#xff0c;来保存中间结果&#xff1b; 2、join_buffer 是无序数组&#xff0c;sort_b…

重生奇迹mu战士攻略有哪些

1、生命之光&#xff1a;PK前起手式&#xff0c;增加血上限。 2、雷霆裂闪&#xff1a;眩晕住对手&#xff0c;战士PK战士第一技能&#xff0c;雷霆裂闪是否使用好关系到胜负。 3、霹雳回旋斩&#xff1a;雷霆裂闪后可以选择用霹雳回旋斩跑出一定范围(因为对手下一招没出意外…

指针的奥秘(四):回调函数+qsort使用+qsort模拟实现冒泡排序

指针 一.回调函数是什么&#xff1f;二.qsort函数使用1.qsort介绍2.qsort排序整型数据3.qsort排序结构体数据1.通过结构体中的整形成员排序2.通过结构体中的字符串成员排序 三.qsort模拟实现冒泡排序 一.回调函数是什么&#xff1f; 回调函数就是一个通过函数指针调用的函数。 …

You Only Cache Once:YOCO 基于Decoder-Decoder 的一个新的大语言模型架构

这是微软再5月刚刚发布的一篇论文提出了一种解码器-解码器架构YOCO&#xff0c;因为只缓存一次KV对&#xff0c;所以可以大量的节省内存。 以前的模型都是通过缓存先前计算的键/值向量&#xff0c;可以在当前生成步骤中重用它们。键值(KV)缓存避免了对每个词元再次编码的过程&…

全学科知网普刊征稿中!即日提交,月内即可见刊!

在当前的学术环境下&#xff0c;论文发表的压力日益增大。当您需要评职称、申请学位、结项课题或完成其他有期限的学术要求时&#xff0c;快速发表普刊能够确保您及时满足这些需求&#xff0c;提升您的职业竞争力&#xff0c;为您的职业发展需求打下坚实基础。 我处普刊现积极…

我的全新官网

科技语者-探索未来的语言和沟通 (chgskj.cn) 另外我还开放了一个网站科技语者-介绍页 (null.fit)

Java反射(含静态代理模式、动态代理模式、类加载器以及JavaBean相关内容)

目录 1、什么是反射 2、Class类 3、通过Class类取得类信息/调用属性或方法 4、静态代理和动态代理 5.类加载器原理分析 6、JavaBean 1、什么是反射 Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息&#xff0c;从而操作类或对象的属性和方法。本质是JVM得…

java基础之面向对象的思想

一、面向对象和面向过程的编程思想对比 面向过程&#xff1a;是一种以过程为中心的编程思想&#xff0c;实现功能的每一步&#xff0c;都是自己实现的&#xff08;自己干活&#xff09;。 面向对象&#xff1a;是一种以对象为中心的编程思想&#xff0c;通过指挥对象实现具体的…

智慧生活:AI工具如何改变我们的工作与生活

文章目录 &#x1f4d1;前言一、常用AI工具&#xff1a;便利与高效的结合1.1 语音助手1.2 智能推荐系统1.3 自然语言处理工具 二、创新AI应用&#xff1a;不断突破与发展2.1 医疗诊断AI2.2 智能家居2.3 无人驾驶技术 三、AI工具在人们生活中的应用和影响3.1 生活方式的变化3.2 …

搭建本地yum仓库

步骤 找个地方存你的rpm包 #我创建了一个rpm文件夹存放我的rpm包 makdir -p /opt/repo/rpmcreaterepo 这个很重要&#xff0c;一定要安装 # 我的能连外网&#xff0c;所以直接yum安装&#xff0c;你的自己想办法 yum install createrepo -y创建repodata 安装了createrepo后…