微信開發之消息接收與回復--weixin-java-tools


一、前言

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

 


免責聲明!

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



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