From 3644b73608c610315b63c001c84b218ccc5725de Mon Sep 17 00:00:00 2001 From: jinyu Date: Mon, 3 Aug 2015 19:25:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4BlankMessageHandler=E7=B1=BB,?= =?UTF-8?q?=E6=96=B0=E5=A2=9ESingleContentResponse=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- weixin4j-server/CHANGE.md | 4 +- .../weixin4j/handler/BlankMessageHandler.java | 38 ----------- .../weixin4j/handler/DebugMessageHandler.java | 5 +- .../weixin4j/response/BlankResponse.java | 16 +---- .../response/SingleContentResponse.java | 24 +++++++ .../socket/SingleResponseEncoder.java | 2 +- .../weixin4j/socket/WeixinRequestHandler.java | 13 ++-- .../socket/WeixinResponseEncoder.java | 66 ++++++++----------- .../startup/WeixinServerBootstrap.java | 2 + .../com/foxinmy/weixin4j/util/HttpUtil.java | 13 +++- .../server/test/MessageServerStartup.java | 3 +- 11 files changed, 83 insertions(+), 103 deletions(-) delete mode 100644 weixin4j-server/src/main/java/com/foxinmy/weixin4j/handler/BlankMessageHandler.java create mode 100644 weixin4j-server/src/main/java/com/foxinmy/weixin4j/response/SingleContentResponse.java diff --git a/weixin4j-server/CHANGE.md b/weixin4j-server/CHANGE.md index 75f7d14d..133502af 100644 --- a/weixin4j-server/CHANGE.md +++ b/weixin4j-server/CHANGE.md @@ -70,4 +70,6 @@ * 2015-08-03 - 新增base64解编码类(来自apache) \ No newline at end of file + + 新增base64解编码类(来自apache) + + + 删除`BlankMessageHandler`类,新增`SingleContentResponse`类 \ No newline at end of file diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/handler/BlankMessageHandler.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/handler/BlankMessageHandler.java deleted file mode 100644 index 048d1a02..00000000 --- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/handler/BlankMessageHandler.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.foxinmy.weixin4j.handler; - -import java.util.Set; - -import com.foxinmy.weixin4j.exception.WeixinException; -import com.foxinmy.weixin4j.request.WeixinRequest; -import com.foxinmy.weixin4j.response.BlankResponse; -import com.foxinmy.weixin4j.response.WeixinResponse; - -/** - * 空白响应消息处理器 - * - * @className BlankMessageHandler - * @author jy - * @date 2015年5月17日 - * @since JDK 1.7 - * @see - */ -public class BlankMessageHandler implements WeixinMessageHandler { - - public final static BlankMessageHandler global = new BlankMessageHandler(); - - private BlankMessageHandler() { - - } - - @Override - public boolean canHandle(WeixinRequest request, Object message, - Set nodeNames) throws WeixinException { - return true; - } - - @Override - public WeixinResponse doHandle(WeixinRequest request, Object message, - Set nodeNames) throws WeixinException { - return BlankResponse.global; - } -} diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/handler/DebugMessageHandler.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/handler/DebugMessageHandler.java index 109e24b7..ddb00240 100644 --- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/handler/DebugMessageHandler.java +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/handler/DebugMessageHandler.java @@ -33,6 +33,9 @@ public class DebugMessageHandler implements WeixinMessageHandler { @Override public WeixinResponse doHandle(WeixinRequest request, Object message, Set nodeNames) throws WeixinException { - return new TextResponse(message.toString()); + String content = message == null ? content = request + .getOriginalContent().replaceAll("\\!\\[CDATA\\[", "") + .replaceAll("\\]\\]", "") : message.toString(); + return new TextResponse(content); } } diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/response/BlankResponse.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/response/BlankResponse.java index 8d159e50..10ab5ef9 100644 --- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/response/BlankResponse.java +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/response/BlankResponse.java @@ -9,21 +9,11 @@ package com.foxinmy.weixin4j.response; * @since JDK 1.7 * @see */ -public class BlankResponse implements WeixinResponse { +public class BlankResponse extends SingleContentResponse { public static final BlankResponse global = new BlankResponse(); - private BlankResponse(){ - - } - - @Override - public String getMsgType() { - return "blank"; - } - - @Override - public String toContent() { - return "success"; + private BlankResponse() { + super("success"); } } diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/response/SingleContentResponse.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/response/SingleContentResponse.java new file mode 100644 index 00000000..0cf408ad --- /dev/null +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/response/SingleContentResponse.java @@ -0,0 +1,24 @@ +package com.foxinmy.weixin4j.response; + +/** + * 单一内容回复 + * + * @className SingleContentResponse + * @author jy + * @date 2015年8月3日 + * @since JDK 1.7 + * @see + */ +public class SingleContentResponse implements SingleResponse { + + private final String content; + + public SingleContentResponse(String content) { + this.content = content; + } + + @Override + public String toContent() { + return content; + } +} diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/socket/SingleResponseEncoder.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/socket/SingleResponseEncoder.java index 6985986f..a1f1452a 100644 --- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/socket/SingleResponseEncoder.java +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/socket/SingleResponseEncoder.java @@ -33,7 +33,7 @@ public class SingleResponseEncoder extends List out) throws WeixinException { String content = response.toContent(); ctx.writeAndFlush(HttpUtil.createHttpResponse(content, OK, - Consts.CONTENTTYPE$APPLICATION_XML)); + Consts.CONTENTTYPE$TEXT_PLAIN)); logger.info("encode single response:{}", content); } } \ No newline at end of file diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/socket/WeixinRequestHandler.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/socket/WeixinRequestHandler.java index c3443637..51d87a85 100644 --- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/socket/WeixinRequestHandler.java +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/socket/WeixinRequestHandler.java @@ -2,7 +2,6 @@ package com.foxinmy.weixin4j.socket; import static io.netty.handler.codec.http.HttpResponseStatus.FORBIDDEN; import static io.netty.handler.codec.http.HttpResponseStatus.METHOD_NOT_ALLOWED; -import static io.netty.handler.codec.http.HttpResponseStatus.OK; import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; @@ -13,6 +12,7 @@ import io.netty.util.internal.logging.InternalLoggerFactory; import com.foxinmy.weixin4j.dispatcher.WeixinMessageDispatcher; import com.foxinmy.weixin4j.exception.WeixinException; import com.foxinmy.weixin4j.request.WeixinRequest; +import com.foxinmy.weixin4j.response.SingleContentResponse; import com.foxinmy.weixin4j.type.EncryptType; import com.foxinmy.weixin4j.util.AesToken; import com.foxinmy.weixin4j.util.Consts; @@ -59,10 +59,7 @@ public class WeixinRequestHandler extends if (MessageUtil.signature(aesToken.getToken(), request.getTimeStamp(), request.getNonce()).equals( request.getSignature())) { - ctx.writeAndFlush( - HttpUtil.createHttpResponse(request.getEchoStr(), OK, - Consts.CONTENTTYPE$TEXT_PLAIN)).addListener( - ChannelFutureListener.CLOSE); + ctx.write(new SingleContentResponse(request.getEchoStr())); return; } ctx.writeAndFlush( @@ -98,9 +95,9 @@ public class WeixinRequestHandler extends } CruxMessageHandler cruxMessage = CruxMessageHandler.parser(request .getOriginalContent()); - WeixinMessageTransfer messageTransfer = new WeixinMessageTransfer(aesToken, - request.getEncryptType(), cruxMessage.getToUserName(), - cruxMessage.getFromUserName()); + WeixinMessageTransfer messageTransfer = new WeixinMessageTransfer( + aesToken, request.getEncryptType(), + cruxMessage.getToUserName(), cruxMessage.getFromUserName()); ctx.channel().attr(Consts.MESSAGE_TRANSFER_KEY).set(messageTransfer); messageDispatcher.doDispatch(ctx, request, cruxMessage); } diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/socket/WeixinResponseEncoder.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/socket/WeixinResponseEncoder.java index 61895591..1bfd5ddf 100644 --- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/socket/WeixinResponseEncoder.java +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/socket/WeixinResponseEncoder.java @@ -9,7 +9,6 @@ import io.netty.util.internal.logging.InternalLoggerFactory; import java.util.List; import com.foxinmy.weixin4j.exception.WeixinException; -import com.foxinmy.weixin4j.response.BlankResponse; import com.foxinmy.weixin4j.response.WeixinResponse; import com.foxinmy.weixin4j.type.EncryptType; import com.foxinmy.weixin4j.util.AesToken; @@ -43,45 +42,38 @@ public class WeixinResponseEncoder extends AesToken aesToken = messageTransfer.getAesToken(); EncryptType encryptType = messageTransfer.getEncryptType(); StringBuilder content = new StringBuilder(); - if (response instanceof BlankResponse) { - content.append(response.toContent()); - } else { + content.append(""); + content.append(String.format("", + messageTransfer.getFromUserName())); + content.append(String.format( + "", + messageTransfer.getToUserName())); + content.append(String.format("", + System.currentTimeMillis() / 1000l)); + content.append(String.format("", + response.getMsgType())); + content.append(response.toContent()); + content.append(""); + if (encryptType == EncryptType.AES) { + String nonce = RandomUtil.generateString(32); + String timestamp = Long + .toString(System.currentTimeMillis() / 1000l); + String encrtypt = MessageUtil.aesEncrypt(aesToken.getWeixinId(), + aesToken.getAesKey(), content.toString()); + String msgSignature = MessageUtil.signature(aesToken.getToken(), + nonce, timestamp, encrtypt); + content.delete(0, content.length()); content.append(""); + content.append(String + .format("", nonce)); content.append(String.format( - "", - messageTransfer.getFromUserName())); - content.append(String.format( - "", - messageTransfer.getToUserName())); - content.append(String.format( - "", - System.currentTimeMillis() / 1000l)); - content.append(String.format("", - response.getMsgType())); - content.append(response.toContent()); + "", timestamp)); + content.append(String + .format("", + msgSignature)); + content.append(String.format("", + encrtypt)); content.append(""); - if (encryptType == EncryptType.AES) { - String nonce = RandomUtil.generateString(32); - String timestamp = Long - .toString(System.currentTimeMillis() / 1000l); - String encrtypt = MessageUtil.aesEncrypt( - aesToken.getWeixinId(), aesToken.getAesKey(), - content.toString()); - String msgSignature = MessageUtil.signature( - aesToken.getToken(), nonce, timestamp, encrtypt); - content.delete(0, content.length()); - content.append(""); - content.append(String.format("", - nonce)); - content.append(String.format( - "", timestamp)); - content.append(String.format( - "", - msgSignature)); - content.append(String.format( - "", encrtypt)); - content.append(""); - } } ctx.writeAndFlush(HttpUtil.createHttpResponse(content.toString(), OK, Consts.CONTENTTYPE$APPLICATION_XML)); diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/startup/WeixinServerBootstrap.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/startup/WeixinServerBootstrap.java index d16b2655..c1981a4c 100644 --- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/startup/WeixinServerBootstrap.java +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/startup/WeixinServerBootstrap.java @@ -324,4 +324,6 @@ public final class WeixinServerBootstrap { messageDispatcher.openAlwaysResponse(); return this; } + + public final static String VERSION = "1.0.3"; } \ No newline at end of file diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/util/HttpUtil.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/util/HttpUtil.java index 1cfeb710..85e22407 100644 --- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/util/HttpUtil.java +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/util/HttpUtil.java @@ -4,7 +4,7 @@ import static io.netty.handler.codec.http.HttpHeaders.Names.CONNECTION; import static io.netty.handler.codec.http.HttpHeaders.Names.CONTENT_LENGTH; import static io.netty.handler.codec.http.HttpHeaders.Names.CONTENT_TYPE; import static io.netty.handler.codec.http.HttpHeaders.Names.DATE; -import static io.netty.handler.codec.http.HttpHeaders.Names.SERVER; +import static io.netty.handler.codec.http.HttpHeaders.Names.USER_AGENT; import static io.netty.handler.codec.http.HttpResponseStatus.OK; import static io.netty.handler.codec.http.HttpVersion.HTTP_1_1; import io.netty.buffer.Unpooled; @@ -16,6 +16,8 @@ import io.netty.handler.codec.http.HttpResponseStatus; import java.util.Date; +import com.foxinmy.weixin4j.startup.WeixinServerBootstrap; + /** * HTTP工具类 * @@ -27,6 +29,9 @@ import java.util.Date; */ public class HttpUtil { + private static String SERVER = "netty4"; + private static String WEIXIN4J = "weixin4j-server"; + public static HttpResponse createHttpResponse(String content, HttpResponseStatus status, String contentType) { if (content == null) { @@ -48,7 +53,11 @@ public class HttpUtil { content.getBytes(Consts.UTF_8).length); httpResponse.headers().set(CONNECTION, Values.KEEP_ALIVE); httpResponse.headers().set(DATE, new Date()); - httpResponse.headers().set(SERVER, "netty4"); + httpResponse.headers().set(SERVER, SERVER); + httpResponse.headers() + .set(USER_AGENT, + String.format("%s/%s", WEIXIN4J, + WeixinServerBootstrap.VERSION)); return httpResponse; } } diff --git a/weixin4j-server/src/test/java/com/foxinmy/weixin4j/server/test/MessageServerStartup.java b/weixin4j-server/src/test/java/com/foxinmy/weixin4j/server/test/MessageServerStartup.java index 2031f5d9..a054333a 100644 --- a/weixin4j-server/src/test/java/com/foxinmy/weixin4j/server/test/MessageServerStartup.java +++ b/weixin4j-server/src/test/java/com/foxinmy/weixin4j/server/test/MessageServerStartup.java @@ -5,7 +5,6 @@ import io.netty.channel.ChannelHandlerContext; import java.util.Set; import com.foxinmy.weixin4j.exception.WeixinException; -import com.foxinmy.weixin4j.handler.BlankMessageHandler; import com.foxinmy.weixin4j.handler.DebugMessageHandler; import com.foxinmy.weixin4j.handler.MessageHandlerAdapter; import com.foxinmy.weixin4j.handler.WeixinMessageHandler; @@ -113,7 +112,7 @@ public class MessageServerStartup { } }; new WeixinServerBootstrap(openid, token).addInterceptor(interceptor) - .addHandler(BlankMessageHandler.global).startup(); + .openAlwaysResponse().startup(); } public static void main(String[] args) throws Exception {