微信开发之消息接收与回复--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开发起来更轻松呢??希望本博文对大家的学习有所帮助,写得不好的地方也欢迎园友们指正,千里之行,始于足下,我们对微信开发又有了进一步的了解了。还有其他的几种消息回复,就留给各位自行实践,如有问题,欢迎各位再评论区进行评论,互相学习,谢谢大家。

 

posted @ 2016-05-29 13:48  Code猿猿  阅读(10779)  评论(1编辑  收藏  举报