您的位置:首页 > 移动开发 > 微信开发

微信开发_接收消息,回复消息(3)

2016-05-12 17:42 609 查看
在前面我实现了配置微信接口的配置,将自己的订阅号的控制交给我自己控制,用户回复消息,微信的后台会通过发送一个post请求到自己的服务器,是发送一个XML

消息的接收:

文本消息(在微信的开发者文档中能看到)

<xml>

<ToUserName><![CDATA[toUser]]></ToUserName>

<FromUserName><![CDATA[fromUser]]></FromUserName>

<CreateTime>1348831860</CreateTime>

<MsgType><![CDATA[text]]></MsgType>

<Content><![CDATA[this is a test]]></Content>

<MsgId>1234567890123456</MsgId>

</xml>


自己写一个方法,解析xml,将所有的内容解析完成之后,存放在一个Map中(首先设置一下编码集),

用到的jar包:dom4j-1.6.1.jar

```
//servlet中调用
request.setCharacterEncoding("utf-8");//设置编码集
response.setCharacterEncoding("utf-8");//设置编码集
Map<String,String> map=MessageUtils.xmlToMap(request);
//解析xml的方法
public static Map<String,String> xmlToMap(HttpServletRequest request){
Map<String,String> map=new HashMap<String,String>();
SAXReader reader=new  SAXReader();
InputStream inputStream=null;
try {
inputStream = request.getInputStream();
Document document=reader.read(inputStream);
Element root=document.getRootElement();
@SuppressWarnings("unchecked")
List<Element> list=root.elements();
for (Element e : list) {
map.put(e.getName(), e.getText());
}
} catch (IOException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
}finally{
if (inputStream!=null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return map;
}
```
将解析微信后台发送给我的xml后得到map,再在map中取值

```
String toUserName=map.get("ToUserName");//自己公众号的账号
String fromUserName=map.get("FromUserName");//发送消息用户的账号
String msgType=map.get("MsgType");//得到消息的类型
String content=map.get("Content");//得到文本消息的内容
/**
* 消息的类型:都可以在微信的开发者文档中找到
*
*/
public static final String MESSAGE_TEXT="text";//文本消息
public static final String MESSAGE_VOICE="voice";//语音消息
public static final String MESSAGE_MUSIC="music";//音乐
public static final String MESSAGE_SHORTVIDEO="shortvideo";//视频
public static final String MESSAGE_LOCATION="location";//地理位置
public static final String MESSAGE_LINK="link";//链接
public static final String MESSAGE_IMAGE="image";//图片
public static final String MESSAGE_EVENT="event";//事件
public static final String MESSAGE_SUBSCRIBE="subscribe";//关注事件
public static final String MESSAGE_UNSUBSCRIBE="unsubscribe";//取消关注事件
public static final String MESSAGE_NEWS="news";//图文
public static final String MESSAGE_CLICK = "CLICK";//菜单的点击事件
public static final String MESSAGE_VIEW = "VIEW";//菜单的跳转
public static final String MESSAGE_SCANCODE= "scancode_push";//扫描二维码事件
```


消息的回复

在公众号收到用户发送的消息后,进行消息的判断,然后在回复给用户,回复的格式也xml

回复消息是使用java对象进行转化,而且有些格式中的字段是都有的,所以可以生成一个父类,后面的各种类型的消息都继承这个父类

//文本消息的格式
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[你好]]></Content>
</xml>
//父类
public class BaseMessage {
private String ToUserName;// 给哪个账号
private String FromUserName;// 来自哪个账号
private long CreateTime;// 创建时间
private String MsgType;// 消息类型
public String getToUserName() {
return ToUserName;
}
public void setToUserName(String toUserName) {
ToUserName = toUserName;
}
public String getFromUserName() {
return FromUserName;
}
public void setFromUserName(String fromUserName) {
FromUserName = fromUserName;
}
public long getCreateTime() {
return CreateTime;
}
public void setCreateTime(long createTime) {
CreateTime = createTime;
}
public String getMsgType() {
return MsgType;
}
public void setMsgType(String msgType) {
MsgType = msgType;
}
}
//回复的文本信息
public class TextMessage extends BaseMessage{
private String Content;// 文本内容
private String MsgId;// 消息ID
public String getContent() {
return Content;
}
public void setContent(String content) {
Content = content;
}
public String getMsgId() {
return MsgId;
}
public void setMsgId(String msgId) {
MsgId = msgId;
}
@Override
public String toString() {
return "TextMessage [Content=" + Content + ", MsgId=" + MsgId + "]";
}

}


在创建了类之后,并且在要回复的信息封装好之后我们要将java对象转化成xml格式,这样要使用一个jar,帮助我们将java对象转化成xml格式的字符串:xstream-1.3.1.jar

/**
* 将文本对象转化为xml
* @param textMessage
* @return
*/
public static String textMessageToXml(TextMessage baseMessage){
XStream stream=new XStream();
stream.alias("xml", baseMessage.getClass());
return stream.toXML(baseMessage);
}
//封装回复的消息
TextMessage message=new TextMessage();
message.setFromUserName(toUserName);//这里填写的自己的账号,也就是前面的toUserName
message.setToUserName(fromUserName);//填写给那个用户,也就是前面的fromUserName
message.setMsgType("text");//消息的类型
message.setCreateTime(new Date().getTime());//时间
message.setContent("你好,欢迎关注我的微信公众号!");
String xmlMessage=MessageUtils.textMessageToXml(message);//将java对象转化成xml格式的字符串
if(xmlMessage!=null && !"".equals(xmlMessage)){
out.print(xmlMessage);//输出字符串
}
out.flush();
out.close();


这是测试的效果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  微信