Java微信公众平台开发(5) 文本及图文消息回复的实现

上篇我们说到回复消息可以根据是否需要上传文件到微信服务器可划分为【普通消息】和【多媒体消息】,这里我们来讲述普通消息的回复实现,在消息回复中存在一个关键字段【openid】,它是微信用户对于公众号的唯一标识,这里不做过多解释后面将给出时间专门来讲解微信生态中的关键字!

(一)回复文本消息

在前面我们已经完成了对消息的分类和回复消息实体的建立,这里回复文本消息需要用到的就是我们的TextMessage,我们把回复文本消息在【文本消息】类型中给出回复!在我们做消息回复的时候需要设置消息的接收人ToUserName(openid)、消息的发送方FromUserName、消息类型MsgType、创建时间CreateTime以及消息体Content,由于我们我们的消息回复格式是需要为xml,所以最终我们需要将其装换成xml再做返回输出!

首先我们在工具类MessageUtil的代码做出部分修改和添加,实现最后版本为:

package com.cuiyongzhi.wechat.util;

import java.io.InputStream;
import java.io.Writer;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.dom4j.D ocument;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import com.cuiyongzhi.wechat.message.resp.Article;
import com.cuiyongzhi.wechat.message.resp.ImageMessage;
import com.cuiyongzhi.wechat.message.resp.MusicMessage;
import com.cuiyongzhi.wechat.message.resp.NewsMessage;
import com.cuiyongzhi.wechat.message.resp.TextMessage;
import com.cuiyongzhi.wechat.message.resp.VideoMessage;
import com.cuiyongzhi.wechat.message.resp.VoiceMessage;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.core.util.QuickWriter;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.xml.PrettyPrintWriter;
import com.thoughtworks.xstream.io.xml.XppDriver;

/**
 * ClassName: MessageUtil
 *
 * @Description: 消息工具类
 * @author dapengniao
 * @date 2016年3月7日 上午10:05:04
 */
public class MessageUtil {

 /**
  * 返回消息类型:文本
  */
 public static final String RESP_MESSAGE_TYPE_TEXT = "text";

 /**
  * 返回消息类型:音乐
  */
 public static final String RESP_MESSAGE_TYPE_MUSIC = "music";

 /**
  * 返回消息类型:图文
  */
 public static final String RESP_MESSAGE_TYPE_NEWS = "news";

 /**
  * 返回消息类型:图片
  */
 public static final String RESP_MESSAGE_TYPE_Image = "image";

 /**
  * 返回消息类型:语音
  */
 public static final String RESP_MESSAGE_TYPE_Voice = "voice";

 /**
  * 返回消息类型:视频
  */
 public static final String RESP_MESSAGE_TYPE_Video = "video";

 /**
  * 请求消息类型:文本
  */
 public static final String REQ_MESSAGE_TYPE_TEXT = "text";

 /**
  * 请求消息类型:图片
  */
 public static final String REQ_MESSAGE_TYPE_IMAGE = "image";

 /**
  * 请求消息类型:链接
  */
 public static final String REQ_MESSAGE_TYPE_LINK = "link";

 /**
  * 请求消息类型:地理位置
  */
 public static final String REQ_MESSAGE_TYPE_LOCATION = "location";

 /**
  * 请求消息类型:音频
  */
 public static final String REQ_MESSAGE_TYPE_VOICE = "voice";

 /**
  * 请求消息类型:视频
  */
 public static final String REQ_MESSAGE_TYPE_VIDEO = "video";

 /**
  * 请求消息类型:推送
  */
 public static final String REQ_MESSAGE_TYPE_EVENT = "event";

 /**
  * 事件类型:subscribe(订阅)
  */
 public static final String EVENT_TYPE_SUBSCRIBE = "subscribe";

 /**
  * 事件类型:unsubscribe(取消订阅)
  */
 public static final String EVENT_TYPE_UNSUBSCRIBE = "unsubscribe";

 /**
  * 事件类型:CLICK(自定义菜单点击事件)
  */
 public static final String EVENT_TYPE_CLICK = "CLICK";

 /**
  * 事件类型:VIEW(自定义菜单URl视图)
  */
 public static final String EVENT_TYPE_VIEW = "VIEW";

 /**
  * 事件类型:LOCATION(上报地理位置事件)
  */
 public static final String EVENT_TYPE_LOCATION = "LOCATION";

 /**
  * 事件类型:LOCATION(上报地理位置事件)
  */
 public static final String EVENT_TYPE_SCAN = "SCAN";

 /**
  * @Description: 解析微信发来的请求(XML)
  * @param @param request
  * @param @return
  * @param @throws Exception
  * @author dapengniao
  * @date 2016年3月7日 上午10:04:02
  */
 @SuppressWarnings("unchecked")
 public static Map<String, String> parseXml(HttpServletRequest request)
   throws Exception {
  // 将解析结果存储在HashMap中
  Map<String, String> map = new HashMap<String, String>();
  // 从request中取得输入流
  InputStream inputStream = request.getInputStream();
  // 读取输入流
  SAXReader reader = new SAXReader();
  Document document = reader.read(inputStream);
  // 得到xml根元素
  Element root = document.getRootElement();
  // 得到根元素的所有子节点
  List<Element> elementList = root.elements();

  // 遍历所有子节点
  for (Element e : elementList)
   map.put(e.getName(), e.getText());

  // 释放资源
  inputStream.close();
  inputStream = null;

  return map;
 }

 /**
  * @Description: 文本消息对象转换成xml
  * @param @param textMessage
  * @param @return
  * @author dapengniao
  * @date 2016年3月8日 下午4:13:22
  */
 public static String textMessageToXml(TextMessage textMessage) {
  xstream.alias("xml", textMessage.getClass());
  return xstream.toXML(textMessage);
 }

 /**
  * @Description: 图文消息对象转换成xml
  * @param @param newsMessage
  * @param @return
  * @author dapengniao
  * @date 2016年3月8日 下午4:14:09
  */
 public static String newsMessageToXml(NewsMessage newsMessage) {
  xstream.alias("xml", newsMessage.getClass());
  xstream.alias("item", new Article().getClass());
  return xstream.toXML(newsMessage);
 }

 /**
  * @Description: 图片消息对象转换成xml
  * @param @param imageMessage
  * @param @return
  * @author dapengniao
  * @date 2016年3月9日 上午9:25:51
  */
 public static String imageMessageToXml(ImageMessage imageMessage) {
  xstream.alias("xml", imageMessage.getClass());
  return xstream.toXML(imageMessage);
 }

 /**
  * @Description: 语音消息对象转换成xml
  * @param @param voiceMessage
  * @param @return
  * @author dapengniao
  * @date 2016年3月9日 上午9:27:26
  */
 public static String voiceMessageToXml(VoiceMessage voiceMessage) {
  xstream.alias("xml", voiceMessage.getClass());
  return xstream.toXML(voiceMessage);
 }

 /**
  * @Description: 视频消息对象转换成xml
  * @param @param videoMessage
  * @param @return
  * @author dapengniao
  * @date 2016年3月9日 上午9:31:09
  */
 public static String videoMessageToXml(VideoMessage videoMessage) {
  xstream.alias("xml", videoMessage.getClass());
  return xstream.toXML(videoMessage);
 }

 /**
  * @Description: 音乐消息对象转换成xml
  * @param @param musicMessage
  * @param @return
  * @author dapengniao
  * @date 2016年3月8日 下午4:13:36
  */
 public static String musicMessageToXml(MusicMessage musicMessage) {
  xstream.alias("xml", musicMessage.getClass());
  return xstream.toXML(musicMessage);
 }

 /**
  * 对象到xml的处理
  */
 private static XStream xstream = new XStream(new XppDriver() {
  public HierarchicalStreamWriter createWriter(Writer out) {
   return new PrettyPrintWriter(out) {
    // 对所有xml节点的转换都增加CDATA标记
    boolean cdata = true;

    @SuppressWarnings("rawtypes")
    public void startNode(String name, Class clazz) {
     super.startNode(name, clazz);
    }

    protected void writeText(QuickWriter writer, String text) {
     if (cdata) {
      writer.write("<![CDATA[");
      writer.write(text);
      writer.write("]]>");
     } else {
      writer.write(text);
     }
    }
   };
  }
 });
}

我们回复文本消息的简单实现:修改MsgDispatcher,在消息分类为【文本消息】中加入如下代码:

String openid=map.get("FromUserName"); //用户openid
String mpid=map.get("ToUserName"); //公众号原始ID

//普通文本消息
TextMessage txtmsg=new TextMessage();
txtmsg.setToUserName(openid);
txtmsg.setFromUserName(mpid);
txtmsg.setCreateTime(new Date().getTime());
txtmsg.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);

if (map.get("MsgType").equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) { // 文本消息
 txtmsg.setContent("你好,这里是崔用志个人账号!");
 return MessageUtil.textMessageToXml(txtmsg);
}

启动项目,当我们发送任何文本消息后我们可以看到我们的回复内容,如图:

(二)图文消息回复

图文消息的回复和文本消息的实现模式是一样的,只不过对应消息体的字段有所区别而已,这里为了和文本消息能有所区分我在【图片消息】实现图文消息的回复,修改MsgDispatcher:

//对图文消息
NewsMessage newmsg=new NewsMessage();
newmsg.setToUserName(openid);
newmsg.setFromUserName(mpid);
newmsg.setCreateTime(new Date().getTime());
newmsg.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_NEWS);

if (map.get("MsgType").equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)) { // 图片消息
 System.out.println("==============这是图片消息!");
 Article article=new Article();
 article.setDescription("这是图文消息1"); //图文消息的描述
 article.setPicUrl("http://res.cuiyongzhi.com/2016/03/201603086749_6850.png"); //图文消息图片地址
 article.setTitle("图文消息1"); //图文消息标题
 article.setUrl("http://www.cuiyongzhi.com"); //图文url链接
 List<Article> list=new ArrayList<Article>();
 list.add(article);  //这里发送的是单图文,如果需要发送多图文则在这里list中加入多个Article即可!
 newmsg.setArticleCount(list.size());
 newmsg.setArticles(list);
 return MessageUtil.newsMessageToXml(newmsg);
}

实现结果如下图所示:

在整个的谱图消息发送的过程中没有任何项目结构的变化,只是对文件内容作了简单代码增加和修改,下一篇将讲述【微信开发中的token生成】以方便后面多媒体消息发送的讲解,感谢你的查阅,如有疑问获需源码可留言!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java调用微信客服消息实现发货通知的方法详解

    本文实例讲述了Java调用微信客服消息实现发货通知的方法.分享给大家供大家参考,具体如下: 微信文档地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140547&token=&lang=zh_CN 个人说明:这是一个样例,微信客户消息有很多种,我现在用的是公众号发送消息.样子如下图. 说明:下面开始代码部分了. 1.首先看微信文档.这里才是我们需要的 这里是说发消息要POST请求这个接口:https://a

  • 微信支付java版本之JSAPI支付+发送模板消息

    本文为大家分享了java版本之JSAPI支付+发送模板消息的相关资料,供大家参考,具体内容如下 1.工具类 工具类见:微信支付JAVA版本之Native付款 2.公众账号设置 3.代码实现 openId:openId为用户与该公众账号之间代表用户的唯一标示  以下类中涉及到生成token,关闭订单接口调用,获取配置文件信息,和工具类,在其他文章中有具体代码实现 package com.zhrd.bussinss.platform.controller.rest; import java.io.F

  • Java微信公众平台开发(4) 回复消息的分类及实体的创建

    前面有说道对接收到微信服务器消息后对消息的分类,当时主要分为普通消息和事件消息,这里我们要讲述的是我们在给用户回复的消息类型,在这里也可以大致分为两类:一种为不需要上传资源到微信服务器的这里成为[普通消息回复]:还有一种需要上传资源到微信服务器的这里称为[多媒体消息回复]! 普通消息回复:回复文本消息/回复图文消息 多媒体消息回复:回复图片消息/回复语音消息/回复视频消息/回复音乐消息 (一)回复消息基类的实现 package com.cuiyongzhi.wechat.message.resp

  • Java微信公众平台开发(2) 微信服务器post消息体的接收

    在上一篇的文章中我们详细讲述了如何将我们的应用服务器和微信腾讯服务器之间的对接操作,最后接入成功,不知道你有没有发现在上一篇的[controller]中我定义了一个get方法和一个post方法,但是在使用过程中我们就用了get方法,这里我们就来说说我们预留的post的方法的使用! 当我们在完成了服务器验证之后,此后用户每次向公众号发送消息.或者产生自定义菜单点击事件时,开发者填写的服务器配置URL将得到微信服务器推送过来的消息和事件,然后开发者可以依据自身业务逻辑进行响应,例如回复消息等!通过这

  • Java开发微信公众号接收和被动回复普通消息

    上篇说完了如何接入微信公众号,本文说一下微信公众号的最基本功能:普通消息的接收和回复.说到普通消息,那么什么是微信公众号所定义的普通消息呢,微信开发者文档中提到的接收的普通消息包括如下几类: 1.文本消息 2.图片消息 3.语音消息 4.视频消息 5.小视频消息 6.地理位置消息 7.链接消息(被动回复的消息) 被动回复的普通消息包括: 1.回复文本消息 2.回复图片消息 3.回复语音消息 4.回复视频消息 5.回复音乐消息 6.回复图文消息 其实接收消息和被动回复消息这两个动作是不分家的,这本

  • java微信开发API第二步 获取和回复消息

    微信开发API如何获取和回复消息,下面就为大家进行介绍 一.说明 * 本示例根据微信开发文档:http://mp.weixin.qq.com/wiki/home/index.html最新版(4/3/2016 5:34:36 PM )进行开发演示. * 编辑平台:myeclipse10.7+win32+jdk1.7+tomcat7.0  * 服务器:阿里云 windows server 2008 64bits * 平台要求:servlet使用注解方式,平台要求:j2ee6.0+.jdk6.0+.t

  • 微信java开发之实现微信主动推送消息

    1.拉取access_token2.拉取用户信息3.主动推送消息4.接口貌似要申请权限5.依赖httpclient4.2.3 和jackson 2.2.1 复制代码 代码如下: public class WeixinAPIHelper { /**  * 获取token接口  */ private String getTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=

  • Java微信公众平台开发(3) 接收消息的分类及实体的创建

    前面一篇有说道应用服务器和腾讯服务器是通过消息进行通讯的,并简单介绍了微信端post的消息类型,这里我们将建立消息实体以方便我们后面的使用! (一)消息实体基础类 package com.cuiyongzhi.wechat.message.req; /** * ClassName: BaseMessage * @Description: 微信请求消息基本类 * @author dapengniao * @date 2016年3月7日 下午3:03:59 */ public class BaseM

  • java微信开发第二步 获取消息和回复消息

    接着上一篇java微信开发API第一步 服务器接入进行学习,下面介绍java微信开发第二步:获取消息和回复消息,具体内容如下 * 本示例根据微信开发文档:http://mp.weixin.qq.com/wiki/home/index.html最新版(4/3/2016 5:34:36 PM )进行开发演示. * 编辑平台:myeclipse10.7+win32+jdk1.7+tomcat7.0  * 服务器:阿里云 windows server 2008 64bits * 平台要求:servlet

  • java微信企业号开发之发送消息(文本、图片、语音)

    上篇文章介绍了开启回调模式,开始回调模式后我们就要实现聊天功能了.平时使用微信聊天可以发送文本消息.语音.图片.视频等,这里只实现了其中的一些功能和大家分享. 一.与微信企业号建立连接 1.企业应用调用企业号提供的接口,管理或查询企业号后台所管理的资源.或给成员发送消息等,以下称主动调用模式. 2.企业号把用户发送的消息或用户触发的事件推送给企业应用,由企业应用处理,以下称回调模式. 3.用户在微信中阅读企业应用下发的H5页面,该页面可以调用微信提供的原生接口,使用微信开放的终端能力,以下称JS

  • JAVA实现 springMVC方式的微信接入、实现消息自动回复实例

    前段时间小忙了一阵,微信公众号的开发,从零开始看文档,踩了不少坑,也算是熬过来了,最近考虑做一些总结,方便以后再开发的时候回顾,也给正在做相关项目的同学做个参考. 1.思路 微信接入:用户消息和开发者需要的事件推送都会通过微信方服务器发起一个请求,转发到你在公众平台配置的服务器url地址,微信方将带上signature,timestamp,nonce,echostr四个参数,我们自己服务器通过拼接公众平台配置的token,以及传上来的timestamp,nonce进行SHA1加密后匹配signa

随机推荐