java 微信公众号开发之简单的实现文字回复的操作

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、示例



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值