利用微信公眾平台實現自動回復消息—java版


最近公司需要拿微信公眾平台做個東西,所以就開始了最基本學習,網上很多是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 }
WbChat
 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 }
ReplyMusicMessage
 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 }
ReplyTextMessage
 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 }
ReplyTuwenMessage
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 }
RequestTextMessage
 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 }
Articles
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 }
Item
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 }
Music
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>
web.xml配置

還要加四個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中直接編寫。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM