一、前言

  在上一篇文章《微信开发之如何使用开发工具--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. 【Python实例二】BeautifulSoup爬虫简单实践

    前言 前面安装了BeautifulSoup库,现在就来实现一下吧. 目录 一.Urllib库的使用 二.BeautifulSoup的使用 三. 一个示例 ----------------------- ...

  2. 自己申请了苹果的ID号,如何输入到平板上,从而换掉原先的其他账号呢?

    刚买了Ipad平板电脑,一直是用商家给我设置的ID,但是时间一长,我希望用自己的ID来玩我的平板,便于下载程序,更新程序,不用每次去问人家密码是多少. 申请IPAD ID 的网站是:http://ww ...

  3. dubbo消费方超时处理

    在我们分布式系统中,远程调用可能随时会出现调用超时,然后抛异常 在dubbo内部,默认设置的是500ms(好像是),所以,对于crud事物大的系统来讲肯定是要自定义超时时间咯,作为消费方,自然是优先级 ...

  4. 1.kafka的介绍

    kafka是一种高可用,高吞吐量,基于zookeeper协调的分布式发布订阅消息系统. 消息中间件:生产者和消费者 举个例子: 生产者:做馒头,消费者:吃馒头,数据流:馒头 如果消费者宕机了,吃不下去 ...

  5. [ Python - 8 ] 简单demo练习

    练习1: 利用os模块编写一个能实现dir -l输出的程序(注意:dir /l是windows下命令) #!_*_coding:utf-8_*_ # Author: hkey import os, t ...

  6. 配置WCF

    出处:http://blog.csdn.net/fangxing80/article/details/6106228 前面一篇文章<WCF 学习总结1 -- 简单实例>一股脑儿展示了几种W ...

  7. socket 上传文件代码

    server.py #!/usr/bin/env python# -*- coding:utf-8 -*- import socketimport os,hashlib ip_port = ('127 ...

  8. python的ConfigParser读取设置配置文件

    python 读写配置文件在实际应用中具有十分强大的功能,在实际的操作中也有相当简捷的操作方案,以下的文章就是对python 读写配置文件的具体方案的介绍,望你浏览完下面的文章会有所收获. pytho ...

  9. CF 1003C Intense Heat【前缀和/精度/双层暴力枚举】

    The heat during the last few days has been really intense. Scientists from all over the Berland stud ...

  10. LCA+差分【CF191C】Fools and Roads

    Description 有一颗 \(n\) 个节点的树,\(k\) 次旅行,问每一条边被走过的次数. Input 第一行一个整数 \(n\) (\(2\leq n\leq 10^5\)). 接下来 \ ...