1.开发准备

网穿透

我用的花生壳

填入你的域名 (花生壳默认送你一个) 和你现在内网的ip 192.168.x.x

然后测试一下 

通过域名访问你的项目

2.公众号配置

Token(令牌): 随意(我这里弄的是token);

EncodingAESKey :随机生成就可以

url填写为自己服务器的域名 如:http://www.xxxx.com/weixin/verify

/weixin/chat  是下面chatController ,推送的链接。

提交服务器配置微信返回

signature , timestamp ,  nonce ,  echostr 4个参数

/**
     * 接入微信服务 (验证服务只使用一次)
     * @param request
     * @param response
     */
    @RequestMapping(value="/verify",method= RequestMethod.GET)
    public void index(HttpServletRequest request,HttpServletResponse response){
        log.info("微信接入服务器");
        String signature = request.getParameter("signature");
        String timestamp = request.getParameter("timestamp");
        String nonce = request.getParameter("nonce");
        String token = "token";
        String echostr = request.getParameter("echostr");
        if (weChatServiceImpl.verifyInfo(signature, timestamp, nonce, token)) {
            log.info("echostr为:{}"+echostr);
            if (echostr != null) {
                try {
                    response.getWriter().write(echostr);
                    log.info("微信接入服务器成功");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } else {
            log.info("微信接入服务器失败");
            log.info("signature为:{}"+signature);
            log.info("timestamp为:{}"+timestamp);
            log.info("nonce为:{}"+nonce);
            log.info("token为:{}"+token);
        }
    }

 将token(就是你上面填写的)、timestamp、nonce三个参数进行字典序排序 2)将三个参数字符串拼接成一个字符串进行sha1加密 3)开发者获得加密后的字符串可与signature对比查看是否正确

最后将echostr 字符串返回给微信

 //微信服务验证
    public Boolean verifyInfo(String signature, String timestamp, String nonce,
                              String token) {
        TreeSet<String> set = new TreeSet<String>();
        set.add(token); 
        set.add(timestamp);
        set.add(nonce);
        StringBuilder sBuilder = new StringBuilder();
        for (String item : set) {
            sBuilder.append(item);
        }
        String sign = DigestUtils.sha1Hex(sBuilder.toString());
        return signature.equalsIgnoreCase(sign);
    }

 

提交后显示配置成功 表示微信通过此接口进行交互

获取所有用户在公众号的操作  进一步处理将返回操作和消息进行自动回复等操作

  /**
     *       微信动作推送
     * @param request
     * @param response
     * @throws Exception
     */
    @RequestMapping(value = "/verify", method = RequestMethod.POST)
    @ResponseBody
    public void verifyPost(HttpServletRequest request, HttpServletResponse response) throws Exception {
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        PrintWriter out = response.getWriter();
        try {
            msg = weChatService.weixinPost(request);
            out.write(msg);
            log.info("The request completed successfully--请求成功");
            log.info("to weixin server "+"\n"+msg);
        } catch (Exception e) {
            log.error("返回微信服务消息为"+msg+",不能发送到公众号");
            log.error("Failed to convert the message from weixin!");
        }finally{
            out.close();
        }
    }

取得微信消息  分类然后回复 或者不做处理(文档中有具体类型)

public String weixinPost(HttpServletRequest request) throws Exception {
        String respMessage = null;
        // 1.将xml转换成Map格式
        Map<String, String> resultMap = WeChatUtil.parseXmlToMap(request);
        log.info("###收到微信消息####resultMap:" + resultMap.toString());
        // 2.判断消息类型
        String msgType = resultMap.get("MsgType");
        // 开发者微信公众号
        String toUserName = resultMap.get("ToUserName");
        // 消息来自公众号 取得openId
        String fromUserName = resultMap.get("FromUserName");
        // 消息内容
        String content = resultMap.get("Content");

        Map<String, Object> userInfo = WeChatUtil.getUserInformationByOpenid(fromUserName);
        log.info("openId: " + fromUserName + ", 开发者微信公众号: " + toUserName + ", 消息类型: " + msgType + ", 消息内容: " + content);
        // 文本消息
        if (RESP_MESSAGE_TYPE.TEXT.name.equals(msgType)) {
            //关键字
             if (content.equals("测试")) {
                ReplyTextMsg text = new ReplyTextMsg();
                text.setContent("微信jsapi支付测试:http://kikock.iok.la/mtmall/wxPay/jsapiPay");
                text.setToUserName(fromUserName);
                text.setFromUserName(toUserName);
                text.setCreateTime();
                text.setMsgType(RESP_MESSAGE_TYPE.TEXT.name);
                respMessage = text.Msg2Xml();
            } else if (content.equals("缓存")) {
                ReplyTextMsg text = new ReplyTextMsg();
                text.setContent("debugx5.qq.com");
                text.setToUserName(fromUserName);
                text.setFromUserName(toUserName);
                text.setCreateTime();
                text.setMsgType(RESP_MESSAGE_TYPE.TEXT.name);
                respMessage = text.Msg2Xml();
            }
            //地理位置
        } else if (RESP_MESSAGE_TYPE.LOCATION.name.equals(msgType)) {

            // 事件推送
        } else if (RESP_MESSAGE_TYPE.EVENT.name.equals(msgType)) {
            // 事件类型
            String eventType = resultMap.get("Event");
            //关注事件
            if (RESP_MESSAGE_TYPE.SUBSCRIBE.name.equals(eventType)) {
                ReplyTextMsg text = new ReplyTextMsg();
                text.setContent("欢迎关注,kikock的公众号");
                text.setToUserName(fromUserName);
                text.setFromUserName(toUserName);
                text.setCreateTime();
                text.setMsgType(RESP_MESSAGE_TYPE.TEXT.name );
                respMessage= text.Msg2Xml();

            }
         }
        return respMessage;
    }