From 20c3432091f78b50642b598a460c92e4406ae1c5 Mon Sep 17 00:00:00 2001 From: jinyu Date: Wed, 27 Apr 2016 21:13:38 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9EMultipleResponse=E5=A4=9A?= =?UTF-8?q?=E4=B8=AA=E5=9B=9E=E5=A4=8D=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin4j/response/MultipleResponse.java | 85 +++++++++++++++++++ .../socket/MultipleResponseEncoder.java | 32 +++++++ .../socket/WeixinResponseEncoder.java | 46 +++++----- .../socket/WeixinServerInitializer.java | 1 + 4 files changed, 144 insertions(+), 20 deletions(-) create mode 100644 weixin4j-server/src/main/java/com/foxinmy/weixin4j/response/MultipleResponse.java create mode 100644 weixin4j-server/src/main/java/com/foxinmy/weixin4j/socket/MultipleResponseEncoder.java diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/response/MultipleResponse.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/response/MultipleResponse.java new file mode 100644 index 00000000..f59cf6e7 --- /dev/null +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/response/MultipleResponse.java @@ -0,0 +1,85 @@ +package com.foxinmy.weixin4j.response; + +import java.util.Arrays; +import java.util.List; + +/** + * 多个消息回复 + * + * @className MultipleResponse + * @author jy + * @date 2016年4月27日 + * @since JDK 1.6 + * @see + */ +public class MultipleResponse implements WeixinResponse { + + private List responses; + + public MultipleResponse(WeixinResponse... responses) { + if (responses == null) { + throw new IllegalArgumentException("responses not be empty"); + } + this.responses = Arrays.asList(responses); + } + + @Override + public String getMsgType() { + return "multiple"; + } + + /** + * 插入首条回复 + * + * @param response + */ + public void addFirstResponse(WeixinResponse response) { + responses.add(0, response); + } + + /** + * 移除首条回复 + * + * @return 移除的回复 + */ + public WeixinResponse removeFirstResponse() { + return responses.remove(0); + } + + /** + * 插入末条回复 + * + * @param response + */ + public void addLastResponse(WeixinResponse response) { + responses.add(response); + } + + /** + * 移除末条回复 + * + * @return 移除的回复 + */ + public WeixinResponse removeLastResponse() { + return responses.remove(responses.size() - 1); + } + + /** + * 获取所有的回复 + * + * @return + */ + public List getResponses() { + return this.responses; + } + + @Override + public String toContent() { + return null; + } + + @Override + public String toString() { + return "MultipleResponse [responses=" + responses + "]"; + } +} diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/socket/MultipleResponseEncoder.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/socket/MultipleResponseEncoder.java new file mode 100644 index 00000000..01282296 --- /dev/null +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/socket/MultipleResponseEncoder.java @@ -0,0 +1,32 @@ +package com.foxinmy.weixin4j.socket; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToMessageEncoder; + +import java.util.List; + +import com.foxinmy.weixin4j.response.MultipleResponse; +import com.foxinmy.weixin4j.response.WeixinResponse; + +/** + * 微信多个回复编码类 + * + * @className WeixinResponseEncoder + * @author jy + * @date 2016年4月27日 + * @since JDK 1.6 + * @see 加密接入指引 + * @see com.foxinmy.weixin4j.response.MultipleResponse + */ +public class MultipleResponseEncoder extends + MessageToMessageEncoder { + + @Override + protected void encode(ChannelHandlerContext ctx, MultipleResponse response, + List out) throws Exception { + for (WeixinResponse r : response.getResponses()) { + ctx.writeAndFlush(r); + } + } +} 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 c38c30a7..d4264b56 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 @@ -29,9 +29,22 @@ import com.foxinmy.weixin4j.util.ServerToolkits; public class WeixinResponseEncoder extends MessageToMessageEncoder { - private final InternalLogger logger = InternalLoggerFactory + protected final InternalLogger logger = InternalLoggerFactory .getInstance(getClass()); + private final String XML_START = ""; + // ---------------明文节点 + private final String ELEMENT_TOUSERNAME = ""; + private final String ELEMENT_FROMUSERNAME = ""; + private final String ELEMENT_CREATETIME = ""; + private final String ELEMENT_MSGTYPE = ""; + // ---------------密文节点 + private final String ELEMENT_MSGSIGNATURE = ""; + private final String ELEMENT_ENCRYPT = ""; + private final String ELEMENT_TIMESTAMP = ""; + private final String ELEMENT_NONCE = ""; + private final String XML_END = ""; + @Override protected void encode(ChannelHandlerContext ctx, WeixinResponse response, List out) throws WeixinException { @@ -39,18 +52,16 @@ public class WeixinResponseEncoder extends .attr(ServerToolkits.MESSAGE_TRANSFER_KEY).get(); EncryptType encryptType = messageTransfer.getEncryptType(); StringBuilder content = new StringBuilder(); - content.append(""); - content.append(String.format("", + content.append(XML_START); + content.append(String.format(ELEMENT_TOUSERNAME, messageTransfer.getFromUserName())); - content.append(String.format( - "", + content.append(String.format(ELEMENT_FROMUSERNAME, messageTransfer.getToUserName())); - content.append(String.format("", + content.append(String.format(ELEMENT_CREATETIME, System.currentTimeMillis() / 1000l)); - content.append(String.format("", - response.getMsgType())); + content.append(String.format(ELEMENT_MSGTYPE, response.getMsgType())); content.append(response.toContent()); - content.append(""); + content.append(XML_END); if (encryptType == EncryptType.AES) { AesToken aesToken = messageTransfer.getAesToken(); String nonce = ServerToolkits.generateRandomString(32); @@ -61,17 +72,12 @@ public class WeixinResponseEncoder extends 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(""); + content.append(XML_START); + content.append(String.format(ELEMENT_NONCE, nonce)); + content.append(String.format(ELEMENT_TIMESTAMP, timestamp)); + content.append(String.format(ELEMENT_MSGSIGNATURE, msgSignature)); + content.append(String.format(ELEMENT_ENCRYPT, encrtypt)); + content.append(XML_END); } ctx.writeAndFlush(HttpUtil.createHttpResponse(content.toString(), ServerToolkits.CONTENTTYPE$APPLICATION_XML)); diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/socket/WeixinServerInitializer.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/socket/WeixinServerInitializer.java index 1fef2fa7..3118031b 100644 --- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/socket/WeixinServerInitializer.java +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/socket/WeixinServerInitializer.java @@ -39,6 +39,7 @@ public class WeixinServerInitializer extends ChannelInitializer { pipeline.addLast(new WeixinMessageDecoder(aesTokenMap)); pipeline.addLast(new WeixinResponseEncoder()); pipeline.addLast(new SingleResponseEncoder()); + pipeline.addLast(new MultipleResponseEncoder()); pipeline.addLast(new WeixinRequestHandler(messageDispatcher)); } }