企业号:新增获取微信服务器IP地址接口&调整回调模式下的首次验证的签名方式

This commit is contained in:
jy.hu
2014-12-28 21:08:16 +08:00
parent 167f696e83
commit a3cec6a17b
14 changed files with 167 additions and 60 deletions
@@ -3,6 +3,7 @@ package com.foxinmy.weixin4j.qy.server;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageDecoder;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpMethod;
import io.netty.handler.codec.http.QueryStringDecoder;
import java.util.List;
@@ -38,13 +39,14 @@ public class WeixinMessageDecoder extends
protected void decode(ChannelHandlerContext ctx, FullHttpRequest req,
List<Object> out) throws Exception {
WeixinQyAccount qyAccount = ConfigUtil.getWeixinQyAccount();
String xmlContent = req.content().toString(Consts.UTF_8);
String content = req.content().toString(Consts.UTF_8);
HttpWeixinMessage message = new HttpWeixinMessage();
message.setXmlContent(xmlContent);
if (StringUtils.isNotBlank(xmlContent)) {
message = XmlStream.get(xmlContent, HttpWeixinMessage.class);
message.setXmlContent(MessageUtil.aesDecrypt(qyAccount.getId(),
qyAccount.getEncodingAesKey(), message.getEncryptContent()));
message.setOriginalContent(content);
if (StringUtils.isNotBlank(content)) {
message = XmlStream.get(content, HttpWeixinMessage.class);
message.setOriginalContent(MessageUtil.aesDecrypt(
qyAccount.getId(), qyAccount.getEncodingAesKey(),
message.getEncryptContent()));
}
message.setMethod(req.getMethod().name());
QueryStringDecoder queryDecoder = new QueryStringDecoder(req.getUri(),
@@ -52,11 +54,11 @@ public class WeixinMessageDecoder extends
log.info("\n=================receive request=================");
log.info("{}", req.getMethod());
log.info("{}", req.getUri());
log.info("{}", xmlContent);
log.info("{}", content);
Map<String, List<String>> parameters = queryDecoder.parameters();
String msgSignature = parameters.containsKey("msg_signature") ? parameters
.get("msg_signature").get(0) : "";
message.setMsgSignature(msgSignature);
message.setSignature(msgSignature);
String echoStr = parameters.containsKey("echostr") ? parameters.get(
"echostr").get(0) : "";
message.setEchoStr(echoStr);
@@ -66,12 +68,16 @@ public class WeixinMessageDecoder extends
String nonce = parameters.containsKey("nonce") ? parameters
.get("nonce").get(0) : "";
message.setNonce(nonce);
String signature = parameters.containsKey("signature") ? parameters
.get("signature").get(0) : "";
message.setSignature(signature);
message.setToken(qyAccount.getToken());
message.setEncryptType(EncryptType.AES);
// 解密 echostr 20141228 added
if (message.getMethod().equals(HttpMethod.GET.name())
&& StringUtils.isNotBlank(echoStr)) {
message.setOriginalContent(MessageUtil.aesDecrypt(
qyAccount.getId(), qyAccount.getEncodingAesKey(), echoStr));
}
out.add(message);
}
}
@@ -46,6 +46,7 @@ public class WeixinServerHandler extends
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
cause.printStackTrace();
ctx.close();
log.error("catch the exception:{}", cause);
}
@Override
@@ -57,18 +58,20 @@ public class WeixinServerHandler extends
boolean validate = false;
if (isGet) {
validate = MessageUtil.signature(httpMessage.getToken(),
httpMessage.getTimeStamp(), httpMessage.getNonce()).equals(
httpMessage.getSignature());
httpMessage.getTimeStamp(), httpMessage.getNonce(),
httpMessage.getEchoStr())
.equals(httpMessage.getSignature());
if (validate) {
ctx.write(HttpUtil.createWeixinMessageResponse(
httpMessage.getEchoStr(), ContentType.TEXT_PLAIN));
httpMessage.getOriginalContent(),
ContentType.TEXT_PLAIN));
return;
}
} else {
validate = MessageUtil.signature(httpMessage.getToken(),
httpMessage.getTimeStamp(), httpMessage.getNonce(),
httpMessage.getEncryptContent()).equals(
httpMessage.getMsgSignature());
httpMessage.getSignature());
}
if (!validate) {
ctx.write(new DefaultFullHttpResponse(HttpVersion.HTTP_1_1,
@@ -76,7 +79,7 @@ public class WeixinServerHandler extends
return;
}
String xmlContent = httpMessage.getXmlContent();
String xmlContent = httpMessage.getOriginalContent();
WeixinAction action = actionMapping.getAction(xmlContent);
if (action == null) {
ctx.write(new DefaultFullHttpResponse(HttpVersion.HTTP_1_1,