经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
微信公众号自动回复_Java
来源:cnblogs  作者:siwei_Wu  时间:2019/1/9 9:51:03  对本文有异议
  1. 先声明一下,这是一个maven工程
    pom文件需要的依赖:
  1. 1 <dependency>
  2. 2 <groupId>dom4j</groupId>
  3. 3 <artifactId>dom4j</artifactId>
  4. 4 <version>1.6</version>
  5. 5 </dependency>
  6. 6 <dependency>
  7. 7 <groupId>commons-io</groupId>
  8. 8 <artifactId>commons-io</artifactId>
  9. 9 <version>2.5</version>
  10. 10 </dependency>
  11. 11 <dependency>
  12. 12 <groupId>com.thoughtworks.xstream</groupId>
  13. 13 <artifactId>xstream</artifactId>
  14. 14 <version>1.4.9</version>
  15. 15 </dependency>
  16. 16 <dependency>
  17. 17 <groupId>javax.servlet</groupId>
  18. 18 <artifactId>javax.servlet-api</artifactId>
  19. 19 <version>3.1.0</version>
  20. 20 </dependency>

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

微信文本消息的参数:

  1. <xml>
  2. <ToUserName><![CDATA[toUser]]></ToUserName>
  3. <FromUserName><![CDATA[fromUser]]></FromUserName>
  4. <CreateTime>1348831860</CreateTime>
  5. <MsgType><![CDATA[text]]></MsgType>
  6. <Content><![CDATA[this is a test]]></Content>
  7. <MsgId>1234567890123456</MsgId>
  8. </xml>
  9. <!--参数 描述
  10. ToUserName 开发者微信号
  11. FromUserName 发送方帐号(一个OpenID)
  12. CreateTime 消息创建时间 (整型)
  13. MsgType text
  14. Content 文本消息内容
  15. MsgId 消息id,64位整型
  16. -->

微信回复文本消息的参数

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

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

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

 

二话不说 先附上主代码:

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

  1. import com.replymessage.*;
  2. import com.requestmessage.RequestTextMessage;
  3. import com.thoughtworks.xstream.XStream;
  4. import com.thoughtworks.xstream.io.xml.DomDriver;
  5. import com.util.Articles;
  6. import com.util.Item;
  7. import com.util.Music;
  8. import org.apache.commons.io.IOUtils;
  9. import javax.servlet.ServletException;
  10. import javax.servlet.http.HttpServlet;
  11. import javax.servlet.http.HttpServletRequest;
  12. import javax.servlet.http.HttpServletResponse;
  13. import java.io.IOException;
  14. import java.io.PrintWriter;
  15. import java.text.SimpleDateFormat;
  16. import java.util.Date;
  17. /**
  18. * 微信回复消息
  19. */
  20. public class WbChat extends HttpServlet {
  21. private static final long serialVersionUID = 1L;
  22. public WbChat() {
  23. super();
  24. }
  25. @Override
  26. protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
  27. //这里没有对发送信息者进行验证,直接返回了,要加验证的话自己去百度吧
  28. response.setContentType("text/html;charset=UTF-8");
  29. PrintWriter writer = response.getWriter();
  30. String echostr = request.getParameter("echostr");
  31. echostr = new String(echostr.getBytes("ISO-8859-1"),"UTF-8");
  32. writer.println(echostr);
  33. //当你提交成为开发者的URL和Token时,微信服务器将发送GET请求到填写的URL上,
  34. //只有你返回参数echostr时,他才会认为你这个接口是通的,才会提交成功
  35. }
  36. @Override
  37. protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
  38. //当你用微信给平台发送信息时就会到这里
  39. //回复音乐和图文消息,都写死了,自己可以根据自己的需要加相应的处理
  40. response.setContentType("text/html;charset=UTF-8");
  41. PrintWriter pw = response.getWriter();
  42. String wxMsgXml = IOUtils.toString(request.getInputStream(),"utf-8");
  43. RequestTextMessage textMsg = null;
  44. try {
  45. textMsg = getRequestTextMessage(wxMsgXml);
  46. } catch (Exception e) {
  47. e.printStackTrace();
  48. }
  49. StringBuffer replyMsg = new StringBuffer();
  50. String receive = textMsg.getContent().trim();
  51. String returnXml = null;
  52. if (textMsg != null&&!receive.equals("")) {
  53. if (receive.equals("?")||receive.equals("?")) {
  54. replyMsg.append("欢迎使用微信平台!");
  55. replyMsg.append("\r\n1、当前时间");
  56. replyMsg.append("\r\n2、听音乐");
  57. replyMsg.append("\r\n3、看图文");
  58. replyMsg.append("\r\n其他、请直接输入文字信息等待管理员回复");
  59. returnXml = getReplyTextMessage(replyMsg.toString(), textMsg.getFromUserName(),textMsg.getToUserName());
  60. } else if (receive.equals("2")) {
  61. //回复音乐信息
  62. returnXml = getReplyMusicMessage(textMsg.getFromUserName(),textMsg.getToUserName());
  63. } else if (receive.equals("3")) {
  64. //回复图文
  65. returnXml = getReplyTuwenMessage(textMsg.getFromUserName(),textMsg.getToUserName());
  66. } else if (receive.equals("1")) {
  67. //回复时间
  68. SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  69. replyMsg.append("当前时间\r\n"+df.format(new Date()));
  70. returnXml = getReplyTextMessage(replyMsg.toString(), textMsg.getFromUserName(),textMsg.getToUserName());
  71. } else {
  72. replyMsg.append("收到: " + textMsg.getContent());
  73. returnXml = getReplyTextMessage(replyMsg.toString(), textMsg.getFromUserName(),textMsg.getToUserName());
  74. }
  75. } else {
  76. replyMsg.append("别闹了,这谁看得懂啊!");
  77. returnXml = getReplyTextMessage(replyMsg.toString(), textMsg.getFromUserName(),textMsg.getToUserName());
  78. }
  79. pw.println(returnXml);
  80. }
  81. //获取推送文本消息
  82. private RequestTextMessage getRequestTextMessage(String xml){
  83. XStream xstream = new XStream(new DomDriver());
  84. xstream.alias("xml", RequestTextMessage.class);
  85. xstream.aliasField("ToUserName", RequestTextMessage.class, "toUserName");
  86. xstream.aliasField("FromUserName", RequestTextMessage.class, "fromUserName");
  87. xstream.aliasField("CreateTime", RequestTextMessage.class, "createTime");
  88. xstream.aliasField("MsgType", RequestTextMessage.class, "messageType");
  89. xstream.aliasField("Content", RequestTextMessage.class, "content");
  90. xstream.aliasField("MsgId", RequestTextMessage.class, "msgId");
  91. RequestTextMessage requestTextMessage = (RequestTextMessage)xstream.fromXML(xml);
  92. return requestTextMessage;
  93. }
  94. //回复文本消息
  95. private String getReplyTextMessage(String content, String fromUserName,String toUserName){
  96. ReplyTextMessage we = new ReplyTextMessage();
  97. we.setMessageType("text");
  98. we.setFuncFlag("0");
  99. we.setCreateTime(new Long(new Date().getTime()).toString());
  100. we.setContent(content);
  101. we.setToUserName(fromUserName);
  102. we.setFromUserName(toUserName);
  103. XStream xstream = new XStream(new DomDriver());
  104. xstream.alias("xml", ReplyTextMessage.class);
  105. xstream.aliasField("ToUserName", ReplyTextMessage.class, "toUserName");
  106. xstream.aliasField("FromUserName", ReplyTextMessage.class, "fromUserName");
  107. xstream.aliasField("CreateTime", ReplyTextMessage.class, "createTime");
  108. xstream.aliasField("MsgType", ReplyTextMessage.class, "messageType");
  109. xstream.aliasField("Content", ReplyTextMessage.class, "content");
  110. xstream.aliasField("FuncFlag", ReplyTextMessage.class, "funcFlag");
  111. String xml =xstream.toXML(we);
  112. return xml;
  113. }
  114. //回复音乐消息
  115. private String getReplyMusicMessage(String fromUserName,String toUserName){
  116. ReplyMusicMessage we = new ReplyMusicMessage();
  117. Music music = new Music();
  118. we.setMessageType("music");
  119. we.setCreateTime(new Long(new Date().getTime()).toString());
  120. we.setToUserName(fromUserName);
  121. we.setFromUserName(toUserName);
  122. we.setFuncFlag("0");
  123. music.setTitle("home");
  124. music.setDescription(" family 想家了吗");
  125. String url = "http://bcs.duapp.com/yishi-music/%E5%9B%9E%E5%AE%B6.mp3?sign=MBO:97068c69ccb2ab230a497c59d528dcce:LdYZ%2FLXohKa6YCy9gbxL%2B1mZ4Co%3D";
  126. String url2 = "http://bcs.duapp.com/yishi-music/X-man.mp3?sign=MBO:97068c69ccb2ab230a497c59d528dcce:cYV%2B%2Fq2Tlv2de6gqecZynCyIm3k%3D";
  127. music.setMusicUrl(url);
  128. music.setHqMusicUrl(url2);
  129. we.setMusic(music);
  130. XStream xstream = new XStream(new DomDriver());
  131. xstream.alias("xml", ReplyMusicMessage.class);
  132. xstream.aliasField("ToUserName", ReplyMusicMessage.class, "toUserName");
  133. xstream.aliasField("FromUserName", ReplyMusicMessage.class, "fromUserName");
  134. xstream.aliasField("CreateTime", ReplyMusicMessage.class, "createTime");
  135. xstream.aliasField("MsgType", ReplyMusicMessage.class, "messageType");
  136. xstream.aliasField("FuncFlag", ReplyMusicMessage.class, "funcFlag");
  137. xstream.aliasField("Music", ReplyMusicMessage.class, "Music");
  138. xstream.aliasField("Title", Music.class, "title");
  139. xstream.aliasField("Description", Music.class, "description");
  140. xstream.aliasField("MusicUrl", Music.class, "musicUrl");
  141. xstream.aliasField("HQMusicUrl", Music.class, "hqMusicUrl");
  142. String xml =xstream.toXML(we);
  143. return xml;
  144. }
  145. //回复图文消息
  146. private String getReplyTuwenMessage(String fromUserName,String toUserName){
  147. ReplyTuwenMessage we = new ReplyTuwenMessage();
  148. Articles articles = new Articles();
  149. Item item = new Item();
  150. we.setMessageType("news");
  151. we.setCreateTime(new Long(new Date().getTime()).toString());
  152. we.setToUserName(fromUserName);
  153. we.setFromUserName(toUserName);
  154. we.setFuncFlag("0");
  155. we.setArticleCount(1);
  156. item.setTitle("二哈");
  157. item.setDescription("二哈(SHUNSUKE)是Twitter上现在最流行的偶像犬,是一条傻狗,因为在网上装疯扮傻而走红网络。");
  158. item.setPicUrl("http://bcs.duapp.com/yishi-music/111.jpg?sign=MBO:97068c69ccb2ab230a497c59d528dcce:hmzcBYxgI4yUaTd9GvahO1GvE%2BA%3D");
  159. item.setUrl("http://baike.baidu.com/view/6300265.htm");
  160. articles.setItem(item);
  161. we.setArticles(articles);
  162. XStream xstream = new XStream(new DomDriver());
  163. xstream.alias("xml", ReplyTuwenMessage.class);
  164. xstream.aliasField("ToUserName", ReplyTuwenMessage.class, "toUserName");
  165. xstream.aliasField("FromUserName", ReplyTuwenMessage.class, "fromUserName");
  166. xstream.aliasField("CreateTime", ReplyTuwenMessage.class, "createTime");
  167. xstream.aliasField("MsgType", ReplyTuwenMessage.class, "messageType");
  168. xstream.aliasField("Articles", ReplyTuwenMessage.class, "Articles");
  169. xstream.aliasField("ArticleCount", ReplyTuwenMessage.class, "articleCount");
  170. xstream.aliasField("FuncFlag", ReplyTuwenMessage.class, "funcFlag");
  171. xstream.aliasField("item", Articles.class, "item");
  172. xstream.aliasField("Title", Item.class, "title");
  173. xstream.aliasField("Description", Item.class, "description");
  174. xstream.aliasField("PicUrl", Item.class, "picUrl");
  175. xstream.aliasField("Url", Item.class, "url");
  176. String xml =xstream.toXML(we);
  177. return xml;
  178. }
  179. }

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

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

实体类一:音乐消息

  1. import com.util.Music;
  2. /**
  3. * 音乐消息实体类
  4. */
  5. public class ReplyMusicMessage {
  6. private String toUserName;
  7. private String fromUserName;
  8. private String createTime;
  9. private String messageType;
  10. private com.util.Music Music;
  11. private String funcFlag;
  12. //这里的funcFlag,微信平台接口文档里没有,但是必须写上,不然会收不到返回的信息
  13.  
  14. public String getToUserName() {
  15. return toUserName;
  16. }
  17. public void setToUserName(String toUserName) {
  18. this.toUserName = toUserName;
  19. }
  20. public String getFromUserName() {
  21. return fromUserName;
  22. }
  23. public void setFromUserName(String fromUserName) {
  24. this.fromUserName = fromUserName;
  25. }
  26. public String getCreateTime() {
  27. return createTime;
  28. }
  29. public void setCreateTime(String createTime) {
  30. this.createTime = createTime;
  31. }
  32. public String getMessageType() {
  33. return messageType;
  34. }
  35. public void setMessageType(String messageType) {
  36. this.messageType = messageType;
  37. }
  38. public Music getMusic() {
  39. return Music;
  40. }
  41. public void setMusic(Music music) {
  42. Music = music;
  43. }
  44. public String getFuncFlag() {
  45. return funcFlag;
  46. }
  47. public void setFuncFlag(String funcFlag) {
  48. this.funcFlag = funcFlag;
  49. }
  50. }

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

  1. /**
  2. * 文本消息实体类
  3. */
  4. public class ReplyTextMessage {
  5. private String toUserName;
  6. private String fromUserName;
  7. private String createTime;
  8. private String messageType;
  9. private String content;
  10. private String funcFlag;
  11. public String getToUserName() {
  12. return toUserName;
  13. }
  14. public void setToUserName(String toUserName) {
  15. this.toUserName = toUserName;
  16. }
  17. public String getFromUserName() {
  18. return fromUserName;
  19. }
  20. public void setFromUserName(String fromUserName) {
  21. this.fromUserName = fromUserName;
  22. }
  23. public String getCreateTime() {
  24. return createTime;
  25. }
  26. public void setCreateTime(String createTime) {
  27. this.createTime = createTime;
  28. }
  29. public String getMessageType() {
  30. return messageType;
  31. }
  32. public void setMessageType(String messageType) {
  33. this.messageType = messageType;
  34. }
  35. public String getContent() {
  36. return content;
  37. }
  38. public void setContent(String content) {
  39. this.content = content;
  40. }
  41. public String getFuncFlag() {
  42. return funcFlag;
  43. }
  44. public void setFuncFlag(String funcFlag) {
  45. this.funcFlag = funcFlag;
  46. }
  47. }

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

  1. import com.util.Articles;
  2. /**
  3. * 图文消息实体类
  4. */
  5. public class ReplyTuwenMessage {
  6. private String toUserName;
  7. private String fromUserName;
  8. private String createTime;
  9. private String messageType;
  10. private int articleCount;
  11. private Articles articles;
  12. private String funcFlag;
  13. public String getToUserName() {
  14. return toUserName;
  15. }
  16. public void setToUserName(String toUserName) {
  17. this.toUserName = toUserName;
  18. }
  19. public String getFromUserName() {
  20. return fromUserName;
  21. }
  22. public void setFromUserName(String fromUserName) {
  23. this.fromUserName = fromUserName;
  24. }
  25. public String getCreateTime() {
  26. return createTime;
  27. }
  28. public void setCreateTime(String createTime) {
  29. this.createTime = createTime;
  30. }
  31. public String getMessageType() {
  32. return messageType;
  33. }
  34. public void setMessageType(String messageType) {
  35. this.messageType = messageType;
  36. }
  37. public int getArticleCount() {
  38. return articleCount;
  39. }
  40. public void setArticleCount(int articleCount) {
  41. this.articleCount = articleCount;
  42. }
  43. public Articles getArticles() {
  44. return articles;
  45. }
  46. public void setArticles(Articles articles) {
  47. this.articles = articles;
  48. }
  49. public String getFuncFlag() {
  50. return funcFlag;
  51. }
  52. public void setFuncFlag(String funcFlag) {
  53. this.funcFlag = funcFlag;
  54. }
  55. }

请求消息实体类

  1. /**
  2. * 请求消息实体类
  3. */
  4. public class RequestTextMessage {
  5. private String toUserName;
  6. private String fromUserName;
  7. private String createTime;
  8. private String messageType;
  9. private String content;
  10. private String msgId;
  11. //getters,setters
  12.  
  13. public String getToUserName() {
  14. return toUserName;
  15. }
  16. public void setToUserName(String toUserName) {
  17. this.toUserName = toUserName;
  18. }
  19. public String getFromUserName() {
  20. return fromUserName;
  21. }
  22. public void setFromUserName(String fromUserName) {
  23. this.fromUserName = fromUserName;
  24. }
  25. public String getCreateTime() {
  26. return createTime;
  27. }
  28. public void setCreateTime(String createTime) {
  29. this.createTime = createTime;
  30. }
  31. public String getMessageType() {
  32. return messageType;
  33. }
  34. public void setMessageType(String messageType) {
  35. this.messageType = messageType;
  36. }
  37. public String getContent() {
  38. return content;
  39. }
  40. public void setContent(String content) {
  41. this.content = content;
  42. }
  43. public String getMsgId() {
  44. return msgId;
  45. }
  46. public void setMsgId(String msgId) {
  47. this.msgId = msgId;
  48. }
  49. }

音乐消息实体类

  1. /**
  2. * 音乐消息实体类
  3. */
  4. public class Music {
  5. private String title;
  6. private String description;
  7. private String musicUrl;
  8. private String hqMusicUrl;
  9. //getters,setters
  10.  
  11. public String getTitle() {
  12. return title;
  13. }
  14. public void setTitle(String title) {
  15. this.title = title;
  16. }
  17. public String getDescription() {
  18. return description;
  19. }
  20. public void setDescription(String description) {
  21. this.description = description;
  22. }
  23. public String getMusicUrl() {
  24. return musicUrl;
  25. }
  26. public void setMusicUrl(String musicUrl) {
  27. this.musicUrl = musicUrl;
  28. }
  29. public String getHqMusicUrl() {
  30. return hqMusicUrl;
  31. }
  32. public void setHqMusicUrl(String hqMusicUrl) {
  33. this.hqMusicUrl = hqMusicUrl;
  34. }
  35. }

xml嵌套标签实体类

  1. /**
  2. * xml嵌套标签实体类
  3. */
  4. public class Articles {
  5. private Item item;
  6. public Item getItem() {
  7. return item;
  8. }
  9. public void setItem(Item item) {
  10. this.item = item;
  11. }
  12. }

xml嵌套标签实体类

  1. /**
  2. * xml嵌套标签实体类
  3. */
  4. public class Item {
  5. private String title;
  6. private String description;
  7. private String picUrl;
  8. private String url;
  9. public String getTitle() {
  10. return title;
  11. }
  12. public void setTitle(String title) {
  13. this.title = title;
  14. }
  15. public String getDescription() {
  16. return description;
  17. }
  18. public void setDescription(String description) {
  19. this.description = description;
  20. }
  21. public String getPicUrl() {
  22. return picUrl;
  23. }
  24. public void setPicUrl(String picUrl) {
  25. this.picUrl = picUrl;
  26. }
  27. public String getUrl() {
  28. return url;
  29. }
  30. public void setUrl(String url) {
  31. this.url = url;
  32. }
  33. }

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

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

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号