1 package com.zone.weixin4j.xml;
2
3 import com.zone.weixin4j.request.WeixinRequest;
4 import com.zone.weixin4j.socket.WeixinMessageTransfer;
5 import com.zone.weixin4j.type.AccountType;
6 import com.zone.weixin4j.util.ServerToolkits;
7 import org.xml.sax.InputSource;
8 import org.xml.sax.SAXException;
9 import org.xml.sax.XMLReader;
10 import org.xml.sax.helpers.DefaultHandler;
11 import org.xml.sax.helpers.XMLReaderFactory;
12
13 import java.io.ByteArrayInputStream;
14 import java.io.IOException;
15 import java.util.HashSet;
16 import java.util.Set;
17
18
19
20
21
22
23
24
25
26
27 public class MessageTransferHandler extends DefaultHandler {
28
29 private String fromUserName;
30 private String toUserName;
31 private String msgType;
32 private String eventType;
33 private boolean isQY;
34 private Set<String> nodeNames;
35
36 private String content;
37
38 @Override
39 public void startDocument() throws SAXException {
40 fromUserName = null;
41 toUserName = null;
42 msgType = null;
43 eventType = null;
44 isQY = false;
45 nodeNames = new HashSet<String>();
46 }
47
48 @Override
49 public void endElement(String uri, String localName, String qName)
50 throws SAXException {
51 nodeNames.add(localName);
52 localName = localName.toLowerCase();
53 if (localName.equals("fromusername")) {
54 fromUserName = content;
55 } else if (localName.equals("tousername")) {
56 toUserName = content;
57 } else if (localName.equals("msgtype")) {
58 msgType = content.toLowerCase();
59 } else if (localName.equals("event")) {
60 eventType = content.toLowerCase();
61 } else if (localName.startsWith("agent")
62 || localName.startsWith("suite")
63 || localName.equals("batchjob")) {
64 isQY = true;
65 }
66 }
67
68 @Override
69 public void characters(char[] ch, int start, int length)
70 throws SAXException {
71 this.content = new String(ch, start, length);
72 }
73
74 private AccountType getAccountType() {
75 if (isQY) {
76 return AccountType.QY;
77 }
78 if (ServerToolkits.isBlank(msgType)
79 && ServerToolkits.isBlank(eventType)) {
80 return null;
81 }
82 return AccountType.MP;
83 }
84
85 private static MessageTransferHandler global = new MessageTransferHandler();
86
87 public static WeixinMessageTransfer parser(WeixinRequest request)
88 throws RuntimeException {
89 try {
90 XMLReader xmlReader = XMLReaderFactory.createXMLReader();
91 xmlReader.setContentHandler(global);
92 xmlReader.parse(new InputSource(new ByteArrayInputStream(request
93 .getOriginalContent().getBytes(ServerToolkits.UTF_8))));
94 } catch (IOException e) {
95 throw new RuntimeException(e);
96 } catch (SAXException e) {
97 throw new RuntimeException(e);
98 }
99 return new WeixinMessageTransfer(request.getAesToken(),
100 request.getEncryptType(), global.toUserName,
101 global.fromUserName, global.getAccountType(), global.msgType,
102 global.eventType, global.nodeNames);
103 }
104 }