处理收到的微信用户消息并给出回复 --文字类消息

首先定义一个类InputMessage  接受微信发过来的消息,微信穿过来的消息主要有,文字(用户输入的),点击事件(按钮),图片,语音,链接,位置等等具体代码如下:```import java.io.Serializable;import com.thoughtworks.xstream.annotations.XStreamAlias;@XStreamAlias("xml")  public class InputMessage implements Serializable {        /**      *      */      private static final long serialVersionUID = 1L;      @XStreamAlias("ToUserName")      private String ToUserName;      @XStreamAlias("FromUserName")      private String FromUserName;      @XStreamAlias("CreateTime")      private Long CreateTime;      @XStreamAlias("MsgType")      private String MsgType = "text";      @XStreamAlias("MsgId")      private Long MsgId;      // 文本消息      @XStreamAlias("Content")      private String Content;      // 图片消息      @XStreamAlias("PicUrl")      private String PicUrl;      // 位置消息      @XStreamAlias("LocationX")      private String LocationX;      @XStreamAlias("LocationY")      private String LocationY;      @XStreamAlias("Scale")      private Long Scale;      @XStreamAlias("Label")      private String Label;      // 链接消息      @XStreamAlias("Title")      private String Title;      @XStreamAlias("Description")      private String Description;      @XStreamAlias("Url")      private String URL;      // 语音信息      @XStreamAlias("MediaId")      private String MediaId;      @XStreamAlias("Format")      private String Format;      @XStreamAlias("Recognition")      private String Recognition;      // 事件      @XStreamAlias("Event")      private String Event;      @XStreamAlias("EventKey")      private String EventKey;      @XStreamAlias("Ticket")      private String Ticket;        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;      }        public String getPicUrl() {          return PicUrl;      }        public void setPicUrl(String picUrl) {          PicUrl = picUrl;      }        public String getLocationX() {          return LocationX;      }        public void setLocationX(String locationX) {          LocationX = locationX;      }        public String getLocationY() {          return LocationY;      }        public void setLocationY(String locationY) {          LocationY = locationY;      }        public Long getScale() {          return Scale;      }        public void setScale(Long scale) {          Scale = scale;      }        public String getLabel() {          return Label;      }        public void setLabel(String label) {          Label = label;      }        public String getTitle() {          return Title;      }        public void setTitle(String title) {          Title = title;      }        public String getDescription() {          return Description;      }        public void setDescription(String description) {          Description = description;      }        public String getURL() {          return URL;      }        public void setURL(String uRL) {          URL = uRL;      }        public String getEvent() {          return Event;      }        public void setEvent(String event) {          Event = event;      }        public String getEventKey() {          return EventKey;      }        public void setEventKey(String eventKey) {          EventKey = eventKey;      }        public String getMediaId() {          return MediaId;      }        public void setMediaId(String mediaId) {          MediaId = mediaId;      }        public String getFormat() {          return Format;      }        public void setFormat(String format) {          Format = format;      }        public String getRecognition() {          return Recognition;      }        public void setRecognition(String recognition) {          Recognition = recognition;      }        public String getTicket() {          return Ticket;      }        public void setTicket(String ticket) {          Ticket = ticket;      }  } import java.lang.annotation.ElementType;  import java.lang.annotation.Retention;  import java.lang.annotation.RetentionPolicy;  import java.lang.annotation.Target;    @Retention(RetentionPolicy.RUNTIME)  @Target({ ElementType.FIELD })  public @interface XStreamCDATA {    }  ```然后我们定义一个返回类根据对应的事件返回文本消息数据代码如下:```import com.thoughtworks.xstream.annotations.XStreamAlias;    @XStreamAlias("xml")  public class OutputMessage {        @XStreamAlias("ToUserName")      @XStreamCDATA      private String ToUserName;        @XStreamAlias("FromUserName")      @XStreamCDATA      private String FromUserName;        @XStreamAlias("CreateTime")      private Long CreateTime;        @XStreamAlias("MsgType")      @XStreamCDATA      private String MsgType = "text";        private ImageMessage Image;        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 ImageMessage getImage() {          return Image;      }        public void setImage(ImageMessage image) {          Image = image;      } }  ```最后将消息转换给xml格式发送给用户所以还需要一个xml转换类代码如下:```import com.thoughtworks.xstream.XStream;  import com.thoughtworks.xstream.annotations.XStreamAlias;  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 java.io.Writer;  import java.lang.reflect.Field;  public class SerializeXmlUtil {      public static XStream createXstream() {          return new XStream(new XppDriver() {              @Override              public HierarchicalStreamWriter createWriter(Writer out) {                  return new PrettyPrintWriter(out) {                      boolean cdata = false;                      Class  targetClass = null;                        @Override                      public void startNode(String name, @SuppressWarnings("rawtypes") Class clazz) {                          super.startNode(name, clazz);                          // 业务处理,对于用XStreamCDATA标记的Field,需要加上CDATA标签                          if (!name.equals("xml")) {                              cdata = needCDATA(targetClass, name);                          } else {                              targetClass = clazz;                          }                      }                        @Override                      protected void writeText(QuickWriter writer, String text) {                          if (cdata) {                              writer.write("");                          } else {                              writer.write(text);                          }                      }                  };              }          });      }        private static boolean needCDATA(ClasstargetClass, String fieldAlias) {          boolean cdata = false;          // first, scan self          cdata = existsCDATA(targetClass, fieldAlias);          if (cdata)              return cdata;          // if cdata is false, scan supperClass until java.lang.Object          ClasssuperClass = targetClass.getSuperclass();          while (!superClass.equals(Object.class)) {              cdata = existsCDATA(superClass, fieldAlias);              if (cdata)                  return cdata;              superClass = superClass.getClass().getSuperclass();          }          return false;      }        private static boolean existsCDATA(Classclazz, String fieldAlias) {          if ("MediaId".equals(fieldAlias)) {              return true; // 特例添加 morning99          }          // scan fields          Field[] fields = clazz.getDeclaredFields();          for (Field field : fields) {              // 1. exists XStreamCDATA              if (field.getAnnotation(XStreamCDATA.class) != null) {                  XStreamAlias xStreamAlias = field.getAnnotation(XStreamAlias.class);                  // 2. exists XStreamAlias                  if (null != xStreamAlias) {                      if (fieldAlias.equals(xStreamAlias.value()))// matched                          return true;                  } else {// not exists XStreamAlias                      if (fieldAlias.equals(field.getName()))                          return true;                  }              }          }          return false;      }    }  ```需要第三方的xml  转换的jar  支持这里我们引入  ```  《dependency》  《groupId〉om.thoughtworks.xstream《/groupId>    《artifactId>xstream《/artifactId>    《version>1.4.9《/version> 《/dependency> ```工具类弄好了接下来就是投入使用了。微信那边采用的是post 请求所以我们在post中处理数据``` if (isGet) {            // 微信加密签名            String signature = request.getParameter("signature");            // 时间戳            String timestamp = request.getParameter("timestamp");            // 随机数            String nonce = request.getParameter("nonce");            // 随机字符串            String echostr = request.getParameter("echostr");            // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败            if (signature != null && CheckoutUtil.checkSignature(StringConfig.Wen_Code,signature, timestamp, nonce)) {                try {                    print = response.getWriter();                    print.write(echostr);                    print.flush();                } catch (IOException e) {                    e.printStackTrace();                }            }        }else {        try {                  // 接收消息并返回消息                new AcceptMessage().acceptMessage(request, response);              } catch (IOException e) {                  e.printStackTrace();              }          }```接下来就是acceptMessage登场的时间了,我们先通过ServletInputStream 获得流数据,接下来使用xml工具类转化成InputMessage 对象取得消息数据再根据消息数据处理返回 结果即可,据图代码如下所示:```import java.io.IOException;import java.util.Calendar;import java.util.Date;import javax.servlet.ServletInputStream;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import com.thoughtworks.xstream.XStream;import com.wen.blog.dto.TLResult;import com.wen.blog.util.HandleTalk;import com.wen.blog.util.ResultMsg;public class AcceptMessage {    private Logger logger = LoggerFactory.getLogger(this.getClass());public void acceptMessage(HttpServletRequest request, HttpServletResponse response) throws IOException {          // 处理接收消息          ServletInputStream in = request.getInputStream();          // 将POST流转换为XStream对象          XStream xs = SerializeXmlUtil.createXstream();          xs.processAnnotations(InputMessage.class);          xs.processAnnotations(OutputMessage.class);          // 将指定节点下的xml节点数据映射为对象          xs.alias("xml", InputMessage.class);          // 将流转换为字符串          StringBuilder xmlMsg = new StringBuilder();          byte[] b = new byte[4096];          for (int n; (n = in.read(b)) != -1;) {              xmlMsg.append(new String(b, 0, n, "UTF-8"));          }          // 将xml内容转换为InputMessage对象          InputMessage inputMsg = (InputMessage) xs.fromXML(xmlMsg.toString());            String servername = inputMsg.getToUserName();// 服务端          String custermname = inputMsg.getFromUserName();// 客户端          long createTime = inputMsg.getCreateTime();// 接收时间          Long returnTime = Calendar.getInstance().getTimeInMillis() / 1000;// 返回时间            // 取得消息类型          String msgType = inputMsg.getMsgType();          // 根据消息类型获取对应的消息内容        ResultMsg msg= new HandleTalk().handleTalk(inputMsg.getContent());        TLResult tl=(TLResult) msg.getData();        logger.info("回答的内容"+tl.text);                //String xmString = new String(tl.text.toString().getBytes("UTF-8"));          String xmString = tl.text;//new String(.toString().getBytes("UTF-8"));              //msgType.equals(MsgType.Text.toString())        if (tl.code==100000) {              // 文本消息              System.out.println("开发者微信号:" + inputMsg.getToUserName());              System.out.println("发送方帐号:" + inputMsg.getFromUserName());              System.out.println("消息创建时间:" + inputMsg.getCreateTime() + new Date(createTime * 1000l));              System.out.println("消息内容:" + inputMsg.getContent());              System.out.println("消息Id:" + inputMsg.getMsgId());              System.out.println("消息类型:" + msgType);              StringBuffer str = new StringBuffer();              str.append("");              str.append("");              str.append("");              str.append("" + returnTime + "");              str.append("");              str.append("");              str.append("");              System.out.println(str.toString());              response.getWriter().write(str.toString());          }  else if(tl.code==200000){          OutputMessage outputMsg = new OutputMessage();              outputMsg.setFromUserName(servername);              outputMsg.setToUserName(custermname);              outputMsg.setCreateTime(returnTime);              outputMsg.setMsgType(msgType);              ImageMessage images = new ImageMessage();              images.setMediaId(inputMsg.getMediaId());              outputMsg.setImage(images);              System.out.println("xml转换:/n" + xs.toXML(outputMsg));              response.getWriter().write(xs.toXML(outputMsg));          }              // 获取并返回多图片消息          /*if (msgType.equals(MsgType.Image.toString())) {              System.out.println("获取多媒体信息");              System.out.println("多媒体文件id:" + inputMsg.getMediaId());              System.out.println("图片链接:" + inputMsg.getPicUrl());              System.out.println("消息id,64位整型:" + inputMsg.getMsgId());                OutputMessage outputMsg = new OutputMessage();              outputMsg.setFromUserName(servername);              outputMsg.setToUserName(custermname);              outputMsg.setCreateTime(returnTime);              outputMsg.setMsgType(msgType);              ImageMessage images = new ImageMessage();              images.setMediaId(inputMsg.getMediaId());              outputMsg.setImage(images);              System.out.println("xml转换:/n" + xs.toXML(outputMsg));              response.getWriter().write(xs.toXML(outputMsg));            }  */    }  }  ```

到此就能实现了,个人博客地址 www.haha174.top

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,639评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,277评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,221评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,474评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,570评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,816评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,957评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,718评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,176评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,511评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,646评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,322评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,934评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,755评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,987评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,358评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,514评论 2 348

推荐阅读更多精彩内容

  • 1、开启公众号开发者模式 公众平台的技术文档目的为了简明扼要的交代接口的使用,语句难免苦涩难懂,甚至对于不同的读者...
    good7758阅读 1,513评论 0 1
  • 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔...
    叶总韩阅读 5,128评论 0 41
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • 我1996年2月29日出生在一个小村子里,童年就是在那里度过的。村子里没有江南水乡的宁静与秀丽,也没有北方草原的辽...
    唐半仙阅读 307评论 7 6
  • 梦中的夜晚, 没有月亮, 也不见星星 ; 山不阻拦, 水不隔绝; 天地浑然一体; 有的只是朦胧的雾霭, 和相对而站...
    zbcao阅读 206评论 0 4