WeinxinCtroller.java
package com.caiyl.zmd.weixin;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/weixin")
public class WeixinController extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
@RequestMapping("")
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
/** 读取接收到的xml消息 */
StringBuffer sb = new StringBuffer();
InputStream is = request.getInputStream();
InputStreamReader isr = new InputStreamReader(is, "UTF-8");
BufferedReader br = new BufferedReader(isr);
String s = "";
while ((s = br.readLine()) != null) {
sb.append(s);
}
String xml = sb.toString(); // 次即为接收到微信端发送过来的xml数据
String result = "";
/** 判断是否是微信接入激活验证,只有首次接入验证时才会收到echostr参数,此时需要把它直接返回 */
String echostr = request.getParameter("echostr");
if (echostr != null && echostr.length() > 1) {
result = echostr;
} else {
// 正常的微信处理流程
result = new WechatProcess().processWechatMag(xml);
}
try {
OutputStream os = response.getOutputStream();
os.write(result.getBytes("UTF-8"));
os.flush();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
处理方法:
/**
*
*/
package com.caiyl.zmd.weixin;
public class WechatProcess {
/**
* 解析处理xml
*
* @param xml
* 接收到的微信数据
* @return 最终的解析结果(xml格式数据)
*/
public String processWechatMag(String xml) {
System.out.println("*****************传入值*****************");
System.out.println(xml);
/** 解析xml数据 */
ReceiveXmlEntity xmlEntity = new ReceiveXmlProcess().getMsgEntity(xml);
/** 以文本消息为例,调用图灵机器人api接口,获取回复内容 */
String result = "";
if ("text".endsWith(xmlEntity.getMsgType())) {
result = "服务器返回数据";
}
result = new FormatXmlProcess().formatXmlAnswer(
xmlEntity.getFromUserName(), xmlEntity.getToUserName(), result);
return result;
}
}
/**
*
*/
package com.caiyl.zmd.weixin;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Iterator;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
public class ReceiveXmlProcess {
/**
* 解析微信xml消息
*
* @param strXml
* @return
*/
public ReceiveXmlEntity getMsgEntity(String strXml) {
ReceiveXmlEntity msg = null;
try {
if (strXml.length() <= 0 || strXml == null)
return null;
// 将字符串转化为XML文档对象
Document document = DocumentHelper.parseText(strXml);
// 获得文档的根节点
Element root = document.getRootElement();
// 遍历根节点下所有子节点
Iterator<?> iter = root.elementIterator();
// 遍历所有结点
msg = new ReceiveXmlEntity();
// 利用反射机制,调用set方法
// 获取该实体的元类型
Class<?> c = Class.forName("com.caiyl.zmd.weixin.ReceiveXmlEntity");
msg = (ReceiveXmlEntity) c.newInstance();// 创建这个实体的对象
while (iter.hasNext()) {
Element ele = (Element) iter.next();
// 获取set方法中的参数字段(实体类的属性)
Field field = c.getDeclaredField(ele.getName());
// 获取set方法,field.getType())获取它的参数数据类型
Method method = c.getDeclaredMethod("set" + ele.getName(),
field.getType());
// 调用set方法
method.invoke(msg, ele.getText());
}
} catch (Exception e) {
// TODO: handle exception
System.out.println("xml 格式异常: " + strXml);
e.printStackTrace();
}
return msg;
}
}
/**
*
*/
package com.caiyl.zmd.weixin;
public class ReceiveXmlEntity {
private String ToUserName="";
private String FromUserName="";
private String CreateTime="";
private String MsgType="";
private String MsgId="";
private String Event="";
private String EventKey="";
private String Ticket="";
private String Latitude="";
private String Longitude="";
private String Precision="";
private String PicUrl="";
private String MediaId="";
private String Title="";
private String Description="";
private String Url="";
private String Location_X="";
private String Location_Y="";
private String Scale="";
private String Label="";
private String Content="";
private String Format="";
private String Recognition="";
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 String getCreateTime() {
return CreateTime;
}
public void setCreateTime(String createTime) {
CreateTime = createTime;
}
public String getMsgType() {
return MsgType;
}
public void setMsgType(String msgType) {
MsgType = msgType;
}
public String getMsgId() {
return MsgId;
}
public void setMsgId(String msgId) {
MsgId = msgId;
}
public String getEvent() {
return Event;
}
public void setEvent(String event) {
Event = event;
}
public String getEventKey() {
return EventKey;
}
public void setEventKey(String eventKey) {
EventKey = eventKey;
}
public String getTicket() {
return Ticket;
}
public void setTicket(String ticket) {
Ticket = ticket;
}
public String getLatitude() {
return Latitude;
}
public void setLatitude(String latitude) {
Latitude = latitude;
}
public String getLongitude() {
return Longitude;
}
public void setLongitude(String longitude) {
Longitude = longitude;
}
public String getPrecision() {
return Precision;
}
public void setPrecision(String precision) {
Precision = precision;
}
public String getPicUrl() {
return PicUrl;
}
public void setPicUrl(String picUrl) {
PicUrl = picUrl;
}
public String getMediaId() {
return MediaId;
}
public void setMediaId(String mediaId) {
MediaId = mediaId;
}
public String getTitle() {
return Title;
}
public void setTitle(String title) {
Title = title;
}
public String getDescription() {
return Description;
}
public void setDescription(String description) {
Description = description;
}
public String getUrl() {
return Url;
}
public void setUrl(String url) {
Url = url;
}
public String getLocation_X() {
return Location_X;
}
public void setLocation_X(String location_X) {
Location_X = location_X;
}
public String getLocation_Y() {
return Location_Y;
}
public void setLocation_Y(String location_Y) {
Location_Y = location_Y;
}
public String getScale() {
return Scale;
}
public void setScale(String scale) {
Scale = scale;
}
public String getLabel() {
return Label;
}
public void setLabel(String label) {
Label = label;
}
public String getContent() {
return Content;
}
public void setContent(String content) {
Content = content;
}
public String getFormat() {
return Format;
}
public void setFormat(String format) {
Format = format;
}
public String getRecognition() {
return Recognition;
}
public void setRecognition(String recognition) {
Recognition = recognition;
}
}
/**
*
*/
package com.caiyl.zmd.weixin;
import java.util.Date;
public class FormatXmlProcess {
/**
* 封装文字类的返回消息
*
* @param to
* @param from
* @param content
* @return
*/
public String formatXmlAnswer(String to, String from, String content) {
StringBuffer sb = new StringBuffer();
Date date = new Date();
sb.append("<xml><ToUserName><![CDATA[");
sb.append(to);
sb.append("]]></ToUserName><FromUserName><![CDATA[");
sb.append(from);
sb.append("]]></FromUserName><CreateTime>");
sb.append(date.getTime());
sb.append("</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[");
sb.append(content);
sb.append("]]></Content><FuncFlag>0</FuncFlag></xml>");
System.out.println("*****************返回值*****************");
System.out.println(sb.toString());
return sb.toString();
}
}