一、前言
在上一篇文章《微信開發之如何使用開發工具--weixin-java-tools》中我給各位介紹了weixin-java-tools,並且介紹了如何使用weixin-java-tools接入我們微信開發者模式,本次就針對這個工具給大家介紹消息的接收與回復
二、消息接收與回復
先來說說接收消息, 當普通微信用戶向公眾賬號發消息時,微信服務器會先接收到用戶發送的消息,然后將用戶消息按照指定的XML格式組裝好數據,最后POST消息的XML數據包到開發者填寫的URL上。
接收到的普通消息的消息類型目前有以下幾種:
1 文本消息
2 圖片消息
3 語音消息
4 視頻消息
5 小視頻消息
6 地理位置消息
7 鏈接消息
每一種消息類型都有其指定的XML數據格式,這7種消息的xml格式請到官方文檔查看,有具體的格式定義和屬性說明。格式很簡單,基本共有屬性包括ToUserName、FromUserName、CreateTime、MsgType、MsgId,並且每種類型有自己特殊的屬性。
接收消息的過程其實就是獲取post請求的這個xml,然后對這個xml進行分析的過程。post請求的入口還是之前提到的微信公眾號接入的那個地址,整個公眾號的所有請求都會走這個入口,只是接入時是get請求,其它情況下是post請求。
weixin-java-tools提供了消息的處理類 WxMpXmlMessage 如下是該類的使用
//獲取消息流 WxMpXmlMessage message=WxMpXmlMessage.fromXml(request.getInputStream()); //我們可以根據WxMpXmlMessage類中的屬性 獲取xml中的信息 //例如: //消息類型 String messageType=message.getMsgType(); //消息類型 //發送者帳號 String fromUser=message.getFromUserName(); //開發者微信號 String touser=message.getToUserName(); //文本消息 文本內容 String content=message.getContent();
下面我基於這樣一個業務場景來演示構造回復的消息,接收到文本消息"文本",回復文本消息;接收到“圖片”,回復圖片消息;接收到“音樂”,回復音樂消息;下面具體說明各幾種消息的構造,注意weixin-java-tools的使用
public void doService(WxMpXmlMessage message,HttpServletResponse response){
//配置微信參數 獲取wxService
WxMpService wxService=new WxMpServiceImpl();
//微信配置參數
WxMpInMemoryConfigStorage wxConfigProvider=new WxMpInMemoryConfigStorage();
wxConfigProvider.setAppId("wx60a8f1c3a95b0b9c");
wxConfigProvider.setSecret("5b0e8613b538da5ac4bbc610998f10ba");
wxService.setWxMpConfigStorage(wxConfigProvider);
//消息處理
String messageType=message.getMsgType(); //消息類型
String fromUser=message.getFromUserName();
String touser=message.getToUserName();
String content=message.getContent();
//文本消息
if(content.equals("文本")){
System.out.println("文本消息========");
//創建消息文本
WxMpXmlOutTextMessage text=WxMpXmlOutTextMessage.TEXT().toUser(fromUser).fromUser(touser).content("我是文本消息").build();
String xml=text.toXml();
System.out.println("xml:"+xml);
PrintWriter out=null;
try {
out = response.getWriter();
out.print(xml);
} catch (IOException e) {
out.close();
out=null;
e.printStackTrace();
}
out.close();
out=null;
}
//圖片消息
if(content.equals("圖片")){
System.out.println("圖片消息==============");
//創建file對象
File file=new File("C:\\Users\\Zhangsy\\Desktop\\二維碼.jpg");
WxMediaUploadResult result=null;
try {
result=wxService.mediaUpload(WxConsts.MEDIA_IMAGE, file);
} catch (WxErrorException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
if(result!=null){
String mediaId=result.getMediaId();
WxMpXmlOutImageMessage image=WxMpXmlOutImageMessage.IMAGE().toUser(fromUser).fromUser(touser).mediaId(mediaId).build();
String xml=image.toXml();
System.out.println("xml:"+xml);
PrintWriter out=null;
try {
out = response.getWriter();
out.print(xml);
} catch (IOException e) {
out.close();
out=null;
e.printStackTrace();
}
out.close();
out=null;
}
}
if(content.equals("音樂")){
System.out.println("音樂消息==============");
//上傳素材 獲取mediaid
//創建file對象
File file=new File("F:\\Music\\music.mp3");
WxMediaUploadResult result=null;
try {
result=wxService.mediaUpload(WxConsts.MEDIA_VOICE, file);
} catch (WxErrorException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
if(result!=null){
String mediaId=result.getMediaId();
WxMpXmlOutMusicMessage music=WxMpXmlOutMusicMessage.MUSIC().toUser(fromUser).fromUser(touser).title("Hello小姐.mp3").description("Hello小姐").musicUrl("http://weixindemo123.ngrok.cc/weixin/media/music.mp3").hqMusicUrl("http://weixindemo123.ngrok.cc/weixin/media/music.mp3").thumbMediaId(mediaId).build();
String xml=music.toXml();
System.out.println("xml:"+xml);
PrintWriter out=null;
try {
out = response.getWriter();
out.print(xml);
} catch (IOException e) {
out.close();
out=null;
e.printStackTrace();
}
out.close();
out=null;
}
}
}
構造文本消息方法:
WxMpXmlOutTextMessage text=WxMpXmlOutTextMessage.TEXT().toUser(fromUser).fromUser(touser).content("我是文本消息").build();
String xml=text.toXml();
構造圖片消息:
WxMpXmlOutImageMessage image=WxMpXmlOutImageMessage.IMAGE().toUser(fromUser).fromUser(touser).mediaId(mediaId).build();
String xml=image.toXml();
構造音樂消息:
WxMpXmlOutMusicMessage music=WxMpXmlOutMusicMessage.MUSIC().toUser(fromUser).fromUser(touser).title("Hello小姐.mp3").description("Hello小姐").musicUrl("http://weixindemo123.ngrok.cc/weixin/media/music.mp3").hqMusicUrl("http://weixindemo123.ngrok.cc/weixin/media/music.mp3").thumbMediaId(mediaId).build();
String xml=music.toXml();
需要注意的是:
回復消息中,除了文本消息外,其他的消息類型都屬於多媒體消息,需要我們上傳多媒體文件來獲取mediaId,(拿音樂消息舉例),我事先准備好音樂文件,如下圖所示:

音樂消息需要我們通過 WxMpService.mediaUpload 方法上傳音樂文件(具體的上傳方法,請參照上面的核心代碼),並獲取mediaId。另外,音樂消息構造中用到musicUrl,因此我們需要保證音樂可以正常外網訪問,如下圖所示:

三、測試
如下是測試截圖:

以上就是關於微信公眾號的普通消息的接收和回復的全部內容了,各位有沒有覺得使用weixin-java-tools開發起來更輕松呢??希望本博文對大家的學習有所幫助,寫得不好的地方也歡迎園友們指正,千里之行,始於足下,我們對微信開發又有了進一步的了解了。還有其他的幾種消息回復,就留給各位自行實踐,如有問題,歡迎各位再評論區進行評論,互相學習,謝謝大家。
