From df8dcb003c8d67eaa60072609d369c90ec92e7a3 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sun, 9 Sep 2018 12:10:15 +0800 Subject: [PATCH] =?UTF-8?q?#752=20=E4=BF=AE=E5=A4=8D=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E6=8B=89=E5=8F=96=E6=94=AF=E4=BB=98=E8=AF=84?= =?UTF-8?q?=E4=BB=B7=E7=9A=84=E6=8E=A5=E5=8F=A3=EF=BC=88limit=E4=B8=8D?= =?UTF-8?q?=E5=8F=82=E4=B8=8E=E7=AD=BE=E5=90=8D=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wxpay/bean/entpay/EntPayBankRequest.java | 4 +- .../wxpay/bean/entpay/EntPayQueryRequest.java | 4 +- .../wxpay/bean/entpay/EntPayRequest.java | 4 +- .../wxpay/bean/request/BaseWxPayRequest.java | 13 ++- .../bean/request/WxPayDefaultRequest.java | 5 ++ .../request/WxPayQueryCommentRequest.java | 22 ++--- .../bean/request/WxPaySendRedpackRequest.java | 4 +- .../wxpay/service/WxPayService.java | 43 ++++++++-- .../service/impl/BaseWxPayServiceImpl.java | 82 ++++++++++++++----- .../wxpay/service/impl/EntPayServiceImpl.java | 40 +++++---- .../binarywang/wxpay/util/SignUtils.java | 55 +++++++------ .../impl/BaseWxPayServiceImplTest.java | 51 ++++++++---- .../binarywang/wxpay/util/SignUtilsTest.java | 9 +- 13 files changed, 222 insertions(+), 114 deletions(-) diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayBankRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayBankRequest.java index a96a547d..05ccebc2 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayBankRequest.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayBankRequest.java @@ -117,8 +117,8 @@ public class EntPayBankRequest extends BaseWxPayRequest { } @Override - protected boolean ignoreSignType() { - return true; + protected String[] getIgnoredParamsForSign() { + return new String[]{"sign_type"}; } @Override diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayQueryRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayQueryRequest.java index a34eaaa4..987677a3 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayQueryRequest.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayQueryRequest.java @@ -54,7 +54,7 @@ public class EntPayQueryRequest extends BaseWxPayRequest { } @Override - protected boolean ignoreSignType() { - return true; + protected String[] getIgnoredParamsForSign() { + return new String[]{"sign_type"}; } } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRequest.java index 4f640f25..5bd3f415 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRequest.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRequest.java @@ -198,7 +198,7 @@ public class EntPayRequest extends BaseWxPayRequest { } @Override - protected boolean ignoreSignType() { - return true; + protected String[] getIgnoredParamsForSign() { + return new String[]{"sign_type"}; } } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/BaseWxPayRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/BaseWxPayRequest.java index 5e40866e..fda18bb6 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/BaseWxPayRequest.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/BaseWxPayRequest.java @@ -188,17 +188,17 @@ public abstract class BaseWxPayRequest implements Serializable { } /** - * 签名时,是否忽略signType. + * 签名时,是否忽略appid. */ - protected boolean ignoreSignType() { + protected boolean ignoreAppid() { return false; } /** - * 签名时,是否忽略appid. + * 签名时,忽略的参数. */ - protected boolean ignoreAppid() { - return false; + protected String[] getIgnoredParamsForSign() { + return new String[0]; } /** @@ -248,7 +248,6 @@ public abstract class BaseWxPayRequest implements Serializable { } //设置签名字段的值 - this.setSign(SignUtils.createSign(this, this.getSignType(), config.getMchKey(), - this.ignoreSignType())); + this.setSign(SignUtils.createSign(this, this.getSignType(), config.getMchKey(), this.getIgnoredParamsForSign())); } } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayDefaultRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayDefaultRequest.java index d37ed7ff..e44a6111 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayDefaultRequest.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayDefaultRequest.java @@ -16,4 +16,9 @@ public class WxPayDefaultRequest extends BaseWxPayRequest { protected void checkConstraints() { //do nothing } + + @Override + protected boolean ignoreAppid() { + return true; + } } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayQueryCommentRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayQueryCommentRequest.java index d052a26e..6b81aeed 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayQueryCommentRequest.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayQueryCommentRequest.java @@ -7,7 +7,7 @@ import me.chanjar.weixin.common.annotation.Required; /** *
- *  拉取订单评价数据接口的请求参数封装类
+ *  拉取订单评价数据接口的请求参数封装类.
  *  Created by BinaryWang on 2017/9/2.
  * 
* @@ -20,14 +20,11 @@ import me.chanjar.weixin.common.annotation.Required; @AllArgsConstructor @XStreamAlias("xml") public class WxPayQueryCommentRequest extends BaseWxPayRequest { - @Override - protected boolean ignoreSignType() { - return true; - } + private static final long serialVersionUID = 2633600418272768186L; /** *
-   * 字段名:开始时间
+   * 字段名:开始时间.
    * 变量名:begin_time
    * 是否必填:是
    * 类型:String(19)
@@ -41,7 +38,7 @@ public class WxPayQueryCommentRequest extends BaseWxPayRequest {
 
   /**
    * 
-   * 字段名:结束时间
+   * 字段名:结束时间.
    * 变量名:end_time
    * 是否必填:是
    * 类型:String(19)
@@ -55,7 +52,7 @@ public class WxPayQueryCommentRequest extends BaseWxPayRequest {
 
   /**
    * 
-   * 字段名:位移
+   * 字段名:位移.
    * 变量名:offset
    * 是否必填:是
    * 类型:uint(64)
@@ -69,7 +66,7 @@ public class WxPayQueryCommentRequest extends BaseWxPayRequest {
 
   /**
    * 
-   * 字段名:条数
+   * 字段名:条数.
    * 变量名:limit
    * 是否必填:否
    * 类型:uint(32)
@@ -81,11 +78,14 @@ public class WxPayQueryCommentRequest extends BaseWxPayRequest {
   private Integer limit;
 
   /**
-   * 检查约束情况
+   * 检查约束情况.
    */
   @Override
   protected void checkConstraints() throws WxPayException {
-
   }
 
+  @Override
+  protected String[] getIgnoredParamsForSign() {
+    return new String[]{"limit","sign_type"};
+  }
 }
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPaySendRedpackRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPaySendRedpackRequest.java
index 30be05cc..4b868a95 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPaySendRedpackRequest.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPaySendRedpackRequest.java
@@ -21,8 +21,8 @@ import lombok.NoArgsConstructor;
 @XStreamAlias("xml")
 public class WxPaySendRedpackRequest extends BaseWxPayRequest {
   @Override
-  protected boolean ignoreSignType() {
-    return true;
+  protected String[] getIgnoredParamsForSign() {
+    return new String[]{"sign_type"};
   }
 
   /**
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java
index e1dccd43..d10fc959 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java
@@ -1,19 +1,46 @@
 package com.github.binarywang.wxpay.service;
 
+import java.io.File;
+import java.util.Date;
+import java.util.Map;
+
 import com.github.binarywang.wxpay.bean.WxPayApiData;
-import com.github.binarywang.wxpay.bean.coupon.*;
+import com.github.binarywang.wxpay.bean.coupon.WxPayCouponInfoQueryRequest;
+import com.github.binarywang.wxpay.bean.coupon.WxPayCouponInfoQueryResult;
+import com.github.binarywang.wxpay.bean.coupon.WxPayCouponSendRequest;
+import com.github.binarywang.wxpay.bean.coupon.WxPayCouponSendResult;
+import com.github.binarywang.wxpay.bean.coupon.WxPayCouponStockQueryRequest;
+import com.github.binarywang.wxpay.bean.coupon.WxPayCouponStockQueryResult;
 import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
 import com.github.binarywang.wxpay.bean.notify.WxPayRefundNotifyResult;
 import com.github.binarywang.wxpay.bean.notify.WxScanPayNotifyResult;
-import com.github.binarywang.wxpay.bean.request.*;
-import com.github.binarywang.wxpay.bean.result.*;
+import com.github.binarywang.wxpay.bean.request.WxPayAuthcode2OpenidRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayDownloadBillRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayDownloadFundFlowRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayMicropayRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayOrderCloseRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayOrderQueryRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayOrderReverseRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayRefundQueryRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayReportRequest;
+import com.github.binarywang.wxpay.bean.request.WxPaySendRedpackRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayShorturlRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
+import com.github.binarywang.wxpay.bean.result.WxPayBillResult;
+import com.github.binarywang.wxpay.bean.result.WxPayFundFlowResult;
+import com.github.binarywang.wxpay.bean.result.WxPayMicropayResult;
+import com.github.binarywang.wxpay.bean.result.WxPayOrderCloseResult;
+import com.github.binarywang.wxpay.bean.result.WxPayOrderQueryResult;
+import com.github.binarywang.wxpay.bean.result.WxPayOrderReverseResult;
+import com.github.binarywang.wxpay.bean.result.WxPayRedpackQueryResult;
+import com.github.binarywang.wxpay.bean.result.WxPayRefundQueryResult;
+import com.github.binarywang.wxpay.bean.result.WxPayRefundResult;
+import com.github.binarywang.wxpay.bean.result.WxPaySendRedpackResult;
+import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderResult;
 import com.github.binarywang.wxpay.config.WxPayConfig;
 import com.github.binarywang.wxpay.exception.WxPayException;
 
-import java.io.File;
-import java.util.Date;
-import java.util.Map;
-
 /**
  * 
  * 微信支付相关接口.
@@ -530,7 +557,7 @@ public interface WxPayService {
    * @param beginDate 开始时间
    * @param endDate   结束时间
    * @param offset    位移
-   * @param limit     条数
+   * @param limit     条数,建议填null,否则接口会报签名错误
    */
   String queryComment(Date beginDate, Date endDate, Integer offset, Integer limit) throws WxPayException;
 }
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java
index a113ca12..3e7dee67 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java
@@ -1,8 +1,29 @@
 package com.github.binarywang.wxpay.service.impl;
 
+import java.io.File;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.zip.ZipException;
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import com.github.binarywang.utils.qrcode.QrcodeUtils;
 import com.github.binarywang.wxpay.bean.WxPayApiData;
-import com.github.binarywang.wxpay.bean.coupon.*;
+import com.github.binarywang.wxpay.bean.coupon.WxPayCouponInfoQueryRequest;
+import com.github.binarywang.wxpay.bean.coupon.WxPayCouponInfoQueryResult;
+import com.github.binarywang.wxpay.bean.coupon.WxPayCouponSendRequest;
+import com.github.binarywang.wxpay.bean.coupon.WxPayCouponSendResult;
+import com.github.binarywang.wxpay.bean.coupon.WxPayCouponStockQueryRequest;
+import com.github.binarywang.wxpay.bean.coupon.WxPayCouponStockQueryResult;
 import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
 import com.github.binarywang.wxpay.bean.notify.WxPayRefundNotifyResult;
 import com.github.binarywang.wxpay.bean.notify.WxScanPayNotifyResult;
@@ -10,8 +31,40 @@ import com.github.binarywang.wxpay.bean.order.WxPayAppOrderResult;
 import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
 import com.github.binarywang.wxpay.bean.order.WxPayMwebOrderResult;
 import com.github.binarywang.wxpay.bean.order.WxPayNativeOrderResult;
-import com.github.binarywang.wxpay.bean.request.*;
-import com.github.binarywang.wxpay.bean.result.*;
+import com.github.binarywang.wxpay.bean.request.WxPayAuthcode2OpenidRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayDefaultRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayDownloadBillRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayDownloadFundFlowRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayMicropayRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayOrderCloseRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayOrderQueryRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayOrderReverseRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayQueryCommentRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayRedpackQueryRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayRefundQueryRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayReportRequest;
+import com.github.binarywang.wxpay.bean.request.WxPaySendRedpackRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayShorturlRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
+import com.github.binarywang.wxpay.bean.result.BaseWxPayResult;
+import com.github.binarywang.wxpay.bean.result.WxPayAuthcode2OpenidResult;
+import com.github.binarywang.wxpay.bean.result.WxPayBillBaseResult;
+import com.github.binarywang.wxpay.bean.result.WxPayBillResult;
+import com.github.binarywang.wxpay.bean.result.WxPayCommonResult;
+import com.github.binarywang.wxpay.bean.result.WxPayFundFlowBaseResult;
+import com.github.binarywang.wxpay.bean.result.WxPayFundFlowResult;
+import com.github.binarywang.wxpay.bean.result.WxPayMicropayResult;
+import com.github.binarywang.wxpay.bean.result.WxPayOrderCloseResult;
+import com.github.binarywang.wxpay.bean.result.WxPayOrderQueryResult;
+import com.github.binarywang.wxpay.bean.result.WxPayOrderReverseResult;
+import com.github.binarywang.wxpay.bean.result.WxPayRedpackQueryResult;
+import com.github.binarywang.wxpay.bean.result.WxPayRefundQueryResult;
+import com.github.binarywang.wxpay.bean.result.WxPayRefundResult;
+import com.github.binarywang.wxpay.bean.result.WxPaySandboxSignKeyResult;
+import com.github.binarywang.wxpay.bean.result.WxPaySendRedpackResult;
+import com.github.binarywang.wxpay.bean.result.WxPayShorturlResult;
+import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderResult;
 import com.github.binarywang.wxpay.config.WxPayConfig;
 import com.github.binarywang.wxpay.constant.WxPayConstants.BillType;
 import com.github.binarywang.wxpay.constant.WxPayConstants.SignType;
@@ -23,17 +76,6 @@ import com.github.binarywang.wxpay.util.SignUtils;
 import com.google.common.base.Joiner;
 import com.google.common.collect.Maps;
 import jodd.io.ZipUtil;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.*;
-import java.util.zip.ZipException;
 
 import static com.github.binarywang.wxpay.constant.WxPayConstants.QUERY_COMMENT_DATE_FORMAT;
 import static com.github.binarywang.wxpay.constant.WxPayConstants.TarType;
@@ -291,7 +333,7 @@ public abstract class BaseWxPayServiceImpl implements WxPayService {
         configMap.put("appid", appId);
 
         final WxPayAppOrderResult result = WxPayAppOrderResult.builder()
-          .sign(SignUtils.createSign(configMap, null, this.getConfig().getMchKey(), false))
+          .sign(SignUtils.createSign(configMap, null, this.getConfig().getMchKey(), null))
           .prepayId(prepayId)
           .partnerId(partnerId)
           .appId(appId)
@@ -317,7 +359,7 @@ public abstract class BaseWxPayServiceImpl implements WxPayService {
           .signType(signType)
           .build();
 
-        payResult.setPaySign(SignUtils.createSign(payResult, signType, this.getConfig().getMchKey(), false));
+        payResult.setPaySign(SignUtils.createSign(payResult, signType, this.getConfig().getMchKey(), null));
         return (T) payResult;
       }
 
@@ -368,7 +410,7 @@ public abstract class BaseWxPayServiceImpl implements WxPayService {
       configMap.put("noncestr", nonceStr);
       configMap.put("appid", appId);
       // 此map用于客户端与微信服务器交互
-      payInfo.put("sign", SignUtils.createSign(configMap, null, this.getConfig().getMchKey(), false));
+      payInfo.put("sign", SignUtils.createSign(configMap, null, this.getConfig().getMchKey(), null));
       payInfo.put("prepayId", prepayId);
       payInfo.put("partnerId", partnerId);
       payInfo.put("appId", appId);
@@ -382,7 +424,7 @@ public abstract class BaseWxPayServiceImpl implements WxPayService {
       payInfo.put("nonceStr", nonceStr);
       payInfo.put("package", "prepay_id=" + prepayId);
       payInfo.put("signType", SignType.MD5);
-      payInfo.put("paySign", SignUtils.createSign(payInfo, null, this.getConfig().getMchKey(), false));
+      payInfo.put("paySign", SignUtils.createSign(payInfo, null, this.getConfig().getMchKey(), null));
     }
 
     return payInfo;
@@ -406,7 +448,7 @@ public abstract class BaseWxPayServiceImpl implements WxPayService {
     params.put("time_stamp", String.valueOf(System.currentTimeMillis() / 1000));
     params.put("nonce_str", String.valueOf(System.currentTimeMillis()));
 
-    String sign = SignUtils.createSign(params, null, this.getConfig().getMchKey(), false);
+    String sign = SignUtils.createSign(params, null, this.getConfig().getMchKey(), null);
     params.put("sign", sign);
 
     for (String key : params.keySet()) {
@@ -632,7 +674,7 @@ public abstract class BaseWxPayServiceImpl implements WxPayService {
       }
     } catch (WxPayException wxPayException) {
       throw wxPayException;
-    } catch (Exception e){
+    } catch (Exception e) {
       this.log.error("解析对账单文件时出错", e);
       throw new WxPayException("解压zip文件出错");
     }
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/EntPayServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/EntPayServiceImpl.java
index b50a0786..c9f3ba1d 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/EntPayServiceImpl.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/EntPayServiceImpl.java
@@ -1,19 +1,5 @@
 package com.github.binarywang.wxpay.service.impl;
 
-import com.github.binarywang.wxpay.bean.entpay.*;
-import com.github.binarywang.wxpay.bean.request.WxPayDefaultRequest;
-import com.github.binarywang.wxpay.bean.result.BaseWxPayResult;
-import com.github.binarywang.wxpay.exception.WxPayException;
-import com.github.binarywang.wxpay.service.EntPayService;
-import com.github.binarywang.wxpay.service.WxPayService;
-import com.github.binarywang.wxpay.util.SignUtils;
-import org.apache.commons.codec.binary.Base64;
-import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
-import org.bouncycastle.jce.provider.BouncyCastleProvider;
-import org.bouncycastle.openssl.PEMParser;
-import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;
-
-import javax.crypto.Cipher;
 import java.io.File;
 import java.io.FileReader;
 import java.io.IOException;
@@ -21,6 +7,28 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.security.PublicKey;
 import java.security.Security;
+import javax.crypto.Cipher;
+
+import org.apache.commons.codec.binary.Base64;
+import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.bouncycastle.openssl.PEMParser;
+import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;
+
+import com.github.binarywang.wxpay.bean.entpay.EntPayBankQueryRequest;
+import com.github.binarywang.wxpay.bean.entpay.EntPayBankQueryResult;
+import com.github.binarywang.wxpay.bean.entpay.EntPayBankRequest;
+import com.github.binarywang.wxpay.bean.entpay.EntPayBankResult;
+import com.github.binarywang.wxpay.bean.entpay.EntPayQueryRequest;
+import com.github.binarywang.wxpay.bean.entpay.EntPayQueryResult;
+import com.github.binarywang.wxpay.bean.entpay.EntPayRequest;
+import com.github.binarywang.wxpay.bean.entpay.EntPayResult;
+import com.github.binarywang.wxpay.bean.entpay.GetPublicKeyResult;
+import com.github.binarywang.wxpay.bean.request.WxPayDefaultRequest;
+import com.github.binarywang.wxpay.bean.result.BaseWxPayResult;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.github.binarywang.wxpay.service.EntPayService;
+import com.github.binarywang.wxpay.service.WxPayService;
 
 /**
  * 
@@ -65,8 +73,8 @@ public class EntPayServiceImpl implements EntPayService {
     WxPayDefaultRequest request = new WxPayDefaultRequest();
     request.setMchId(this.payService.getConfig().getMchId());
     request.setNonceStr(String.valueOf(System.currentTimeMillis()));
-    request.setSign(SignUtils.createSign(request, null, this.payService.getConfig().getMchKey(),
-      true));
+
+    request.checkAndSign(this.payService.getConfig());
 
     String url = "https://fraud.mch.weixin.qq.com/risk/getpublickey";
     String responseContent = this.payService.post(url, request.toXML(), true);
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/util/SignUtils.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/util/SignUtils.java
index eda47de3..c98783a6 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/util/SignUtils.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/util/SignUtils.java
@@ -1,5 +1,18 @@
 package com.github.binarywang.wxpay.util;
 
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.StringUtils;
+
 import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest;
 import com.github.binarywang.wxpay.bean.result.BaseWxPayResult;
 import com.github.binarywang.wxpay.constant.WxPayConstants.SignType;
@@ -7,12 +20,6 @@ import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.thoughtworks.xstream.annotations.XStreamAlias;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.codec.digest.DigestUtils;
-import org.apache.commons.lang3.StringUtils;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.util.*;
 
 /**
  * 
@@ -25,7 +32,7 @@ import java.util.*;
 @Slf4j
 public class SignUtils {
   /**
-   * 请参考并使用 {@link #createSign(Object, String, String, boolean)}.
+   * 请参考并使用 {@link #createSign(Object, String, String, String[])}.
    */
   @Deprecated
   public static String createSign(Object xmlBean, String signKey) {
@@ -33,45 +40,43 @@ public class SignUtils {
   }
 
   /**
-   * 请参考并使用 {@link #createSign(Map, String, String, boolean)}.
+   * 请参考并使用 {@link #createSign(Map, String, String, String[])} .
    */
   @Deprecated
   public static String createSign(Map params, String signKey) {
-    return createSign(params, null, signKey, false);
+    return createSign(params, null, signKey, new String[0]);
   }
 
   /**
    * 微信支付签名算法(详见:https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=4_3).
    *
-   * @param xmlBean          Bean里的属性如果存在XML注解,则使用其作为key,否则使用变量名
-   * @param signType         签名类型,如果为空,则默认为MD5
-   * @param signKey          签名Key
-   * @param isIgnoreSignType 签名时,是否忽略signType
+   * @param xmlBean       Bean里的属性如果存在XML注解,则使用其作为key,否则使用变量名
+   * @param signType      签名类型,如果为空,则默认为MD5
+   * @param signKey       签名Key
+   * @param ignoredParams 签名时需要忽略的特殊参数
    * @return 签名字符串
    */
-  public static String createSign(Object xmlBean, String signType, String signKey, boolean isIgnoreSignType) {
-    return createSign(xmlBean2Map(xmlBean), signType, signKey, isIgnoreSignType);
+  public static String createSign(Object xmlBean, String signType, String signKey, String[] ignoredParams) {
+    return createSign(xmlBean2Map(xmlBean), signType, signKey, ignoredParams);
   }
 
   /**
    * 微信支付签名算法(详见:https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=4_3).
    *
-   * @param params         参数信息
-   * @param signType       签名类型,如果为空,则默认为MD5
-   * @param signKey        签名Key
-   * @param ignoreSignType 签名时,是否忽略signType
+   * @param params        参数信息
+   * @param signType      签名类型,如果为空,则默认为MD5
+   * @param signKey       签名Key
+   * @param ignoredParams 签名时需要忽略的特殊参数
    * @return 签名字符串
    */
-  public static String createSign(Map params, String signType, String signKey, boolean ignoreSignType) {
+  public static String createSign(Map params, String signType, String signKey, String[] ignoredParams) {
     SortedMap sortedMap = new TreeMap<>(params);
 
     StringBuilder toSign = new StringBuilder();
     for (String key : sortedMap.keySet()) {
       String value = params.get(key);
       boolean shouldSign = false;
-      if (ignoreSignType && "sign_type".equals(key)) {
-        shouldSign = false;
-      } else if (StringUtils.isNotEmpty(value)
+      if (StringUtils.isNotEmpty(value) && !ArrayUtils.contains(ignoredParams, key)
         && !Lists.newArrayList("sign", "key", "xmlString", "xmlDoc", "couponList").contains(key)) {
         shouldSign = true;
       }
@@ -110,12 +115,12 @@ public class SignUtils {
    * @return true - 签名校验成功,false - 签名校验失败
    */
   public static boolean checkSign(Map params, String signType, String signKey) {
-    String sign = createSign(params, signType, signKey, false);
+    String sign = createSign(params, signType, signKey, new String[0]);
     return sign.equals(params.get("sign"));
   }
 
   /**
-   * 将bean按照@XStreamAlias标识的字符串内容生成以之为key的map对象
+   * 将bean按照@XStreamAlias标识的字符串内容生成以之为key的map对象.
    *
    * @param bean 包含@XStreamAlias的xml bean对象
    * @return map对象
diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImplTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImplTest.java
index 8e01429e..505d5b1f 100644
--- a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImplTest.java
+++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImplTest.java
@@ -1,30 +1,52 @@
 package com.github.binarywang.wxpay.service.impl;
 
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Calendar;
+import java.util.Date;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.annotations.*;
+
 import com.github.binarywang.utils.qrcode.QrcodeUtils;
-import com.github.binarywang.wxpay.bean.coupon.*;
+import com.github.binarywang.wxpay.bean.coupon.WxPayCouponInfoQueryRequest;
+import com.github.binarywang.wxpay.bean.coupon.WxPayCouponInfoQueryResult;
+import com.github.binarywang.wxpay.bean.coupon.WxPayCouponSendRequest;
+import com.github.binarywang.wxpay.bean.coupon.WxPayCouponSendResult;
+import com.github.binarywang.wxpay.bean.coupon.WxPayCouponStockQueryRequest;
+import com.github.binarywang.wxpay.bean.coupon.WxPayCouponStockQueryResult;
 import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
+import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResultTest;
 import com.github.binarywang.wxpay.bean.order.WxPayAppOrderResult;
 import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
 import com.github.binarywang.wxpay.bean.order.WxPayNativeOrderResult;
-import com.github.binarywang.wxpay.bean.request.*;
-import com.github.binarywang.wxpay.bean.result.*;
+import com.github.binarywang.wxpay.bean.request.WxPayAuthcode2OpenidRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayMicropayRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayOrderReverseRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayReportRequest;
+import com.github.binarywang.wxpay.bean.request.WxPaySendRedpackRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayShorturlRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
+import com.github.binarywang.wxpay.bean.result.WxPayBillResult;
+import com.github.binarywang.wxpay.bean.result.WxPayFundFlowResult;
+import com.github.binarywang.wxpay.bean.result.WxPayMicropayResult;
+import com.github.binarywang.wxpay.bean.result.WxPayOrderReverseResult;
+import com.github.binarywang.wxpay.bean.result.WxPayRedpackQueryResult;
+import com.github.binarywang.wxpay.bean.result.WxPayRefundQueryResult;
+import com.github.binarywang.wxpay.bean.result.WxPayRefundResult;
+import com.github.binarywang.wxpay.bean.result.WxPaySendRedpackResult;
+import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderResult;
+import com.github.binarywang.wxpay.constant.WxPayConstants.AccountType;
 import com.github.binarywang.wxpay.constant.WxPayConstants.BillType;
 import com.github.binarywang.wxpay.constant.WxPayConstants.SignType;
 import com.github.binarywang.wxpay.constant.WxPayConstants.TradeType;
-import com.github.binarywang.wxpay.constant.WxPayConstants.AccountType;
 import com.github.binarywang.wxpay.exception.WxPayException;
 import com.github.binarywang.wxpay.service.WxPayService;
 import com.github.binarywang.wxpay.testbase.ApiTestModule;
 import com.github.binarywang.wxpay.testbase.XmlWxPayConfig;
 import com.google.inject.Inject;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.annotations.*;
-
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.Calendar;
-import java.util.Date;
 
 import static com.github.binarywang.wxpay.constant.WxPayConstants.TarType;
 import static org.assertj.core.api.Assertions.assertThat;
@@ -407,13 +429,12 @@ public class BaseWxPayServiceImplTest {
     Date endDate = calendar.getTime();
     calendar.add(Calendar.DAY_OF_MONTH, -88);
     Date beginDate = calendar.getTime();
-    String result = this.payService.queryComment(beginDate, endDate, 0, null);
+    String result = this.payService.queryComment(beginDate, endDate, 0, 1);
     this.logger.info(result);
   }
 
   /**
-   * @see {@link com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResultTest}
-   * @throws Exception
+   * @see WxPayOrderNotifyResultTest#testFromXML()
    */
   @Test
   public void testParseOrderNotifyResult() throws Exception {
diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/util/SignUtilsTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/util/SignUtilsTest.java
index 57c185b5..b060cfd4 100644
--- a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/util/SignUtilsTest.java
+++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/util/SignUtilsTest.java
@@ -1,10 +1,11 @@
 package com.github.binarywang.wxpay.util;
 
+import org.testng.annotations.*;
+
 import com.google.common.base.Splitter;
-import org.testng.annotations.Test;
 
 import static com.github.binarywang.wxpay.constant.WxPayConstants.SignType.HMAC_SHA256;
-import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.*;
 
 /**
  * 
@@ -20,7 +21,7 @@ public class SignUtilsTest {
   public void testCreateSign() throws Exception {
     String signKey = "192006250b4c09247ec02edce69f6a2d";
     String message = "appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_id=10000100&nonce_str=ibuaiVcKdpRxkhJA";
-    assertEquals(SignUtils.createSign((Splitter.on("&").withKeyValueSeparator("=").split(message)), null, signKey, false),
+    assertEquals(SignUtils.createSign((Splitter.on("&").withKeyValueSeparator("=").split(message)), null, signKey, null),
       "9A0A8659F005D6984697E2CA0A9CF3B7");
   }
 
@@ -29,7 +30,7 @@ public class SignUtilsTest {
     String signKey = "192006250b4c09247ec02edce69f6a2d";
     final String message = "appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_id=10000100&nonce_str=ibuaiVcKdpRxkhJA";
     String sign = SignUtils.createSign(Splitter.on("&").withKeyValueSeparator("=").split(message),
-      HMAC_SHA256, signKey, false);
+      HMAC_SHA256, signKey, null);
     assertEquals(sign, "6A9AE1657590FD6257D693A078E1C3E4BB6BA4DC30B23E0EE2496E54170DACD6");
   }