1. 程式人生 > >springboot與微信開發(二)

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>

上一節