上回说到 接口连接成功,接下来是真正的开发了。

消息的接收,整个过程就是关注订阅号的用户在微信订阅号中发送消息,微信服务器接收到消息,将消息发给开发者的服务器,服务器接收消息然后可以根据内容进行回复。

上代码,同样是在weixin.java的servlet中doPOst方法中接收消息

目录

public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

//接收微信服务器传来的报文
        request.setCharacterEncoding("utf-8");
        String notityXml = "";
        String inputLine;
        try {
            while ((inputLine = request.getReader().readLine()) != null) {//将消息一行行读入
                notityXml += inputLine;//将一行行的 xml数据存入字符串中
            }
            request.getReader().close();
        } catch (Exception e) {
            e.printStackTrace();
        }

System.out.println("接收到的报文:" + notityXml);//下面是对xml报文你的解析
        Map m = parseXmlToList2(notityXml);//该函数将xml报文的项和值存入map数组中
        System.out.println("接收的用户消息:"+m.get("Content").toString());
        String receive=m.get("Content").toString();//得到用户输入的内容

//将接收xml格式的字符串存入map 数组中
     private static Map parseXmlToList2(String xml) {
            Map retMap = new HashMap();
            try {
                StringReader read = new StringReader(xml);
                // 创建新的输入源SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入
                InputSource source = new InputSource(read);
                // 创建一个新的SAXBuilder
                SAXBuilder sb = new SAXBuilder();
                // 通过输入源构造一个Document
                Document doc = (Document) sb.build(source);
                Element root = doc.getRootElement();// 指向根节点
                List<Element> es = root.getChildren();
                if (es != null && es.size() != 0) {
                    for (Element element : es) {
                        retMap.put(element.getName(), element.getValue());
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return retMap;
        }

接下来是根据用户发送的内容进行回复,回复的是带参数的xml格式的报文

//根据消息自动回复
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter pw = response.getWriter();
        
        StringBuffer replyMsg = new StringBuffer();
        String returnXml = null;
        
        if(receive.equals("1")){
            replyMsg=replyMsg.append("我长得帅吗?");
            returnXml = getReplyTextMessage(replyMsg.toString(), m.get("FromUserName").toString(), m.get("ToUserName").toString());

}
        else if(receive.equals("2")){
            replyMsg=replyMsg.append("我长得帅吗?");
            returnXml = getReplyPicMessage(m.get("FromUserName").toString(), m.get("ToUserName").toString());

}
        else{
            replyMsg=replyMsg.append("发送1:回答问题,发送2:收到图片");
            returnXml = getReplyTextMessage(replyMsg.toString(), m.get("FromUserName").toString(), m.get("ToUserName").toString());

}
        pw.println(returnXml);

 //    得到转化格式的恢复的文本消息
     private String getReplyTextMessage(String content, String fromUserName,String toUserName)
     {
        ReplyTextMessage we = new ReplyTextMessage();
        we.setMessageType("text");
        we.setFuncFlag("0");
        we.setCreateTime(new Long(new Date().getTime()).toString());
        we.setContent(content);
        we.setToUserName(fromUserName);  
        we.setFromUserName(toUserName);
        XStream xstream = new XStream(new DomDriver());
        xstream.alias("xml", ReplyTextMessage.class);
        xstream.aliasField("ToUserName", ReplyTextMessage.class, "toUserName");
        xstream.aliasField("FromUserName", ReplyTextMessage.class, "fromUserName");
        xstream.aliasField("CreateTime", ReplyTextMessage.class, "createTime");
        xstream.aliasField("MsgType", ReplyTextMessage.class, "messageType");
        xstream.aliasField("Content", ReplyTextMessage.class, "content");
        xstream.aliasField("FuncFlag", ReplyTextMessage.class, "funcFlag");
        String xml =xstream.toXML(we);
        return xml;
     }
  //   得到转化格式的恢复的图片消息
     private String getReplyPicMessage(String fromUserName,String toUserName){
        
         ReplyPicMessage we = new ReplyPicMessage();
        
                  Articles articles = new Articles();
                  
                  Item item = new Item();
                  we.setMessageType("news");
                  we.setCreateTime(new Long(new Date().getTime()).toString());
                  we.setToUserName(fromUserName);  
                  we.setFromUserName(toUserName);
                  we.setFuncFlag("0");
                  we.setArticleCount(1);
                   
                  item.setTitle("俊介");
                  item.setDescription("俊介(SHUNSUKE)是Twitter上现在最流行的偶像犬,是哈多利系博美犬(即俗称英系博美),因为在网上卖萌而走红网络。");
                  item.setPicUrl("http://jiangzhongxi.tunnel.2bdata.com/weixin/junjie.jpg");
                  item.setUrl("http://baike.baidu.com/view/6300265.htm");        
                
                  articles.setItem(item);
                  we.setArticles(articles);
                   
                  XStream xstream = new XStream(new DomDriver());
                  xstream.alias("xml", ReplyPicMessage.class);
                xstream.aliasField("ToUserName", ReplyPicMessage.class, "toUserName");
                 xstream.aliasField("FromUserName", ReplyPicMessage.class, "fromUserName");
                xstream.aliasField("CreateTime", ReplyPicMessage.class, "createTime");
                 xstream.aliasField("MsgType", ReplyPicMessage.class, "messageType");
                  xstream.aliasField("Articles", ReplyPicMessage.class, "Articles");
                  
                xstream.aliasField("ArticleCount", ReplyPicMessage.class, "articleCount");
                  xstream.aliasField("FuncFlag", ReplyPicMessage.class, "funcFlag");
                  
                  xstream.aliasField("item", Articles.class, "item");
                  
                 xstream.aliasField("Title", Item.class, "title");
                xstream.aliasField("Description", Item.class, "description");
                 xstream.aliasField("PicUrl", Item.class, "picUrl");
                 xstream.aliasField("Url", Item.class, "url");
                 
                String xml =xstream.toXML(we);
                  return xml;
     }

public class Articles {

private Item item;
    public Item getItem() {
        return item;
    }
   public void setItem(Item item) {
    this.item = item;
        }
}

package com.jiang.reply;

public class Item {

private String title;
     private String description;
     private String picUrl;
     private String url;
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public String getPicUrl() {
        return picUrl;
    }
    public void setPicUrl(String picUrl) {
        this.picUrl = picUrl;
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
}

package com.jiang.reply;

public class ReplyPicMessage {

private String toUserName;
    private String fromUserName;
    private String createTime;
    private String messageType;
    private int articleCount;
    private Articles Articles;
    public String getToUserName() {
        return toUserName;
    }
    public void setToUserName(String toUserName) {
        this.toUserName = toUserName;
    }
    public String getFromUserName() {
        return fromUserName;
    }
    public void setFromUserName(String fromUserName) {
        this.fromUserName = fromUserName;
    }
    public String getCreateTime() {
        return createTime;
    }
    public void setCreateTime(String createTime) {
        this.createTime = createTime;
    }
    public String getMessageType() {
        return messageType;
    }
    public void setMessageType(String messageType) {
        this.messageType = messageType;
    }
    public int getArticleCount() {
        return articleCount;
    }
    public void setArticleCount(int articleCount) {
        this.articleCount = articleCount;
    }
    public Articles getArticles() {
        return Articles;
    }
    public void setArticles(Articles articles) {
        Articles = articles;
    }
    public String getFuncFlag() {
        return funcFlag;
    }
    public void setFuncFlag(String funcFlag) {
        this.funcFlag = funcFlag;
    }
    private String funcFlag;
}

package com.jiang.reply;

public class ReplyTextMessage {

private String toUserName;
     private String fromUserName;
     private String createTime;
     private String messageType;
     private String content;
     public String getToUserName() {
        return toUserName;
    }
    public void setToUserName(String toUserName) {
        this.toUserName = toUserName;
    }
    public String getFromUserName() {
        return fromUserName;
    }
    public void setFromUserName(String fromUserName) {
        this.fromUserName = fromUserName;
    }
    public String getCreateTime() {
        return createTime;
    }
    public void setCreateTime(String createTime) {
        this.createTime = createTime;
    }
    public String getMessageType() {
        return messageType;
    }
    public void setMessageType(String messageType) {
        this.messageType = messageType;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    public String getFuncFlag() {
        return funcFlag;
    }
    public void setFuncFlag(String funcFlag) {
        this.funcFlag = funcFlag;
    }
    private String funcFlag;
}

java微信开发之接受消息回复图片或者文本的更多相关文章

  1. PHP微信开发之模板消息回复

    参考:http://www.jb51.net/article/87269.htm 代码: <?php //$ac = file_get_contents('https://api.weixin. ...

  2. java微信开发API解析(二)-获取消息和回复消息

    java微信开发API解析(二)-获取消息和回复消息 说明 * 本演示样例依据微信开发文档:http://mp.weixin.qq.com/wiki/home/index.html最新版(4/3/20 ...

  3. 《C#微信开发系列(4)-接收 / 返回文本消息》

    4.0接收 / 返回文本消息 ①接收/返回文本消息原理说明 当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上,着手开发之前先行阅读微信公众平台接收普通消息 ...

  4. Java微信开发_00_资源汇总贴

    1.微信公众平台技术文档(https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432) 2.微信企业号开发接口文档(ht ...

  5. java微信开发

    所谓的微信开发就是在微信开发模式之下,对微信进行公众号和企业号的扩展开发.     如果要让你的微信公众号有更多的功能,比如菜单支持,自动的信息服务,查询,消息推送等,就必须开启微信的开发模式.进入微 ...

  6. 2014-07-24 .NET实现微信公众号的消息回复与自定义菜单

    今天是在吾索实习的第12天.我们在这一天中,基本实现了微信公众号的消息回复与自定义菜单的创建. 首先,是实现消息回复,其关键点如下: 读取POST来的数据流:Stream 数据流变量 = HttpCo ...

  7. 分享 Java微信开发SDK

    分享 Java微信开发SDK •发布于 4周前  •作者 朋也  •432 次浏览  •最后一次编辑是 2周前  •来自 分享 给大家分享两个java开发微信公众号的sdk jfinal-weixin ...

  8. Java微信公众号安全模式消息解密

    这篇文章主要为大家详细介绍了Java微信公众号安全模式消息解密,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 1.微信公众平台下载解密工具,导入项目中,根据demo解密消息 public stat ...

  9. Java微信公众平台开发(七)--多媒体消息回复之图片回复

    之前我们在做消息回复的时候我们对回复的消息简单做了分类,前面也有讲述如何回复[普通消息类型消息],这里将讲述多媒体消息的回复方法,[多媒体消息]包含回复图片消息/回复语音消息/回复视频消息/回复音乐消 ...

随机推荐

  1. C到C++的快速教程

    1.头文件: C++头文件不是以.h结尾,C语言中的标准库文件如math,h,stdio.h在C++中被命名为cmath,cstdio 2.命名空间: 为防止名字冲突(出现同名),C++引入名字空间( ...

  2. 解决kali linux使用metasploit报错办法

    curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/templates/metasploit- ...

  3. 函数的返回值是void

    #include <stdio.h> void sub(int x,int y,int z){ z=y-x; } void main() { int a=1,b=2,c=3; sub(10 ...

  4. 读取和修改app.config文件

    本处主要是指读取和修改appSettings节点: 读取: string port = ConfigurationManager.AppSettings["port"];  //p ...

  5. 【转】在发布站点前,Web开发者需要关注哪些技术细节

    转摘:http://www.csdn.net/article/2014-05-19/2819818-technical-details-programmer 在网站发布前,开发者需要关注有许多的技术细 ...

  6. 20155207王雪纯 Exp2 后门原理与实践

    20155207王雪纯 Exp2 后门原理与实践 实验步骤 一.windows获取Linux shell Windows:使用 ipconfig 命令查看当前机器IP地址. 进入ncat所在文件地址, ...

  7. 课下测试ch01修改补交

    由于当时学习态度有问题,没有注意到第一次的课下测试,虽然在当周的总结中就进行补交,但是当时态度并没有很认真,可能没有引起老师的注意,现在重新修改,望老师谅解. (单选题 | 1 分) Amdahl定律 ...

  8. 学习笔记:启动对特定用户的会话的sql跟踪

    学习 Oracle性能诊断艺术 制作一个role: CREATE ROLE sql_trace; 然后再作一个数据库登录级别的触发器: CREATE OR REPLACE TRIGGER enable ...

  9. Autoanalyze 的注意事项

    磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面:PostgreSQL内部结构与源代码研究索引页    回到顶级页面:PostgreSQL索引页 根据官方文档的说明  http://www.p ...

  10. 【HNOI2014】抄卡组

    题面 题解 如果所有的字符串都有通配符,那么只要比较不含通配符的前缀和后缀就可以了. 否则一定有一个串没有通配符.找出这个字符串,然后将所有串与这个串匹配,通配符将\(B\)分成一段一段在\(A\)上 ...