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