springboot与微信开发(二)

关注、接收和发送消息

上一节讲述了配置接口,这次看一下关注、接收和发送消息。
我们先看效果图在这里插入图片描述
在这里插入图片描述
在上一次的controller里面加上:

 @PostMapping("/wx")
    public void doPost(HttpServletRequest request, HttpServletResponse response) {
        response.setCharacterEncoding("utf-8");
        PrintWriter out = null;
        //将微信请求xml转为map格式,获取所需的参数
        Map<String, String> map = MessageUtil.xmlToMap(request);
        String ToUserName = map.get("ToUserName");
        String FromUserName = map.get("FromUserName");
        String MsgType = map.get("MsgType");
        String Content = map.get("Content");
        String Event = map.get("Event");
        String message = null;
      
        if ("subscribe".equals(Event)) {
            message = MessageUtil.subscribeMessage(FromUserName, ToUserName);
        } else if ("unsubscribe".equals(Event)) {
            return;
        } else if ("text".equals(MsgType)) {
            //用户输入特定内容,输入1,回复相应的封装的内容
            if ("1".equals(Content)) {
                message = MessageUtil.initMessage(FromUserName, ToUserName);
            } else {
                //用户发来其他消息处理
                message = MessageUtil.reversalMessage(FromUserName, ToUserName, Content);
            }
        }
        try {
            out = response.getWriter();
            out.write(message);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

model里面则为:


public class BaseMessage {
    protected String ToUserName;
    protected String FromUserName;
    protected long CreateTime;
    protected String MsgType;

    public BaseMessage() {
        super();
    }

    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;
    }
}

另外一个model:

package com.xbjs.wechat.model;

public class MessageText extends BaseMessage {
    private String Content;//文本消息内容

    private String MsgId;//消息id,64位整型

    public MessageText() {

    }

    public MessageText(String toUserName, String fromUserName,
                       long createTime, String msgType, String content, String msgId) {
        super();
        ToUserName = toUserName;
        FromUserName = fromUserName;
        CreateTime = createTime;
        MsgType = msgType;
        Content = content;
        MsgId = msgId;
    }

    public String getContent() {
        return Content;
    }

    public void setContent(String content) {
        Content = content;
    }

    public String getMsgId() {
        return MsgId;
    }

    public void setMsgId(String msgId) {
        MsgId = msgId;
    }

}

再看看微信消息工具:

/**
 * @author zxc
 * @Title: MessageUtil
 * @ProjectName wechat
 * @Description: 处理消息
 * @date 2018/10/295:10 PM
 */
public class MessageUtil {

    public static Map<String, String> xmlToMap(HttpServletRequest request) {
        Map<String, String> map = new HashMap<>();
        SAXReader reader = new SAXReader();
        InputStream inputStream = null;
        try {
            inputStream = request.getInputStream();
            Document document = reader.read(inputStream);
            Element root = document.getRootElement();
            List<Element> elementList = root.elements();
            for (Element element : elementList) {
                map.put(element.getName(), element.getText());
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (DocumentException e) {
            e.printStackTrace();
        } finally {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return map;
    }

    /**
     * 将发送消息封装成对应的xml格式
     */
    public static String messageToxml(MessageText message) {
        XStream xstream = new XStream();
        xstream.alias("xml", message.getClass());
        return xstream.toXML(message);
    }

    /**
     * 封装发送消息对象,封装时,需要将调换发送者和接收者的关系
     *
     * @param FromUserName
     * @param ToUserName
     */
    public static String initMessage(String FromUserName, String ToUserName) {
        MessageText text = new MessageText();
        text.setToUserName(FromUserName);
        text.setFromUserName(ToUserName);
        text.setContent("fuck");
        text.setCreateTime(new Date().getTime());
        text.setMsgType("text");
        return messageToxml(text);
    }

    /**
     * 封装发送消息对象,封装时,需要将调换发送者和接收者的关系
     *
     * @param FromUserName
     * @param ToUserName
     */
    public static String subscribeMessage(String FromUserName, String ToUserName) {
        MessageText text = new MessageText();
        text.setToUserName(FromUserName);
        text.setFromUserName(ToUserName);
        text.setContent("欢迎关注");
        text.setCreateTime(new Date().getTime());
        text.setMsgType("text");
        return messageToxml(text);
    }
    /**
     * 封装发送消息对象,封装时,需要将调换发送者和接收者的关系
     *
     * @param FromUserName
     * @param ToUserName
     * @param Content
     */
    public static String reversalMessage(String fromUserName, String toUserName, String Content) {
        MessageText text = new MessageText();
        text.setToUserName(fromUserName);
        text.setFromUserName(toUserName);
        text.setContent("您发的消息为:" + Content);
        text.setCreateTime(new Date().getTime());
        text.setMsgType("text");
        return messageToxml(text);
    }
}

这里先将收到的消息转为了map,使用
<dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> </dependency>
微信官方消息为xml结构:

接收消息

<xml>
 <ToUserName><![CDATA[toUser]]></ToUserName>
 <FromUserName><![CDATA[fromUser]]></FromUserName>
 <CreateTime>1248861860</CreateTime>
 <MsgType><![CDATA[text]]></MsgType>
 <Content><![CDATA[this is a test]]></Content>
 <MsgId>789456126411</MsgId>
 </xml>

发送消息


<xml>
 
<ToUserName><![CDATA[toUser]]></ToUserName>
 
<FromUserName><![CDATA[fromUser]]></FromUserName>
 
<CreateTime>816451315</CreateTime>
 
<MsgType><![CDATA[text]]></MsgType>
 
<Content><![CDATA[HelloWord]]></Content>
 
</xml>

消息体转xml用到:

	    <dependency>
            <groupId>com.thoughtworks.xstream</groupId>
            <artifactId>xstream</artifactId>
            <version>1.4.11.1</version>
        </dependency>

上一节
希望能交流更多技术,关注小白的微信公众号吧。
在这里插入图片描述

小白技术社
原文地址:https://www.cnblogs.com/xbjss/p/13326701.html