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

在前面我实现了配置微信接口的配置,将自己的订阅号的控制交给我自己控制,用户回复消息,微信的后台会通过发送一个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();

这是测试的效果
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值