WeChat 보조 개발 문자 메시지 요청 및 전송

Y2J
풀어 주다: 2017-05-10 09:25:10
원래의
1998명이 탐색했습니다.

이 글에서는 주로 Java WeChat 2차 개발의 두 번째 부분인 Java WeChat 문자 메시지 인터페이스 요청 및 전송 기능을 자세히 소개하며, 관심 있는 친구들은 참고할 수 있습니다.

두 번째 글, WeChat 문자 메시지 인터페이스 요청 및 전송 시 구체적인 내용은 다음과 같습니다

라이브러리를 가져와야 합니다: dom4j-1.6.1.jar, xstream-1.3.1.jar

첫 번째 단계: 새 패키지 com.wtz.message.response 및 새 클래스 BaseMessage.java 만들기

package com.wtz.message.response;

/**
 * @author wangtianze QQ:864620012
 * @date 2017年4月19日 下午3:12:40
 * <p>version:1.0</p>
 * <p>description:基础消息类</p>
 */
public class BaseMessage {
 //接收方
 private String ToUserName;
 //发送方
 private String FromUserName;
 //消息的创建时间
 private long CreateTime;
 //消息类型
 private String MsgType;
 
 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;
 }
}
로그인 후 복사

두 번째 단계: com.wtz.message 패키지 찾기 .response , 새 클래스 TextMessage.java 만들기

package com.wtz.message.response;

/**
 *  @author wangtianze QQ:864620012
 * @date 2017年4月19日 下午3:22:33
 * <p>version:1.0</p>
 *  <p>description:文本消息类</p>
 */
public class TextMessage extends BaseMessage{
 //消息内容
 private String Content;
 
 public String getContent() {
  return Content;
 }
 public void setContent(String content) {
  Content = content;
 }
}
로그인 후 복사

3단계: com.wtz.util 패키지를 찾아 새 클래스 MessageUtil.java

package com.wtz.util;

import java.io.IOException;
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.DocumentException;
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;
import com.wtz.message.response.TextMessage;

/**
 *  @author wangtianze QQ:864620012
 * @date 2017年4月19日 下午3:29:58
 * <p>version:1.0</p>
 *  <p>description:消息处理工具类</p>
 */
public class MessageUtil {
 //定义了消息类型(常量:文本类型)
 public static final String RESP_MESSAGE_TYPE_TEXT = "text";
 
 //从流中解析出每个节点的内容
 public static Map<String,String> parseXml(HttpServletRequest request) throws IOException{
  Map<String,String> map = new HashMap<String,String>();
  
  //从输入流中获取流对象
  InputStream in = request.getInputStream();
  
  //构建SAX阅读器对象
  SAXReader reader = new SAXReader();
  try {
   //从流中获得文档对象
   Document doc = reader.read(in);
   
   //获得根节点
   Element root = doc.getRootElement();
   
   //获取根节点下的所有子节点
   List<Element> children = root.elements();
   
   for(Element e:children){
    //遍历每一个节点,并按照节点名--节点值放入map中
    map.put(e.getName(), e.getText());
    System.out.println("用户发送的消息XML解析为:" + e.getName() + e.getText());
   }
   
   //关闭流
   in.close();
   in = null;
  } catch (DocumentException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
  return map;
 }
 
 /**
  * 用于扩展节点数据按照<ToUserName><![CDATA[toUser]]></ToUserName>,中间加了CDATA段
  */
 private static XStream xstream = new XStream(new XppDriver(){
  public HierarchicalStreamWriter createWriter(Writer out){
   return new PrettyPrintWriter(out){
    boolean cdata = true;
    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格式
  */
 public static String messageToXml(TextMessage textMessage){
  xstream.alias("xml",textMessage.getClass());
  String xml = xstream.toXML(textMessage);
  System.out.println("响应所转换的XML:"+xml);
  return xml;
 }
}
로그인 후 복사

< 만들기 🎜>4단계: com.wtz.service 패키지를 찾아 새 클래스 ProcessService.java 만들기

package com.wtz.util;

import java.io.IOException;
import java.util.Date;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import com.wtz.message.response.TextMessage;

/**
 *  @author wangtianze QQ:864620012
 * @date 2017年4月19日 下午8:04:14
 * <p>version:1.0</p>
 *  <p>description:核心服务类</p>
 */
public class ProcessService {
 public static String dealRequest(HttpServletRequest request) throws IOException{
  //响应的XML串
  String respXml = "";
  
  //要响应的文本内容
  String respContent = "未知的消息类型";
  Map<String,String> requestMap = MessageUtil.parseXml(request);
  String fromUserName = requestMap.get("FromUserName");
  String toUserName = requestMap.get("ToUserName");
  String MsgType = requestMap.get("MsgType");
  String Content = requestMap.get("Content");
  
  System.out.println("用户给公众号发的消息为:" + Content);
  
  //构建一条文本消息
  TextMessage textMessage = new TextMessage();
  textMessage.setToUserName(fromUserName);
  textMessage.setFromUserName(toUserName);
  textMessage.setCreateTime(new Date().getTime());
  textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);
  
  if(MsgType.equals(MessageUtil.RESP_MESSAGE_TYPE_TEXT)){
   respContent = "王天泽的公众号收到了您的一条文本消息:" + Content + ",时间戳是:" + (new Date().getTime());
  }
  textMessage.setContent(respContent);
  respXml = MessageUtil.messageToXml(textMessage);
  
  System.out.println("respXml:"+respXml);
  
  return respXml;
 }
}
로그인 후 복사

5단계: com.wtz 패키지에서 LoginServlet 클래스 찾기 .service 및 doPost 메소드 다시 작성

package com.wtz.service;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.wtz.util.MessageUtil;
import com.wtz.util.ProcessService;
import com.wtz.util.ValidationUtil;

/**
 *  @author wangtianze QQ:864620012
 * @date 2017年4月17日 下午8:11:32
 * <p>version:1.0</p>
 *  <p>description:微信请求验证类</p>
 */
public class LoginServlet extends HttpServlet {

 @Override
 protected void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  System.out.println("get请求。。。。。。");
  
  //1.获得微信签名的加密字符串
  String signature = request.getParameter("signature");
  
  //2.获得时间戳信息
  String timestamp = request.getParameter("timestamp");
   
  //3.获得随机数
  String nonce = request.getParameter("nonce");
  
  //4.获得随机字符串
  String echostr = request.getParameter("echostr");
  
  System.out.println("获得微信签名的加密字符串:"+signature);
  System.out.println("获得时间戳信息:"+timestamp);
  System.out.println("获得随机数:"+nonce);
  System.out.println("获得随机字符串:"+echostr);
  
  PrintWriter out = response.getWriter();
  
  //验证请求确认成功原样返回echostr参数内容,则接入生效,成为开发者成功,否则失败
  if(ValidationUtil.checkSignature(signature, timestamp, nonce)){
   out.print(echostr);
  }
  
  out.close();
  out = null;
 }

 /**
  * 接受微信服务器发过来的XML数据包(通过post请求发送过来的)
  */
 @Override
 protected void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  
  request.setCharacterEncoding("utf-8");
  response.setCharacterEncoding("utf-8");
  
  //获取微信加密的签名字符串
  String signature = request.getParameter("signature");
  
  //获取时间戳
  String timestamp = request.getParameter("timestamp");
  
  //获取随机数
  String nonce = request.getParameter("nonce");
  
  PrintWriter out = response.getWriter();
  
  if(ValidationUtil.checkSignature(signature,timestamp,nonce)){
   String respXml = "";
   try {
    respXml = ProcessService.dealRequest(request);
   } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   out.print(respXml);
  }
  out.close();
  out = null;
 }
}
로그인 후 복사
WeChat 문자 메시지 인터페이스 요청 및 전송을 완료합니다.

[관련 추천]

1.

위챗 공개계정 플랫폼 소스코드 다운로드

2.위챗 투표 소스코드

위 내용은 WeChat 보조 개발 문자 메시지 요청 및 전송의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿