1. 接收用户消息
经过(一)之后,我们完成了微信公众号的接入校验(get方式)。
我们在 WeChatService 这个类下创建parseRequest方法,用于读取用户发送的消息(用户发送的消息,发送到了微信服务器,微信服务器转换为xml格式发送到我们自己的服务器)。
//读取微信服务器转发的xml消息
public static Map<String, String> parseRequest(InputStream is){
Map<String, String> map = new HashMap<>();
SAXReader reader = new SAXReader();
try{
//读取输入流,获取文档对象
Document document = reader.read(is);
//根据文档对象获取根节点
Element root = document.getRootElement();
//获取根节点的所有子节点
List<Element> elements = root.elements();
for(Element e:elements){
map.put(e.getName(),e.getStringValue());
}
}catch (DocumentException e){
e.printStackTrace();
}
return map;
}
经由该方法,我们将xml String 数据转换为Map格式的数据。
2.回复用户消息
我们创建msg对象。
BaseMessage(各个实现类message的父类):
@XStreamAlias("xml")
public class BaseMessage {
@XStreamAlias("ToUserName")
private String toUserName;
@XStreamAlias("FromUserName")
private String fromUserName;
@XStreamAlias("CreateTime")
private String createTime;
@XStreamAlias("MsgType")
private String msgType;
public BaseMessage(Map<String,String> requestMap){
this.toUserName = requestMap.get("FromUserName");
this.fromUserName = requestMap.get("ToUserName");
this.createTime = System.currentTimeMillis()/1000 + " ";
}
public String getToUserName() {
return toUserName;
}
public void setToUserName(String toUserName) {
this.toUserName = toUserName;
}
public String getFromUserName() {
return fromUserName;
}
public void setFromUserName(String fromUserName) {
this.fromUserName = fromUserName;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public String getMsgType() {
return msgType;
}
public void setMsgType(String msgType) {
this.msgType = msgType;
}
@Override
public String toString() {
return "BaseMessage{" +
"toUserName='" + toUserName + '\'' +
", fromUserName='" + fromUserName + '\'' +
", createTime='" + createTime + '\'' +
", msgType='" + msgType + '\'' +
'}';
}
}
TextMessage:
@XStreamAlias("xml")
public class TextMessage extends BaseMessage{
@XStreamAlias("Content")
private String content;
public TextMessage(Map<String,String> requestMap,String content){
super(requestMap);//toUserName fromUserName createTime
this.setMsgType("text");// MsgType
this.content = content;// content
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@Override
public String toString() {
return "TextMessage{" +
"content='" + content + '\'' +
"} " + super.toString();
}
}
其余的 ImageMessage、VideoMessage等实现类类似于TextMessage,这里就不写了。
我们需要编写一个能够处理解析经由parseRequest方法得到的Map数据的方法如下:
public static String getResponse(Map<String,String> requestMap){
BaseMessage msg = null;
String msgType = requestMap.get("MsgType");
switch(msgType){
case "text"://用户发送到公众号的消息类型若为text,执行该case
msg = dealTextMessage(requestMap);
break;
case "image":
msg = dealImageMessage(requestMap);
break;
case "voice":
break;
case "video":
break;
case "shortvideo":
break;
case "location":
break;
}
System.out.println("公众号要发送的原始数据:");
System.out.println(msg);
if(msg != null){
return ObjToXml.change(msg);
}else{
return null;
}
}
private static BaseMessage dealImageMessage(Map<String, String> requestMap) {
// ImageMessage imageMessage = new ImageMessage(requestMap, "")
return null;
}
private static BaseMessage dealTextMessage(Map<String, String> requestMap) {
TextMessage textMessage = new TextMessage(requestMap,"真帅!");
return textMessage;
}
这里只写了text 消息 的回复处理。
上述代码中 ObjToXml.change方法是用于将 对象 类型的数据转换为 xml格式。
xml格式用于发送给微信服务器。
public class ObjToXml {
public static String change(BaseMessage msg){
XStream xStream = new XStream();
String xml = null;
xStream.processAnnotations(TextMessage.class);
xStream.processAnnotations(ImageMessage.class);
xStream.processAnnotations(VideoMessage.class);
xStream.processAnnotations(VoiceMessage.class);
xml = xStream.toXML(msg);
return xml;
}
}
控制回复的Controller如下:
//消息的处理 post
@RequestMapping(value="/test1",method= RequestMethod.POST)
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//处理消息和事件推送
response.setCharacterEncoding("UTF-8");
Map<String,String> requestMap = WeChatService.parseRequest(request.getInputStream());
System.out.println("POST");
System.out.println("公众号接收的:");
System.out.println(requestMap);
//准备回复的数据包
String responseXml = WeChatService.getResponse(requestMap);
System.out.println("公众号转换后发送的:");
System.out.println(responseXml);
PrintWriter out = response.getWriter();
out.print(responseXml);
out.flush();
out.close();
}