微信公众号自动回复_Java

2019-01-10 07:47:22来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

先声明一下,这是一个maven工程
pom文件需要的依赖:
 1 <dependency>
 2     <groupId>dom4j</groupId>
 3     <artifactId>dom4j</artifactId>
 4     <version>1.6</version>
 5 </dependency>
 6 <dependency>
 7     <groupId>commons-io</groupId>
 8     <artifactId>commons-io</artifactId>
 9     <version>2.5</version>
10 </dependency>
11 <dependency>
12     <groupId>com.thoughtworks.xstream</groupId>
13     <artifactId>xstream</artifactId>
14     <version>1.4.9</version>
15 </dependency>
16 <dependency>
17     <groupId>javax.servlet</groupId>
18     <artifactId>javax.servlet-api</artifactId>
19     <version>3.1.0</version>
20 </dependency>

微信消息都是基于xml文件进行接收发送的

微信文本消息的参数:

<xml>
    <ToUserName><![CDATA[toUser]]></ToUserName>
    <FromUserName><![CDATA[fromUser]]></FromUserName>
    <CreateTime>1348831860</CreateTime>
    <MsgType><![CDATA[text]]></MsgType>
    <Content><![CDATA[this is a test]]></Content>
    <MsgId>1234567890123456</MsgId>
</xml>
        <!--参数              描述
            ToUserName       开发者微信号
            FromUserName     发送方帐号(一个OpenID)
            CreateTime       消息创建时间 (整型)
            MsgType          text
            Content          文本消息内容
            MsgId            消息id,64位整型
        -->

微信回复文本消息的参数

<xml>
    <ToUserName><![CDATA[toUser]]></ToUserName>
    <FromUserName><![CDATA[fromUser]]></FromUserName>
    <CreateTime>12345678</CreateTime>
    <MsgType><![CDATA[text]]></MsgType>
    <Content><![CDATA[你好]]></Content>
</xml>
<!--参数             是否必须        描述
    ToUserName          是            接收方帐号(收到的OpenID)
    FromUserName        是            开发者微信号
    CreateTime          是            消息创建时间 (整型)
    MsgType             是            text
    Content             是            回复的消息内容(换行:在content中能够换行,微信客户端就支持换行显示)
 -->

我会在相应的代码上加上注释,其他对应图片消息参数,以及回复图片消息参数、图文消息参数等等 请参考微信开发文档。

附上微信公众号接口文档链接:点击这里

 

二话不说 先附上主代码:

注:  xml解析:本文使用的是xtream进行xml与java对象之间的转换;对于xml解析还可以使用其他方法 如:dom4j等等 我这里就不一一列举了

import com.replymessage.*;
import com.requestmessage.RequestTextMessage;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
import com.util.Articles;
import com.util.Item;
import com.util.Music;
import org.apache.commons.io.IOUtils;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 微信回复消息
 */
public class WbChat extends HttpServlet {

    private static final long serialVersionUID = 1L;

    public WbChat() {
        super();
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
        //这里没有对发送信息者进行验证,直接返回了,要加验证的话自己去百度吧
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter writer = response.getWriter();
        String echostr = request.getParameter("echostr");
        echostr = new String(echostr.getBytes("ISO-8859-1"),"UTF-8");
        writer.println(echostr);
        //当你提交成为开发者的URL和Token时,微信服务器将发送GET请求到填写的URL上,
        //只有你返回参数echostr时,他才会认为你这个接口是通的,才会提交成功
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
        //当你用微信给平台发送信息时就会到这里
        //回复音乐和图文消息,都写死了,自己可以根据自己的需要加相应的处理
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter pw = response.getWriter();
        String wxMsgXml = IOUtils.toString(request.getInputStream(),"utf-8");
        RequestTextMessage textMsg = null;
        try {
            textMsg = getRequestTextMessage(wxMsgXml);
        } catch (Exception e) {
            e.printStackTrace();
        }
        StringBuffer replyMsg = new StringBuffer();
        String receive = textMsg.getContent().trim();
        String returnXml = null;

        if (textMsg != null&&!receive.equals("")) {
            if (receive.equals("?")||receive.equals("?")) {

                replyMsg.append("欢迎使用微信平台!");
                replyMsg.append("\r\n1、当前时间");
                replyMsg.append("\r\n2、听音乐");
                replyMsg.append("\r\n3、看图文");
                replyMsg.append("\r\n其他、请直接输入文字信息等待管理员回复");

                returnXml = getReplyTextMessage(replyMsg.toString(), textMsg.getFromUserName(),textMsg.getToUserName());

            } else  if (receive.equals("2")) {
                //回复音乐信息
                returnXml = getReplyMusicMessage(textMsg.getFromUserName(),textMsg.getToUserName());

            } else  if (receive.equals("3")) {
                //回复图文
                returnXml = getReplyTuwenMessage(textMsg.getFromUserName(),textMsg.getToUserName());

            }  else if (receive.equals("1")) {
                //回复时间
                SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

                replyMsg.append("当前时间\r\n"+df.format(new Date()));
                returnXml = getReplyTextMessage(replyMsg.toString(), textMsg.getFromUserName(),textMsg.getToUserName());

            } else {
                replyMsg.append("收到: " + textMsg.getContent());
                returnXml = getReplyTextMessage(replyMsg.toString(), textMsg.getFromUserName(),textMsg.getToUserName());

            }
        } else {
            replyMsg.append("别闹了,这谁看得懂啊!");
            returnXml = getReplyTextMessage(replyMsg.toString(), textMsg.getFromUserName(),textMsg.getToUserName());

        }
        pw.println(returnXml);
    }


    //获取推送文本消息
    private RequestTextMessage getRequestTextMessage(String xml){

        XStream xstream = new XStream(new DomDriver());

        xstream.alias("xml", RequestTextMessage.class);
        xstream.aliasField("ToUserName", RequestTextMessage.class, "toUserName");
        xstream.aliasField("FromUserName", RequestTextMessage.class, "fromUserName");
        xstream.aliasField("CreateTime", RequestTextMessage.class, "createTime");
        xstream.aliasField("MsgType", RequestTextMessage.class, "messageType");
        xstream.aliasField("Content", RequestTextMessage.class, "content");
        xstream.aliasField("MsgId", RequestTextMessage.class, "msgId");

        RequestTextMessage requestTextMessage = (RequestTextMessage)xstream.fromXML(xml);
        return requestTextMessage;
    }
    //回复文本消息
    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 getReplyMusicMessage(String fromUserName,String toUserName){

        ReplyMusicMessage we = new ReplyMusicMessage();
        Music music = new Music();

        we.setMessageType("music");
        we.setCreateTime(new Long(new Date().getTime()).toString());
        we.setToUserName(fromUserName);
        we.setFromUserName(toUserName);
        we.setFuncFlag("0");

        music.setTitle("home");
        music.setDescription(" family 想家了吗");

        String url = "http://bcs.duapp.com/yishi-music/%E5%9B%9E%E5%AE%B6.mp3?sign=MBO:97068c69ccb2ab230a497c59d528dcce:LdYZ%2FLXohKa6YCy9gbxL%2B1mZ4Co%3D";
        String url2 = "http://bcs.duapp.com/yishi-music/X-man.mp3?sign=MBO:97068c69ccb2ab230a497c59d528dcce:cYV%2B%2Fq2Tlv2de6gqecZynCyIm3k%3D";
        music.setMusicUrl(url);
        music.setHqMusicUrl(url2);

        we.setMusic(music);

        XStream xstream = new XStream(new DomDriver());
        xstream.alias("xml", ReplyMusicMessage.class);
        xstream.aliasField("ToUserName", ReplyMusicMessage.class, "toUserName");
        xstream.aliasField("FromUserName", ReplyMusicMessage.class, "fromUserName");
        xstream.aliasField("CreateTime", ReplyMusicMessage.class, "createTime");
        xstream.aliasField("MsgType", ReplyMusicMessage.class, "messageType");
        xstream.aliasField("FuncFlag", ReplyMusicMessage.class, "funcFlag");
        xstream.aliasField("Music", ReplyMusicMessage.class, "Music");

        xstream.aliasField("Title", Music.class, "title");
        xstream.aliasField("Description", Music.class, "description");
        xstream.aliasField("MusicUrl", Music.class, "musicUrl");
        xstream.aliasField("HQMusicUrl", Music.class, "hqMusicUrl");

        String xml =xstream.toXML(we);
        return xml;
    }

    //回复图文消息
    private String getReplyTuwenMessage(String fromUserName,String toUserName){

        ReplyTuwenMessage we = new ReplyTuwenMessage();

        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://bcs.duapp.com/yishi-music/111.jpg?sign=MBO:97068c69ccb2ab230a497c59d528dcce:hmzcBYxgI4yUaTd9GvahO1GvE%2BA%3D");
        item.setUrl("http://baike.baidu.com/view/6300265.htm");

        articles.setItem(item);
        we.setArticles(articles);

        XStream xstream = new XStream(new DomDriver());
        xstream.alias("xml", ReplyTuwenMessage.class);
        xstream.aliasField("ToUserName", ReplyTuwenMessage.class, "toUserName");
        xstream.aliasField("FromUserName", ReplyTuwenMessage.class, "fromUserName");
        xstream.aliasField("CreateTime", ReplyTuwenMessage.class, "createTime");
        xstream.aliasField("MsgType", ReplyTuwenMessage.class, "messageType");
        xstream.aliasField("Articles", ReplyTuwenMessage.class, "Articles");

        xstream.aliasField("ArticleCount", ReplyTuwenMessage.class, "articleCount");
        xstream.aliasField("FuncFlag", ReplyTuwenMessage.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;
    }

}

当你看到这里 说明你成功一半了,下面我们继续来完成这些小瑕疵

这时候需要:根据xml标签创建对应的实体类

实体类一:音乐消息

import com.util.Music;

/**
 * 音乐消息实体类
 */
public class ReplyMusicMessage {

    private String toUserName;
    private String fromUserName;
    private String createTime;
    private String messageType;
    private com.util.Music Music;
    private String funcFlag;
//这里的funcFlag,微信平台接口文档里没有,但是必须写上,不然会收不到返回的信息

    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 Music getMusic() {
        return Music;
    }

    public void setMusic(Music music) {
        Music = music;
    }

    public String getFuncFlag() {
        return funcFlag;
    }

    public void setFuncFlag(String funcFlag) {
        this.funcFlag = funcFlag;
    }
}

实体类二:文本消息(常用)

/**
 * 文本消息实体类
 */
public class ReplyTextMessage {

    private String toUserName;
    private String fromUserName;
    private String createTime;
    private String messageType;
    private String content;
    private String funcFlag;

    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;
    }
}

实体类三:图文消息(常用)

import com.util.Articles;

/**
 * 图文消息实体类
 */
public class ReplyTuwenMessage {

    private String toUserName;
    private String fromUserName;
    private String createTime;
    private String messageType;
    private int articleCount;

    private Articles articles;
    private String funcFlag;


    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) {
        this.articles = articles;
    }

    public String getFuncFlag() {
        return funcFlag;
    }

    public void setFuncFlag(String funcFlag) {
        this.funcFlag = funcFlag;
    }
}

请求消息实体类

/**
 * 请求消息实体类
 */
public class RequestTextMessage {
    private String toUserName;
    private String fromUserName;
    private String createTime;
    private String messageType;
    private String content;
    private String msgId;
//getters,setters

    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 getMsgId() {
        return msgId;
    }

    public void setMsgId(String msgId) {
        this.msgId = msgId;
    }
}

音乐消息实体类

/**
 * 音乐消息实体类
 */
public class Music {

    private String title;
    private String description;
    private String musicUrl;
    private String hqMusicUrl;
//getters,setters

    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 getMusicUrl() {
        return musicUrl;
    }

    public void setMusicUrl(String musicUrl) {
        this.musicUrl = musicUrl;
    }

    public String getHqMusicUrl() {
        return hqMusicUrl;
    }

    public void setHqMusicUrl(String hqMusicUrl) {
        this.hqMusicUrl = hqMusicUrl;
    }
}

xml嵌套标签实体类

/**
 * xml嵌套标签实体类
 */
public class Articles {

    private Item item;

    public Item getItem() {
        return item;
    }

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

xml嵌套标签实体类

/**
 * xml嵌套标签实体类
 */
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;
    }
}

当你看到这里 恭喜你  微信公众号自动回复的基础操作你已经学会了

后续还会有 在公众号基础上进行小活动开发 后续更新...

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Eclipse中各种文件的注释与取消注释的快捷键

下一篇:程序员写代码之外,如何再赚一份工资?