zoukankan      html  css  js  c++  java
  • 微信公众号自动回复

    先进行公众号服务器配置,不会的可参考博主上篇http://www.cnblogs.com/yanan7890/p/8629094.html

    Controller:

    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();
        }
    }
    View Code

    工具类:

    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;
        }
    }
    View Code

     注意:

    微信官方文档提供的xml如下:

    <xml> <ToUserName>< ![CDATA[toUser] ]></ToUserName> <FromUserName>< ![CDATA[fromUser] ]></FromUserName> <CreateTime>12345678</CreateTime> <MsgType>< ![CDATA[text] ]></MsgType> <Content>< ![CDATA[你好] ]></Content> </xml>
    View Code

    千万不要照着官网的例子来,有空格,必须删除,否则报“该公众号提供的服务出现故障,请稍后再试”

    注意:未认证的情况下只有上述回复文本消息接口权限,如图片、视频等需要认证

  • 相关阅读:
    AtCoder Beginner Contest 218 A~F 题解
    【学习笔记】光速幂
    【Nowcoder 1103A】复读数组
    【Nowcoder 1105A】集合统计
    初赛知识宝典
    KMP算法 next数组模板
    C#链接Windows远程桌面
    帝国cms 修改 上一篇 下一篇样式
    Appweb漏洞复现
    Apereo-cas漏洞复现
  • 原文地址:https://www.cnblogs.com/yanan7890/p/8632443.html
Copyright © 2011-2022 走看看