From e941c939dad5de9e904a4a33bc41c8d3297ff93a Mon Sep 17 00:00:00 2001
From: qfrjava <13402782+qfrjava@user.noreply.gitee.com>
Date: 星期二, 04 三月 2025 18:25:02 +0800
Subject: [PATCH] feat(weixin): 实现微信接口的二次回复功能

---
 JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/vo/MediaVo.java                 |   23 ++++
 JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/control/SMTAIWeixinControl.java |  164 ++++++++++++++++++++++++++++++--
 JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/vo/Item.java                    |    8 +
 JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/vo/WechatMessageVO.java         |   66 +++++++++++++
 JAVA/SMTAIServer/src/main/resources/requestmap/weixin.json                                 |    6 
 5 files changed, 253 insertions(+), 14 deletions(-)

diff --git a/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/control/SMTAIWeixinControl.java b/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/control/SMTAIWeixinControl.java
index 7b212bd..4f95192 100644
--- a/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/control/SMTAIWeixinControl.java
+++ b/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/control/SMTAIWeixinControl.java
@@ -1,18 +1,41 @@
 package com.smtaiserver.smtaiserver.control;
 
 import com.smtaiserver.smtaiserver.core.SMTAIServerApp;
+import com.smtaiserver.smtaiserver.vo.MediaVo;
+import com.smtaiserver.smtaiserver.vo.WechatMessageVO;
 import com.smtservlet.core.SMTRequest;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
 import org.springframework.boot.configurationprocessor.json.JSONObject;
-import org.springframework.stereotype.Component;
+import org.springframework.http.HttpEntity;
+import org.springframework.web.servlet.ModelAndView;
 
+import javax.servlet.ServletInputStream;
 import javax.servlet.http.HttpServletRequest;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+import java.io.IOException;
+import java.io.StringWriter;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 import static java.util.Arrays.sort;
+
 public class SMTAIWeixinControl {
+  private static final String FROM_USER_NAME = "FromUserName";
+  private static final String TO_USER_NAME = "ToUserName";
+  private static final String CONTENT = "Content";
+  private final String accessToken =
+      "89_ME-53TIn8zHs2mctB9zG6_RGFQ6DhuxD7wIwgUbwD6eiOTsE0wwLOUDLlO68LHl"
+          + "M-Wqts32zr6VT83XGAJr3vQ-Dphauq4u5f5PxpXRFcoGNtzWhjM9PTIMpXboXTYdABAQMR";
 
   private static Logger _logger = LogManager.getLogger(SMTAIServerControl.class);
 
@@ -20,17 +43,135 @@
    * 寰俊楠岃瘉
    *
    * @param tranReq
-   * @param request
    * @return
    * @throws Exception
    */
-  public String weChatVerification(SMTRequest tranReq, HttpServletRequest request) throws Exception {
-    _logger.info(tranReq);
+  public ModelAndView weChatNotify(SMTRequest tranReq) throws Exception {
+    String method = tranReq.getRequest().getMethod();
+    if (method.equals("GET")) return getModelAndView(tranReq);
+    return reply(tranReq);
+  }
+
+  private ModelAndView reply(SMTRequest tranReq) throws Exception {
+    HttpServletRequest request = tranReq.getRequest();
+    Map<String, String> requestMap = getWechatReqMap(request);
+    if (requestMap.isEmpty()) {
+      return null;
+    }
+
+    String reqContent = requestMap.get(CONTENT);
+    WechatMessageVO wechatMessage = new WechatMessageVO();
+    wechatMessage.setFromUserName(requestMap.get(TO_USER_NAME));
+    wechatMessage.setToUserName(requestMap.get(FROM_USER_NAME));
+    if (reqContent.equals("鏂囧瓧")) {
+      wechatMessage.setMsgType("text"); // 璁剧疆涓烘枃鏈秷鎭�
+    } else if (reqContent.equals("鍥剧墖")) {
+      wechatMessage.setMsgType("image"); // 璁剧疆涓哄浘鐗囨秷鎭�
+    } else if (reqContent.equals("璇煶")) {
+      wechatMessage.setMsgType("voice"); // 璁剧疆涓鸿闊虫秷鎭�
+    } else if (reqContent.equals("瑙嗛")) {
+      wechatMessage.setMsgType("video"); // 璁剧疆涓鸿棰戞秷鎭�
+    } else if (reqContent.equals("闊充箰")) {
+      wechatMessage.setMsgType("music"); // 璁剧疆涓洪煶涔愭秷鎭�
+    } else if (reqContent.equals("鍥炬枃")) {
+      wechatMessage.setMsgType("news"); // 璁剧疆涓哄浘鏂囨秷鎭�
+    } else {
+      wechatMessage.setMsgType("text"); // 榛樿璁剧疆涓烘枃鏈秷鎭�
+    }
+    wechatMessage.setCreateTime(System.currentTimeMillis() / 1000);
+    MediaVo media = new MediaVo();
+    if (reqContent.equals("鏂囧瓧")) {
+      wechatMessage.setContent("鎴戞鍦ㄦ�濊�冨摝~璇风◢绛夆�︹��");
+      aiReplyToTheUserASecondTime(tranReq, requestMap.get(FROM_USER_NAME));
+    } else if (reqContent.equals("鍥剧墖")) {
+      media.setMediaId("SI7HPwMI5PL1QV_I9M5AFw6K-1ZVMyTGE0-a5jQM4czTmffKTQpHa6zlYDmvIAPX");
+      wechatMessage.setImage(media);
+    } else if (reqContent.equals("璇煶")) {
+      media.setMediaId("c6hRH_X2HGwrOa1MiTQAcg35D7M42Xa4VMhyzSFMk8MA0pWFhly19W4K3W5NaH4b");
+      wechatMessage.setVoice(media);
+    } else if (reqContent.equals("瑙嗛")) {
+      media.setMediaId("c6hRH_X2HGwrOa1MiTQAcmo7zQjGAIV7uSP1U1S-tsnR0VJXUS0y10Z5FkaueU5Y");
+      media.setTitle("浣犲ソ");
+      media.setDescription("浣犲ソ鍟�");
+      wechatMessage.setVideo(media);
+    } else if (reqContent.equals("闊充箰")) {
+      System.out.println("杩涘叆闊充箰鍒嗘敮");
+    } else if (reqContent.equals("鍥炬枃")) {
+      System.out.println("杩涘叆鍥炬枃鍒嗘敮");
+    } else {
+      System.out.println("杩涘叆榛樿鍒嗘敮");
+      wechatMessage.setContent("鎴戜笉澶璇嗕綘鐨勮緭鍏ュ摝");
+    }
+    try {
+      // 鍒涘缓JAXBContext瀹炰緥
+      JAXBContext jaxbContext = JAXBContext.newInstance(WechatMessageVO.class);
+      // 鍒涘缓Marshaller瀹炰緥
+      Marshaller marshaller = jaxbContext.createMarshaller();
+      // 璁剧疆Marshaller鐨勫睘鎬э紝渚嬪缂╄繘
+      marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
+      // 灏哢ser瀵硅薄杞崲涓篨ML骞跺啓鍏tringWriter
+      StringWriter sw = new StringWriter();
+      marshaller.marshal(wechatMessage, sw);
+      _logger.info("寰俊娑堟伅杩斿弬锛�" + sw);
+      // 杩斿洖XML瀛楃涓�
+      return tranReq.returnText(sw.toString());
+    } catch (JAXBException e) {
+      throw new RuntimeException(e);
+    }
+  }
+
+  /**
+   * 浜屾鍥炲
+   *
+   * @param tranReq
+   * @return
+   * @throws Exception
+   */
+  private ModelAndView aiReplyToTheUserASecondTime(SMTRequest tranReq, String fromUserName)
+      throws Exception {
+    JSONObject jsonObject = new JSONObject();
+    jsonObject.put("touser", "oKAHz7LQhyL2IkcMpl8B7K4OotQk");
+    jsonObject.put("msgtype", "text");
+    JSONObject jsonObject1 = new JSONObject();
+    jsonObject1.put("content", "浣犲ソ鍟�");
+    jsonObject.put("text", jsonObject1);
+    _logger.info("jsonObject: {}", jsonObject);
+    // 鏋勫缓涓婁紶 URL
+    String url =
+        String.format(
+            "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=%s", accessToken);
+    //    String s = httpsRequest(url, jsonObject.toString());
+    //    log.info("涓婁紶缁撴灉: {}", s);
+    return null;
+  }
+
+  public static Map<String, String> getWechatReqMap(HttpServletRequest request) {
+    Map<String, String> requestMap = new HashMap<>();
+    SAXReader reader = new SAXReader();
+    try (ServletInputStream inputStream = request.getInputStream()) {
+      Document document = reader.read(inputStream);
+      // 寰楀埌xml鏍瑰厓绱�
+      Element root = document.getRootElement();
+      // 寰楀埌鏍瑰厓绱犵殑鎵�鏈夊瓙鑺傜偣
+
+      List<Element> elementList = root.elements();
+
+      // 閬嶅巻鎵�鏈夊瓙鑺傜偣
+      for (Element e : elementList) {
+        requestMap.put(e.getName(), e.getText());
+      }
+    } catch (IOException | DocumentException e) {
+      throw new RuntimeException(e);
+    }
+    return requestMap;
+  }
+
+  private static ModelAndView getModelAndView(SMTRequest tranReq) throws Exception {
+    String signature = tranReq.convParamToString("signature", true);
+    String timestamp = tranReq.convParamToString("timestamp", true);
+    String nonce = tranReq.convParamToString("nonce", true);
+    String echostr = tranReq.convParamToString("echostr", true);
     // 鑾峰彇寰俊璇锋眰鍙傛暟
-    String signature = request.getParameter("signature");
-    String timestamp = request.getParameter("timestamp");
-    String nonce = request.getParameter("nonce");
-    String echostr = request.getParameter("echostr");
     _logger.info(
         "寮�濮嬫牎楠屾娆℃秷鎭槸鍚︽潵鑷井淇℃湇鍔″櫒锛宲aram->signature:{},\ntimestamp:{},\nnonce:{},\nechostr:{}",
         signature,
@@ -39,9 +180,9 @@
         echostr);
     // 闇�瑕侀獙璇佺殑鏃跺�欏氨鍚敤
     if (checkSignature(signature, timestamp, nonce)) {
-      return echostr;
+      return tranReq.returnText(echostr);
     }
-    return "";
+    return tranReq.returnText("");
   }
 
   /**
@@ -55,7 +196,8 @@
   public static boolean checkSignature(String signature, String timestamp, String nonce)
       throws Exception {
     Object weixinParam = SMTAIServerApp.getApp().getGlobalConfig("weixin_core_param", "false");
-    JSONObject weixinJson = (JSONObject) weixinParam;
+    _logger.info("寰俊鍙傛暟锛歿}", weixinParam);
+    JSONObject weixinJson = new JSONObject(weixinParam.toString());
     Object appId = weixinJson.get("appId");
     Object secret = weixinJson.get("secret");
     String token = (String) weixinJson.get("token");
diff --git a/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/vo/Item.java b/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/vo/Item.java
new file mode 100644
index 0000000..6f70602
--- /dev/null
+++ b/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/vo/Item.java
@@ -0,0 +1,8 @@
+package com.smtaiserver.smtaiserver.vo;
+
+public class Item {
+    private String title;
+    private String description;
+    private String picUrl;
+    private String url;
+}
diff --git a/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/vo/MediaVo.java b/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/vo/MediaVo.java
new file mode 100644
index 0000000..501a8a9
--- /dev/null
+++ b/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/vo/MediaVo.java
@@ -0,0 +1,23 @@
+package com.smtaiserver.smtaiserver.vo;
+
+import javax.xml.bind.annotation.XmlElement;
+import lombok.Setter;
+
+@Setter
+public class MediaVo {
+    @XmlElement(name = "MediaId")
+    private String mediaId;
+    @XmlElement(name = "item")
+    private Item item;
+    @XmlElement(name = "Title")
+    private String title;
+    @XmlElement(name = "Description")
+    private String description;
+    @XmlElement(name = "MusicUrl")
+    private String musicUrl;
+    @XmlElement(name = "HQMusicUrl")
+    private String hQMusicUrl;
+    @XmlElement(name = "ThumbMediaId")
+    private String thumbMediaId;
+
+}
diff --git a/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/vo/WechatMessageVO.java b/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/vo/WechatMessageVO.java
new file mode 100644
index 0000000..77ab0f4
--- /dev/null
+++ b/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/vo/WechatMessageVO.java
@@ -0,0 +1,66 @@
+package com.smtaiserver.smtaiserver.vo;
+
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import lombok.Setter;
+
+@Setter
+@XmlRootElement(name = "xml")
+public class WechatMessageVO {
+
+    /**
+     * 鎺ユ敹鏂瑰笎鍙凤紙鏀跺埌鐨凮penID锛�
+     */
+    @XmlElement(name = "ToUserName")
+    private String toUserName;
+    /**
+     * 寮�鍙戣�呭井淇″彿
+     */
+    @XmlElement(name = "FromUserName")
+    private String fromUserName;
+    /**
+     * 娑堟伅鍒涘缓鏃堕棿 锛堟暣鍨嬶級
+     */
+    @XmlElement(name = "CreateTime")
+    private long createTime;
+
+    /**
+     * 娑堟伅绫诲瀷
+     */
+    @XmlElement(name = "MsgType")
+    private String msgType;
+
+    /**
+     * 娑堟伅绫诲瀷
+     */
+    @XmlElement(name = "Content")
+    private String content;
+
+    /**
+     * 鍥剧墖娑堟伅
+     */
+    @XmlElement(name = "Image")
+    private MediaVo image;
+    /**
+     * 闊抽
+     */
+    @XmlElement(name = "Voice")
+    private MediaVo voice;
+    /**
+     * 瑙嗛
+     */
+    @XmlElement(name = "Video")
+    private MediaVo video;
+    /**
+     * 闊充箰
+     */
+    @XmlElement(name = "Music")
+    private MediaVo music;
+    /**
+     * 鍥炬枃
+     */
+    @XmlElement(name = "Articles")
+    private MediaVo articles;
+}
+
diff --git a/JAVA/SMTAIServer/src/main/resources/requestmap/weixin.json b/JAVA/SMTAIServer/src/main/resources/requestmap/weixin.json
index 4f30c97..d529fa2 100644
--- a/JAVA/SMTAIServer/src/main/resources/requestmap/weixin.json
+++ b/JAVA/SMTAIServer/src/main/resources/requestmap/weixin.json
@@ -1,10 +1,10 @@
 {
-  "weixin/we_chat_verification": {
+  "weixin/wechat_notify": {
     "map": {
       "class": "#SMTAIWeixinControl",
-      "method": "weChatVerification",
-      "no_shrio":true
+      "method": "weChatNotify"
     },
+    "no_shrio": true,
     "swaggers": [
       {
         "tags": [

--
Gitblit v1.9.3