View Javadoc
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   * @className MessageTransferHandler
22   * @author jinyu(foxinmy@gmail.com)
23   * @date 2015年5月17日
24   * @since JDK 1.6
25   * @see
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 }