一、前言
在上一篇文章《微信開發之如何使用開發工具--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開發起來更輕松呢??希望本博文對大家的學習有所幫助,寫得不好的地方也歡迎園友們指正,千里之行,始於足下,我們對微信開發又有了進一步的了解了。還有其他的幾種消息回復,就留給各位自行實踐,如有問題,歡迎各位再評論區進行評論,互相學習,謝謝大家。