// Path: src/com/jfinal/weixin/sdk/api/ApiConfigKit.java
// public class ApiConfigKit {
// 	
// 	private static final ThreadLocal<ApiConfig> tl = new ThreadLocal<ApiConfig>();
// 	
// 	// 开发模式将输出消息交互 xml 到控制台
// 	private static boolean devMode = false;
// 	
// 	public static void setDevMode(boolean devMode) {
// 		ApiConfigKit.devMode = devMode;
// 	}
// 	
// 	public static boolean isDevMode() {
// 		return devMode;
// 	}
// 	
// 	public static void setThreadLocalApiConfig(ApiConfig apiConfig) {
// 		tl.set(apiConfig);
// 	}
// 	
// 	public static void removeThreadLocalApiConfig() {
// 		tl.remove();
// 	}
// 	
// 	public static ApiConfig getApiConfig() {
// 		ApiConfig result = tl.get();
// 		if (result == null)
// 			throw new IllegalStateException("需要事先使用 ApiConfigKit.setThreadLocalApiConfig(apiConfig) 将 ApiConfig对象存入，才可以调用 ApiConfigKit.getApiConfig() 方法");
// 		return result;
// 	}
// 	
// 	static IAccessTokenCache accessTokenCache = new DefaultAccessTokenCache();
// 	
// 	public static void setAccessTokenCache(IAccessTokenCache accessTokenCache) {
// 		ApiConfigKit.accessTokenCache = accessTokenCache;
// 	}
// 	
// 	public static IAccessTokenCache getAccessTokenCache() {
// 		return ApiConfigKit.accessTokenCache;
// 	}
// }


import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;
import com.jfinal.core.Controller;
import com.jfinal.kit.StrKit;
import com.jfinal.weixin.sdk.api.ApiConfigKit;
import com.jfinal.weixin.sdk.kit.SignatureCheckKit;
import org.slf4j.LoggerFactory;
			if (ApiConfigKit.isDevMode()) {
				inv.invoke();
			} else {
				// 如果是服务器配置请求，则配置服务器并返回
				if (isConfigServerRequest(controller)) {
					configServer(controller);
					return ;
				}
				
				// 签名检测
				if (checkSignature(controller)) {
					inv.invoke();
				}
				else {
					controller.renderText("签名验证失败，请确定是微信服务器在发送消息过来");
				}
			}

		}
		finally {
			ApiConfigKit.removeThreadLocalApiConfig();
		}
	}
	
	/**
	 * 检测签名
	 */
	private boolean checkSignature(Controller controller) {
		String signature = controller.getPara("signature");
		String timestamp = controller.getPara("timestamp");
// Path: src/com/jfinal/weixin/sdk/api/ApiConfigKit.java
// public class ApiConfigKit {
// 	
// 	private static final ThreadLocal<ApiConfig> tl = new ThreadLocal<ApiConfig>();
// 	
// 	// 开发模式将输出消息交互 xml 到控制台
// 	private static boolean devMode = false;
// 	
// 	public static void setDevMode(boolean devMode) {
// 		ApiConfigKit.devMode = devMode;
// 	}
// 	
// 	public static boolean isDevMode() {
// 		return devMode;
// 	}
// 	
// 	public static void setThreadLocalApiConfig(ApiConfig apiConfig) {
// 		tl.set(apiConfig);
// 	}
// 	
// 	public static void removeThreadLocalApiConfig() {
// 		tl.remove();
// 	}
// 	
// 	public static ApiConfig getApiConfig() {
// 		ApiConfig result = tl.get();
// 		if (result == null)
// 			throw new IllegalStateException("需要事先使用 ApiConfigKit.setThreadLocalApiConfig(apiConfig) 将 ApiConfig对象存入，才可以调用 ApiConfigKit.getApiConfig() 方法");
// 		return result;
// 	}
// 	
// 	static IAccessTokenCache accessTokenCache = new DefaultAccessTokenCache();
// 	
// 	public static void setAccessTokenCache(IAccessTokenCache accessTokenCache) {
// 		ApiConfigKit.accessTokenCache = accessTokenCache;
// 	}
// 	
// 	public static IAccessTokenCache getAccessTokenCache() {
// 		return ApiConfigKit.accessTokenCache;
// 	}
// }


// Path: src/com/jfinal/weixin/sdk/jfinal/MsgInterceptor.java
import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;
import com.jfinal.core.Controller;
import com.jfinal.kit.StrKit;
import com.jfinal.weixin.sdk.api.ApiConfigKit;
import com.jfinal.weixin.sdk.kit.SignatureCheckKit;
import org.slf4j.LoggerFactory;

			if (ApiConfigKit.isDevMode()) {
				inv.invoke();
			} else {
				// 如果是服务器配置请求，则配置服务器并返回
				if (isConfigServerRequest(controller)) {
					configServer(controller);
					return ;
				}
				
				// 签名检测
				if (checkSignature(controller)) {
					inv.invoke();
				}
				else {
					controller.renderText("签名验证失败，请确定是微信服务器在发送消息过来");
				}
			}

		}
		finally {
			ApiConfigKit.removeThreadLocalApiConfig();
		}
	}
	
	/**
	 * 检测签名
	 */
	private boolean checkSignature(Controller controller) {
		String signature = controller.getPara("signature");
		String timestamp = controller.getPara("timestamp");
		String nonce = controller.getPara("nonce");