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