springboot與微信開發(二)
阿新 • • 發佈:2018-12-18
關注、接收和傳送訊息
上一節講述了配置介面,這次看一下關注、接收和傳送訊息。 我們先看效果圖 在上一次的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>