mirror of
https://gitee.com/binary/weixin-java-tools.git
synced 2025-09-20 02:29:44 +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