>  기사  >  위챗 애플릿  >  WeChat 서버에서 게시물 메시지 본문을 수신하기 위한 Java 코드 예

WeChat 서버에서 게시물 메시지 본문을 수신하기 위한 Java 코드 예

Y2J
Y2J원래의
2017-05-04 09:07:431987검색

이 글에서는 주로 Java WeChat 공개 플랫폼 개발의 두 번째 단계인 WeChat 서버 게시물 메시지 본문 수신에 대해 자세히 소개하며, 관심 있는 친구들은 이를 참고할 수 있습니다.

이전에 기사에서 우리 애플리케이션 서버를 WeChat Tencent 서버에 연결하는 방법을 자세히 설명했습니다. 마지막으로, 이전 기사에서 [controller]를 정의했다는 것을 눈치채셨는지 궁금합니다. post 메소드이지만 사용 중에는 get 메소드를 사용합니다. 여기서는 예약한 post 메소드의 사용에 대해 이야기하겠습니다!

서버 확인이 완료되면 사용자가 공식 계정으로 메시지를 보내거나 맞춤 메뉴 클릭 이벤트가 발생할 때마다 개발자가 입력한 서버 구성 URL이 WeChat에서 푸시됩니다. 서버 메시지 및 이벤트, 그리고 개발자는 메시지에 응답하는 등 자신의 비즈니스 로직에 따라 응답할 수 있습니다! 이 문장을 통해 WeChat 서버와 애플리케이션 서버 간의 모든 후속 통신이 게시물 메시지 본문을 통해 완료된다는 것을 알 수 있으므로 여기서는 WeChat 게시물의 메시지 본문을 수락하는 방법을 설명하겠습니다!

(1) 메시지 유형 및 메시지 형식

위에서 언급했듯이 WeChat 서버와의 모든 통신은 기본적으로 게시물 메시지 본문을 통해 완료됩니다. 메시지 본문의 유형을 살펴보겠습니다.

일반적인 메시지 유형: 문자 메시지, 사진 메시지, 음성 메시지, 영상 메시지. , 짧은 동영상 메시지, 위치 메시지, 링크 메시지

이벤트 메시지 유형: 이벤트 팔로우/언팔로우, 매개변수가 있는 QR 코드 이벤트 스캔, 위치 이벤트 보고, 맞춤형 메뉴 이벤트, 메뉴 클릭 시 이벤트 푸시, 메뉴 점프 링크 클릭 시 이벤트 푸시
메시지 유형: WeChat 서버에서 푸시되는 모든 메시지 본문의 유형 형식은 xml 형식입니다.

(2) 메시지 재시도 메커니즘

WeChat 서버가 5초 이내에 응답을 받지 못하면 연결을 끊고 요청을 다시 시작하여 총 3번 재시도합니다. 서버가 5초 이내에 처리 및 응답을 보장할 수 없으면 빈 문자열로 직접 응답할 수 있습니다. WeChat 서버는 이에 대해 아무 작업도 수행하지 않으며 재시도를 시작하지 않습니다. 그러나 [고객 서비스 메시지 인터페이스]를 사용할 수 있습니다. 나중에 메시지를 다시 푸시합니다.

(3) 메시지 수신 및 처리

앞서 WeChat의 메시지 본문이 xml 형식이라고 해서 여기에 MessageUtil을 작성했습니다. 메시지 형식을 처리하는 경우 대략적인 코드는 다음과 같습니다.

package com.cuiyongzhi.wechat.util;
import java.io.InputStream;
import java.io.Writer;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
 
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
 
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.core.util.QuickWriter;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.xml.PrettyPrintWriter;
import com.thoughtworks.xstream.io.xml.XppDriver;
  
/**
 * ClassName: MessageUtil
 * @Description: 消息工具类
 * @author dapengniao
 * @date 2016年3月7日 上午10:05:04
 */
public class MessageUtil { 
  
  /** 
   * 返回消息类型:文本 
   */ 
  public static final String RESP_MESSAGE_TYPE_TEXT = "text"; 
  
  /** 
   * 返回消息类型:音乐 
   */ 
  public static final String RESP_MESSAGE_TYPE_MUSIC = "music"; 
  
  /** 
   * 返回消息类型:图文 
   */ 
  public static final String RESP_MESSAGE_TYPE_NEWS = "news"; 
  
  /** 
   * 请求消息类型:文本 
   */ 
  public static final String REQ_MESSAGE_TYPE_TEXT = "text"; 
  
  /** 
   * 请求消息类型:图片 
   */ 
  public static final String REQ_MESSAGE_TYPE_IMAGE = "image"; 
  
  /** 
   * 请求消息类型:链接 
   */ 
  public static final String REQ_MESSAGE_TYPE_LINK = "link"; 
  
  /** 
   * 请求消息类型:地理位置 
   */ 
  public static final String REQ_MESSAGE_TYPE_LOCATION = "location"; 
  
  /** 
   * 请求消息类型:音频 
   */ 
  public static final String REQ_MESSAGE_TYPE_VOICE = "voice"; 
  
  /** 
   * 请求消息类型:推送 
   */ 
  public static final String REQ_MESSAGE_TYPE_EVENT = "event"; 
  
  /** 
   * 事件类型:subscribe(订阅) 
   */ 
  public static final String EVENT_TYPE_SUBSCRIBE = "subscribe"; 
  
  /** 
   * 事件类型:unsubscribe(取消订阅) 
   */ 
  public static final String EVENT_TYPE_UNSUBSCRIBE = "unsubscribe"; 
  
  /** 
   * 事件类型:CLICK(自定义菜单点击事件) 
   */ 
  public static final String EVENT_TYPE_CLICK = "CLICK"; 
  
  /**
   * @Description: 解析微信发来的请求(XML) 
   * @param @param request
   * @param @return
   * @param @throws Exception  
   * @author dapengniao
   * @date 2016年3月7日 上午10:04:02
   */
  @SuppressWarnings("unchecked")
  public static Map<String, String> parseXml(HttpServletRequest request) throws Exception { 
    // 将解析结果存储在HashMap中  
    Map<String, String> map = new HashMap<String, String>(); 
  
    // 从request中取得输入流  
    InputStream inputStream = request.getInputStream(); 
    // 读取输入流  
    SAXReader reader = new SAXReader(); 
    Document document = reader.read(inputStream); 
    // 得到xml根元素  
    Element root = document.getRootElement(); 
    // 得到根元素的所有子节点  
    List<Element> elementList = root.elements(); 
  
    // 遍历所有子节点  
    for (Element e : elementList) 
      map.put(e.getName(), e.getText()); 
  
    // 释放资源  
    inputStream.close(); 
    inputStream = null; 
  
    return map; 
  } 
  
  @SuppressWarnings("unused")
  private static XStream xstream = new XStream(new XppDriver() { 
    public HierarchicalStreamWriter createWriter(Writer out) { 
      return new PrettyPrintWriter(out) { 
        // 对所有xml节点的转换都增加CDATA标记  
        boolean cdata = true; 
        @SuppressWarnings("rawtypes")
        public void startNode(String name, Class clazz) { 
          super.startNode(name, clazz); 
        } 
  
        protected void writeText(QuickWriter writer, String text) { 
          if (cdata) { 
            writer.write("<![CDATA["); 
            writer.write(text); 
            writer.write("]]>"); 
          } else { 
            writer.write(text); 
          } 
        } 
      }; 
    } 
  }); 
}

이 메서드 본문에는 일부 종속성을 사용해야 합니다.

<!-- xml -->
<dependency>
  <groupId>org.apache.directory.studio</groupId>
  <artifactId>org.dom4j.dom4j</artifactId>
  <version>1.6.1</version>
</dependency>
 
<dependency>
  <groupId>com.thoughtworks.xstream</groupId>
  <artifactId>xstream</artifactId>
  <version>1.4.8</version>
</dependency>

그런 다음 pom 파일에 다음 부분을 추가해야 합니다. WechatSecurity 컨트롤러에 추가하세요. 메시지 수신 및 처리를 위해 post 메서드는 다음과 같이 수정됩니다.

@RequestMapping(value = "security", method = RequestMethod.POST)
  // post方法用于接收微信服务端消息
  public void DoPost(HttpServletRequest request,HttpServletResponse response) {
    System.out.println("这是post方法!");
    try{
    Map<String, String> map=MessageUtil.parseXml(request);
    System.out.println("============================="+map.get("Content"));
    }catch(Exception e){
      logger.error(e,e);
    }
  }

이전에 이미 개발자 모드를 활성화했기 때문에 여기에 코드를 게시하면 다음으로 보내게 됩니다. 공개 계정 메시지를 보면 메시지 본문이 성공적으로 입력되고 구문 분석된 것을 볼 수 있습니다. 여기서는 WeChat의 [원본 ID]를 출력합니다.

여기에서는 메시지 본문을 받아서 Map으로 변환만 했을 뿐, 메시지를 생성하지는 않았습니다. 다음 글에서는 메시지 분류 및 처리에 대해 다루겠습니다! 읽어주셔서 감사합니다. 궁금한 점이 있으면 토론 메시지를 남겨주세요!

위 내용은 WeChat 서버에서 게시물 메시지 본문을 수신하기 위한 Java 코드 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.