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