diff --git a/pom.xml b/pom.xml
index b93c50ec4..5e219eb68 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
   4.0.0
   com.github.binarywang
   weixin-java-parent
-  2.6.0
+  2.7.0-SNAPSHOT
   pom
   WeiXin Java Tools - Parent
   微信公众号、企业号上级POM
diff --git a/readme.md b/readme.md
index 5f10da8a2..b55333188 100644
--- a/readme.md
+++ b/readme.md
@@ -52,7 +52,7 @@
 ---------------------------------
 ## Maven & Gradle 最新正式版本
 
-* 微信支付(暂时为测试版本):
+* 微信支付:
 
 maven:
 ```xml
diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml
index 946c65c24..e666caab3 100644
--- a/weixin-java-common/pom.xml
+++ b/weixin-java-common/pom.xml
@@ -6,7 +6,7 @@
   
     com.github.binarywang
     weixin-java-parent
-    2.6.0
+    2.7.0-SNAPSHOT
   
 
   weixin-java-common
@@ -39,6 +39,11 @@
       jetty-servlet
       test
     
+    
+      org.jodd
+      jodd-http
+      3.7
+    
   
 
   
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/MediaDownloadRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/MediaDownloadRequestExecutor.java
index e95f02de2..3cb1d5631 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/MediaDownloadRequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/MediaDownloadRequestExecutor.java
@@ -10,6 +10,7 @@ import me.chanjar.weixin.common.exception.WxErrorException;
 import me.chanjar.weixin.common.util.fs.FileUtils;
 import me.chanjar.weixin.common.util.http.apache.InputStreamResponseHandler;
 import me.chanjar.weixin.common.util.http.apache.Utf8ResponseHandler;
+
 import me.chanjar.weixin.common.util.http.okhttp.OkhttpProxyInfo;
 import okhttp3.*;
 
@@ -111,7 +112,7 @@ public class MediaDownloadRequestExecutor extends AbstractRequestExecutor {
    */
   T executeOkhttp(ConnectionPool pool, final OkhttpProxyInfo proxyInfo, String uri, E data) throws WxErrorException, IOException;
 
-
 }
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimpleGetRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimpleGetRequestExecutor.java
index 50beb29f0..5edb70f3a 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimpleGetRequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimpleGetRequestExecutor.java
@@ -7,6 +7,7 @@ import jodd.http.ProxyInfo;
 import me.chanjar.weixin.common.bean.result.WxError;
 import me.chanjar.weixin.common.exception.WxErrorException;
 import me.chanjar.weixin.common.util.http.apache.Utf8ResponseHandler;
+
 import me.chanjar.weixin.common.util.http.okhttp.OkhttpProxyInfo;
 import okhttp3.*;
 
@@ -28,6 +29,7 @@ import java.util.concurrent.TimeUnit;
  */
 public class SimpleGetRequestExecutor extends AbstractRequestExecutor {
 
+
   /**
    * apache-http实现方式
    *
@@ -98,6 +100,7 @@ public class SimpleGetRequestExecutor extends AbstractRequestExecutor
     com.github.binarywang
     weixin-java-parent
-    2.6.0
+    2.7.0-SNAPSHOT
   
 
   weixin-java-cp
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/apache/WxCpServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/apache/WxCpServiceImpl.java
index 8e4d57e39..ca0ed4620 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/apache/WxCpServiceImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/apache/WxCpServiceImpl.java
@@ -1,6 +1,5 @@
 package me.chanjar.weixin.cp.api.impl.apache;
 
-
 import me.chanjar.weixin.common.bean.WxAccessToken;
 import me.chanjar.weixin.common.bean.result.WxError;
 import me.chanjar.weixin.common.exception.WxErrorException;
@@ -8,6 +7,7 @@ import me.chanjar.weixin.common.util.http.apache.ApacheHttpClientBuilder;
 import me.chanjar.weixin.common.util.http.apache.DefaultApacheHttpClientBuilder;
 import me.chanjar.weixin.cp.api.impl.AbstractWxCpService;
 
+
 import org.apache.http.HttpHost;
 import org.apache.http.client.config.RequestConfig;
 import org.apache.http.client.methods.CloseableHttpResponse;
@@ -73,6 +73,7 @@ public class WxCpServiceImpl extends AbstractWxCpService 0) {
       httpProxy = new ProxyInfo(ProxyInfo.ProxyType.HTTP, configStorage.getHttpProxyHost(), configStorage.getHttpProxyPort(), configStorage.getHttpProxyUsername(), configStorage.getHttpProxyPassword());
     }
 
     httpClient = JoddHttp.httpConnectionProvider;
   }
+
 }
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpMessageGsonAdapter.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpMessageGsonAdapter.java
index 949709abe..1cf2d3120 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpMessageGsonAdapter.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpMessageGsonAdapter.java
@@ -61,6 +61,10 @@ public class WxCpMessageGsonAdapter implements JsonSerializer {
       messageJson.add("voice", voice);
     }
 
+    if (StringUtils.isNotBlank(message.getSafe())) {
+      messageJson.addProperty("safe", message.getSafe());
+    }
+
     if (WxConsts.CUSTOM_MSG_VIDEO.equals(message.getMsgType())) {
       JsonObject video = new JsonObject();
       video.addProperty("media_id", message.getMediaId());
diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml
index 3f4bf6498..77d2488a9 100644
--- a/weixin-java-mp/pom.xml
+++ b/weixin-java-mp/pom.xml
@@ -6,7 +6,7 @@
   
     com.github.binarywang
     weixin-java-parent
-    2.6.0
+    2.7.0-SNAPSHOT
   
   weixin-java-mp
   WeiXin Java Tools - MP
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java
index 33333c44e..20cb30644 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java
@@ -350,4 +350,5 @@ public interface WxMpService {
    */
   void initHttp();
 
+
 }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/apache/WxMpServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/apache/WxMpServiceImpl.java
index 8c8085da7..37f7e5a44 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/apache/WxMpServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/apache/WxMpServiceImpl.java
@@ -1,5 +1,6 @@
 package me.chanjar.weixin.mp.api.impl.apache;
 
+
 import java.io.IOException;
 import java.util.concurrent.locks.Lock;
 
@@ -71,11 +72,13 @@ public class WxMpServiceImpl extends AbstractWxMpService 0) {
@@ -40,7 +40,6 @@ public class WxMpServiceImpl extends AbstractWxMpService {
 
-
   @Override
   public WxMediaImgUploadResult executeJodd(HttpConnectionProvider provider, ProxyInfo proxyInfo, String uri, File data) throws WxErrorException, IOException {
     if (data == null) {
@@ -99,6 +102,7 @@ public class MediaImgUploadRequestExecutor extends AbstractRequestExecutor
     weixin-java-parent
     com.github.binarywang
-    2.6.0
+    2.7.0-SNAPSHOT
   
   4.0.0
 
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImpl.java
index 2572f0911..1a949bc06 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImpl.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImpl.java
@@ -188,17 +188,37 @@ public class WxPayServiceImpl implements WxPayService {
     }
 
     Map payInfo = new HashMap<>();
-    payInfo.put("appId", getConfig().getAppId());
-    // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。
-    // 但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
-    payInfo.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000));
-    payInfo.put("nonceStr", String.valueOf(System.currentTimeMillis()));
-    payInfo.put("package", "prepay_id=" + prepayId);
-    payInfo.put("signType", "MD5");
     if ("NATIVE".equals(request.getTradeType())) {
       payInfo.put("codeUrl", unifiedOrderResult.getCodeURL());
+    } else if ("APP".equals(request.getTradeType())) {
+      // APP支付绑定的是微信开放平台上的账号,APPID为开放平台上绑定APP后发放的参数
+      String appId = getConfig().getAppId();
+      Map configMap = new HashMap<>();
+      // 此map用于参与调起sdk支付的二次签名,格式全小写,timestamp只能是10位,格式固定,切勿修改
+      String partnerid = getConfig().getMchId();
+      configMap.put("prepayid", prepayId);
+      configMap.put("partnerid", partnerid);
+      configMap.put("package", "Sign=WXPay");
+      configMap.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000));
+      configMap.put("noncestr", String.valueOf(System.currentTimeMillis()));
+      configMap.put("appid", appId);
+      // 此map用于客户端与微信服务器交互
+      payInfo.put("paySign", SignUtils.createSign(payInfo, this.getConfig().getMchKey()));
+      payInfo.put("prepayId", prepayId);
+      payInfo.put("partnerId", partnerid);
+      payInfo.put("appId", appId);
+      payInfo.put("packageValue", "Sign=WXPay");
+      payInfo.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000));
+      payInfo.put("nonceStr", String.valueOf(System.currentTimeMillis()));
+    } else if ("JSAPI".equals(request.getTradeType())) {
+      payInfo.put("appId", unifiedOrderResult.getAppid());
+      // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
+      payInfo.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000));
+      payInfo.put("nonceStr", String.valueOf(System.currentTimeMillis()));
+      payInfo.put("package", "prepay_id=" + prepayId);
+      payInfo.put("signType", "MD5");
+      payInfo.put("paySign", SignUtils.createSign(payInfo, this.getConfig().getMchKey()));
     }
-    payInfo.put("paySign", SignUtils.createSign(payInfo, this.getConfig().getMchKey()));
     return payInfo;
   }