微信公众号接入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.hqwc.cn/news/692007.html

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

相关文章

从0开始学python(七)

目录 前言 1 break、continue和pass函数 1.1 break 1.2 continue 1.3 pass 2、序列的索引及切片操作 2.1字符串的索引和切片 2.1.1 字符串索引 2.1.2 字符串切片 总结 前言 上一篇文章我们介绍了python中的循环结构&#xff0c;包括for和while的使用。本章接着往下讲。…

【Go语言初探】(一)、Linux开发环境建立

一、操作系统选择 选择在Windows 11主机上运行的CentOS 7 Linux 虚拟机&#xff0c;虚拟化平台为VMWare Workstation. 二、安装Go语言环境 访问Go语言官网&#xff0c;选择Linux版本下载&#xff1a; 解压&#xff1a; tar -xvf go1.22.3.linux-amd64.tar.gz检验安装结果&…

基于JAVA的微信小程序二手车交易平台(源码)

博主介绍&#xff1a;✌程序员徐师兄、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Deckset for Mac:让演示文稿制作更轻松

还在为繁琐的演示文稿制作而烦恼吗&#xff1f;Deckset for Mac来帮您解决&#xff01;它支持Markdown语言&#xff0c;让您只需专注于内容的创作&#xff0c;无需在排版和设计上耗费过多精力。丰富的主题和布局选项&#xff0c;让您能够轻松打造出专业级的演示文稿。快来体验D…

YOLOv8_seg预测流程-原理解析[实例分割理论篇]

YOLOv8_seg的网络结构图在博客YOLOv8网络结构介绍已经更新了,由网络结构图可以看到相对于目标检测网络,实例分割网络只是在Head层不相同,如下图所示,在每个特征层中增加了Mask层(浅紫色),这和同一层的Box,cls的shape大小一样;另外还利用8080尺度的特征图,经过卷积+上…

windows系统安装Ubuntu子系统

安装前先在 控制面板 中打开 程序与功能选项 &#xff0c;点击 启用或关闭Windows功能&#xff1a; 勾选 适用于 Linux的Windows子系统 和 虚拟机平台 、 Hyper-v 。 重启电脑后再 Microsoft Store Windows应用商店 中下载合适的Ubuntu版本。 运行Ubuntu程序&#xff0c;如出现…

OpenHarmony 实战开发——轻量带屏解决方案之恒玄芯片移植案例

本文章基于恒玄科技BES2600W芯片的欧智通 Multi-modal V200Z-R开发板 &#xff0c;进行轻量带屏开发板的标准移植&#xff0c;开发了智能开关面板样例&#xff0c;同时实现了ace_engine_lite、arkui_ui_lite、aafwk_lite、appexecfwk_lite、HDF等部件基于OpenHarmony LiteOS-M内…

SOA构架介绍

1.SOA定义 SOA面向服务的架构是一种计算机环境设计、开发、部署和管理离散模型的方法&#xff0c;SOA中所有的功能都被定义成立独立的服务&#xff0c;所有的服务通过总线&#xff08;ESB)或者流程管理连接。这种松耦合的结构使得服务器在交互的过程中无需考虑双方内部细节&am…

【Linux】动态库与静态库的底层比较

送给大家一句话&#xff1a; 人生最遗憾的&#xff0c;莫过于&#xff0c;轻易地放弃了不该放弃的&#xff0c;固执地坚持了不该坚持的。 – 柏拉图 (x(x_(x_x(O_o)x_x)_x)x) (x(x_(x_x(O_o)x_x)_x)x) (x(x_(x_x(O_o)x_x)_x)x) 底层比较 1 前言2 编译使用比较2 如何加载Than…

51基于单片机的温室大棚系统设计

设计摘要&#xff1a; 本设计旨在基于51单片机和蓝牙技术&#xff0c;实现一个功能完善的温室大棚系统。该系统具备以下主要功能&#xff1a;首先&#xff0c;通过连接的显示屏能够实时地显示当前的温度和湿度信息&#xff0c;方便用户了解温室内的环境变化。其次&#xff0c;…

java项目之校园失物招领系统(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的校园失物招领系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 校园失物招领系统的主要…

【Linux】-Linux的实用操作:快捷键与软件安装操作、构建软连接、日期时区的设置[4]

目录 一、各类小技巧&#xff08;快捷键&#xff09; 1、ctrl c 强制停止 2、ctrl d 退出或登出 3、历史命令搜索 4、光标移动快捷键 5、清屏 二、软件安装 1、yum命令 2、apt命令 - 扩展&#xff08;ubuntu&#xff09; 三、systemctl命令 四、软连接 1、ln命令…