diff --git a/weixin-java-demo-with-spring/pom.xml b/weixin-java-demo-with-spring/pom.xml
index 469ac9e22..517846861 100644
--- a/weixin-java-demo-with-spring/pom.xml
+++ b/weixin-java-demo-with-spring/pom.xml
@@ -20,7 +20,7 @@
     1.7.2
     1.8.9
     1.2.6
-    3.1
+    3.4
     9.3.10.v20160621
   
 
diff --git a/weixin-java-demo-with-spring/src/main/java/com/github/binarywang/demo/spring/config/WxConfig.java b/weixin-java-demo-with-spring/src/main/java/com/github/binarywang/demo/spring/config/WxConfig.java
index a65d4000e..782f24051 100644
--- a/weixin-java-demo-with-spring/src/main/java/com/github/binarywang/demo/spring/config/WxConfig.java
+++ b/weixin-java-demo-with-spring/src/main/java/com/github/binarywang/demo/spring/config/WxConfig.java
@@ -12,6 +12,8 @@ public abstract class WxConfig {
 
     public abstract String getAppsecret();
 
+    public abstract String getAesKey();
+
     public abstract WxAccountEnum getWxAccountEnum();
 
     public int getPubId() {
diff --git a/weixin-java-demo-with-spring/src/main/java/com/github/binarywang/demo/spring/config/WxGzh1Config.java b/weixin-java-demo-with-spring/src/main/java/com/github/binarywang/demo/spring/config/WxGzh1Config.java
index fee34f431..c1cfc01c7 100644
--- a/weixin-java-demo-with-spring/src/main/java/com/github/binarywang/demo/spring/config/WxGzh1Config.java
+++ b/weixin-java-demo-with-spring/src/main/java/com/github/binarywang/demo/spring/config/WxGzh1Config.java
@@ -19,6 +19,9 @@ public class WxGzh1Config extends WxConfig {
     @Value("#{gzh1WxProperties.wx_appsecret}")
     private String appsecret;
 
+    @Value("#{gzh1WxProperties.wx_aeskey}")
+    private String aesKey;
+
     @Override
     public String getToken() {
         return this.token;
@@ -34,6 +37,11 @@ public class WxGzh1Config extends WxConfig {
         return this.appsecret;
     }
 
+    @Override
+    public String getAesKey() {
+        return this.aesKey;
+    }
+
     @Override
     public WxAccountEnum getWxAccountEnum() {
         return WxAccountEnum.GZH1;
diff --git a/weixin-java-demo-with-spring/src/main/java/com/github/binarywang/demo/spring/config/WxGzh2Config.java b/weixin-java-demo-with-spring/src/main/java/com/github/binarywang/demo/spring/config/WxGzh2Config.java
index d284630a8..8c593909c 100644
--- a/weixin-java-demo-with-spring/src/main/java/com/github/binarywang/demo/spring/config/WxGzh2Config.java
+++ b/weixin-java-demo-with-spring/src/main/java/com/github/binarywang/demo/spring/config/WxGzh2Config.java
@@ -19,6 +19,9 @@ public class WxGzh2Config extends WxConfig {
     @Value("#{gzh2WxProperties.wx_appsecret}")
     private String appsecret;
 
+    @Value("#{gzh2WxProperties.wx_aeskey}")
+    private String aesKey;
+
     @Override
     public String getToken() {
         return this.token;
@@ -34,6 +37,11 @@ public class WxGzh2Config extends WxConfig {
         return this.appsecret;
     }
 
+    @Override
+    public String getAesKey() {
+        return this.aesKey;
+    }
+
     @Override
     public WxAccountEnum getWxAccountEnum() {
         return WxAccountEnum.GZH2;
diff --git a/weixin-java-demo-with-spring/src/main/java/com/github/binarywang/demo/spring/controller/AbstractWxPortalController.java b/weixin-java-demo-with-spring/src/main/java/com/github/binarywang/demo/spring/controller/AbstractWxPortalController.java
index 8bae46695..dba3f8406 100644
--- a/weixin-java-demo-with-spring/src/main/java/com/github/binarywang/demo/spring/controller/AbstractWxPortalController.java
+++ b/weixin-java-demo-with-spring/src/main/java/com/github/binarywang/demo/spring/controller/AbstractWxPortalController.java
@@ -1,5 +1,6 @@
 package com.github.binarywang.demo.spring.controller;
 
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -27,7 +28,8 @@ public abstract class AbstractWxPortalController {
       @RequestParam("timestamp") String timestamp,
       @RequestParam("nonce") String nonce,
       @RequestParam("echostr") String echostr) {
-    this.logger.info("接收到来自微信服务器的认证消息");
+    this.logger.info("\n接收到来自微信服务器的认证消息:[{},{},{},{}]",
+            signature, timestamp, nonce, echostr);
 
     if (this.getWxService().checkSignature(timestamp, nonce, signature)) {
       return echostr;
@@ -37,24 +39,40 @@ public abstract class AbstractWxPortalController {
   }
 
   @RequestMapping(method = RequestMethod.POST, produces = "application/xml; charset=UTF-8")
-  public @ResponseBody String post(@RequestBody String requestBody) {
+  public @ResponseBody String post(@RequestBody String requestBody,
+                                   @RequestParam("signature") String signature,
+                                   @RequestParam("encrypt_type") String encType,
+                                   @RequestParam("msg_signature") String msgSignature,
+                                   @RequestParam("timestamp") String timestamp,
+                                   @RequestParam("nonce") String nonce) {
+    this.logger.info("\n接收微信请求:[{},{},{},{},{}]\n{} ",
+                        signature, encType, msgSignature, timestamp, nonce, requestBody);
 
-    this.logger.debug("\n接收微信请求:{} ", requestBody);
+    String out = null;
+    if (encType == null) {
+      // 明文传输的消息
+      WxMpXmlMessage inMessage = WxMpXmlMessage.fromXml(requestBody);
+      WxMpXmlOutMessage outMessage = this.getWxService().route(inMessage);
+      if (outMessage == null) {
+        return "";
+      }
+      out = outMessage.toXml();
+    }else if ("aes".equals(encType)) {
+      // aes加密的消息
+      WxMpXmlMessage inMessage = WxMpXmlMessage.fromEncryptedXml(requestBody,
+              this.getWxService().getWxMpConfigStorage(), timestamp, nonce, msgSignature);
+      this.logger.debug("\n消息解密后内容为:\n{} ", inMessage.toString());
+      WxMpXmlOutMessage outMessage = this.getWxService().route(inMessage);
+      if (outMessage == null) {
+        return "";
+      }
 
-    BaseWxService wxService = this.getWxService();
-
-    WxMpXmlOutMessage out = wxService
-        .route(WxMpXmlMessage.fromXml(requestBody));
-
-    if (out == null) {
-      return "";
+      out = outMessage.toEncryptedXml(this.getWxService().getWxMpConfigStorage());
     }
 
-    String outXml = out.toXml();
+    this.logger.debug("\n组装回复信息:{}", out);
 
-    this.logger.debug("\n组装回复信息:{}", outXml);
-
-    return outXml;
+    return out;
   }
 
   protected abstract BaseWxService getWxService();
diff --git a/weixin-java-demo-with-spring/src/main/java/com/github/binarywang/demo/spring/service/BaseWxService.java b/weixin-java-demo-with-spring/src/main/java/com/github/binarywang/demo/spring/service/BaseWxService.java
index 133c7445b..ac61bea0b 100644
--- a/weixin-java-demo-with-spring/src/main/java/com/github/binarywang/demo/spring/service/BaseWxService.java
+++ b/weixin-java-demo-with-spring/src/main/java/com/github/binarywang/demo/spring/service/BaseWxService.java
@@ -63,6 +63,7 @@ public abstract class BaseWxService extends WxMpServiceImpl {
     config.setAppId(this.getServerConfig().getAppid());// 设置微信公众号的appid
     config.setSecret(this.getServerConfig().getAppsecret());// 设置微信公众号的app corpSecret
     config.setToken(this.getServerConfig().getToken());// 设置微信公众号的token
+    config.setAesKey(this.getServerConfig().getAesKey());// 设置消息加解密密钥
     super.setWxMpConfigStorage(config);
 
     this.refreshRouter();
diff --git a/weixin-java-demo-with-spring/src/main/resources/wx-gzh1.properties.template b/weixin-java-demo-with-spring/src/main/resources/wx-gzh1.properties.template
index 76afcd9ea..302903e55 100644
--- a/weixin-java-demo-with-spring/src/main/resources/wx-gzh1.properties.template
+++ b/weixin-java-demo-with-spring/src/main/resources/wx-gzh1.properties.template
@@ -1,3 +1,4 @@
 wx_appid=
 wx_appsecret=
 wx_token=
+wx_aeskey=
diff --git a/weixin-java-demo-with-spring/src/main/resources/wx-gzh2.properties.template b/weixin-java-demo-with-spring/src/main/resources/wx-gzh2.properties.template
index 76afcd9ea..302903e55 100644
--- a/weixin-java-demo-with-spring/src/main/resources/wx-gzh2.properties.template
+++ b/weixin-java-demo-with-spring/src/main/resources/wx-gzh2.properties.template
@@ -1,3 +1,4 @@
 wx_appid=
 wx_appsecret=
 wx_token=
+wx_aeskey=