/**
  * 序列化关注渠道
  *
  * @param message
  */
 private String serializeSubscribe(Message message) {
   String eventKey = message.getEventKey();
   String openId = message.getFromUserName();
   if (eventKey != null && eventKey.startsWith("qrscene_")) {
     eventKey = eventKey.substring("qrscene_".length());
   } else if (eventKey == null || eventKey.equals("")) {
     eventKey = DEFAULT_EVENT_KEY;
   }
   this.subscribeService.save(new Subscribe(openId, eventKey));
   return eventKey;
 }
 @Override
 public Message kfCloseSessionEvent(Message message) {
   Message result = new Message();
   result.setFromUserName(message.getToUserName());
   result.setToUserName(message.getFromUserName());
   result.setCreateTime(System.currentTimeMillis() / 1000);
   result.setMsgType(MsgType.text);
   String content = this.robotMsgByKeyword("评价客服", message.getFromUserName());
   if (content != null) {
     content = content.replaceAll("#kfAccount", message.getKfAccount());
   }
   result.setContent(content);
   return result;
 }
 @Override
 public Message subscribe(Message message) {
   String eventKey = serializeSubscribe(message); // 序列化渠道
   Message result = new Message();
   result.setFromUserName(message.getToUserName());
   result.setToUserName(message.getFromUserName());
   result.setCreateTime(System.currentTimeMillis());
   result.setMsgType(MsgType.text);
   String content = this.robotMsgByEventKey(PREFIX_QR_SUBSCRIBE, eventKey);
   result.setContent(content);
   return result;
 }
  @Override
  public Message clickEvent(Message message, IWxApi wxApi) {
    String opendid = message.getFromUserName();
    Message result = new Message();
    result.setFromUserName(message.getToUserName());
    result.setToUserName(message.getFromUserName());
    result.setCreateTime(System.currentTimeMillis());
    result.setMsgType(MsgType.text);
    String content;
    if (CLICK_LOGIN_BIND.equals(message.getEventKey())) { // 免登陆功能按钮key
      // 免登陆功能按钮
      Map<String, String> paramsMap = new HashMap<>();
      paramsMap.put("openId", opendid);
      FenlibaoApi<AutoLogin> fenlibaoApi =
          this.httpsPost(
              this.connectionSettings.getServerBind(),
              paramsMap,
              new TypeReference<FenlibaoApi<AutoLogin>>() {});

      if (fenlibaoApi == null
          || fenlibaoApi.getData() != null
              && fenlibaoApi.getData().getWeixinStatus() != WeixinStatus.BINDED) {
        // 绑定提示
        content = this.robotMsgByKeyword("开启免登录", message.getFromUserName());
      } else {
        content = this.robotMsgByKeyword("取消免登录", message.getFromUserName());
      }

    } else if (CLICK_WEIXIN_CUSTOMER.equals(message.getEventKey())) { // 微信客服
      int dayOfWeek = this.getDayOfWeek();
      if (dayOfWeek > 1 && dayOfWeek < 7) {
        content = this.robotMsgByKeyword("工作日客服消息", message.getFromUserName());
      } else {
        content = this.robotMsgByKeyword("休息日客服消息", message.getFromUserName());
      }
    } else {
      content = this.robotMsgByKeyword(message.getEventKey(), message.getFromUserName());
    }

    if (content != null) {
      result.setContent(content);
      return result;
    } else {
      return null;
    }
  }
 @Async
 @Override
 public void completeStatusTemplateMsg(Message message) {
   this.templateMsgRepository.setStatusFor(message.getMsgID(), message.getStatus());
 }
  /**
   * 消息处理
   *
   * @param message
   * @return
   */
  @Override
  public Message multiService(Message message) {
    String content = this.robotMsgByKeyword(message.getContent(), message.getFromUserName());
    if (null == content) {
      String toUserName = message.getFromUserName();
      message.setFromUserName(message.getToUserName());
      message.setToUserName(toUserName);
      message.setMsgType(MsgType.transfer_customer_service);
      return message;
    }

    Message result = new Message();
    result.setFromUserName(message.getToUserName());
    result.setToUserName(message.getFromUserName());
    result.setCreateTime(System.currentTimeMillis());
    result.setMsgType(MsgType.text);
    result.setContent(content);
    return result;
  }