diff --git a/src/main/java/love/sola/netsupport/api/Authorize.java b/src/main/java/love/sola/netsupport/api/Authorize.java deleted file mode 100644 index 4fca2b4..0000000 --- a/src/main/java/love/sola/netsupport/api/Authorize.java +++ /dev/null @@ -1,90 +0,0 @@ -package love.sola.netsupport.api; - -import com.google.gson.Gson; -import love.sola.netsupport.config.Settings; -import love.sola.netsupport.pojo.User; -import love.sola.netsupport.sql.SQLCore; -import love.sola.netsupport.sql.TableUser; -import love.sola.netsupport.util.Checker; -import love.sola.netsupport.util.ParseUtil; -import love.sola.netsupport.wechat.Command; - -import javax.servlet.ServletException; -import javax.servlet.annotation.WebServlet; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; -import java.io.IOException; -import java.io.PrintWriter; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * *********************************************** - * Created by Sola on 2015/12/2. - * Don't modify this source without my agreement - * *********************************************** - */ -@WebServlet(name = "Authorize", urlPatterns = "/api/authorize", loadOnStartup = 21) -public class Authorize extends HttpServlet { - - private Gson gson = SQLCore.gson; - - public static Map fetchedTime = new ConcurrentHashMap<>(); - public static Map fetchedCommand = new ConcurrentHashMap<>(); - - protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - doGet(request, response); - } - - protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - request.setCharacterEncoding("utf-8"); - response.setCharacterEncoding("utf-8"); - response.addHeader("Content-type", "text/json;charset=utf-8"); - PrintWriter out = response.getWriter(); - String json = gson.toJson(authorize(request)); - out.println(ParseUtil.parseJsonP(request, json)); - out.close(); - } - - private Response authorize(HttpServletRequest request) { - String wechat = request.getParameter("wechat"); - if (wechat == null) { - return new Response(Response.ResponseCode.PARAMETER_REQUIRED); - } - Long l = fetchedTime.remove(wechat); - Command c = fetchedCommand.remove(wechat); - - // FIXME: 2015/12/10 FOR TEST ONLY - if (request.getParameter("bypass") != null) { - c = Command.fromId(Integer.parseInt(request.getParameter("bypass"))); - l = System.currentTimeMillis(); - } - - if (Checker.hasNull(c, l)) { - return new Response(Response.ResponseCode.AUTHORIZE_FAILED); - } - if (l < System.currentTimeMillis() - Settings.I.User_Command_Timeout * 1000) { - return new Response(Response.ResponseCode.REQUEST_EXPIRED); - } - - HttpSession httpSession = request.getSession(true); - httpSession.setAttribute("authorized", c); - httpSession.setAttribute("wechat", wechat); - switch (c) { - case REGISTER: - break; - case QUERY: - case SUBMIT: - User u = TableUser.getByWechat(wechat); - if (u == null) return new Response(Response.ResponseCode.AUTHORIZE_FAILED); - httpSession.setAttribute("user", u); - break; - default: - return new Response(Response.ResponseCode.AUTHORIZE_FAILED); - } - return new Response(Response.ResponseCode.OK); - } - -} diff --git a/src/main/java/love/sola/netsupport/api/Register.java b/src/main/java/love/sola/netsupport/api/Register.java index b606e63..1b7d7d2 100644 --- a/src/main/java/love/sola/netsupport/api/Register.java +++ b/src/main/java/love/sola/netsupport/api/Register.java @@ -8,6 +8,7 @@ import love.sola.netsupport.sql.TableUser; import love.sola.netsupport.util.Checker; import love.sola.netsupport.util.ParseUtil; import love.sola.netsupport.wechat.Command; +import me.chanjar.weixin.common.session.WxSession; import org.hibernate.exception.ConstraintViolationException; import javax.servlet.ServletException; @@ -15,7 +16,6 @@ import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; import java.io.IOException; import java.io.PrintWriter; @@ -38,19 +38,15 @@ public class Register extends HttpServlet { response.setCharacterEncoding("utf-8"); response.addHeader("Content-type", "text/json;charset=utf-8"); PrintWriter out = response.getWriter(); - String json; - HttpSession httpSession = request.getSession(false); - if (!Checker.authorized(httpSession, Command.REGISTER)) { - json = gson.toJson(new Response(Response.ResponseCode.AUTHORIZE_FAILED)); - out.println(ParseUtil.parseJsonP(request, json)); - out.close(); + + WxSession session = Checker.isAuthorized(request, Command.REGISTER); + if (session == null) { + printAuthorizeFailed(request, out); return; } - String wechat = (String) httpSession.getAttribute("wechat"); + String wechat = (String) session.getAttribute("wechat"); if (wechat == null) { - json = gson.toJson(new Response(Response.ResponseCode.AUTHORIZE_FAILED)); - out.println(ParseUtil.parseJsonP(request, json)); - out.close(); + printAuthorizeFailed(request, out); return; } @@ -69,11 +65,9 @@ public class Register extends HttpServlet { boolean isSuccess = result.equals("Register_Success"); if (isSuccess) { request.getSession().invalidate(); - json = gson.toJson(new Response(Response.ResponseCode.OK, result)); - out.println(ParseUtil.parseJsonP(request, json)); + out.println(ParseUtil.parseJsonP(request, gson.toJson(new Response(Response.ResponseCode.OK, result)))); } else { - json = gson.toJson(new Response(Response.ResponseCode.REQUEST_FAILED, result)); - out.println(ParseUtil.parseJsonP(request, json)); + out.println(ParseUtil.parseJsonP(request, gson.toJson(new Response(Response.ResponseCode.REQUEST_FAILED, result)))); } out.close(); } @@ -171,4 +165,10 @@ public class Register extends HttpServlet { return -1; } + private void printAuthorizeFailed(HttpServletRequest request, PrintWriter out) { + out.println(ParseUtil.parseJsonP(request, gson.toJson(new Response(Response.ResponseCode.AUTHORIZE_FAILED)))); + out.close(); + return; + } + } diff --git a/src/main/java/love/sola/netsupport/api/TicketQuery.java b/src/main/java/love/sola/netsupport/api/TicketQuery.java index 9cbc024..27d33bf 100644 --- a/src/main/java/love/sola/netsupport/api/TicketQuery.java +++ b/src/main/java/love/sola/netsupport/api/TicketQuery.java @@ -7,6 +7,7 @@ import love.sola.netsupport.sql.SQLCore; import love.sola.netsupport.util.Checker; import love.sola.netsupport.util.ParseUtil; import love.sola.netsupport.wechat.Command; +import me.chanjar.weixin.common.session.WxSession; import org.hibernate.Criteria; import org.hibernate.HibernateException; import org.hibernate.Session; @@ -18,7 +19,6 @@ import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; import java.io.IOException; import java.io.PrintWriter; @@ -51,11 +51,11 @@ public class TicketQuery extends HttpServlet { private Response query(HttpServletRequest request) { try (Session s = SQLCore.sf.openSession()) { - HttpSession httpSession = request.getSession(false); - if (!Checker.authorized(httpSession, Command.QUERY)) { + WxSession session = Checker.isAuthorized(request, Command.QUERY); + if (session == null) { return new Response(Response.ResponseCode.UNAUTHORIZED); } - User u = (User) httpSession.getAttribute("user"); + User u = (User) session.getAttribute("user"); if (u == null) return new Response(Response.ResponseCode.UNAUTHORIZED); Criteria c = s.createCriteria(Ticket.class); diff --git a/src/main/java/love/sola/netsupport/api/TicketSubmit.java b/src/main/java/love/sola/netsupport/api/TicketSubmit.java index f0360a0..d8d1079 100644 --- a/src/main/java/love/sola/netsupport/api/TicketSubmit.java +++ b/src/main/java/love/sola/netsupport/api/TicketSubmit.java @@ -8,6 +8,7 @@ import love.sola.netsupport.sql.TableTicket; import love.sola.netsupport.util.Checker; import love.sola.netsupport.util.ParseUtil; import love.sola.netsupport.wechat.Command; +import me.chanjar.weixin.common.session.WxSession; import org.hibernate.HibernateException; import org.hibernate.Session; @@ -16,7 +17,6 @@ import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; import java.io.IOException; import java.io.PrintWriter; @@ -53,11 +53,11 @@ public class TicketSubmit extends HttpServlet { try (Session s = SQLCore.sf.openSession()) { - HttpSession httpSession = request.getSession(false); - if (!Checker.authorized(httpSession, Command.SUBMIT)) { + WxSession session = Checker.isAuthorized(request, Command.SUBMIT); + if (session == null) { return new Response(Response.ResponseCode.UNAUTHORIZED); } - User u = (User) httpSession.getAttribute("user"); + User u = (User) session.getAttribute("user"); if (u == null) return new Response(Response.ResponseCode.UNAUTHORIZED); if (TableTicket.hasOpen(u)) { diff --git a/src/main/java/love/sola/netsupport/api/admin/Login.java b/src/main/java/love/sola/netsupport/api/admin/Login.java index 62ec7b6..b3da153 100644 --- a/src/main/java/love/sola/netsupport/api/admin/Login.java +++ b/src/main/java/love/sola/netsupport/api/admin/Login.java @@ -2,21 +2,19 @@ package love.sola.netsupport.api.admin; import com.google.gson.Gson; import love.sola.netsupport.api.Response; -import love.sola.netsupport.enums.Access; +import love.sola.netsupport.enums.Attribute; import love.sola.netsupport.pojo.Operator; import love.sola.netsupport.sql.SQLCore; import love.sola.netsupport.util.Checker; import love.sola.netsupport.util.Crypto; import love.sola.netsupport.util.ParseUtil; -import org.hibernate.HibernateException; -import org.hibernate.Session; +import me.chanjar.weixin.common.session.WxSession; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; import java.io.IOException; import java.io.PrintWriter; @@ -46,32 +44,18 @@ public class Login extends HttpServlet { } private Response login(HttpServletRequest request) { - String wechat = request.getParameter("wechat"); - String opId = request.getParameter("op"); String password = request.getParameter("pass"); - if (Checker.hasNull(wechat, opId, password)) return new Response(Response.ResponseCode.PARAMETER_REQUIRED); + if (Checker.hasNull(password)) return new Response(Response.ResponseCode.PARAMETER_REQUIRED); - try (Session s = SQLCore.sf.openSession()) { - Operator operator = s.get(Operator.class, Integer.parseInt(opId)); - if (operator == null || operator.getAccess() == Access.NOLOGIN) - return new Response(Response.ResponseCode.OPERATOR_NOT_FOUND); - if (!wechat.equals(operator.getWechat())) - return new Response(Response.ResponseCode.INCORRECT_WECHAT); - if (!Crypto.check(password,operator.getPassword())) - return new Response(Response.ResponseCode.WRONG_PASSWORD); - - HttpSession httpSession = request.getSession(true); - httpSession.setAttribute("wechat", wechat); - httpSession.setAttribute("operator", operator); - return new Response(Response.ResponseCode.OK, operator); - } catch (NumberFormatException e) { - return new Response(Response.ResponseCode.ILLEGAL_PARAMETER); - } catch (HibernateException e) { - e.printStackTrace(); - return new Response(Response.ResponseCode.DATABASE_ERROR, e); - } catch (Exception e) { - e.printStackTrace(); - return new Response(Response.ResponseCode.INTERNAL_ERROR, e); + WxSession session = Checker.isOperator(request); + if (session == null) { + return new Response(Response.ResponseCode.UNAUTHORIZED); } + Operator operator = (Operator) session.getAttribute(Attribute.OPERATOR); + + if (!Crypto.check(password,operator.getPassword())) + return new Response(Response.ResponseCode.WRONG_PASSWORD); + else + return new Response(Response.ResponseCode.OK, operator); } } diff --git a/src/main/java/love/sola/netsupport/api/admin/TicketUpdate.java b/src/main/java/love/sola/netsupport/api/admin/TicketUpdate.java index 7bcb6ac..10f98b1 100644 --- a/src/main/java/love/sola/netsupport/api/admin/TicketUpdate.java +++ b/src/main/java/love/sola/netsupport/api/admin/TicketUpdate.java @@ -53,7 +53,7 @@ public class TicketUpdate extends HttpServlet { try (Session s = SQLCore.sf.openSession()) { HttpSession httpSession = request.getSession(false); - if (!Checker.operator(httpSession)) { + if (!Checker.isOperator(httpSession)) { return new Response(Response.ResponseCode.UNAUTHORIZED); } Operator op = (Operator) httpSession.getAttribute("operator"); diff --git a/src/main/java/love/sola/netsupport/api/test/TestPost.java b/src/main/java/love/sola/netsupport/api/test/TestPost.java deleted file mode 100644 index c9a06e6..0000000 --- a/src/main/java/love/sola/netsupport/api/test/TestPost.java +++ /dev/null @@ -1,48 +0,0 @@ -package love.sola.netsupport.api.test; - -import javax.servlet.ServletConfig; -import javax.servlet.ServletException; -import javax.servlet.annotation.WebServlet; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.io.PrintWriter; -import java.util.Arrays; -import java.util.Map; - -/** - * *********************************************** - * Created by Sola on 2014/8/20. - * Don't modify this source without my agreement - * *********************************************** - */ -@WebServlet(name = "TestPost",urlPatterns = "/api/testpost",loadOnStartup = 10) -public class TestPost extends HttpServlet { - - @Override - public void init(ServletConfig config) throws ServletException { - super.init(config); - } - - protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - doGet(request, response); - } - - protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - request.setCharacterEncoding("utf-8"); - response.setCharacterEncoding("utf-8"); - response.addHeader("Content-type", "text/plain;charset=utf-8"); - PrintWriter out = response.getWriter(); - out.println("Parameters:"); - for (Map.Entry entry : request.getParameterMap().entrySet()) { - out.println(entry.getKey() + ": " + Arrays.toString(entry.getValue())); - } - Integer i = (Integer) request.getSession().getAttribute("ReqCount"); - i = i == null ? 0 : i; - request.getSession().setAttribute("ReqCount", i + 1); - out.println("ReqCount = " + i); - out.close(); - } - -} diff --git a/src/main/java/love/sola/netsupport/api/test/TestSession.java b/src/main/java/love/sola/netsupport/api/test/TestSession.java deleted file mode 100644 index b00eb0a..0000000 --- a/src/main/java/love/sola/netsupport/api/test/TestSession.java +++ /dev/null @@ -1,45 +0,0 @@ -package love.sola.netsupport.api.test; - -import javax.servlet.ServletConfig; -import javax.servlet.ServletException; -import javax.servlet.annotation.WebServlet; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; -import java.io.IOException; -import java.io.PrintWriter; - -/** - * *********************************************** - * Created by Sola on 2014/8/20. - * Don't modify this source without my agreement - * *********************************************** - */ -@WebServlet(name = "TestSession", urlPatterns = "/api/testsession", loadOnStartup = 11) -public class TestSession extends HttpServlet { - - @Override - public void init(ServletConfig config) throws ServletException { - super.init(config); - } - - protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - doGet(request, response); - } - - protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - request.setCharacterEncoding("utf-8"); - response.setCharacterEncoding("utf-8"); - response.addHeader("Content-type", "text/plain;charset=utf-8"); - PrintWriter out = response.getWriter(); - HttpSession httpSession = request.getSession(false); - if (httpSession == null) { - out.println(httpSession); - } else { - out.println(httpSession.getId()); - } - out.close(); - } - -} diff --git a/src/main/java/love/sola/netsupport/config/Settings.java b/src/main/java/love/sola/netsupport/config/Settings.java index 06a9f89..b4f3953 100644 --- a/src/main/java/love/sola/netsupport/config/Settings.java +++ b/src/main/java/love/sola/netsupport/config/Settings.java @@ -31,8 +31,7 @@ public class Settings { public int User_Caching_Time; - public int User_Register_Timeout; - public int User_Command_Timeout; + public int User_Session_Max_Inactive; //No arg constructor for Yaml.loadAs public Settings() { I = this; } diff --git a/src/main/java/love/sola/netsupport/enums/Attribute.java b/src/main/java/love/sola/netsupport/enums/Attribute.java new file mode 100644 index 0000000..381d449 --- /dev/null +++ b/src/main/java/love/sola/netsupport/enums/Attribute.java @@ -0,0 +1,16 @@ +package love.sola.netsupport.enums; + +/** + * *********************************************** + * Created by Sola on 2015/12/14. + * Don't modify this source without my agreement + * *********************************************** + */ +public class Attribute { + + public static final String AUTHORIZED = "authorized"; + public static final String WECHAT = "wechat"; + public static final String OPERATOR = "operator"; + public static final String USER = "user"; + +} diff --git a/src/main/java/love/sola/netsupport/util/Checker.java b/src/main/java/love/sola/netsupport/util/Checker.java index c947cb8..a450bb7 100644 --- a/src/main/java/love/sola/netsupport/util/Checker.java +++ b/src/main/java/love/sola/netsupport/util/Checker.java @@ -1,8 +1,11 @@ package love.sola.netsupport.util; +import love.sola.netsupport.enums.Attribute; import love.sola.netsupport.wechat.Command; +import love.sola.netsupport.wechat.WechatSession; +import me.chanjar.weixin.common.session.WxSession; -import javax.servlet.http.HttpSession; +import javax.servlet.http.HttpServletRequest; /** * *********************************************** @@ -17,12 +20,18 @@ public class Checker { return false; } - public static boolean authorized(HttpSession s, Command c) { - return s != null && s.getAttribute("authorized") == c; + public static WxSession isAuthorized(HttpServletRequest r, Command c) { + String t = r.getParameter("token"); + if (t == null || t.isEmpty()) return null; + WxSession s = WechatSession.get(t, false); + return s == null ? null : s.getAttribute(Attribute.AUTHORIZED) == c ? s : null; } - public static boolean operator(HttpSession s) { - return s != null && s.getAttribute("operator") != null; + public static WxSession isOperator(HttpServletRequest r) { + String t = r.getParameter("token"); + if (t == null || t.isEmpty()) return null; + WxSession s = WechatSession.get(t, false); + return s == null ? null : s.getAttribute(Attribute.OPERATOR) == null ? null : s; } } diff --git a/src/main/java/love/sola/netsupport/wechat/WechatSession.java b/src/main/java/love/sola/netsupport/wechat/WechatSession.java new file mode 100644 index 0000000..f5aa3c8 --- /dev/null +++ b/src/main/java/love/sola/netsupport/wechat/WechatSession.java @@ -0,0 +1,35 @@ +package love.sola.netsupport.wechat; + +import love.sola.netsupport.config.Settings; +import me.chanjar.weixin.common.session.StandardSessionManager; +import me.chanjar.weixin.common.session.WxSession; + +import java.util.UUID; + +/** + * *********************************************** + * Created by Sola on 2015/12/14. + * Don't modify this source without my agreement + * *********************************************** + */ +public class WechatSession { + + private static StandardSessionManager manager; + + static{ + manager = new StandardSessionManager(); + manager.setMaxInactiveInterval(Settings.I.User_Session_Max_Inactive); + } + + public static WxSession get(String id, boolean create) { + return manager.getSession(id, create); + } + + public static WxSession get(String id) { + return manager.getSession(id); + } + + public static String genId() { + return UUID.randomUUID().toString(); + } +} diff --git a/src/main/java/love/sola/netsupport/wechat/handler/LoginHandler.java b/src/main/java/love/sola/netsupport/wechat/handler/LoginHandler.java index c1f0280..6b57c1f 100644 --- a/src/main/java/love/sola/netsupport/wechat/handler/LoginHandler.java +++ b/src/main/java/love/sola/netsupport/wechat/handler/LoginHandler.java @@ -25,6 +25,28 @@ public class LoginHandler implements WxMpMessageHandler { @Override public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, WxMpService wxMpService, WxSessionManager sessionManager) throws WxErrorException { +// try (Session s = SQLCore.sf.openSession()) { +// if (operator == null || operator.getAccess() == Access.NOLOGIN) +// return new Response(Response.ResponseCode.OPERATOR_NOT_FOUND); +// if (!wechat.equals(operator.getWechat())) +// return new Response(Response.ResponseCode.INCORRECT_WECHAT); +// if (!Crypto.check(password,operator.getPassword())) +// return new Response(Response.ResponseCode.WRONG_PASSWORD); +// +// return new Response(Response.ResponseCode.OK, operator); +// } catch (NumberFormatException e) { +// return new Response(Response.ResponseCode.ILLEGAL_PARAMETER); +// } catch (HibernateException e) { +// e.printStackTrace(); +// return new Response(Response.ResponseCode.DATABASE_ERROR, e); +// } catch (Exception e) { +// e.printStackTrace(); +// return new Response(Response.ResponseCode.INTERNAL_ERROR, e); +// } + +// if (operator == null || operator.getAccess() == Access.NOLOGIN) +// return new Response(Response.ResponseCode.OPERATOR_NOT_FOUND); + TextBuilder out = WxMpXmlOutMessage.TEXT().fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName()); if (!TableOperator.has(wxMessage.getFromUserName())) { return out.content(lang("Not_Operator")).build(); diff --git a/src/main/java/love/sola/netsupport/wechat/handler/QueryHandler.java b/src/main/java/love/sola/netsupport/wechat/handler/QueryHandler.java index fbd95c6..eb0c228 100644 --- a/src/main/java/love/sola/netsupport/wechat/handler/QueryHandler.java +++ b/src/main/java/love/sola/netsupport/wechat/handler/QueryHandler.java @@ -1,13 +1,15 @@ package love.sola.netsupport.wechat.handler; -import love.sola.netsupport.api.Authorize; +import love.sola.netsupport.enums.Attribute; import love.sola.netsupport.pojo.Ticket; import love.sola.netsupport.pojo.User; import love.sola.netsupport.sql.TableTicket; import love.sola.netsupport.sql.TableUser; import love.sola.netsupport.util.ParseUtil; import love.sola.netsupport.wechat.Command; +import love.sola.netsupport.wechat.WechatSession; import me.chanjar.weixin.common.exception.WxErrorException; +import me.chanjar.weixin.common.session.WxSession; import me.chanjar.weixin.common.session.WxSessionManager; import me.chanjar.weixin.mp.api.WxMpMessageHandler; import me.chanjar.weixin.mp.api.WxMpService; @@ -38,15 +40,18 @@ public class QueryHandler implements WxMpMessageHandler { return WxMpXmlOutMessage.TEXT().fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName()) .content(lang("No_Ticket_Available")).build(); } + String id = WechatSession.genId(); + WxSession session = WechatSession.get(id, true); + session.setAttribute(Attribute.AUTHORIZED, Command.QUERY); + session.setAttribute(Attribute.WECHAT, wxMessage.getFromUserName()); + session.setAttribute(Attribute.USER, u); NewsBuilder out = WxMpXmlOutMessage.NEWS().fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName()); WxMpXmlOutNewsMessage.Item item = new WxMpXmlOutNewsMessage.Item(); item.setTitle(lang("Query_Title")); item.setDescription(ParseUtil.parseTicket(t) + "\n" + lang("More_Details")); - item.setUrl(format("User_Query_Link", wxMessage.getFromUserName())); + item.setUrl(format("User_Query_Link", id)); out.addArticle(item); - Authorize.fetchedTime.put(wxMessage.getFromUserName(), System.currentTimeMillis()); - Authorize.fetchedCommand.put(wxMessage.getFromUserName(), Command.QUERY); return out.build(); } diff --git a/src/main/java/love/sola/netsupport/wechat/handler/RegisterHandler.java b/src/main/java/love/sola/netsupport/wechat/handler/RegisterHandler.java index 0a6c996..b54d8db 100644 --- a/src/main/java/love/sola/netsupport/wechat/handler/RegisterHandler.java +++ b/src/main/java/love/sola/netsupport/wechat/handler/RegisterHandler.java @@ -1,10 +1,12 @@ package love.sola.netsupport.wechat.handler; -import love.sola.netsupport.api.Authorize; +import love.sola.netsupport.enums.Attribute; import love.sola.netsupport.pojo.User; import love.sola.netsupport.sql.TableUser; import love.sola.netsupport.wechat.Command; +import love.sola.netsupport.wechat.WechatSession; import me.chanjar.weixin.common.exception.WxErrorException; +import me.chanjar.weixin.common.session.WxSession; import me.chanjar.weixin.common.session.WxSessionManager; import me.chanjar.weixin.mp.api.WxMpMessageHandler; import me.chanjar.weixin.mp.api.WxMpService; @@ -34,9 +36,11 @@ public class RegisterHandler implements WxMpMessageHandler { if (u != null) { out.content(lang("Already_Registered")); } else { - out.content(format("User_Register_Link", wxMessage.getFromUserName())); - Authorize.fetchedTime.put(wxMessage.getFromUserName(), System.currentTimeMillis()); - Authorize.fetchedCommand.put(wxMessage.getFromUserName(), Command.REGISTER); + String id = WechatSession.genId(); + WxSession session = WechatSession.get(id, true); + session.setAttribute(Attribute.AUTHORIZED, Command.REGISTER); + session.setAttribute(Attribute.WECHAT, wxMessage.getFromUserName()); + out.content(format("User_Register_Link", id)); } return out.build(); } diff --git a/src/main/java/love/sola/netsupport/wechat/handler/SubmitHandler.java b/src/main/java/love/sola/netsupport/wechat/handler/SubmitHandler.java index b9a3cca..979162d 100644 --- a/src/main/java/love/sola/netsupport/wechat/handler/SubmitHandler.java +++ b/src/main/java/love/sola/netsupport/wechat/handler/SubmitHandler.java @@ -1,11 +1,13 @@ package love.sola.netsupport.wechat.handler; -import love.sola.netsupport.api.Authorize; +import love.sola.netsupport.enums.Attribute; import love.sola.netsupport.pojo.User; import love.sola.netsupport.sql.TableTicket; import love.sola.netsupport.sql.TableUser; import love.sola.netsupport.wechat.Command; +import love.sola.netsupport.wechat.WechatSession; import me.chanjar.weixin.common.exception.WxErrorException; +import me.chanjar.weixin.common.session.WxSession; import me.chanjar.weixin.common.session.WxSessionManager; import me.chanjar.weixin.mp.api.WxMpMessageHandler; import me.chanjar.weixin.mp.api.WxMpService; @@ -34,14 +36,18 @@ public class SubmitHandler implements WxMpMessageHandler { return WxMpXmlOutMessage.TEXT().fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName()) .content(lang("Already_Opening_Ticket")).build(); } + String id = WechatSession.genId(); + WxSession session = WechatSession.get(id, true); + session.setAttribute(Attribute.AUTHORIZED, Command.QUERY); + session.setAttribute(Attribute.WECHAT, wxMessage.getFromUserName()); + session.setAttribute(Attribute.USER, u); + NewsBuilder out = WxMpXmlOutMessage.NEWS().fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName()); WxMpXmlOutNewsMessage.Item item = new WxMpXmlOutNewsMessage.Item(); item.setTitle(lang("Submit_Title")); item.setDescription(lang("Submit_Desc")); - item.setUrl(format("User_Submit_Link", wxMessage.getFromUserName(), u.getName(), u.getIsp().id, u.getRoom(), u.getBlock(), u.getPhone())); + item.setUrl(format("User_Submit_Link", id, u.getName(), u.getIsp().id, u.getRoom(), u.getBlock(), u.getPhone())); out.addArticle(item); - Authorize.fetchedTime.put(wxMessage.getFromUserName(), System.currentTimeMillis()); - Authorize.fetchedCommand.put(wxMessage.getFromUserName(), Command.SUBMIT); return out.build(); } diff --git a/src/main/resources/lang.yml b/src/main/resources/lang.yml index f704164..6589846 100644 --- a/src/main/resources/lang.yml +++ b/src/main/resources/lang.yml @@ -5,9 +5,9 @@ Unknown_Encrypt_Type: 'Unknown encrypt-type.' #Command Regex REGEX_QUERY: '^(?i)(Query)|(查询)|(cx)$' -REGEX_REGISTER: '^(?i)(Reg(ister)?)|(注册)|(zc)$' +REGEX_REGISTER: '^(?i)(Reg(ister)?)|(注册)|(绑定)|(zc)$' REGEX_SUBMIT: '^(?i)(Submit)|(报修)|(bx)$' -REGEX_CANCEL: '^(?i)(Cancel)|(取消)|(qx)$' +REGEX_CANCEL: '^(?i)(Cancel)|(取消)|(撤销)|(qx)$' REGEX_LOGIN: '^(?i)Authme$' #Event @@ -39,11 +39,11 @@ Cancel_Failed: '取消失败。' Not_Operator: '嘟嘟嘟……' #URL -User_Register_Link: '您尚未进行微信绑定, 请点击这里进行微信绑定操作。' -User_Query_Link: 'http://topaz.sinaapp.com/nm/v1/list.html?wechatid={0}' -User_Submit_Link: 'http://topaz.sinaapp.com/nm/v1/rrepair.html?wechatid={0}&name={1}&isp={2}&room={3}&block={4}&phone={5,number,#}' +User_Register_Link: '您尚未进行微信绑定, 请点击这里进行微信绑定操作。' +User_Query_Link: 'http://topaz.sinaapp.com/nm/v1/list.html?token={0}' +User_Submit_Link: 'http://topaz.sinaapp.com/nm/v1/rrepair.html?token={0}&name={1}&isp={2}&room={3}&block={4}&phone={5,number,#}' Result_Page: 'http://topaz.sinaapp.com/nm/v1/result.html' -Operator_Login_Link: 'CLICK HERE' +Operator_Login_Link: 'CLICK HERE' #Localized #Status