@Override
  public WxMpXmlOutMessage handle(
      WxMpXmlMessage wxMessage,
      Map<String, Object> context,
      WxMpService wxMpService,
      WxSessionManager sessionManager)
      throws WxErrorException {

    if (wxMessage.getContent().equals("1")) {
      String url =
          wxMpService.oauth2buildAuthorizationUrl(
              Configue.getBaseUrl() + "/binf/oauth/login", WxConsts.OAUTH2_SCOPE_BASE, null);
      System.out.println("url:" + url);
      String aTag = "<a href=\"" + url + "\">认证链接</a>";
      return WxMpXmlOutMessage.TEXT()
          .content(aTag)
          .fromUser(wxMessage.getToUserName())
          .toUser(wxMessage.getFromUserName())
          .build();
    } else {
      return WxMpXmlOutMessage.TEXT()
          .content(Constant.DEF_SUBSCRIBE_TEXT)
          .fromUser(wxMessage.getToUserName())
          .toUser(wxMessage.getFromUserName())
          .build();
    }
  }
  /** 此逻辑为了确定请求来自微信服务器 */
  @RequestMapping(value = "/api/wechat", method = RequestMethod.GET)
  public void service(HttpServletRequest request, HttpServletResponse response) throws IOException {
    logger.debug("验证是否来自微信请求");
    response.setContentType("text/html;charset=utf-8");
    response.setStatus(HttpServletResponse.SC_OK);

    String signature = request.getParameter("signature");
    String nonce = request.getParameter("nonce");
    String timestamp = request.getParameter("timestamp");

    if (!WeChatConnector.getMpService().checkSignature(timestamp, nonce, signature)) {
      // 消息签名不正确,说明不是公众平台发过来的消息
      response.getWriter().println("非法请求");
      return;
    }

    String echostr = request.getParameter("echostr");
    if (StringUtils.isNotBlank(echostr)) {
      // 说明是一个仅仅用来验证的请求,回显echostr
      response.getWriter().println(echostr);
      return;
    }

    String encryptType =
        StringUtils.isBlank(request.getParameter("encrypt_type"))
            ? "raw"
            : request.getParameter("encrypt_type");

    if ("raw".equals(encryptType)) {
      // 明文传输的消息
      WxMpXmlMessage inMessage = WxMpXmlMessage.fromXml(request.getInputStream());
      WxMpXmlOutMessage outMessage = WeChatConnector.getMpMessageRouter().route(inMessage);
      if (outMessage != null) {
        response.getWriter().write(outMessage.toXml());
      }
      return;
    }

    if ("aes".equals(encryptType)) {
      // 是aes加密的消息
      String msgSignature = request.getParameter("msg_signature");
      WxMpXmlMessage inMessage =
          WxMpXmlMessage.fromEncryptedXml(
              request.getInputStream(),
              WeChatConnector.getMpConfigStorage(),
              timestamp,
              nonce,
              msgSignature);
      WxMpXmlOutMessage outMessage = WeChatConnector.getMpMessageRouter().route(inMessage);
      response.getWriter().write(outMessage.toEncryptedXml(WeChatConnector.getMpConfigStorage()));
      return;
    }

    response.getWriter().println("不可识别的加密类型");
    return;
  }
  @RequestMapping(value = "/api/wechat/", method = RequestMethod.POST)
  public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException, DocumentException, WxErrorException {
    // 将请求、响应的编码均设置为UTF-8(防止中文乱码)
    request.setCharacterEncoding("UTF-8");
    response.setCharacterEncoding("UTF-8");
    logger.debug("点击按钮");
    /* 获取openId */
    // String code = request.getParameter("code");
    // WxMpOAuth2AccessToken wxMpOAuth2AccessToken = WeChatConnector
    // .getMpService().oauth2getAccessToken(code);
    // WxMpUser wxMpUser = WeChatConnector.getMpService()
    // .oauth2getUserInfo(wxMpOAuth2AccessToken, null);
    // logger.debug("openId"+wxMpUser.getOpenId());
    Map<String, String> requestMap = MessageUtil.parseXml(request);
    logger.debug(requestMap.toString());
    String toUserName = requestMap.get("FromUserName");
    String fromUserName = requestMap.get("ToUserName");
    String msgType = requestMap.get("MsgType");
    // logger.debug("msgType:"+msgType);
    // logger.debug("ToUserName"+fromUserName);
    // logger.debug("FromUserName"+toUserName);
    // logger.debug("Event:"+requestMap.get("Event"));
    // logger.debug("OrderId:"+requestMap.get("OrderId"));
    // logger.debug("OrderStatus:"+requestMap.get("OrderStatus"));
    // logger.debug("ProductId:"+requestMap.get("ProductId"));
    // logger.debug("SkuInfo:"+requestMap.get("SkuInfo"));
    if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) {
      String eventType = requestMap.get("Event");
      if (eventType.equals(MessageUtil.EVENT_TYPE_CLICK)) {
        // 事件KEY值,与创建自定义菜单时指定的KEY值对应
        String eventKey = requestMap.get("EventKey");
        if (eventKey.matches("activitys:\\d+")) {
          logger.debug("推送长图文消息");
          Long outNewsMessageId = Long.parseLong(eventKey.split(":")[1]);
          OutNewsMessage outNewsMessage = outNewsMessageRepository.findOne(outNewsMessageId);
          WxMpXmlOutNewsMessage m =
              WxMpXmlOutMessage.NEWS().fromUser(fromUserName).toUser(toUserName).build();
          if (outNewsMessage != null) {
            logger.debug("子图文size:" + outNewsMessage.getOutNewsMessageItems().size());
            logger.debug("遍历添加子图文");
            for (OutNewsMessageItem outNewsMessageItem : outNewsMessage.getOutNewsMessageItems()) {
              WxMpXmlOutNewsMessage.Item item = new WxMpXmlOutNewsMessage.Item();
              //							String url=outNewsMessageItem.getUrl();
              //							url=url.replace("/", "%2F");
              //							url=url.replace(":", "%3A");
              //							apiUrl=apiUrl.replace("{url}", url);
              item.setUrl(
                  apiUrl.replace("{outNewsMessageItem.id}", "" + outNewsMessageItem.getId()));
              logger.debug("apiUrl:" + apiUrl);
              item.setPicUrl(outNewsMessageItem.getPicUrl());
              item.setDescription(outNewsMessageItem.getContent());
              item.setTitle(outNewsMessageItem.getContent());
              m.addArticle(item);
            }
            // WxMpXmlOutNewsMessage m = WxMpXmlOutMessage.NEWS()
            // .fromUser(fromUserName).toUser(toUserName)
            // .addArticle(item).build();
            logger.info(m.toXml());
            response.getWriter().write(m.toXml());
            response.getWriter().close();
          }
          return;
        } else {

          OutMessage message = outMessageService.findOneById(Long.parseLong(eventKey));
          if (message == null) {
            return;
          }
          if ("news".equals(message.getType())) {
            logger.debug("推送图文消息");
            WxMpXmlOutNewsMessage.Item item = new WxMpXmlOutNewsMessage.Item();
            item.setUrl(message.getUrl());
            item.setPicUrl(message.getPicUrl());
            item.setDescription(message.getContent());
            item.setTitle(message.getTitle());
            WxMpXmlOutNewsMessage m =
                WxMpXmlOutMessage.NEWS()
                    .fromUser(fromUserName)
                    .toUser(toUserName)
                    .addArticle(item)
                    .build();
            logger.info(m.toXml());
            response.getWriter().write(m.toXml());
            response.getWriter().close();
          }
          if ("text".equals(message.getType())) {
            logger.debug("推送文本消息");
            WxMpXmlOutTextMessage text =
                WxMpXmlOutMessage.TEXT()
                    .fromUser(fromUserName)
                    .toUser(toUserName)
                    .content(message.getContent())
                    .build();
            response.getWriter().write(text.toXml());
            response.getWriter().close();
          }
        }
      } else if (eventType.equals("merchant_order")) {
        /*捕获微小店付款事件*/
        logger.debug("微小店付款");
        /*得到订单号*/
        String orderId = requestMap.get("OrderId");
        /*查看商品详情,得到商品名和商品数量*/
        Map<String, Object> orderInfo = RestTemplateUtil.getOrderInfo(orderId);
        Integer product_count = (Integer) orderInfo.get("product_count");
        String product_name = (String) orderInfo.get("product_name");
        Integer order_total_price = (Integer) orderInfo.get("order_total_price");
        String returnOrderPrice = "" + (order_total_price * 1.0 / 100) + "元";
        /*根据商品名确定是发哪个供应商的提货码,并且发同等数量*/
        Goods goods = goodsRepository.findOneByName(product_name);
        if (goods == null) {
          logger.debug("商品:" + product_name + ",未在管理台绑定对应的批次号");
          return;
        }
        List<NCoupon> nCoupons =
            nCouponService.getOneUnusedNCoupon(goods.getCouponBatch(), COUPONSTATUS.UNUSED);
        if (nCoupons == null || nCoupons.size() < product_count) {
          logger.debug("提货码不足");
          return;
        }
        String couponsInfo = "";
        for (int i = 0; i < product_count; i++) {
          NCoupon nCoupon = nCoupons.get(i);
          nCoupon.setStatus(COUPONSTATUS.SENT);
          nCouponService.save(nCoupon);
          couponsInfo += nCoupon.getCode() + ",";
        }
        couponsInfo = couponsInfo.substring(0, couponsInfo.length() - 1);
        logger.debug("couponsInfo:" + couponsInfo);
        RestTemplateUtil.sendTemplateInfo(
            toUserName, "https://www.baidu.com/", returnOrderPrice, couponsInfo);
      } else {
        logger.debug("eventType:" + eventType);
      }
    }
  }