站内搜索

微信二次开发之文本消息请求与发送

这篇文章主要为大家详细介绍了Java微信二次开发第二篇,Java微信文本消息接口请求与发送功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

第二篇,做微信文本消息接口请求与发送,具体内容如下

需要导入库: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; }}

第三步:找到包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; }}

第四步:找到包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; }}

第五步:找到包com.wtz.service下的LoginServlet类,重写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; }}

完成微信文本消息接口请求与发送。

【相关推荐】

1. 微信公众号平台源码下载

2. 微信投票源码

以上就是微信二次开发之文本消息请求与发送的详细内容,更多请关注php中文网其它相关文章!

  • 上一篇:二次开发微信之请求验证
  • 下一篇:微信二次开发之各类型消息封装