| @@ -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<String, Object> 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; | |||||
| } | |||||
| } | |||||
| @@ -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<String, Object> 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; | |||||
| } | |||||
| } | |||||
| @@ -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<String, Object> context, WxMpService wxMpService, | |||||
| WxSessionManager sessionManager) { | |||||
| System.out.println(wxMessage.toString()); | |||||
| return null; | |||||
| } | |||||
| } | |||||
| @@ -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<String, Object> context, | |||||
| WxMpService wxMpService, WxSessionManager sessionManager) { | |||||
| String href = "<a href=\"" + wxMpService.oauth2buildAuthorizationUrl(WxConsts.OAUTH2_SCOPE_USER_INFO, null) | |||||
| + "\">测试oauth2</a>"; | |||||
| return WxMpXmlOutMessage | |||||
| .TEXT() | |||||
| .content(href) | |||||
| .fromUser(wxMessage.getToUserName()) | |||||
| .toUser(wxMessage.getFromUserName()).build(); | |||||
| } | |||||
| } | |||||
| @@ -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<String, Object> 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; | |||||
| } | |||||
| } | |||||
| @@ -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<String, Object> context, | |||||
| WxMpService wxMpService, WxSessionManager sessionManager) { | |||||
| WxMpXmlOutTextMessage m | |||||
| = WxMpXmlOutMessage.TEXT().content("测试加密消息").fromUser(wxMessage.getToUserName()) | |||||
| .toUser(wxMessage.getFromUserName()).build(); | |||||
| return m; | |||||
| } | |||||
| } | |||||
| @@ -1,21 +1,12 @@ | |||||
| package me.chanjar.weixin.mp.demo; | package me.chanjar.weixin.mp.demo; | ||||
| import me.chanjar.weixin.common.api.WxConsts; | 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.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.server.Server; | ||||
| import org.eclipse.jetty.servlet.ServletHandler; | import org.eclipse.jetty.servlet.ServletHandler; | ||||
| import org.eclipse.jetty.servlet.ServletHolder; | import org.eclipse.jetty.servlet.ServletHolder; | ||||
| import java.io.IOException; | |||||
| import java.io.InputStream; | import java.io.InputStream; | ||||
| import java.util.Map; | |||||
| public class WxMpDemoServer { | public class WxMpDemoServer { | ||||
| @@ -42,79 +33,28 @@ public class WxMpDemoServer { | |||||
| } | } | ||||
| private static void initWeixin() { | 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<String, Object> 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<String, Object> 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<String, Object> context, | |||||
| WxMpService wxMpService, WxSessionManager sessionManager) { | |||||
| String href = "<a href=\"" + wxMpService.oauth2buildAuthorizationUrl(WxConsts.OAUTH2_SCOPE_USER_INFO, null) | |||||
| + "\">测试oauth2</a>"; | |||||
| return WxMpXmlOutMessage | |||||
| .TEXT() | |||||
| .content(href) | |||||
| .fromUser(wxMessage.getToUserName()) | |||||
| .toUser(wxMessage.getFromUserName()).build(); | |||||
| } | |||||
| }; | |||||
| wxMpMessageRouter = new WxMpMessageRouter(wxMpService); | |||||
| wxMpMessageRouter = new WxMpMessageRouter(wxMpService); | |||||
| wxMpMessageRouter | 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() | |||||
| ; | ; | ||||
| } | } | ||||
| @@ -60,7 +60,9 @@ public class WxMpEndpointServlet extends HttpServlet { | |||||
| // 明文传输的消息 | // 明文传输的消息 | ||||
| WxMpXmlMessage inMessage = WxMpXmlMessage.fromXml(request.getInputStream()); | WxMpXmlMessage inMessage = WxMpXmlMessage.fromXml(request.getInputStream()); | ||||
| WxMpXmlOutMessage outMessage = wxMpMessageRouter.route(inMessage); | WxMpXmlOutMessage outMessage = wxMpMessageRouter.route(inMessage); | ||||
| response.getWriter().write(outMessage.toXml()); | |||||
| if (outMessage != null) { | |||||
| response.getWriter().write(outMessage.toXml()); | |||||
| } | |||||
| return; | return; | ||||
| } | } | ||||