最近公司需要拿微信公眾平台做個東西,所以就開始了最基本學習,網上很多是php版的,對於我這個只會java,不會php的就只能在網上找點只言片語來一點一點學習了。不費話了直接貼圖看效果(很簡單的)。
不會做關注時就回復信息,所以必須先發送“?”,才能出現提示。回復“1”和“其他”都是返回文字信息,“2”是音樂信息,“3”是圖文信息。
好了,下面進入正題。
1、首先必須開通微信公中平台,還得申請到高級功能的(這個點比較坑,我等了兩天才申請到的),關於申請公眾平台我就不說了,網上很多介紹,自己看吧。
2、必須有自己的服務器資源,因為公眾平台開發者模式開啟時,必須填寫接口配置信息(成為開發者)。
服務器資源我是用的是百度開發者中心來創建自己的應用。百度開發者中心:http://developer.baidu.com/
成為微信公眾平台開發者前必須發布好自己的服務器資源,因為微信服務器將發送GET請求到填寫的URL上(后面詳細介紹)。
3、創建自己的應用。
這是整個項目結構。
下面逐一介紹:

1 public class WbChat extends HttpServlet{ 2 3 private static final long serialVersionUID = 1L; 4 5 public WbChat() { 6 super(); 7 } 8 @Override 9 protected void doGet(HttpServletRequest request, HttpServletResponse response) 10 throws ServletException, IOException { 11 //這里沒有對發送信息者進行驗證,直接返回了,要加驗證的話自己去百度吧 12 response.setContentType("text/html;charset=UTF-8"); 13 PrintWriter pw = response.getWriter(); 14 String echo = request.getParameter("echostr"); 15 echo = new String(echo.getBytes("ISO-8859-1"),"UTF-8"); 16 pw.println(echo); 17 //當你提交成為開發者的URL和Token時,微信服務器將發送GET請求到填寫的URL上, 18 //只有你返回參數echostr時,他才會認為你這個接口是通的,才會提交成功 19 } 20 21 @Override 22 protected void doPost(HttpServletRequest request, HttpServletResponse response) 23 throws ServletException, IOException { 24 // 當你用微信給平台發送信息時就會到這里 25 // 回復音樂和圖文消息,我都寫死了,自己可以根據自己的需要加相應的處理 26 response.setContentType("text/html;charset=UTF-8"); 27 PrintWriter pw = response.getWriter(); 28 String wxMsgXml = IOUtils.toString(request.getInputStream(),"utf-8"); 29 RequestTextMessage textMsg = null; 30 try { 31 textMsg = getRequestTextMessage(wxMsgXml); 32 } catch (Exception e) { 33 e.printStackTrace(); 34 } 35 StringBuffer replyMsg = new StringBuffer(); 36 String receive = textMsg.getContent().trim(); 37 String returnXml = null; 38 39 if (textMsg != null&&!receive.equals("")) { 40 if (receive.equals("?")||receive.equals("?")) { 41 42 replyMsg.append("歡迎使用微信平台!"); 43 replyMsg.append("\r\n1、當前時間"); 44 replyMsg.append("\r\n2、聽音樂"); 45 replyMsg.append("\r\n3、看圖文"); 46 replyMsg.append("\r\n其他、回音壁請直接輸入文字信息"); 47 48 returnXml = getReplyTextMessage(replyMsg.toString(), textMsg.getFromUserName(),textMsg.getToUserName()); 49 50 } else if (receive.equals("2")) { 51 52 //回復音樂信息 53 returnXml = getReplyMusicMessage(textMsg.getFromUserName(),textMsg.getToUserName()); 54 55 56 } else if (receive.equals("3")) { 57 58 //回復圖文 59 returnXml = getReplyTuwenMessage(textMsg.getFromUserName(),textMsg.getToUserName()); 60 61 } else if (receive.equals("1")) { 62 63 //回復時間 64 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 65 66 replyMsg.append("當前時間\r\n"+df.format(new Date())); 67 returnXml = getReplyTextMessage(replyMsg.toString(), textMsg.getFromUserName(),textMsg.getToUserName()); 68 69 } else { 70 71 replyMsg.append("收到: " + textMsg.getContent()); 72 returnXml = getReplyTextMessage(replyMsg.toString(), textMsg.getFromUserName(),textMsg.getToUserName()); 73 74 } 75 } else { 76 77 replyMsg.append("別鬧了,這誰看得懂啊!"); 78 returnXml = getReplyTextMessage(replyMsg.toString(), textMsg.getFromUserName(),textMsg.getToUserName()); 79 80 } 81 pw.println(returnXml); 82 } 83 84 85 // 獲取推送文本消息 86 private RequestTextMessage getRequestTextMessage(String xml){ 87 88 XStream xstream = new XStream(new DomDriver()); 89 90 xstream.alias("xml", RequestTextMessage.class); 91 xstream.aliasField("ToUserName", RequestTextMessage.class, "toUserName"); 92 xstream.aliasField("FromUserName", RequestTextMessage.class, "fromUserName"); 93 xstream.aliasField("CreateTime", RequestTextMessage.class, "createTime"); 94 xstream.aliasField("MsgType", RequestTextMessage.class, "messageType"); 95 xstream.aliasField("Content", RequestTextMessage.class, "content"); 96 xstream.aliasField("MsgId", RequestTextMessage.class, "msgId"); 97 98 RequestTextMessage requestTextMessage = (RequestTextMessage)xstream.fromXML(xml); 99 return requestTextMessage; 100 } 101 // 回復文本消息 102 private String getReplyTextMessage(String content, String fromUserName,String toUserName){ 103 104 ReplyTextMessage we = new ReplyTextMessage(); 105 we.setMessageType("text"); 106 we.setFuncFlag("0"); 107 we.setCreateTime(new Long(new Date().getTime()).toString()); 108 we.setContent(content); 109 we.setToUserName(fromUserName); 110 we.setFromUserName(toUserName); 111 XStream xstream = new XStream(new DomDriver()); 112 xstream.alias("xml", ReplyTextMessage.class); 113 xstream.aliasField("ToUserName", ReplyTextMessage.class, "toUserName"); 114 xstream.aliasField("FromUserName", ReplyTextMessage.class, "fromUserName"); 115 xstream.aliasField("CreateTime", ReplyTextMessage.class, "createTime"); 116 xstream.aliasField("MsgType", ReplyTextMessage.class, "messageType"); 117 xstream.aliasField("Content", ReplyTextMessage.class, "content"); 118 xstream.aliasField("FuncFlag", ReplyTextMessage.class, "funcFlag"); 119 String xml =xstream.toXML(we); 120 return xml; 121 } 122 // 回復音樂消息 123 private String getReplyMusicMessage(String fromUserName,String toUserName){ 124 125 ReplyMusicMessage we = new ReplyMusicMessage(); 126 Music music = new Music(); 127 128 we.setMessageType("music"); 129 we.setCreateTime(new Long(new Date().getTime()).toString()); 130 we.setToUserName(fromUserName); 131 we.setFromUserName(toUserName); 132 we.setFuncFlag("0"); 133 134 music.setTitle("回家|X-man"); 135 music.setDescription("薩克斯 回家 勾起你想家的愁思..."); 136 137 String url = "http://bcs.duapp.com/yishi-music/%E5%9B%9E%E5%AE%B6.mp3?sign=MBO:97068c69ccb2ab230a497c59d528dcce:LdYZ%2FLXohKa6YCy9gbxL%2B1mZ4Co%3D"; 138 String url2 = "http://bcs.duapp.com/yishi-music/X-man.mp3?sign=MBO:97068c69ccb2ab230a497c59d528dcce:cYV%2B%2Fq2Tlv2de6gqecZynCyIm3k%3D"; 139 music.setMusicUrl(url); 140 music.setHqMusicUrl(url2); 141 142 we.setMusic(music); 143 144 XStream xstream = new XStream(new DomDriver()); 145 xstream.alias("xml", ReplyMusicMessage.class); 146 xstream.aliasField("ToUserName", ReplyMusicMessage.class, "toUserName"); 147 xstream.aliasField("FromUserName", ReplyMusicMessage.class, "fromUserName"); 148 xstream.aliasField("CreateTime", ReplyMusicMessage.class, "createTime"); 149 xstream.aliasField("MsgType", ReplyMusicMessage.class, "messageType"); 150 xstream.aliasField("FuncFlag", ReplyMusicMessage.class, "funcFlag"); 151 xstream.aliasField("Music", ReplyMusicMessage.class, "Music"); 152 153 xstream.aliasField("Title", Music.class, "title"); 154 xstream.aliasField("Description", Music.class, "description"); 155 xstream.aliasField("MusicUrl", Music.class, "musicUrl"); 156 xstream.aliasField("HQMusicUrl", Music.class, "hqMusicUrl"); 157 158 String xml =xstream.toXML(we); 159 return xml; 160 } 161 162 // 回復圖文消息 163 private String getReplyTuwenMessage(String fromUserName,String toUserName){ 164 165 ReplyTuwenMessage we = new ReplyTuwenMessage(); 166 167 Articles articles = new Articles(); 168 169 Item item = new Item(); 170 171 we.setMessageType("news"); 172 we.setCreateTime(new Long(new Date().getTime()).toString()); 173 we.setToUserName(fromUserName); 174 we.setFromUserName(toUserName); 175 we.setFuncFlag("0"); 176 we.setArticleCount(1); 177 178 item.setTitle("俊介"); 179 item.setDescription("俊介(SHUNSUKE)是Twitter上現在最流行的偶像犬,是哈多利系博美犬(即俗稱英系博美),因為在網上賣萌而走紅網絡。"); 180 item.setPicUrl("http://bcs.duapp.com/yishi-music/111.jpg?sign=MBO:97068c69ccb2ab230a497c59d528dcce:hmzcBYxgI4yUaTd9GvahO1GvE%2BA%3D"); 181 item.setUrl("http://baike.baidu.com/view/6300265.htm"); 182 183 articles.setItem(item); 184 we.setArticles(articles); 185 186 XStream xstream = new XStream(new DomDriver()); 187 xstream.alias("xml", ReplyTuwenMessage.class); 188 xstream.aliasField("ToUserName", ReplyTuwenMessage.class, "toUserName"); 189 xstream.aliasField("FromUserName", ReplyTuwenMessage.class, "fromUserName"); 190 xstream.aliasField("CreateTime", ReplyTuwenMessage.class, "createTime"); 191 xstream.aliasField("MsgType", ReplyTuwenMessage.class, "messageType"); 192 xstream.aliasField("Articles", ReplyTuwenMessage.class, "Articles"); 193 194 xstream.aliasField("ArticleCount", ReplyTuwenMessage.class, "articleCount"); 195 xstream.aliasField("FuncFlag", ReplyTuwenMessage.class, "funcFlag"); 196 197 xstream.aliasField("item", Articles.class, "item"); 198 199 xstream.aliasField("Title", Item.class, "title"); 200 xstream.aliasField("Description", Item.class, "description"); 201 xstream.aliasField("PicUrl", Item.class, "picUrl"); 202 xstream.aliasField("Url", Item.class, "url"); 203 204 String xml =xstream.toXML(we); 205 return xml; 206 } 207 208 }

1 public class ReplyMusicMessage { 2 3 private String toUserName; 4 private String fromUserName; 5 private String createTime; 6 private String messageType; 7 private Music Music; 8 private String funcFlag; 9 //這里的funcFlag,微信平台接口文檔里沒有,但是必須寫上,不然會收不到返回的信息 10 //getters、setters 11 }

1 public class ReplyTextMessage { 2 3 private String toUserName; 4 private String fromUserName; 5 private String createTime; 6 private String messageType; 7 private String content; 8 private String funcFlag; 9 // getters,setters 10 }

1 public class ReplyTuwenMessage { 2 3 private String toUserName; 4 private String fromUserName; 5 private String createTime; 6 private String messageType; 7 private int articleCount; 8 9 private Articles Articles; 10 private String funcFlag; 11 //getters,setters 12 }

1 public class RequestTextMessage { 2 private String toUserName; 3 private String fromUserName; 4 private String createTime; 5 private String messageType; 6 private String content; 7 private String msgId; 8 //getters,setters 9 }

1 public class Articles { 2 3 private Item item; 4 5 public Item getItem() { 6 return item; 7 } 8 9 public void setItem(Item item) { 10 this.item = item; 11 } 12 13 14 }

1 public class Item { 2 3 private String title; 4 private String description; 5 private String picUrl; 6 private String url; 7 //getters,setters 8 }

1 public class Music { 2 3 private String title; 4 private String description; 5 private String musicUrl; 6 private String hqMusicUrl; 7 //getters,setters 8 }

1 <servlet> 2 <servlet-name>Test</servlet-name> 3 <servlet-class>com.main.WbChat</servlet-class> 4 </servlet> 5 <servlet-mapping> 6 <servlet-name>Test</servlet-name> 7 <url-pattern>/wbchat</url-pattern> 8 </servlet-mapping>
還要加四個jar包:
利用MyEclipse直接把工程打為war包,上傳到百度開發者中心,並上線該應用。
4、成為開發者,開啟開發模式。
將百度開發者中心中的當前域名+/wbchat 添加到微信平台的URL處,Token可以隨便填(因為我沒有判斷Token)。
5、大功告成,可以在微信上添加該公眾賬號聊天了。
小提示:
1、調試時,微信發送消息卻沒有受到信息,可以去看看百度開發者中心,在應用版本管理中找到該應用,然后點擊高級下的日志,查看日志來看出什么問題了
2、下載jar包地址:http://jarfiles.pandaidea.com/
3、不要聽百度開發者中心說的那個”如何提交代碼“,它是使用svn,它給的下載svn地址下的是svn1.8的,根本就checkout不了工程,如果想使用svn的話,就得去下載svn1.6的版本來使用。我是使用上傳更新war包來更新工程的,這樣在自己的MyEclipse中直接編寫。