萬詞霸屏,網站推廣,關鍵詞推廣
您當前的位置 : 首 頁 > 新聞中心 > 公司動態

關鍵詞推廣微信公眾號開發:識別文本消息

2020-09-27 13:35:31

這次要實現的功能是,微信公眾號可以識別你發送的文本消息類型,比如你回復個"你好",微信公眾號會回復給你一句“你發送的是文本消息:你好”,就類似這樣的功能,我們來看該怎么實現。


首先你要知道的是,你向微信公眾號發送一個文本消息,這樣會產生一個post請求給微信服務器,而微信服務器會將這個請求轉發給我們的服務器,準確來說是交給我們的CoreServlet來處理。


要處理這塊我們需要查看官方技術文檔,也就是這塊---接收普通消息

關鍵詞推廣

當普通微信用戶向公眾賬號發消息時,微信服務器將POST消息的XML數據包到開發者填寫的URL上。


文本消息的XML數據包結構是這樣的


< ![CDATA[toUser] ]>  < ![CDATA[fromUser] ]>  1348831860  < ![CDATA[text] ]>  < ![CDATA[this is a test] ]>  1234567890123456



這里面包含一些參數如下



ToUserName開發者微信號

FromUserName發送方帳號(一個OpenID)

CreateTime消息創建時間 (整型)

MsgTypetextContent文本消息內容MsgId消息id64位整型



也就是說,現在你往微信公眾號上發送一段文字,然后最終會形成一個XML數據包,我們通過我們的CoreServlet去處理這個數據包,也就是這些數據包含在request當中。


那接下來的重點就是去解析request中的XML數據包了,那么該如何解析,觀察XML數據,可以將數據存放在Map集合中,然后將XML中的數據映射成一個object對象,這其中用到了一些開源庫,首先我們需要創建一個Javabean對應著我們的文本消息XML數據結構中的那些參數。


public class TextMessage {
  // 開發者微信號
  private String ToUserName;
  // 發送方帳號(一個OpenID)
  private String FromUserName;
  // 消息創建時間 (整型)
  private long CreateTime;
  // 消息類型(text/image/location/link)
  private String MsgType;
  // 消息id,64位整型
  private long MsgId;
  // 消息內容
  private String Content;

  public String getToUserName() {
      return ToUserName;
  }

  public void setToUserName(String toUserName) {
      ToUserName = toUserName;
  }

  public String getFromUserName() {
      return FromUserName;
  }

  public void setFromUserName(String fromUserName) {
      FromUserName = fromUserName;
  }

  public long getCreateTime() {
      return CreateTime;
  }

  public void setCreateTime(long createTime) {
      CreateTime = createTime;
  }

  public String getMsgType() {
      return MsgType;
  }

  public void setMsgType(String msgType) {
      MsgType = msgType;
  }

  public long getMsgId() {
      return MsgId;
  }

  public void setMsgId(long msgId) {
      MsgId = msgId;
  }


  public String getContent() {
      return Content;
  }

  public void setContent(String content) {
      Content = content;
  }
}



接下來的重點就是要去解析我們的請求,將xml數據映射成JavaBean,我們新建一個CoreService去處理我們的請求,在C哦熱Servlet中這樣操作請求



@Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
{

      // 將請求、響應的編碼均設置為UTF-8(防止中文亂碼)
      req.setCharacterEncoding("UTF-8");
      resp.setCharacterEncoding("UTF-8");
      PrintWriter out = resp.getWriter();

      CoreService coreService = new CoreService();
      String s = coreService.parseWxRequest(req);

      // 響應消息,將相應的xml數據轉發給微信服務器
      out.print(s);
      System.out.println("消息:"+s);
      out.close();
  }



也就是將微信請求交給CoreService去解析,到這里要知道就是微信請求中是XML數據格式,所以我們返回給微信服務器的也應該是Xml數據,因此,這個parseWxRequest返回的應該是一個字符串,但是這個字符串是一個XML數據,下面看具體的如何解析請求,下面是CoreService的具體寫法。關鍵詞推廣


public class CoreService {
  public static String parseWxRequest(HttpServletRequest request) {
      // xml格式的消息數據
      String respXml = null;
      // 默認返回的文本消息內容
      String respContent = "未知的消息類型!";

      try {
          // 調用parseXml方法解析請求消息
          Map requestMap = MessageUtil.parseXml(request);
          // 發送方帳號,一個openID
          String fromUserName = requestMap.get("FromUserName");
          // 開發者微信號
          String toUserName = requestMap.get("ToUserName");
          // 消息類型
          String msgType = requestMap.get("MsgType");
          // 接收用戶發送的文本消息內容
          String content = requestMap.get("Content");
          //回復文本消息
          TextMessage textMessage = new TextMessage();
          textMessage.setToUserName(fromUserName);
          textMessage.setFromUserName(toUserName);
          textMessage.setCreateTime(System.currentTimeMillis());
          textMessage.setMsgType(MessageUtil.REQ_MESSAGE_TYPE_TEXT);

          // 文本消息
          if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) {
              respContent = "你回復的是文本消息:"+content;
              textMessage.setContent(respContent);
              String xml = MessageUtil.messageToXml(textMessage);
              respXml = xml;

          }
      } catch (Exception e) {
          e.printStackTrace();
      }

      return respXml;
  }

}



可以看出這里只是對解析后的消息做一個響應,通過



MessageUtil.parseXml(request);



將請求中的XML數據解析出來放在Map集合當中,然后從集合中拿出數據生成一個具體的TextMessage類供我們使用,那么具體的是如何將請求中的XML數據解析成一個Map集合呢。



public class MessageUtil {
  // 請求消息類型:文本
  public static final String REQ_MESSAGE_TYPE_TEXT = "text";
  /**
   * 解析微信發來的請求(XML)
   *
   * @param request
   * @return Map
   * @throws Exception
   */

  @SuppressWarnings("unchecked")
  public static Map parseXml(HttpServletRequest request) throws Exception {
      // 將解析結果存儲在HashMap中
      Map map = new HashMap();

      // 從request中取得輸入流
      InputStream inputStream = request.getInputStream();
      // 讀取輸入流
      SAXReader reader = new SAXReader();
      Document document = reader.read(inputStream);
      // 得到xml根元素
      Element root = document.getRootElement();
      // 得到根元素的所有子節點
      List elementList = root.elements();

      // 遍歷所有子節點
      for (Element e : elementList){
          map.put(e.getName(), e.getText());
      }

      // 釋放資源
      inputStream.close();
      inputStream = null;

      return map;
  }

  /**
   * 擴展xstream使其支持CDATA
   */

  private static XStream xstream = new XStream(new XppDriver() {
      @Override
      public HierarchicalStreamWriter createWriter(Writer out) {
          return new PrettyPrintWriter(out) {
              // 對所有xml節點的轉換都增加CDATA標記
              boolean cdata = true;

              @Override
              @SuppressWarnings("unchecked")
              public void startNode(String name, Class clazz) {
                  super.startNode(name, clazz);
              }

              @Override
              protected void writeText(QuickWriter writer, String text) {
                  if (cdata) {
                      writer.write("                        writer.write(text);
                      writer.write("
]]>");
                  } else {
                      writer.write(text);
                  }
              }
          };
      }
  });

  /**
   * 文本消息對象轉換成xml
   *
   * @param textMessage 文本消息對象
   * @return xml
   */
  public static String messageToXml(TextMessage textMessage) {
      xstream.alias("
xml", textMessage.getClass());
      return xstream.toXML(textMessage);
  }

}



我們知道微信請求是一個XML格式的數據,這個類可以將XML的數據解析成Java對象,當然也 提供將Java對象再次轉換成XML,以便我們作為響應數據返回給微信服務器。


最近瀏覽:

Pay attention to us

微信圖片_20200317111253.png

未標題-3.png咨詢服務熱線:18608119775

立即咨詢
北京pk10三码计划分析