1、首先看一下整体代码架构
首先需要3个jar包,主要是用来封装xml数据的
MapUtil.java
package com.xcc.tools;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Map工具类
*/
public class MapUtil {
/** 记录日志 */
private static Logger logger = LoggerFactory.getLogger(MapUtil.class);
public static Map<String, Object> formSerializeToMap(String args){
Map<String, Object> map = new HashMap<String, Object>();
if(args == null || args.length() == 0){
return map;
}
String[] kvs = args.split("&"); //先尝试用&分割
if(kvs.length <= 1){
kvs = args.split("#"); //先尝试用#分割
}
for(String kv : kvs){
if(kv == null || kv.length() == 0){
continue;
}
String[] kvAry = kv.split("=");
if(kvAry.length == 2){
if(map.containsKey(kvAry[0])){
map.put(kvAry[0],map.get(kvAry[0])+","+kvAry[1]);
}else{
map.put(kvAry[0], kvAry[1]);
}
}
}
return map;
}
/**
* 将request请求参数解析为Map<String,Object>,数组传递的参数将用英文逗号进行分割
* @param request
* @return Map<String,Object>
*/
public static Map<String,Object> requestParam2MapString(HttpServletRequest request){
Map<String,Object> map = new HashMap<String, Object>();
Enumeration<?> enumeration=request.getParameterNames();
while(enumeration.hasMoreElements()){
String paraName=(String)enumeration.nextElement();
String[] values = request.getParameterValues(paraName);
String value = "";
if(values.length>0){
for(int i=0;i<values.length;i++){
value += values[i] + ",";
}
value = value.substring(0, value.length()-1);
}else{
value="";
}
map.put(paraName, value);
}
return map;
}
/**
* 将request请求参数解析为Map<String,Object>,数组传递的参数将用英文逗号进行分割
* @param request
* @return Map<String,Object>
*/
public static Map<String,Object> requestParam2MapString(HttpServletRequest request,boolean isArray){
Map<String,Object> map = new HashMap<String, Object>();
Enumeration<?> enumeration=request.getParameterNames();
while(enumeration.hasMoreElements()){
String paraName=(String)enumeration.nextElement();
String[] values = request.getParameterValues(paraName);
if(isArray){
if(values.length>1){
map.put(paraName, values);
}else if(values.length==1){
map.put(paraName, values[0]);
}else{
map.put(paraName, "");
}
}else{
String value = "";
if(values.length>0){
for(int i=0;i<values.length;i++){
value += values[i] + ",";
}
value = value.substring(0, value.length()-1);
}else{
value="";
}
map.put(paraName, value);
}
}
return map;
}
/**
* 将request请求参数解析为Map<String,Object[]>
* @param request
* @return Map<String,Object[]>
*/
public static Map<String,Object[]> requestParam2MapArray(HttpServletRequest request){
Map<String,Object[]> map = new HashMap<String, Object[]>();
Enumeration<?> enumeration=request.getParameterNames();
while(enumeration.hasMoreElements()){
String paraName=(String)enumeration.nextElement();
map.put(paraName, request.getParameterValues(paraName));
}
return map;
}
public static void main(String[] args) {
String arg = "a=1&b=2&c=";
Map<String, Object> map = formSerializeToMap(arg);
logger.debug(map.toString());
logger.debug(String.valueOf(map.containsKey("a")));
}
}
MessageUtil.java
package com.xcc.tools;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import com.thoughtworks.xstream.XStream;
public class MessageUtil {
/**
* 将XML转换成Map集合
*/
public static Map<String, String> xmlToMap(HttpServletRequest request) throws IOException, DocumentException{
Map<String, String> map = new HashMap<String, String>();
SAXReader reader = new SAXReader(); // 使用dom4j解析xml
InputStream ins = request.getInputStream(); // 从request中获取输入流
Document doc = reader.read(ins);
Element root = doc.getRootElement(); // 获取根元素
List<Element> list = root.elements(); // 获取所有节点
for (Element e : list) {
map.put(e.getName(), e.getText());
System.out.println(e.getName() + "--->" + e.getText());
}
ins.close();
return map;
}
/**
* 将文本消息对象转换成XML
*/
public static String textMessageToXML(TextMeaasge textMessage){
XStream xstream = new XStream(); // 使用XStream将实体类的实例转换成xml格式
xstream.alias("xml", textMessage.getClass()); // 将xml的默认根节点替换成“xml”
return xstream.toXML(textMessage);
}
}
TextMessage.java
package com.xcc.tools;
public class TextMeaasge {
private String ToUserName;
private String FromUserName;
private long CreateTime;
private String MsgType;
private String Content;
private String MsgId;
public TextMeaasge() {
}
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;
}
public String getContent() {
return Content;
}
public void setContent(String content) {
Content = content;
}
public String getMsgId() {
return MsgId;
}
public void setMsgId(String msgId) {
MsgId = msgId;
}
}
2、servlet实现
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.dom4j.DocumentException;
import com.xcc.tools.MessageUtil;
import com.xcc.tools.TextMeaasge;
@SuppressWarnings("serial")
public class WxServlet extends HttpServlet {
/**
* 接收微信服务器发送来的4个参数,进行验证
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 微信加密签名
String signature = request.getParameter("signature");
// 时间戳
String timestamp = request.getParameter("timestamp");
// 随机数
String nonce = request.getParameter("nonce");
// 随机字符串
String echostr = request.getParameter("echostr");
PrintWriter out = response.getWriter();
// 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
out.print(echostr);
System.out.println("微信服务验证成功!");
out.close();
out = null;
}
/**
* 接收客户端发来的信息
*/
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/xml;charset=utf-8");
PrintWriter out = response.getWriter();
try {
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 message = null;
if ("text".equals(msgType)) { // 对文本消息进行处理
TextMeaasge text = new TextMeaasge();
text.setFromUserName(toUserName); // 发送和回复是反向的
text.setToUserName(fromUserName);
text.setMsgType("text");
text.setCreateTime(new Date().getTime());
text.setContent("你发送的消息是:" + content);
message = MessageUtil.textMessageToXML(text);
System.out.println(message);
}
out.print(message); // 将回应发送给微信服务器
} catch (DocumentException e) {
e.printStackTrace();
}finally{
out.close();
}
}
}
3、web.xml配置
4、之后公众号中配置url及token就可以了,如何只是测试,所以没有对token进行验证
5、示例