diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoCheckAnswerHandler.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoCheckAnswerHandler.java new file mode 100644 index 00000000..d23adb36 --- /dev/null +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoCheckAnswerHandler.java @@ -0,0 +1,71 @@ +package me.chanjar.weixin.mp.demo; + +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; +import me.chanjar.weixin.mp.bean.WxMpCustomMessage; +import me.chanjar.weixin.mp.bean.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage; + +import java.util.Map; + +public class DemoCheckAnswerHandler implements WxMpMessageHandler { + + @Override + public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, WxMpService wxMpService, + WxSessionManager sessionManager) { + + WxSession session = sessionManager.getSession(wxMessage.getFromUserName()); + + if (session.getAttribute("guessing") == null) { + return null; + } + boolean guessing = (Boolean) session.getAttribute("guessing"); + if (!guessing) { + return null; + } + + int answer = (Integer) session.getAttribute("number"); + int guessNumber = Integer.valueOf(wxMessage.getContent()); + if (guessNumber < answer) { + WxMpCustomMessage m = WxMpCustomMessage + .TEXT() + .toUser(wxMessage.getFromUserName()) + .content("小了") + .build(); + try { + wxMpService.customMessageSend(m); + } catch (WxErrorException e) { + e.printStackTrace(); + } + + } else if (guessNumber > answer) { + WxMpCustomMessage m = WxMpCustomMessage + .TEXT() + .toUser(wxMessage.getFromUserName()) + .content("大了") + .build(); + try { + wxMpService.customMessageSend(m); + } catch (WxErrorException e) { + e.printStackTrace(); + } + } else { + WxMpCustomMessage m = WxMpCustomMessage + .TEXT() + .toUser(wxMessage.getFromUserName()) + .content("Bingo!") + .build(); + try { + session.removeAttribute("guessing"); + wxMpService.customMessageSend(m); + } catch (WxErrorException e) { + e.printStackTrace(); + } + } + return null; + } + +} diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoImageHandler.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoImageHandler.java new file mode 100644 index 00000000..8cc50542 --- /dev/null +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoImageHandler.java @@ -0,0 +1,38 @@ +package me.chanjar.weixin.mp.demo; + +import me.chanjar.weixin.common.api.WxConsts; +import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; +import me.chanjar.weixin.common.exception.WxErrorException; +import me.chanjar.weixin.common.session.WxSessionManager; +import me.chanjar.weixin.mp.api.WxMpMessageHandler; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.WxMpXmlOutImageMessage; +import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage; + +import java.io.IOException; +import java.util.Map; + +public class DemoImageHandler implements WxMpMessageHandler { + @Override + public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, + WxMpService wxMpService, WxSessionManager sessionManager) { + try { + WxMediaUploadResult wxMediaUploadResult = wxMpService + .mediaUpload(WxConsts.MEDIA_IMAGE, WxConsts.FILE_JPG, ClassLoader.getSystemResourceAsStream("mm.jpeg")); + WxMpXmlOutImageMessage m + = WxMpXmlOutMessage + .IMAGE() + .mediaId(wxMediaUploadResult.getMediaId()) + .fromUser(wxMessage.getToUserName()) + .toUser(wxMessage.getFromUserName()) + .build(); + return m; + } catch (WxErrorException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } +} diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoLogHandler.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoLogHandler.java new file mode 100644 index 00000000..5245bc03 --- /dev/null +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoLogHandler.java @@ -0,0 +1,21 @@ +package me.chanjar.weixin.mp.demo; + +import me.chanjar.weixin.common.session.WxSessionManager; +import me.chanjar.weixin.mp.api.WxMpMessageHandler; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage; + +import java.util.Map; + +/** + * Created by qianjia on 15/1/22. + */ +public class DemoLogHandler implements WxMpMessageHandler { + @Override + public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, WxMpService wxMpService, + WxSessionManager sessionManager) { + System.out.println(wxMessage.toString()); + return null; + } +} diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoOAuth2Handler.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoOAuth2Handler.java new file mode 100644 index 00000000..da3ec93c --- /dev/null +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoOAuth2Handler.java @@ -0,0 +1,27 @@ +package me.chanjar.weixin.mp.demo; + +import me.chanjar.weixin.common.api.WxConsts; +import me.chanjar.weixin.common.session.WxSessionManager; +import me.chanjar.weixin.mp.api.WxMpMessageHandler; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage; + +import java.util.Map; + +/** + * Created by qianjia on 15/1/22. + */ +public class DemoOAuth2Handler implements WxMpMessageHandler { + @Override + public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, + WxMpService wxMpService, WxSessionManager sessionManager) { + String href = "测试oauth2"; + return WxMpXmlOutMessage + .TEXT() + .content(href) + .fromUser(wxMessage.getToUserName()) + .toUser(wxMessage.getFromUserName()).build(); + } +} diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoStartGuessNumberHandler.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoStartGuessNumberHandler.java new file mode 100644 index 00000000..d28834f5 --- /dev/null +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoStartGuessNumberHandler.java @@ -0,0 +1,54 @@ +package me.chanjar.weixin.mp.demo; + +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; +import me.chanjar.weixin.mp.bean.WxMpCustomMessage; +import me.chanjar.weixin.mp.bean.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage; + +import java.util.Map; +import java.util.Random; + +public class DemoStartGuessNumberHandler implements WxMpMessageHandler { + + private Random random = new Random(); + + @Override + public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, WxMpService wxMpService, + WxSessionManager sessionManager) { + + WxSession session = sessionManager.getSession(wxMessage.getFromUserName()); + + if (session.getAttribute("guessing") == null) { + WxMpCustomMessage m = WxMpCustomMessage + .TEXT() + .toUser(wxMessage.getFromUserName()) + .content("请猜一个100以内的数字") + .build(); + try { + wxMpService.customMessageSend(m); + } catch (WxErrorException e) { + e.printStackTrace(); + } + } else { + WxMpCustomMessage m = WxMpCustomMessage + .TEXT() + .toUser(wxMessage.getFromUserName()) + .content("放弃了吗?那请重新猜一个100以内的数字") + .build(); + try { + wxMpService.customMessageSend(m); + } catch (WxErrorException e) { + e.printStackTrace(); + } + } + + session.setAttribute("guessing", Boolean.TRUE); + session.setAttribute("number", random.nextInt(100)); + return null; + + } +} diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoTextHandler.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoTextHandler.java new file mode 100644 index 00000000..43f017be --- /dev/null +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoTextHandler.java @@ -0,0 +1,25 @@ +package me.chanjar.weixin.mp.demo; + +import me.chanjar.weixin.common.session.WxSessionManager; +import me.chanjar.weixin.mp.api.WxMpMessageHandler; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage; +import me.chanjar.weixin.mp.bean.WxMpXmlOutTextMessage; + +import java.util.Map; + +/** + * Created by qianjia on 15/1/22. + */ +public class DemoTextHandler implements WxMpMessageHandler { + @Override + public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, + WxMpService wxMpService, WxSessionManager sessionManager) { + WxMpXmlOutTextMessage m + = WxMpXmlOutMessage.TEXT().content("测试加密消息").fromUser(wxMessage.getToUserName()) + .toUser(wxMessage.getFromUserName()).build(); + return m; + } + +} diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpDemoServer.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpDemoServer.java index 8e44d2db..1d8c5bef 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpDemoServer.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpDemoServer.java @@ -1,21 +1,12 @@ package me.chanjar.weixin.mp.demo; import me.chanjar.weixin.common.api.WxConsts; -import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; -import me.chanjar.weixin.common.exception.WxErrorException; -import me.chanjar.weixin.common.session.WxSessionManager; import me.chanjar.weixin.mp.api.*; -import me.chanjar.weixin.mp.bean.WxMpXmlMessage; -import me.chanjar.weixin.mp.bean.WxMpXmlOutImageMessage; -import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage; -import me.chanjar.weixin.mp.bean.WxMpXmlOutTextMessage; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.servlet.ServletHandler; import org.eclipse.jetty.servlet.ServletHolder; -import java.io.IOException; import java.io.InputStream; -import java.util.Map; public class WxMpDemoServer { @@ -42,79 +33,28 @@ public class WxMpDemoServer { } private static void initWeixin() { - InputStream is1 = ClassLoader.getSystemResourceAsStream("test-config.xml"); - WxMpDemoInMemoryConfigStorage config = WxMpDemoInMemoryConfigStorage.fromXml(is1); + InputStream is1 = ClassLoader.getSystemResourceAsStream("test-config.xml"); + WxMpDemoInMemoryConfigStorage config = WxMpDemoInMemoryConfigStorage.fromXml(is1); - wxMpConfigStorage = config; - wxMpService = new WxMpServiceImpl(); - wxMpService.setWxMpConfigStorage(config); + wxMpConfigStorage = config; + wxMpService = new WxMpServiceImpl(); + wxMpService.setWxMpConfigStorage(config); - WxMpMessageHandler textHandler = new WxMpMessageHandler() { - @Override - public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, - WxMpService wxMpService, WxSessionManager sessionManager) { - WxMpXmlOutTextMessage m - = WxMpXmlOutMessage.TEXT().content("测试加密消息").fromUser(wxMessage.getToUserName()) - .toUser(wxMessage.getFromUserName()).build(); - return m; - } - }; + WxMpMessageHandler logHandler = new DemoLogHandler(); + WxMpMessageHandler textHandler = new DemoTextHandler(); + WxMpMessageHandler imageHandler = new DemoImageHandler(); + WxMpMessageHandler oauth2handler = new DemoOAuth2Handler(); + WxMpMessageHandler checkAnswerHandler = new DemoCheckAnswerHandler(); + DemoStartGuessNumberHandler startGuessNumberHandler = new DemoStartGuessNumberHandler(); - WxMpMessageHandler imageHandler = new WxMpMessageHandler() { - @Override - public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, - WxMpService wxMpService, WxSessionManager sessionManager) { - try { - WxMediaUploadResult wxMediaUploadResult = wxMpService - .mediaUpload(WxConsts.MEDIA_IMAGE, WxConsts.FILE_JPG, ClassLoader.getSystemResourceAsStream("mm.jpeg")); - WxMpXmlOutImageMessage m - = WxMpXmlOutMessage - .IMAGE() - .mediaId(wxMediaUploadResult.getMediaId()) - .fromUser(wxMessage.getToUserName()) - .toUser(wxMessage.getFromUserName()) - .build(); - return m; - } catch (WxErrorException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - return null; - } - }; - - WxMpMessageHandler oauth2handler = new WxMpMessageHandler() { - @Override - public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, - WxMpService wxMpService, WxSessionManager sessionManager) { - String href = "测试oauth2"; - return WxMpXmlOutMessage - .TEXT() - .content(href) - .fromUser(wxMessage.getToUserName()) - .toUser(wxMessage.getFromUserName()).build(); - } - }; - - wxMpMessageRouter = new WxMpMessageRouter(wxMpService); + wxMpMessageRouter = new WxMpMessageRouter(wxMpService); wxMpMessageRouter - .rule() - .async(false) - .content("哈哈") // 拦截内容为“哈哈”的消息 - .handler(textHandler) - .end() - .rule() - .async(false) - .content("图片") - .handler(imageHandler) - .end() - .rule() - .async(false) - .content("oauth") - .handler(oauth2handler) - .end() + .rule().handler(logHandler).next() + .rule().msgType(WxConsts.XML_MSG_TEXT).content("猜数字").handler(startGuessNumberHandler).next() + .rule().msgType(WxConsts.XML_MSG_TEXT).rContent("\\d+").handler(checkAnswerHandler).end() + .rule().async(false).content("哈哈").handler(textHandler).end() + .rule().async(false).content("图片").handler(imageHandler).end() + .rule().async(false).content("oauth").handler(oauth2handler).end() ; } diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpEndpointServlet.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpEndpointServlet.java index 36bc77ee..2921e5fb 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpEndpointServlet.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpEndpointServlet.java @@ -60,7 +60,9 @@ public class WxMpEndpointServlet extends HttpServlet { // 明文传输的消息 WxMpXmlMessage inMessage = WxMpXmlMessage.fromXml(request.getInputStream()); WxMpXmlOutMessage outMessage = wxMpMessageRouter.route(inMessage); - response.getWriter().write(outMessage.toXml()); + if (outMessage != null) { + response.getWriter().write(outMessage.toXml()); + } return; }