一、前言

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

微信开发之消息接收与回复--weixin-java-tools的更多相关文章

  1. Java企业微信开发_05_消息推送之被动回复消息

    一.本节要点 1.消息的加解密 微信加解密包 下载地址:http://qydev.weixin.qq.com/java.zip      ,此包中封装好了AES加解密方法,直接调用方法即可. 其中,解 ...

  2. 使用flask搭建微信公众号:接收与回复消息

    token验证的意义 在看了别人的代码之后对token加密有了些理解了.但又觉得很鸡肋.第一次验证服务器的时候我在那弄了半天的验证其实不写也可以验证成功,只要直接返回echostr这个字段就行了.微信 ...

  3. C#微信开发之旅--基本信息的回复

    上一篇说到配置和验证<C#微信开发之旅--准备阶段> 下面来实现一下简单的信息回复. 也就是接收XML,返回XML 可以去看下微信开发文档的说明:http://mp.weixin.qq.c ...

  4. Java企业微信开发_05_消息推送之发送消息(主动)

    一.本节要点 1.发送消息与被动回复消息 (1)流程不同:发送消息是第三方服务器主动通知微信服务器向用户发消息.而被动回复消息是 用户发送消息之后,微信服务器将消息传递给 第三方服务器,第三方服务器接 ...

  5. Java企业微信开发_04_消息推送之发送消息(主动)

    源码请见: Java企业微信开发_00_源码及资源汇总贴 一.本节要点 1.发送消息与被动回复消息 (1)流程不同:发送消息是第三方服务器主动通知微信服务器向用户发消息.而被动回复消息是 用户发送消息 ...

  6. .NET 微信Token验证和消息接收和回复

    public class wxXmlModel { public string ToUserName { get; set; } public string FromUserName { get; s ...

  7. thinkphp微信开发(消息加密解密)

    使用thinkphp官方的WeChat包,使用不同模式可以成功,但是安全模式就是不行,现将分析解决结果做下记录. 分析问题: 解密微信服务器消息老是不成功,下载下微信公众平台官方给出的解密文件和Wec ...

  8. Java企业微信开发_13_异常:com.qq.weixin.mp.aes.AesException: 解密后得到的buffer非法

    一.异常信息 方法:POST@ echostr是否存在 :false java.lang.IllegalArgumentException: 20 > -367029533 at java.ut ...

  9. NETSHARP微信开发说明

    一.微信开发介绍 1.微信分为个人号,订阅号.服务号,需要去理解三个号的区别,对于开发来说也需要了解不同的账号所提供的功能 2.微信号需要审批,审批之后有一些功能才能使用 3.微信提供的功能及使用情况 ...

随机推荐

  1. hdu 1686 Oulipo (kmp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1686 题目大意:寻找子链在母链中出现的次数. #include <iostream> #i ...

  2. SAR图像处理 MSTAR数据库利用问题

    本人最近刚接手的新活,打算从事SAR目标识别的研究,从美国的mstar数据库中下到一些资源,但是这些数据并不是原始图片的格式,需要转换,由于刚刚接触,并不太了解,所以特此请教!如有感兴趣的朋友可以一起 ...

  3. HDU 4344 大数分解大素数判定

    这里贴个模板吧.反正是不太理解 看原题就可以理解用法!! #include <cstdio> #include <iostream> #include <algorith ...

  4. linux 中解析命令行参数(getopt_long用法)

    linux 中解析命令行参数(getopt_long用法) http://www.educity.cn/linux/518242.html 详细解析命令行的getopt_long()函数 http:/ ...

  5. C#中文乱码转换

    string text="中文";string keyword;byte[] buffer= Encoding.UTF8.GetBytes(text);keyword=Encodi ...

  6. C++ Primer 阅读笔记:迭代器和容器 小结

    原创 by zoe.zhang  0.写在前面的话 我是在2011年学的C++,但是那一年恰好是C++11新标准的一年,但是大学上学的C++还是基于C++98的风格的,使用的编译器也是VC6.0,啊, ...

  7. codevs 1085

    数字游戏 2003年NOIP全国联赛普及组 时间限制: s 空间限制: KB 题目等级 : 黄金 Gold 题解 题目描述 Description 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但 ...

  8. 【SQL】约束与触发器1

    一.外键 1.1特点 表A的外键,一定是其他某个表B的主键或有UNIQUE声明的属性. A的外键的值,一定是对应表B中相应的属性值.(空值除外) 1.2声明方法 方法1:属性名 类型 REFERENC ...

  9. Android 欢迎界面淡入效果并用WebView加载网址

    1.首先是欢迎界面布局文件,只有一个背景图片:welcome.xml: <?xml version="1.0" encoding="utf-8"?> ...

  10. jquery事件之select选中事件

    根据select下拉列表选中的不同选项执行不同的方法,工作中经常会用到,这里就要用到Jquery的select选中事件 这里给select加一个叫label_id的id,然后通过id选择器找到这个节点 ...