weixin4j/weixin4j-server
2015-07-13 10:08:50 +08:00
..
u
2015-07-13 10:08:50 +08:00
2015-07-04 22:15:45 +08:00
2015-07-04 22:18:13 +08:00
2015-07-04 22:15:45 +08:00

weixin4j-server

微信消息服务器

base on netty.

功能列表

  • netty服务器

  • 消息分发

  • 消息拦截

如何使用

###maven依赖(1.0.3,2015-07-04 released)

<dependency>
    <groupId>com.foxinmy</groupId>
    <artifactId>weixin4j-server</artifactId>
    <version>1.0.3</version>
</dependency>

###编写服务启动类 明文模式并总是调试输出微信请求信息的服务启动类.

public class MessageServerStartup{
	public static void main(String[] args) {
		new WeixinServerBootstrap("appid或微信原始ID","开发者token").addHandler(
				DebugMessageHandler.global).startup();
	}
}

密文模式的服务启动类

public class MessageServerStartup{
	public static void main(String[] args) {
		new WeixinServerBootstrap("appid","开发者token","加密密钥").addHandler(
				DebugMessageHandler.global).startup();
	}
}

只针对文本消息的服务启动类

public class MessageServerStartup{
	public static void main(String[] args) {
		// 针对文本消息回复
		WeixinMessageHandler messageHandler = new MessageHandlerAdapter<TextMessage>() {
			@Override
			public WeixinResponse doHandle0(WeixinRequest request,
				TextMessage message) throws WeixinException {
					return new TextResponse("HelloWorld!");
			}
		};
		// 当消息类型为文本(text)时回复「HelloWorld」, 否则回复调试消息
		new WeixinServerBootstrap(appid, token, aesKey).addHandler(
				messageHandler, DebugMessageHandler.global).startup();
		}
	}
}

使用拦截器处理消息请求的启动类

public static void main(String[] args) {
	// 拦截所有请求
	WeixinMessageInterceptor interceptor = new MessageInterceptorAdapter() {
		@Override
		public boolean preHandle(ChannelHandlerContext context,
				WeixinRequest request, Object message,
				WeixinMessageHandler handler) throws WeixinException {
			context.write(new TextResponse("所有消息被拦截了!"));
			return false;
		}
		@Override
		public void postHandle(ChannelHandlerContext context,
				WeixinRequest request, WeixinResponse response,
				Object message, WeixinMessageHandler handler)
				throws WeixinException {
			System.err.println("preHandle返回为true,执行handler后");
		}
		@Override
		public void afterCompletion(ChannelHandlerContext context,
				WeixinRequest request, Object message,
				WeixinMessageHandler handler, WeixinException exception)
				throws WeixinException {
			System.err.println("请求处理完毕");
		}
	};
	new WeixinServerBootstrap("token").addInterceptor(interceptor)
			.addHandler(BlankMessageHandler.global).startup();
}

更多内容将会写在wiki里

assembly打包(辅助)

assembly是maven的一个打包插件,它可以创建一个包含脚本、配置文件以及所有运行时所依赖的元素(jar)assembly插件能帮你构建一个完整的发布包.

1.复制assembly.xmlstartup.sh到自己工程的src/main目录下.

2.在项目pom.xml中的/bulid/plugins节点新增如下配置

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-assembly-plugin</artifactId>
	<version>2.5.1</version>
	<configuration>
		<descriptors>
			<descriptor>src/main/assembly.xml</descriptor>
		</descriptors>
		<finalName>weixin4j-server</finalName>
	</configuration>
	<executions>
		<execution>
			<id>make-assembly</id>
			<phase>package</phase>
			<goals>
				<goal>single</goal>
			</goals>
		</execution>
	</executions>
</plugin>

descriptor表示assembly文件的位置.

finalName表示打包(zip)后的文件名,需配合startup.shAPP_HOME的值使用.

3.startup.shJAVA_HOME为java运行环境(jre|jdk)的安装根目录,如果与脚本中的值不一致,可使用ln -s t/usr/local/java 实际的目录.

4.startup.shAPP_HOME为服务的启动目录,相当于运行服务时的classpath目录.

5.修改startup.shAPP_MAINCLASS为上述编写的netty服务启动类的全限定名.

6.执行mvn package命令后在target目录下得到一个zip的压缩包,在7或者8中选择一种方式启动服务.

7.[上传zip包到服务器],解压包到启动目录(APP_HOME)的上一级目录后运行startup.sh脚本.

sh startup.sh start

8.ant远程部署

复制deploy.xml到自己工程的根目录下.

Ant远程部署deploy.xml的正确执行需要jsch包的支持,下载jar包将其引入执行Ant命令时的classpath中.

正确填写zip.namehostpwdmain.dirsub.dir五个属性值.

右键 Run as -> Ant Build

相关参考

消息服务时序图

spring-webmvc:DispatcherServlet

spring-webmvc:HandlerAdapter

spring-webmvc:HandlerInterceptor

更新LOG