From a7ae5db38611821cfa805556ed37065a256baefb Mon Sep 17 00:00:00 2001
From: 秦芳睿 <1425609123@qq.com>
Date: 星期二, 22 四月 2025 09:40:28 +0800
Subject: [PATCH] refactor(SMTAIServer): 注释掉未使用的微信测试相关代码

---
 JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/control/SMTAIWeixinControl.java |  603 +++++++++++++++++++++++++++---------------------------
 1 files changed, 303 insertions(+), 300 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 2a84b06..d368c4c 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,343 +1,346 @@
 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 com.smtaiserver.smtaiserver.core.SMTAIServerRequest;
+import com.smtaiserver.smtaiserver.database.SMTDatabase;
+import com.smtaiserver.smtaiserver.database.SMTDatabase.DBRecords;
+import com.smtaiserver.smtaiserver.javaai.SMTJavaAIChat;
+import com.smtaiserver.smtaiserver.util.SMTWXSStatic;
+import com.smtservlet.util.Json;
+import com.smtservlet.util.SMTJsonWriter;
+import com.smtservlet.util.SMTStatic;
+import java.util.*;
+import javax.servlet.http.HttpServletRequest;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
 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.JSONException;
-import org.springframework.boot.configurationprocessor.json.JSONObject;
+import org.jetbrains.annotations.NotNull;
 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.OutputStream;
-import java.io.StringWriter;
-import java.net.HttpURLConnection;
-import java.net.URL;
-import java.nio.charset.StandardCharsets;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.CompletableFuture;
-
-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_pBAY9bgHt-7gBy2N8k_s31PMV3KFY1xgy_yCLw8eMHLqpugmHv2RXUgwf-2HC6bq5XPzVloiZp4ccnHDUfumjEOGxeFwFqIp8-gLU3OrPneiKgkv4l0mxd_orTAHNPgAJANTV";
 
-  private static Logger _logger = LogManager.getLogger(SMTAIServerControl.class);
+    private static final HashMap<String, String> asynchronousList = new HashMap<>();
+    private static final String FROM_USER_NAME = "FromUserName";
+    private static final String TO_USER_NAME = "ToUserName";
+    private static final String CONTENT = "Content";
+    private static final Logger _logger = LogManager.getLogger(SMTAIServerControl.class);
 
-  /** 寰俊楠岃瘉 */
-  public ModelAndView weChatNotify(SMTRequest tranReq) throws Exception {
-    String method = tranReq.getRequest().getMethod();
-    if (method.equals("GET")) return getModelAndView(tranReq);
-    return reply(tranReq);
-  }
+    private final Object _lockToken = new Object();
+
+    /**
+     * 寰俊楠岃瘉
+     */
+    public ModelAndView weChatNotify(SMTAIServerRequest tranReq) throws Exception {
+        String method = tranReq.getRequest().getMethod();
+        if (method.equals("GET")) return SMTWXSStatic.getModelAndView(tranReq);
+        return reply(tranReq);
+    }
 
   /** 琚姩鍥炲 */
-  private ModelAndView reply(SMTRequest tranReq) throws Exception {
+  private ModelAndView reply(SMTAIServerRequest tranReq) {
+
+    long l = System.currentTimeMillis() / 1000;
+    String createTimeStr = String.valueOf(l);
     HttpServletRequest request = tranReq.getRequest();
-    Map<String, String> requestMap = getWechatReqMap(request);
+    Map<String, String> requestMap = SMTWXSStatic.getWechatReqMap(request);
+    String fromUserName = requestMap.get(FROM_USER_NAME);
+    String toUserName = requestMap.get(TO_USER_NAME);
     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));
-    // 璁剧疆娑堟伅绫诲瀷
-    switch (reqContent) {
-      case "鏂囧瓧":
-        wechatMessage.setMsgType("text");
-        break;
-      case "鍥剧墖":
-        wechatMessage.setMsgType("image");
-        break;
-      case "璇煶":
-        wechatMessage.setMsgType("voice");
-        break;
-      case "瑙嗛":
-        wechatMessage.setMsgType("video");
-        break;
-      case "闊充箰":
-        wechatMessage.setMsgType("music");
-        break;
-      case "鍥炬枃":
-        wechatMessage.setMsgType("news");
-        break;
-      default:
-        wechatMessage.setMsgType("text");
-        break;
+    if (asynchronousList.get(fromUserName) != null && !reqContent.equals("鍋滄杈撳嚭")) {
+      String dissuadeReturn = dissuadeReturn(fromUserName, toUserName, createTimeStr);
+      return tranReq.returnText(dissuadeReturn);
+    }
+    UUID randomUuid = UUID.randomUUID();
+    asynchronousList.put(fromUserName, randomUuid.toString());
+    String reply;
+    reply = getReply(reqContent);
+    String textContent =
+        "鎴戞鍦ㄦ�濊�冨摝~璇风◢绛夆�︹�n<a href=\"weixin://bizmsgmenu?msgmenucontent=鍋滄杈撳嚭&msgmenuid=101\">鍋滄杈撳嚭</a>";
+    String baiduTextContent = "鎴戞槸鐧惧害\n<a href=\"www.baidu.com\">鐧惧害</a>";
+    String result =
+        getString(
+            fromUserName,
+            toUserName,
+            createTimeStr,
+            reply,
+            null,
+            "https://pics0.baidu.com/feed/d31b0ef41bd5ad6e9388c7f8d8eda0d4b6fd3c60.png@f_auto?token=3da8e06f44a46832a7d0f50fa9e92c34",
+            "鎬讳功璁板紩鐢ㄧ殑杩欎簺鍙よ鑰愪汉瀵诲懗",
+            "鈥滄病鏈夎鐭╋紝涓嶆垚鏂瑰渾鈥濄�佲�滃繁涓嶆锛岀剦鑳芥浜衡�濄�佲�滃敖灏忚�呭ぇ锛屾厧寰�呰憲鈥濃�︹�︽�讳功璁板紩鐢ㄧ殑杩欎簺鍙よ鑰愪汉瀵诲懗銆�",
+            "https://www.baidu.com/s?&wd=%E6%80%BB%E4%B9%A6%E8%AE%B0%E5%BC%95%E7%94%A8%E7%9A%84%E8%BF%99%E4%BA%9B%E5%8F%A4%E8%AF%AD%E8%80%90%E4%BA%BA%E5%AF%BB%E5%91%B3",
+            null);
+    if (reqContent.equals("鍋滄杈撳嚭")) {
+      asynchronousList.remove(fromUserName);
+      _logger.info("鐢ㄦ埛鍋滄杈撳嚭");
+      return null;
     }
 
-    wechatMessage.setCreateTime(System.currentTimeMillis() / 1000);
-    MediaVo media = new MediaVo();
-    
-  wechatMessage.setContent("鎴戞鍦ㄦ�濊�冨摝~璇风◢绛夆�︹��");
-  // 寮傛璋冪敤 aiReplyToTheUserASecondTime
-  CompletableFuture.runAsync(
-      () -> {
-        try {
-          //aiReplyToTheUserASecondTime(tranReq, requestMap.get(FROM_USER_NAME));
-        	String answer = callAIForAnswerQuestion(reqContent);
-        	
-        } catch (Exception e) {
-          e.printStackTrace();
-        }
-      });
-    
-    
-    // 璁剧疆娑堟伅鍐呭
-//    switch (reqContent) {
-//      case "鏂囧瓧":
-//        wechatMessage.setContent("鎴戞鍦ㄦ�濊�冨摝~璇风◢绛夆�︹��");
-//        // 寮傛璋冪敤 aiReplyToTheUserASecondTime
-//        CompletableFuture.runAsync(
-//            () -> {
-//              try {
-//                aiReplyToTheUserASecondTime(tranReq, requestMap.get(FROM_USER_NAME));
-//              } catch (Exception e) {
-//                e.printStackTrace();
-//              }
-//            });
-//        break;
-//      case "鍥剧墖":
-//        media.setMediaId("SI7HPwMI5PL1QV_I9M5AFw6K-1ZVMyTGE0-a5jQM4czTmffKTQpHa6zlYDmvIAPX");
-//        wechatMessage.setImage(media);
-//        break;
-//      case "璇煶":
-//        media.setMediaId("c6hRH_X2HGwrOa1MiTQAcg35D7M42Xa4VMhyzSFMk8MA0pWFhly19W4K3W5NaH4b");
-//        wechatMessage.setVoice(media);
-//        break;
-//      case "瑙嗛":
-//        media.setMediaId("c6hRH_X2HGwrOa1MiTQAcmo7zQjGAIV7uSP1U1S-tsnR0VJXUS0y10Z5FkaueU5Y");
-//        media.setTitle("浣犲ソ");
-//        media.setDescription("浣犲ソ鍟�");
-//        wechatMessage.setVideo(media);
-//        break;
-//      case "闊充箰":
-//        System.out.println("杩涘叆闊充箰鍒嗘敮");
-//        break;
-//      case "鍥炬枃":
-//        System.out.println("杩涘叆鍥炬枃鍒嗘敮");
-//        break;
-//      default:
-//        System.out.println("杩涘叆榛樿鍒嗘敮");
-//        wechatMessage.setContent("鎴戜笉澶璇嗕綘鐨勮緭鍏ュ摝");
-//        break;
-//    }
-
-    try {
-      // 灏� WechatMessageVO 瀵硅薄杞崲涓� XML
-      JAXBContext jaxbContext = JAXBContext.newInstance(WechatMessageVO.class);
-      Marshaller marshaller = jaxbContext.createMarshaller();
-      marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
-      StringWriter sw = new StringWriter();
-      marshaller.marshal(wechatMessage, sw);
-      _logger.info("寰俊娑堟伅杩斿弬锛�" + sw);
-      // 杩斿洖 XML 瀛楃涓�
-      return tranReq.returnText(sw.toString());
-    } catch (JAXBException e) {
-      throw new RuntimeException(e);
+        // 寮傛璋冪敤 aiReplyToTheUserASecondTime
+//    CompletableFuture.runAsync(
+//        () -> {
+//          try {
+//            SMTAIServerRequest threadTranReq = new SMTAIServerRequest();
+//            threadTranReq.initInstance(null, "", null);
+//            String answer = callAIForAnswerQuestion(reqContent, threadTranReq); // Ai璋冪敤 杩斿洖缁撴灉
+//            aiReplyToTheUserASecondTime(
+//                answer, requestMap.get(FROM_USER_NAME), randomUuid.toString());
+//          } catch (Exception e) {
+//            _logger.error("aiReplyToTheUserASecondTime error", e);
+//            asynchronousList.remove(request.getParameter("FromUserName"));
+//          }
+//        });
+        _logger.info("寰俊娑堟伅杩斿弬锛�" + result);
+        // 杩斿洖 XML 瀛楃涓�
+        return tranReq.returnText(result);
     }
-  }
-  
-  private String callAIForAnswerQuestion(String question)
-  {
-	  return "ssss";
-  }
 
-  /**
-   * 浜屾鍥炲
-   *
-   * @param tranReq
-   * @return
-   * @throws Exception
-   */
-  public ModelAndView aiReplyToTheUserASecondTime(SMTRequest tranReq, String fromUserName)
+//  public ModelAndView weChatTest(SMTAIServerRequest tranReq) throws Exception {
+//    String question = "鍐扮鏄粈涔�";
+//    tranReq.setAIQuestion(question);
+//    tranReq.setTextResultMode();
+//
+//    Set<String> setAgentGroup = new HashSet<>();
+//    String weixinGroupId =
+//        (String) SMTAIServerApp.getApp().getGlobalConfig("weixin.group_id", false);
+//    setAgentGroup.add(weixinGroupId);
+//
+//    SMTJavaAIChat.questionChat("aliyun", setAgentGroup, "涓氬姟鍦烘櫙", question, null, false, tranReq);
+//    String text = tranReq.getTextResult();
+//
+//    return tranReq.returnText(text);
+//  }
+
+  /** ai鍥炲 */
+//  private String callAIForAnswerQuestion(String question, SMTAIServerRequest tranReq)
+//      throws Exception {
+//    tranReq.setAIQuestion(question);
+//    tranReq.setTextResultMode();
+//
+//    Set<String> setAgentGroup = new HashSet<>();
+//    String weixinGroupId =
+//        (String) SMTAIServerApp.getApp().getGlobalConfig("weixin.group_id", false);
+//    setAgentGroup.add(weixinGroupId);
+//
+//    SMTJavaAIChat.questionChat("aliyun", setAgentGroup, "涓氬姟鍦烘櫙", question, null, false, tranReq);
+//    return tranReq.getTextResult();
+//  }
+
+  /** 浜屾鍥炲 */
+  public void aiReplyToTheUserASecondTime(String answer, String fromUserName, String abortID)
       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 accessToken = getAccessToken();
+    if (answer.isEmpty()) answer = "鎶辨瓑锛屾垜鏆傛椂鏃犳硶鐞嗚В鎮ㄧ殑闂銆�";
+    SMTJsonWriter jsonWr = new SMTJsonWriter(false);
+    jsonWr.addKeyValue("touser", fromUserName);
+    jsonWr.addKeyValue("msgtype", "text");
+    jsonWr.beginMap("text");
+    {
+      jsonWr.addKeyValue("content", answer);
+    }
+    jsonWr.endMap();
     String url =
         String.format(
             "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=%s", accessToken);
-    //    String body = HttpRequest.post(url).form(String.valueOf(jsonObject)).timeout(20000)//瓒呮椂锛屾绉�
-    //            .execute().body();
-    Map<String, Object> stringObjectMap = jsonObjectToMap(jsonObject);
-    String s = sendPost(url, stringObjectMap);
-    _logger.info("涓婁紶缁撴灉: {}", s);
-    return null;
-  }
-
-
-
-  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);
-    // 鑾峰彇寰俊璇锋眰鍙傛暟
-    _logger.info(
-        "寮�濮嬫牎楠屾娆℃秷鎭槸鍚︽潵鑷井淇℃湇鍔″櫒锛宲aram->signature:{},\ntimestamp:{},\nnonce:{},\nechostr:{}",
-        signature,
-        timestamp,
-        nonce,
-        echostr);
-    // 闇�瑕侀獙璇佺殑鏃跺�欏氨鍚敤
-    if (checkSignature(signature, timestamp, nonce)) {
-      return tranReq.returnText(echostr);
+    if (abortID.equals(asynchronousList.get(fromUserName))) {
+      String s = SMTWXSStatic.sendPost(url, jsonWr.getRootJson());
+      asynchronousList.remove(fromUserName);
+      _logger.info("涓婁紶缁撴灉: : " + s);
+    } else {
+      asynchronousList.remove(fromUserName);
+      _logger.info("寮傛璋冪敤琚彇娑�");
     }
-    return tranReq.returnText("");
   }
 
-  public static Map<String, Object> jsonObjectToMap(JSONObject jsonObject) throws JSONException {
-    Map<String, Object> map = new HashMap<>();
-    Iterator<String> keys = jsonObject.keys();
+  /** 鏁版嵁搴撹幏鍙� access_koen */
+  public String getAccessToken() throws Exception {
+    synchronized (this._lockToken) {
+      SMTDatabase db = SMTAIServerApp.getApp().allocDatabase();
+      //      try (SMTDatabase db = SMTAIServerApp.getApp().allocDatabase()) {
+      HashMap<String, String> weixinParam = SMTWXSStatic.getWeixinParam();
+      Date curTime = new Date();
+      String appId = weixinParam.get("appId");
 
-    while (keys.hasNext()) {
-      String key = keys.next();
-      Object value = jsonObject.get(key);
+      // 鏌ヨ鏈繃鏈熺殑 access_token
+      DBRecords dbRecord =
+          db.querySQL(
+              "SELECT app_id, access_token, expires_time "
+                  + "FROM ai_weixin_token "
+                  + "WHERE app_id = ? "
+                  + "  AND ? < expires_time",
+              new Object[] {appId, curTime});
 
-      // 濡傛灉鍊兼槸 JSONObject锛岄�掑綊杞崲涓� Map
-      if (value instanceof JSONObject) {
-        value = jsonObjectToMap((JSONObject) value);
+      // 鏁版嵁搴撴棤璁板綍锛屼粠寰俊鏈嶅姟鍣ㄨ幏鍙� access_token
+      List<SMTDatabase.DBRecord> records = dbRecord.getRecords();
+
+      if (dbRecord.getRowCount() > 0) {
+        return records.get(0).getString("access_token");
       }
+      // 寰俊鍙栵紝杩斿洖token骞朵笖淇濆瓨鎴栬鐩栨暟鎹�
+      else {
 
-      map.put(key, value);
-    }
+        Object[] accessToken = fetchAccessTokenFromWeixinServer(); // 浠庡井淇℃湇鍔″櫒鑾峰彇 access_token
 
-    return map;
-  }
+        Date expiresTime =
+            SMTStatic.calculateTime(
+                curTime, SMTStatic.SMTCalcTime.ADD_SECOND, ((int) accessToken[1]) / 2);
 
-  /**
-   * 楠岃瘉绛惧悕
-   *
-   * @param signature
-   * @param timestamp
-   * @param nonce
-   * @return
-   */
-  public static boolean checkSignature(String signature, String timestamp, String nonce)
-      throws Exception {
-    Object weixinParam = SMTAIServerApp.getApp().getGlobalConfig("weixin_core_param", "false");
-    _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");
-
-    String[] arr = new String[] {token, timestamp, nonce};
-    // 灏唗oken銆乼imestamp銆乶once涓変釜鍙傛暟杩涜瀛楀吀搴忔帓搴�
-    // Arrays.sort(arr);
-    sort(arr);
-    StringBuilder content = new StringBuilder();
-    for (String s : arr) {
-      content.append(s);
-    }
-    MessageDigest md = null;
-    String tmpStr = null;
-
-    try {
-      md = MessageDigest.getInstance("SHA-1");
-      // 灏嗕笁涓弬鏁板瓧绗︿覆鎷兼帴鎴愪竴涓瓧绗︿覆杩涜sha1鍔犲瘑
-      byte[] digest = md.digest(content.toString().getBytes());
-      tmpStr = byteToStr(digest);
-    } catch (NoSuchAlgorithmException e) {
-      _logger.error("绛惧悕寮傚父", e);
-    }
-    content = null;
-    // 灏唖ha1鍔犲瘑鍚庣殑瀛楃涓插彲涓巗ignature瀵规瘮锛屾爣璇嗚璇锋眰鏉ユ簮浜庡井淇�
-
-    return tmpStr != null && tmpStr.equals(signature.toUpperCase());
-  }
-  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);
-      Element root = document.getRootElement();
-      List<Element> elementList = root.elements();
-      for (Element e : elementList) {
-        requestMap.put(e.getName(), e.getText());
+        String sql =
+            "INSERT INTO ai_weixin_token (app_id, access_token, expires_time) "
+                + "VALUES (?, ?, ?) "
+                + "ON CONFLICT (app_id) "
+                + // 濡傛灉 app_id 鍐茬獊
+                "DO UPDATE SET "
+                + "    access_token = EXCLUDED.access_token, "
+                + "    expires_time = EXCLUDED.expires_time;";
+        db.executeSQL(sql, new Object[] {appId, accessToken[0], expiresTime});
+        return (String) accessToken[0];
       }
-    } catch (IOException | DocumentException e) {
-      throw new RuntimeException(e);
+      //      } catch (Exception e) {
+      //        throw new Exception("Failed to get access token", e);
+      //
+      //      }
     }
-    return requestMap;
-  }
-  /**
-   * 灏嗗瓧鑺傛暟缁勮浆鎹负鍗佸叚杩涘埗瀛楃涓�
-   *
-   * @param byteArray
-   * @return
-   */
-  private static String byteToStr(byte[] byteArray) {
-    StringBuilder strDigest = new StringBuilder();
-    for (byte b : byteArray) {
-      strDigest.append(byteToHexStr(b));
-    }
-    return strDigest.toString();
   }
 
-  /**
-   * 灏嗗瓧鑺傝浆鎹负鍗佸叚杩涘埗瀛楃涓�
-   *
-   * @param mByte
-   * @return
-   */
-  private static String byteToHexStr(byte mByte) {
-    char[] Digit = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
-    char[] tempArr = new char[2];
-    tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
-    tempArr[1] = Digit[mByte & 0X0F];
-    String s = new String(tempArr);
-    return s;
+  /** 浠庡井淇℃湇鍔″櫒鑾峰彇 access_token */
+  private Object[] fetchAccessTokenFromWeixinServer() throws Exception {
+    HashMap<String, String> weixinParam = SMTWXSStatic.getWeixinParam();
+    OkHttpClient okHttpClient = new OkHttpClient();
+    // 鍒涘缓璇锋眰
+    Request request =
+        new Request.Builder()
+            .url(
+                "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="
+                    + weixinParam.get("appId")
+                    + "&secret="
+                    + weixinParam.get("secret")) // 璇锋眰URL
+            .get() // 浣跨敤GET鏂规硶
+            .build();
+    Response response = okHttpClient.newCall(request).execute();
+    if (!response.isSuccessful() || response.body() == null) {
+      throw new Exception("can't get weixin token");
+    }
+    Json json = Json.read(response.body().string());
+    String accessToken = json.safeGetStr("access_token", null);
+    String expiresIn = json.safeGetStr("expires_in", null);
+
+    if (accessToken != null) {
+      return new Object[] {accessToken, SMTStatic.toInt(expiresIn)};
+    } else {
+      _logger.info("can't get weixin token : " + json);
+      return null;
+      //      throw new Exception("can't get weixin token : " + json);
+    }
   }
 
-  public static String sendPost(String urlString, Map<String, Object> params) throws Exception {
-    // 灏嗗弬鏁拌浆鎹负 JSON 鏍煎紡瀛楃涓�
-    JSONObject jsonParams = new JSONObject(params);
-    String payload = jsonParams.toString();
-    // 鍒涘缓杩炴帴
-    URL url = new URL(urlString);
-    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
-    connection.setRequestMethod("POST");
-    // 璁剧疆璇锋眰澶�
-    connection.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
-    connection.setDoOutput(true);
-    // 鍐欏叆璇锋眰浣�
-    try (OutputStream os = connection.getOutputStream()) {
-      byte[] input = payload.getBytes(StandardCharsets.UTF_8);
-      os.write(input, 0, input.length);
+    @NotNull
+    private static String getString(String fromUserName, String toUserName, String createTimeStr, String msgType, String content, String mediaId, String title, String description, String musicUrl, String hqMusicUrl) {
+        StringBuilder xmlBuilder = new StringBuilder();
+        xmlBuilder.append("<xml>\n")
+                .append("  <ToUserName><![CDATA[").append(fromUserName).append("]]></ToUserName>\n")
+                .append("  <FromUserName><![CDATA[").append(toUserName).append("]]></FromUserName>\n")
+                .append("  <CreateTime>").append(createTimeStr).append("</CreateTime>\n")
+                .append("  <MsgType><![CDATA[").append(msgType).append("]]></MsgType>\n");
+
+        switch (msgType) {
+            case "text":
+                xmlBuilder.append("  <Content><![CDATA[").append(content).append("]]></Content>\n");
+                break;
+            case "image":
+                xmlBuilder.append("  <Image><MediaId><![CDATA[").append(mediaId).append("]]></MediaId></Image>\n");
+                break;
+            case "voice":
+                xmlBuilder.append("  <Voice><MediaId><![CDATA[").append(mediaId).append("]]></MediaId></Voice>\n");
+                break;
+            case "video":
+                xmlBuilder.append("  <Video>\n")
+                        .append("    <MediaId><![CDATA[").append(mediaId).append("]]></MediaId>\n")
+                        .append("    <Title><![CDATA[").append(title).append("]]></Title>\n")
+                        .append("    <Description><![CDATA[").append(description).append("]]></Description>\n")
+                        .append("  </Video>\n");
+                break;
+            case "music":
+                xmlBuilder.append("  <Music>\n")
+                        .append("    <Title><![CDATA[").append(title).append("]]></Title>\n")
+                        .append("    <Description><![CDATA[").append(description).append("]]></Description>\n")
+                        .append("    <MusicUrl><![CDATA[").append(musicUrl).append("]]></MusicUrl>\n")
+                        .append("    <HQMusicUrl><![CDATA[").append(hqMusicUrl).append("]]></HQMusicUrl>\n")
+                        .append("    <ThumbMediaId><![CDATA[").append(mediaId).append("]]></ThumbMediaId>\n")
+                        .append("  </Music>\n");
+                break;
+            case "news": // 鍥炬枃娑堟伅
+                xmlBuilder.append("  <ArticleCount>2</ArticleCount>\n")
+                        .append("  <Articles>\n")
+                        .append("    <item>\n")
+                        .append("      <Title><![CDATA[").append(title).append("]]></Title>\n")
+                        .append("      <Description><![CDATA[").append(description).append("]]></Description>\n")
+                        .append("      <PicUrl><![CDATA[").append(mediaId).append("]]></PicUrl>\n")
+                        .append("      <Url><![CDATA[").append(musicUrl).append("]]></Url>\n")
+                        .append("    </item>\n")
+                        .append("  </Articles>\n");
+                break;
+            default:
+                xmlBuilder.append("  <Content><![CDATA[鏈煡鐨勬秷鎭被鍨媇]></Content>\n");
+        }
+        xmlBuilder.append("</xml>");
+        return xmlBuilder.toString();
     }
-    // 璇诲彇鍝嶅簲
-    try (java.io.InputStream in = connection.getInputStream()) {
-      java.util.Scanner scanner = new java.util.Scanner(in).useDelimiter("\\A");
-      return scanner.hasNext() ? scanner.next() : "";
+
+    /**
+     * 鐢ㄤ簬娴嬭瘯锛屾甯稿彲浠ヤ笉鐢�
+     *
+     * @param reqContent
+     * @return
+     */
+    @NotNull
+    private static String getReply(String reqContent) {
+        String reply;
+        switch (reqContent) {
+            case "鏂囧瓧":
+                reply = "text";
+                break;
+            case "鍥剧墖":
+                reply = "image";
+                break;
+            case "璇煶":
+                reply = "voice";
+                break;
+            case "瑙嗛":
+                reply = "video";
+                break;
+            case "闊充箰":
+                reply = "music";
+                break;
+            case "鍥炬枃":
+                reply = "news";
+                break;
+            default:
+                reply = "text";
+                break;
+        }
+        return reply;
     }
-  }
+
+    private static String dissuadeReturn(
+            String fromUserName, String toUserName, String createTimeStr) {
+        String xmltemp =
+                "<xml>\n"
+                        + "  <ToUserName><![CDATA[{{{toUser}}}]]></ToUserName>\n"
+                        + "  <FromUserName><![CDATA[{{{fromUser}}}]]></FromUserName>\n"
+                        + "  <CreateTime>{{{CreateTime}}}</CreateTime>\n"
+                        + "  <MsgType><![CDATA[text]]></MsgType>\n"
+                        + "  <Content><![CDATA[涓婁竴鏉℃秷鎭繕鍦ㄥ姞杞戒腑鍝︼紝璇风◢绛夋垨鐐瑰嚮涓嬫鍋滄涓婁竴杞洖澶峔n<a href=\"weixin://bizmsgmenu?msgmenucontent=鍋滄杈撳嚭&msgmenuid=101\">鍋滄杈撳嚭</a>]]></Content>\n"
+                        + "  <Content><![CDATA[]]></Content>\n"
+                        + "</xml>";
+        // 鏇挎崲鍗犱綅绗�
+        return xmltemp
+                .replace("{{{toUser}}}", fromUserName)
+                .replace("{{{fromUser}}}", toUserName)
+                .replace("{{{CreateTime}}}", createTimeStr);
+    }
 }

--
Gitblit v1.9.3