mirror of
				https://gitee.com/binary/weixin-java-tools.git
				synced 2025-10-31 10:38:42 +08:00 
			
		
		
		
	issue #69 添加Session的支持
This commit is contained in:
		| @ -1,5 +1,6 @@ | ||||
| package me.chanjar.weixin.mp.api; | ||||
|  | ||||
| import me.chanjar.weixin.common.session.WxSessionManager; | ||||
| import me.chanjar.weixin.mp.bean.WxMpXmlMessage; | ||||
| import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage; | ||||
|  | ||||
| @ -7,18 +8,21 @@ import java.util.Map; | ||||
|  | ||||
| /** | ||||
|  * 处理微信推送消息的处理器接口 | ||||
|  * @author chanjarster | ||||
|  * | ||||
|  * @author Daniel Qian | ||||
|  */ | ||||
| public interface WxMpMessageHandler { | ||||
|  | ||||
|   /** | ||||
|    *  | ||||
|    * @param wxMessage | ||||
|    * @param context  上下文,如果handler或interceptor之间有信息要传递,可以用这个 | ||||
|    * @param context        上下文,如果handler或interceptor之间有信息要传递,可以用这个 | ||||
|    * @param wxMpService | ||||
|    * @param sessionManager | ||||
|    * @return xml格式的消息,如果在异步规则里处理的话,可以返回null | ||||
|    */ | ||||
|   public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> context, WxMpService wxMpService); | ||||
|    | ||||
|   public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, | ||||
|                                   Map<String, Object> context, | ||||
|                                   WxMpService wxMpService, | ||||
|                                   WxSessionManager sessionManager); | ||||
|  | ||||
| } | ||||
|  | ||||
| @ -1,21 +1,29 @@ | ||||
| package me.chanjar.weixin.mp.api; | ||||
|  | ||||
| import me.chanjar.weixin.common.session.WxSessionManager; | ||||
| import me.chanjar.weixin.mp.bean.WxMpXmlMessage; | ||||
|  | ||||
| import java.util.Map; | ||||
|  | ||||
| /** | ||||
|  * 微信消息拦截器,可以用来做验证 | ||||
|  * | ||||
|  * @author Daniel Qian | ||||
|  */ | ||||
| public interface WxMpMessageInterceptor { | ||||
|  | ||||
|   /** | ||||
|    * 拦截微信消息 | ||||
|    * | ||||
|    * @param wxMessage | ||||
|    * @param context  上下文,如果handler或interceptor之间有信息要传递,可以用这个 | ||||
|    * @param context        上下文,如果handler或interceptor之间有信息要传递,可以用这个 | ||||
|    * @param wxMpService | ||||
|    * @return  true代表OK,false代表不OK | ||||
|    * @param sessionManager | ||||
|    * @return true代表OK,false代表不OK | ||||
|    */ | ||||
|   public boolean intercept(WxMpXmlMessage wxMessage, Map<String, Object> context, WxMpService wxMpService); | ||||
|    | ||||
|   public boolean intercept(WxMpXmlMessage wxMessage, | ||||
|                             Map<String, Object> context, | ||||
|                             WxMpService wxMpService, | ||||
|                             WxSessionManager sessionManager); | ||||
|  | ||||
| } | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| package me.chanjar.weixin.mp.api; | ||||
|  | ||||
| import me.chanjar.weixin.common.session.InternalSession; | ||||
| import me.chanjar.weixin.common.session.SessionManagerImpl; | ||||
| import me.chanjar.weixin.common.session.InMemorySessionManager; | ||||
| import me.chanjar.weixin.common.session.WxSession; | ||||
| import me.chanjar.weixin.common.session.WxSessionManager; | ||||
| import me.chanjar.weixin.common.util.WxMessageDuplicateChecker; | ||||
| @ -59,15 +59,15 @@ public class WxMpMessageRouter { | ||||
|  | ||||
|   private ExecutorService executorService; | ||||
|  | ||||
|   private WxMessageDuplicateChecker wxMessageDuplicateChecker; | ||||
|   private WxMessageDuplicateChecker messageDuplicateChecker; | ||||
|  | ||||
|   private WxSessionManager sessionManager; | ||||
|  | ||||
|   public WxMpMessageRouter(WxMpService wxMpService) { | ||||
|     this.wxMpService = wxMpService; | ||||
|     this.executorService = Executors.newFixedThreadPool(DEFAULT_THREAD_POOL_SIZE); | ||||
|     this.wxMessageDuplicateChecker = new WxMessageInMemoryDuplicateChecker(); | ||||
|     this.sessionManager = new SessionManagerImpl(); | ||||
|     this.messageDuplicateChecker = new WxMessageInMemoryDuplicateChecker(); | ||||
|     this.sessionManager = new InMemorySessionManager(); | ||||
|   } | ||||
|  | ||||
|   /** | ||||
| @ -86,10 +86,10 @@ public class WxMpMessageRouter { | ||||
|    * 设置自定义的 {@link me.chanjar.weixin.common.util.WxMessageDuplicateChecker} | ||||
|    * 如果不调用该方法,默认使用 {@link me.chanjar.weixin.common.util.WxMessageInMemoryDuplicateChecker} | ||||
|    * </pre> | ||||
|    * @param wxMessageDuplicateChecker | ||||
|    * @param messageDuplicateChecker | ||||
|    */ | ||||
|   public void setWxMessageDuplicateChecker(WxMessageDuplicateChecker wxMessageDuplicateChecker) { | ||||
|     this.wxMessageDuplicateChecker = wxMessageDuplicateChecker; | ||||
|   public void setMessageDuplicateChecker(WxMessageDuplicateChecker messageDuplicateChecker) { | ||||
|     this.messageDuplicateChecker = messageDuplicateChecker; | ||||
|   } | ||||
|  | ||||
|   /** | ||||
| @ -108,7 +108,7 @@ public class WxMpMessageRouter { | ||||
|    * @return | ||||
|    */ | ||||
|   public Rule rule() { | ||||
|     return new Rule(this, wxMpService); | ||||
|     return new Rule(this, wxMpService, sessionManager); | ||||
|   } | ||||
|  | ||||
|   /** | ||||
| @ -116,7 +116,7 @@ public class WxMpMessageRouter { | ||||
|    * @param wxMessage | ||||
|    */ | ||||
|   public WxMpXmlOutMessage route(final WxMpXmlMessage wxMessage) { | ||||
|     if (wxMessageDuplicateChecker.isDuplicate(wxMessage.getMsgId())) { | ||||
|     if (messageDuplicateChecker.isDuplicate(wxMessage.getMsgId())) { | ||||
|       // 如果是重复消息,那么就不做处理 | ||||
|       return null; | ||||
|     } | ||||
| @ -195,6 +195,8 @@ public class WxMpMessageRouter { | ||||
|  | ||||
|     private final WxMpService wxMpService; | ||||
|  | ||||
|     private final WxSessionManager sessionManager; | ||||
|  | ||||
|     private boolean async = true; | ||||
|  | ||||
|     private String fromUser; | ||||
| @ -214,10 +216,11 @@ public class WxMpMessageRouter { | ||||
|     private List<WxMpMessageHandler> handlers = new ArrayList<WxMpMessageHandler>(); | ||||
|      | ||||
|     private List<WxMpMessageInterceptor> interceptors = new ArrayList<WxMpMessageInterceptor>(); | ||||
|      | ||||
|     protected Rule(WxMpMessageRouter routerBuilder, WxMpService wxMpService) { | ||||
|  | ||||
|     protected Rule(WxMpMessageRouter routerBuilder, WxMpService wxMpService, WxSessionManager sessionManager) { | ||||
|       this.routerBuilder = routerBuilder; | ||||
|       this.wxMpService = wxMpService; | ||||
|       this.sessionManager = sessionManager; | ||||
|     } | ||||
|      | ||||
|     /** | ||||
| @ -383,7 +386,7 @@ public class WxMpMessageRouter { | ||||
|       Map<String, Object> context = new HashMap<String, Object>(); | ||||
|       // 如果拦截器不通过 | ||||
|       for (WxMpMessageInterceptor interceptor : this.interceptors) { | ||||
|         if (!interceptor.intercept(wxMessage, context, wxMpService)) { | ||||
|         if (!interceptor.intercept(wxMessage, context, wxMpService, sessionManager)) { | ||||
|           return null; | ||||
|         } | ||||
|       } | ||||
| @ -392,7 +395,7 @@ public class WxMpMessageRouter { | ||||
|       WxMpXmlOutMessage res = null; | ||||
|       for (WxMpMessageHandler handler : this.handlers) { | ||||
|         // 返回最后handler的结果 | ||||
|         res = handler.handle(wxMessage, context, wxMpService); | ||||
|         res = handler.handle(wxMessage, context, wxMpService, sessionManager); | ||||
|       } | ||||
|       return res; | ||||
|     } | ||||
|  | ||||
| @ -10,8 +10,7 @@ import me.chanjar.weixin.common.bean.WxMenu; | ||||
| import me.chanjar.weixin.common.bean.result.WxError; | ||||
| import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; | ||||
| import me.chanjar.weixin.common.exception.WxErrorException; | ||||
| import me.chanjar.weixin.common.session.SessionManagerImpl; | ||||
| import me.chanjar.weixin.common.session.WxSession; | ||||
| import me.chanjar.weixin.common.session.InMemorySessionManager; | ||||
| import me.chanjar.weixin.common.session.WxSessionManager; | ||||
| import me.chanjar.weixin.common.util.StringUtils; | ||||
| import me.chanjar.weixin.common.util.crypto.SHA1; | ||||
| @ -69,7 +68,7 @@ public class WxMpServiceImpl implements WxMpService { | ||||
|  | ||||
|   private int maxRetryTimes = 5; | ||||
|  | ||||
|   protected WxSessionManager sessionManager = new SessionManagerImpl(); | ||||
|   protected WxSessionManager sessionManager = new InMemorySessionManager(); | ||||
|  | ||||
|   public boolean checkSignature(String timestamp, String nonce, String signature) { | ||||
|     try { | ||||
|  | ||||
| @ -1,6 +1,7 @@ | ||||
| package me.chanjar.weixin.mp.api; | ||||
|  | ||||
| import me.chanjar.weixin.common.api.WxConsts; | ||||
| import me.chanjar.weixin.common.session.WxSessionManager; | ||||
| import me.chanjar.weixin.mp.bean.WxMpXmlMessage; | ||||
| import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage; | ||||
| import org.testng.Assert; | ||||
| @ -67,7 +68,8 @@ public class WxMpMessageRouterTest { | ||||
|     final WxMpMessageRouter router = new WxMpMessageRouter(null); | ||||
|     router.rule().handler(new WxMpMessageHandler() { | ||||
|       @Override | ||||
|       public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> context, WxMpService wxMpService) { | ||||
|       public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> context, WxMpService wxMpService, | ||||
|           WxSessionManager sessionManager) { | ||||
|         return null; | ||||
|       } | ||||
|     }).end(); | ||||
| @ -149,7 +151,8 @@ public class WxMpMessageRouterTest { | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> context, WxMpService wxMpService) { | ||||
|     public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> context, WxMpService wxMpService, | ||||
|         WxSessionManager sessionManager) { | ||||
|       sb.append(this.echoStr).append(','); | ||||
|       return null; | ||||
|     } | ||||
|  | ||||
| @ -3,6 +3,7 @@ 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; | ||||
| @ -51,7 +52,7 @@ public class WxMpDemoServer { | ||||
|       WxMpMessageHandler textHandler = new WxMpMessageHandler() { | ||||
|         @Override | ||||
|         public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> context, | ||||
|             WxMpService wxMpService) { | ||||
|             WxMpService wxMpService, WxSessionManager sessionManager) { | ||||
|           WxMpXmlOutTextMessage m | ||||
|               = WxMpXmlOutMessage.TEXT().content("测试加密消息").fromUser(wxMessage.getToUserName()) | ||||
|               .toUser(wxMessage.getFromUserName()).build(); | ||||
| @ -62,7 +63,7 @@ public class WxMpDemoServer { | ||||
|       WxMpMessageHandler imageHandler = new WxMpMessageHandler() { | ||||
|         @Override | ||||
|         public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> context, | ||||
|             WxMpService wxMpService) { | ||||
|             WxMpService wxMpService, WxSessionManager sessionManager) { | ||||
|           try { | ||||
|             WxMediaUploadResult wxMediaUploadResult = wxMpService | ||||
|                 .mediaUpload(WxConsts.MEDIA_IMAGE, WxConsts.FILE_JPG, ClassLoader.getSystemResourceAsStream("mm.jpeg")); | ||||
| @ -86,7 +87,7 @@ public class WxMpDemoServer { | ||||
|       WxMpMessageHandler oauth2handler = new WxMpMessageHandler() { | ||||
|         @Override | ||||
|         public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> context, | ||||
|             WxMpService wxMpService) { | ||||
|             WxMpService wxMpService, WxSessionManager sessionManager) { | ||||
|           String href = "<a href=\"" + wxMpService.oauth2buildAuthorizationUrl(WxConsts.OAUTH2_SCOPE_USER_INFO, null) | ||||
|               + "\">测试oauth2</a>"; | ||||
|           return WxMpXmlOutMessage | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 Daniel Qian
					Daniel Qian