微信公众号自动回复
先进行公众号服务器配置,不会的可参考博主上篇http://www.cnblogs.com/yanan7890/p/8629094.html
Controller:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package controller; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.Collections; import java.util.Map; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.codec.digest.DigestUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import util.MessageUtil; import util.XMLUtil; @Controller public class PdfController { private static final Logger logger = LoggerFactory.getLogger(PdfController.class); @RequestMapping("/pdf") public void index(HttpServletRequest req, HttpServletResponse res) throws Exception { logger.info("-----------进入pdf------------"); res.setCharacterEncoding("utf-8"); req.setCharacterEncoding("utf-8"); boolean isGet = req.getMethod().toLowerCase().equals("get"); if(isGet){ String signature = req.getParameter("signature"); String timestamp = req.getParameter("timestamp"); String nonce = req.getParameter("nonce"); String echostr = req.getParameter("echostr"); String token = "zhangyanan"; ArrayList<String> list = new ArrayList<String>(); list.add(nonce); list.add(timestamp); list.add(token); Collections.sort(list); String signature2 = DigestUtils.shaHex(list.get(0) + list.get(1) + list.get(2)); if (signature.equals(signature2)) { res.getWriter().write(echostr); res.getWriter().close(); } }else{ logger.info("-----------hadreturn------------"); ServletInputStream in = req.getInputStream(); String params = inputStream2String(in); Map<String, String> mapxml = XMLUtil.XMLToMap(params); logger.info("params:-----------------:" + params.toString()); in.close(); // 消息类型 String msgType = (String) mapxml.get("MsgType"); String content="自动回复功能正在开发,请稍后再试"; // 文本消息 if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)&&mapxml.get("Content").equals("pdf")) { content="pdf"; } String xmlSendUser = XMLUtil.toXmlSendUser(mapxml.get("FromUserName"), mapxml.get("ToUserName"), Integer.valueOf(mapxml.get("CreateTime")),content); logger.info("xmlSendUser:" + xmlSendUser); res.getWriter().write(xmlSendUser); res.getWriter().close(); } } private static final String inputStream2String(InputStream in) throws UnsupportedEncodingException, IOException { if (in == null) return ""; StringBuffer out = new StringBuffer(); byte[] b = new byte[4096]; for (int n; (n = in.read(b)) != -1;) { out.append(new String(b, 0, n, "UTF-8")); } return out.toString(); } }
工具类:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package util; import java.util.HashMap; import java.util.List; import java.util.Map; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * * @todo * @author zhangyanan * @datetime 2017年11月30日下午1:59:25 */ public class XMLUtil { private static final Logger logger = LoggerFactory.getLogger(XMLUtil.class); /** * * @todo xml转map * @author zhangyanan * @datetime 2017年11月30日下午1:58:49 * @param xml * @return */ public static Map<String,String> XMLToMap(String xml){ Map<String, String> map = new HashMap<String, String>(); Document document; try { document = DocumentHelper.parseText(xml); Element root = document.getRootElement(); // 获取XML文档的根节点对象 @SuppressWarnings("unchecked") List<Element> list = root.elements(); // 获取根节点下的所有的子节点 for (Element ele : list) { // 遍历根节点下的所有子节点并将其放入MAP对象中 map.put(ele.getName(), ele.getText()); } return map; } catch (DocumentException e) { e.printStackTrace(); } return null; } public static String toXmlSendUser(String OpenID,String kfwxid,int time,String Content) throws Exception { StringBuilder sb = new StringBuilder(); sb.append("<xml>"); sb.append("<ToUserName><![CDATA["+OpenID+"]]></ToUserName>"); sb.append("<FromUserName><![CDATA["+kfwxid+"]]></FromUserName>"); sb.append("<CreateTime><![CDATA["+time+"]]></CreateTime>"); sb.append("<MsgType><![CDATA[text]]></MsgType>"); sb.append("<Content><![CDATA["+Content+"]]></Content>"); sb.append("</xml>"); String data = sb.toString(); logger.info("-------------------XMLPushMsg:"+data); return data; } }
注意:
微信官方文档提供的xml如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<xml> <ToUserName>< ![CDATA[toUser] ]></ToUserName> <FromUserName>< ![CDATA[fromUser] ]></FromUserName> <CreateTime>12345678</CreateTime> <MsgType>< ![CDATA[text] ]></MsgType> <Content>< ![CDATA[你好] ]></Content> </xml>
千万不要照着官网的例子来,有空格,必须删除,否则报“该公众号提供的服务出现故障,请稍后再试”
注意:未认证的情况下只有上述回复文本消息接口权限,如图片、视频等需要认证
本文来自博客园,作者:每天都要学一点,欢迎讨论和转载,转载请注明原文链接:https://www.cnblogs.com/yanan7890/p/8632443.html