@Override
  protected void service(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

    response.setContentType("text/html;charset=utf-8");
    response.setStatus(HttpServletResponse.SC_OK);

    String code = request.getParameter("code");
    try {
      response.getWriter().println("<h1>code</h1>");
      response.getWriter().println(code);

      WxMpOAuth2AccessToken wxMpOAuth2AccessToken = this.wxMpService.oauth2getAccessToken(code);
      response.getWriter().println("<h1>access token</h1>");
      response.getWriter().println(wxMpOAuth2AccessToken.toString());

      WxMpUser wxMpUser = this.wxMpService.oauth2getUserInfo(wxMpOAuth2AccessToken, null);
      response.getWriter().println("<h1>user info</h1>");
      response.getWriter().println(wxMpUser.toString());

      wxMpOAuth2AccessToken =
          this.wxMpService.oauth2refreshAccessToken(wxMpOAuth2AccessToken.getRefreshToken());
      response.getWriter().println("<h1>after refresh</h1>");
      response.getWriter().println(wxMpOAuth2AccessToken.toString());

    } catch (WxErrorException e) {
      e.printStackTrace();
    }

    response.getWriter().flush();
    response.getWriter().close();
  }
  public WxMpOAuth2AccessToken deserialize(
      JsonElement json, Type typeOfT, JsonDeserializationContext context)
      throws JsonParseException {
    WxMpOAuth2AccessToken accessToken = new WxMpOAuth2AccessToken();
    JsonObject accessTokenJsonObject = json.getAsJsonObject();

    if (accessTokenJsonObject.get("access_token") != null
        && !accessTokenJsonObject.get("access_token").isJsonNull()) {
      accessToken.setAccessToken(GsonHelper.getAsString(accessTokenJsonObject.get("access_token")));
    }
    if (accessTokenJsonObject.get("expires_in") != null
        && !accessTokenJsonObject.get("expires_in").isJsonNull()) {
      accessToken.setExpiresIn(
          GsonHelper.getAsPrimitiveInt(accessTokenJsonObject.get("expires_in")));
    }
    if (accessTokenJsonObject.get("refresh_token") != null
        && !accessTokenJsonObject.get("refresh_token").isJsonNull()) {
      accessToken.setRefreshToken(
          GsonHelper.getAsString(accessTokenJsonObject.get("refresh_token")));
    }
    if (accessTokenJsonObject.get("openid") != null
        && !accessTokenJsonObject.get("openid").isJsonNull()) {
      accessToken.setOpenId(GsonHelper.getAsString(accessTokenJsonObject.get("openid")));
    }
    if (accessTokenJsonObject.get("scope") != null
        && !accessTokenJsonObject.get("scope").isJsonNull()) {
      accessToken.setScope(GsonHelper.getAsString(accessTokenJsonObject.get("scope")));
    }
    return accessToken;
  }
  /**
   * 网页授权回调
   *
   * @param request
   * @param response
   */
  @RequestMapping("oauth")
  public void oauth(HttpServletRequest request, HttpServletResponse response) {

    try {
      WxMpService wxService = BuildAndGetWxService.buildAndGetWxService();
      String state = request.getParameter("state");
      String openId = null;
      Owners owner = null;
      LogBuilder.writeToLog("error in oauth");
      if (request.getSession().getAttribute("openId") == null) {
        WxMpOAuth2AccessToken wxMpOAuth2AccessToken =
            wxService.oauth2getAccessToken(request.getParameter("code"));
        openId = wxMpOAuth2AccessToken.getOpenId();
        LogBuilder.writeToLog(openId);
        request.getSession().setAttribute("openId", openId);
      } else {
        openId = (String) request.getSession().getAttribute("openId");
        LogBuilder.writeToLog("error");
      }
      if (state.equals("1")) {
        response.sendRedirect("/owner/ownerBind?openId=" + openId);
        return;
      } else if (state.equals("2")) {
        owner = (Owners) request.getSession().getAttribute("owner");
        if (owner == null) {
          owner = ownerService.getOwnerByOpenId(openId);
        }
        if (owner != null) {
          request.getSession().setAttribute("owner", owner);
          response.sendRedirect("/owner/ownerProfile?openId=" + openId);
          return;
        } else {
          request.getSession().setAttribute("visitor", "visitor");
        }
        response.sendRedirect("/owner/ownerBind?openId=" + openId);
        return;
      } else if (state.equals("3")) {

        owner = (Owners) request.getSession().getAttribute("owner");
        if (owner == null) {
          owner = ownerService.getOwnerByOpenId(openId);
        }
        if (owner != null) {
          request.getSession().setAttribute("owner", owner);

        } else {
          request.getSession().setAttribute("visitor", "visitor");
        }
        response.sendRedirect("/custom/index.jsp");
        return;
      } else if (state.equals("4")) {
        owner = (Owners) request.getSession().getAttribute("owner");
        if (owner == null) {
          owner = ownerService.getOwnerByOpenId(openId);
        }
        if (owner != null) {
          request.getSession().setAttribute("owner", owner);
          response.sendRedirect("/custom/comment.jsp");
          return;
        } else {
          request.getSession().setAttribute("visitor", "visitor");
          response.sendRedirect("/owner/ownerBind?openId=" + openId);
          return;
        }

      } else if (state.equals("5")) {
        owner = (Owners) request.getSession().getAttribute("owner");
        if (owner == null) {
          owner = ownerService.getOwnerByOpenId(openId);
        }
        if (owner != null) {
          request.getSession().setAttribute("owner", owner);
          response.sendRedirect("/custom/repair.jsp");
          return;
        } else {
          request.getSession().setAttribute("visitor", "visitor");
          response.sendRedirect("/owner/ownerBind?openId=" + openId);
          return;
        }

      } else if (state.equals("6")) {
        owner = (Owners) request.getSession().getAttribute("owner");
        if (owner == null) {
          owner = ownerService.getOwnerByOpenId(openId);
        }
        if (owner != null) {
          request.getSession().setAttribute("owner", owner);
          response.sendRedirect("/owner/myChargeAndMessage?openId=" + openId);
          return;
        } else {
          request.getSession().setAttribute("visitor", "visitor");
          response.sendRedirect("/owner/ownerBind?openId=" + openId);
          return;
        }
      }
    } catch (Exception e) {
      e.printStackTrace();
      LogBuilder.writeToLog(e.getMessage());
    }
  }