- * 消息重复检查器 + * 消息重复检查器. * 微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次 **/ public interface WxMessageDuplicateChecker { /** + * 判断消息是否重复. *
+ * *
普通消息:关于重试的消息排重,推荐使用msgid排重。文档参考。
*事件消息:关于重试的消息排重,推荐使用FromUserName + CreateTime 排重。文档参考
- *+ * *
- * 官方文档完全没有写,参照公众号的方式排重。 - *
+ *
官方文档完全没有写,参照公众号的方式排重。
*或者可以采取更简单的方式,如果有MsgId就用MsgId排重,如果没有就用FromUserName+CreateTime排重
* * @param messageId messageId需要根据上面讲的方式构造 diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxMessageInMemoryDuplicateChecker.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxMessageInMemoryDuplicateChecker.java index 1281e2601..d8be08f44 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxMessageInMemoryDuplicateChecker.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxMessageInMemoryDuplicateChecker.java @@ -6,46 +6,46 @@ import java.util.concurrent.atomic.AtomicBoolean; /** *- * 默认消息重复检查器 + * 默认消息重复检查器. * 将每个消息id保存在内存里,每隔5秒清理已经过期的消息id,每个消息id的过期时间是15秒 **/ public class WxMessageInMemoryDuplicateChecker implements WxMessageDuplicateChecker { /** - * 一个消息ID在内存的过期时间:15秒 + * 一个消息ID在内存的过期时间:15秒. */ private final Long timeToLive; /** - * 每隔多少周期检查消息ID是否过期:5秒 + * 每隔多少周期检查消息ID是否过期:5秒. */ private final Long clearPeriod; /** - * 消息id->消息时间戳的map + * 消息id->消息时间戳的map. */ private final ConcurrentHashMap
    * 一个消息ID在内存的过期时间:15秒
    * 每隔多少周期检查消息ID是否过期:5秒
    * 
    */
   public WxMessageInMemoryDuplicateChecker() {
-    this.timeToLive = 15 * 1000l;
-    this.clearPeriod = 5 * 1000l;
+    this.timeToLive = 15 * 1000L;
+    this.clearPeriod = 5 * 1000L;
   }
 
   /**
-   * WxMsgIdInMemoryDuplicateChecker构造函数
+   * 构造方法.
    *
    * @param timeToLive  一个消息ID在内存的过期时间:毫秒
    * @param clearPeriod 每隔多少周期检查消息ID是否过期:毫秒
@@ -66,7 +66,8 @@ public class WxMessageInMemoryDuplicateChecker implements WxMessageDuplicateChec
           while (true) {
             Thread.sleep(WxMessageInMemoryDuplicateChecker.this.clearPeriod);
             Long now = System.currentTimeMillis();
-            for (Map.Entry
-   * 菜单的响应动作类型:
+   * 菜单的响应动作类型.
    * view表示网页类型,
    * click表示点击类型,
    * miniprogram表示小程序类型
@@ -21,13 +21,13 @@ public class WxMenuButton implements Serializable {
   private String type;
 
   /**
-   * 菜单标题,不超过16个字节,子菜单不超过60个字节
+   * 菜单标题,不超过16个字节,子菜单不超过60个字节.
    */
   private String name;
 
   /**
    * 
-   * 菜单KEY值,用于消息接口推送,不超过128字节
+   * 菜单KEY值,用于消息接口推送,不超过128字节.
    * click等点击类型必须
    * 
    */
@@ -35,7 +35,8 @@ public class WxMenuButton implements Serializable {
 
   /**
    * 
-   * 网页链接,用户点击菜单可打开链接,不超过1024字节。type为miniprogram时,不支持小程序的老版本客户端将打开本url。
+   * 网页链接.
+   * 用户点击菜单可打开链接,不超过1024字节。type为miniprogram时,不支持小程序的老版本客户端将打开本url。
    * view、miniprogram类型必须
    * 
    */
@@ -43,7 +44,7 @@ public class WxMenuButton implements Serializable {
 
   /**
    * 
-   * 调用新增永久素材接口返回的合法media_id
+   * 调用新增永久素材接口返回的合法media_id.
    * media_id类型和view_limited类型必须
    * 
    */
@@ -52,7 +53,7 @@ public class WxMenuButton implements Serializable {
 
   /**
    * 
-   * 小程序的appid
+   * 小程序的appid.
    * miniprogram类型必须
    * 
    */
@@ -61,7 +62,7 @@ public class WxMenuButton implements Serializable {
 
   /**
    * 
-   * 小程序的页面路径
+   * 小程序的页面路径.
    * miniprogram类型必须
    * 
    */
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenuRule.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenuRule.java
index efc42fbb6..dffae9488 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenuRule.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenuRule.java
@@ -9,7 +9,7 @@ public class WxMenuRule implements Serializable {
   private static final long serialVersionUID = -4587181819499286670L;
 
   /**
-   * 变态的微信接口,反序列化时这里反人类的使用和序列化时不一样的名字
+   * 变态的微信接口,反序列化时这里反人类的使用和序列化时不一样的名字.
    */
   @SerializedName(value = "tag_id", alternate = "group_id")
   private String tagId;
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxError.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxError.java
index 46c0ae89b..809d015ab 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxError.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxError.java
@@ -5,7 +5,7 @@ import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 import java.io.Serializable;
 
 /**
- * 微信错误码说明,请阅读: 全局返回码说明
+ * 微信错误码说明,请阅读: 全局返回码说明.
  *
  * @author Daniel Qian
  */
@@ -73,6 +73,9 @@ public class WxError implements Serializable {
       return this;
     }
 
+    /**
+     * 构造器方法.
+     */
     public WxError build() {
       WxError wxError = new WxError();
       wxError.setErrorCode(this.errorCode);
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheHttpClientBuilder.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheHttpClientBuilder.java
index 939b62478..fcd56c48a 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheHttpClientBuilder.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheHttpClientBuilder.java
@@ -4,51 +4,41 @@ import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
 import org.apache.http.impl.client.CloseableHttpClient;
 
 /**
- * httpclient build interface
+ * httpclient build interface.
  *
  * @author kakotor
  */
 public interface ApacheHttpClientBuilder {
 
   /**
-   * 构建httpclient实例
+   * 构建httpclient实例.
    *
    * @return new instance of CloseableHttpClient
    */
   CloseableHttpClient build();
 
   /**
-   * 代理服务器地址
-   *
-   * @param httpProxyHost
+   * 代理服务器地址.
    */
   ApacheHttpClientBuilder httpProxyHost(String httpProxyHost);
 
   /**
-   * 代理服务器端口
-   *
-   * @param httpProxyPort
+   * 代理服务器端口.
    */
   ApacheHttpClientBuilder httpProxyPort(int httpProxyPort);
 
   /**
-   * 代理服务器用户名
-   *
-   * @param httpProxyUsername
+   * 代理服务器用户名.
    */
   ApacheHttpClientBuilder httpProxyUsername(String httpProxyUsername);
 
   /**
-   * 代理服务器密码
-   *
-   * @param httpProxyPassword
+   * 代理服务器密码.
    */
   ApacheHttpClientBuilder httpProxyPassword(String httpProxyPassword);
 
   /**
-   * ssl连接socket工厂
-   *
-   * @param sslConnectionSocketFactory
+   * ssl连接socket工厂.
    */
   ApacheHttpClientBuilder sslConnectionSocketFactory(SSLConnectionSocketFactory sslConnectionSocketFactory);
 }
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheHttpDnsClientBuilder.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheHttpDnsClientBuilder.java
index d3e5a1c16..b99b09fb8 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheHttpDnsClientBuilder.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheHttpDnsClientBuilder.java
@@ -29,9 +29,8 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
- * httpclient 连接管理器 自带DNS解析
- * 
- * 大部分代码拷贝自:DefaultApacheHttpClientBuilder
+ * httpclient 连接管理器 自带DNS解析.
+ * 
大部分代码拷贝自:DefaultApacheHttpClientBuilder
  *
  * @author Andy.Huo
  */
@@ -64,7 +63,7 @@ public class ApacheHttpDnsClientBuilder implements ApacheHttpClientBuilder {
   private String httpProxyPassword;
 
   /**
-   * 闲置连接监控线程
+   * 闲置连接监控线程.
    */
   private IdleConnectionMonitorThread idleConnectionMonitorThread;
   private HttpClientBuilder httpClientBuilder;
@@ -162,7 +161,7 @@ public class ApacheHttpDnsClientBuilder implements ApacheHttpClientBuilder {
   }
 
   /**
-   * 每路的最大链接数,默认10
+   * 每路的最大链接数,默认10.
    *
    * @param maxConnPerHost 每路的最大链接数,默认10
    */
@@ -171,7 +170,7 @@ public class ApacheHttpDnsClientBuilder implements ApacheHttpClientBuilder {
   }
 
   /**
-   * 最大总连接数,默认50
+   * 最大总连接数,默认50.
    *
    * @param maxTotalConn 最大总连接数,默认50
    */
@@ -180,7 +179,7 @@ public class ApacheHttpDnsClientBuilder implements ApacheHttpClientBuilder {
   }
 
   /**
-   * 自定义httpclient的User Agent
+   * 自定义httpclient的User Agent.
    *
    * @param userAgent User Agent
    */
@@ -196,9 +195,12 @@ public class ApacheHttpDnsClientBuilder implements ApacheHttpClientBuilder {
     if (prepared.get()) {
       return;
     }
-    Registry registry = RegistryBuilder.create()
-      .register("http", this.plainConnectionSocketFactory).register("https", this.sslConnectionSocketFactory)
-      .build();
+
+    Registry registry =
+      RegistryBuilder.create()
+        .register("http", this.plainConnectionSocketFactory)
+        .register("https", this.sslConnectionSocketFactory)
+        .build();
 
     @SuppressWarnings("resource")
     PoolingHttpClientConnectionManager connectionManager;
@@ -219,8 +221,8 @@ public class ApacheHttpDnsClientBuilder implements ApacheHttpClientBuilder {
     connectionManager
       .setDefaultSocketConfig(SocketConfig.copy(SocketConfig.DEFAULT).setSoTimeout(this.soTimeout).build());
 
-    this.idleConnectionMonitorThread = new IdleConnectionMonitorThread(connectionManager, this.idleConnTimeout,
-      this.checkWaitTime);
+    this.idleConnectionMonitorThread = new IdleConnectionMonitorThread(
+      connectionManager, this.idleConnTimeout, this.checkWaitTime);
     this.idleConnectionMonitorThread.setDaemon(true);
     this.idleConnectionMonitorThread.start();
 
@@ -234,8 +236,8 @@ public class ApacheHttpDnsClientBuilder implements ApacheHttpClientBuilder {
     if (StringUtils.isNotBlank(this.httpProxyHost) && StringUtils.isNotBlank(this.httpProxyUsername)) {
       // 使用代理服务器 需要用户认证的代理服务器
       CredentialsProvider provider = new BasicCredentialsProvider();
-      provider.setCredentials(new AuthScope(this.httpProxyHost, this.httpProxyPort),
-        new UsernamePasswordCredentials(this.httpProxyUsername, this.httpProxyPassword));
+      provider.setCredentials(new AuthScope(this.httpProxyHost, this.httpProxyPort)
+        , new UsernamePasswordCredentials(this.httpProxyUsername, this.httpProxyPassword));
       this.httpClientBuilder.setDefaultCredentialsProvider(provider);
     }
 
@@ -267,8 +269,10 @@ public class ApacheHttpDnsClientBuilder implements ApacheHttpClientBuilder {
     private final int checkWaitTime;
     private volatile boolean shutdown;
 
-    public IdleConnectionMonitorThread(HttpClientConnectionManager connMgr, int idleConnTimeout,
-                                       int checkWaitTime) {
+    /**
+     * 构造方法.
+     */
+    public IdleConnectionMonitorThread(HttpClientConnectionManager connMgr, int idleConnTimeout, int checkWaitTime) {
       super("IdleConnectionMonitorThread");
       this.connMgr = connMgr;
       this.idleConnTimeout = idleConnTimeout;
@@ -289,12 +293,18 @@ public class ApacheHttpDnsClientBuilder implements ApacheHttpClientBuilder {
       }
     }
 
+    /**
+     * 触发.
+     */
     public void trigger() {
       synchronized (this) {
         notifyAll();
       }
     }
 
+    /**
+     * 关闭.
+     */
     public void shutdown() {
       this.shutdown = true;
       synchronized (this) {
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMediaDownloadRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMediaDownloadRequestExecutor.java
index 2eb71b52f..80f819929 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMediaDownloadRequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMediaDownloadRequestExecutor.java
@@ -2,8 +2,8 @@ package me.chanjar.weixin.common.util.http.okhttp;
 
 import me.chanjar.weixin.common.bean.result.WxError;
 import me.chanjar.weixin.common.exception.WxErrorException;
-import me.chanjar.weixin.common.util.http.HttpResponseProxy;
 import me.chanjar.weixin.common.util.http.BaseMediaDownloadRequestExecutor;
+import me.chanjar.weixin.common.util.http.HttpResponseProxy;
 import me.chanjar.weixin.common.util.http.RequestHttp;
 import okhttp3.OkHttpClient;
 import okhttp3.Request;
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/xml/XStreamTransformer.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/xml/XStreamTransformer.java
index c86ed1ff6..e08ef4df6 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/xml/XStreamTransformer.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/xml/XStreamTransformer.java
@@ -28,7 +28,7 @@ public class XStreamTransformer {
   }
 
   /**
-   * 注册扩展消息的解析器
+   * 注册扩展消息的解析器.
    *
    * @param clz     类型
    * @param xStream xml解析器
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/AbstractWxMaQrcodeWrapper.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/AbstractWxMaQrcodeWrapper.java
index b4ad75179..f329dd30e 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/AbstractWxMaQrcodeWrapper.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/AbstractWxMaQrcodeWrapper.java
@@ -3,7 +3,7 @@ package cn.binarywang.wx.miniapp.bean;
 import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
 
 /**
- * 微信二维码(小程序码)包装器
+ * 微信二维码(小程序码)包装器.
  *
  * @author Element
  */
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/builder/BaseBuilder.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/builder/BaseBuilder.java
index 70d7cf4b7..c353534c3 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/builder/BaseBuilder.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/builder/BaseBuilder.java
@@ -15,6 +15,9 @@ public class BaseBuilder {
     return (T) this;
   }
 
+  /**
+   * 构造器方法.
+   */
   public WxMaKefuMessage build() {
     WxMaKefuMessage m = new WxMaKefuMessage();
     m.setMsgType(this.msgType);
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/http/QrCodeRequestExecutor.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/http/QrCodeRequestExecutor.java
index 24d9e99b7..9b35df895 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/http/QrCodeRequestExecutor.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/http/QrCodeRequestExecutor.java
@@ -36,11 +36,9 @@ public class QrCodeRequestExecutor implements RequestExecutor 0
-        && ContentType.APPLICATION_JSON.getMimeType()
-        .equals(ContentType.parse(contentTypeHeader[0].getValue()).getMimeType())) {
+          && ContentType.APPLICATION_JSON.getMimeType()
+          .equals(ContentType.parse(contentTypeHeader[0].getValue()).getMimeType())) {
         String responseContent = Utf8ResponseHandler.INSTANCE.handleResponse(response);
         throw new WxErrorException(WxError.fromJson(responseContent));
       }
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/xml/XStreamTransformer.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/xml/XStreamTransformer.java
index 8c6ec52ad..578bf68c7 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/xml/XStreamTransformer.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/xml/XStreamTransformer.java
@@ -18,7 +18,7 @@ public class XStreamTransformer {
   }
 
   /**
-   * xml -> pojo
+   * xml -> pojo.
    */
   @SuppressWarnings("unchecked")
   public static  T fromXml(Class clazz, String xml) {
@@ -33,14 +33,14 @@ public class XStreamTransformer {
   }
 
   /**
-   * pojo -> xml
+   * pojo -> xml.
    */
   public static  String toXml(Class clazz, T object) {
     return CLASS_2_XSTREAM_INSTANCE.get(clazz).toXML(object);
   }
 
   /**
-   * 注册扩展消息的解析器
+   * 注册扩展消息的解析器.
    *
    * @param clz     类型
    * @param xStream xml解析器
@@ -50,7 +50,7 @@ public class XStreamTransformer {
   }
 
   /**
-   * 会自动注册该类及其子类
+   * 会自动注册该类及其子类.
    *
    * @param clz 要注册的类
    */
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/device/AbstractDeviceBean.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/device/AbstractDeviceBean.java
index 5aaf5ea5e..d49999c50 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/device/AbstractDeviceBean.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/device/AbstractDeviceBean.java
@@ -5,6 +5,8 @@ import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 import java.io.Serializable;
 
 /**
+ * 设备抽象类.
+ *
  * @author keungtung
  * @date 14/12/2016
  */
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/apache/ApacheMaterialNewsInfoRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/apache/ApacheMaterialNewsInfoRequestExecutor.java
index 5298160f3..fe8dc580d 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/apache/ApacheMaterialNewsInfoRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/apache/ApacheMaterialNewsInfoRequestExecutor.java
@@ -22,9 +22,13 @@ import java.util.HashMap;
 import java.util.Map;
 
 /**
- * Created by ecoolper on 2017/5/5.
+ * httpclient 实现的素材请求执行器.
+ *
+ * @author ecoolper
+ * @date 2017/5/5
  */
-public class ApacheMaterialNewsInfoRequestExecutor extends MaterialNewsInfoRequestExecutor {
+public class ApacheMaterialNewsInfoRequestExecutor
+    extends MaterialNewsInfoRequestExecutor {
   private final Logger logger = LoggerFactory.getLogger(this.getClass());
 
   public ApacheMaterialNewsInfoRequestExecutor(RequestHttp requestHttp) {
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 992844757..efb9d8560 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
@@ -19,16 +19,17 @@ import java.util.TreeMap;
 
 /**
  * 
- * 签名相关工具类
+ * 签名相关工具类.
  * Created by Binary Wang on 2017-3-23.
- * @author binarywang(Binary Wang)
  * 
+ *
+ * @author binarywang(Binary Wang)
  */
 public class SignUtils {
   private static final Logger log = LoggerFactory.getLogger(SignUtils.class);
 
   /**
-   * 请参考并使用 {@link #createSign(Object, String, String, boolean)}
+   * 请参考并使用 {@link #createSign(Object, String, String, boolean)}.
    */
   @Deprecated
   public static String createSign(Object xmlBean, String signKey) {
@@ -36,7 +37,7 @@ public class SignUtils {
   }
 
   /**
-   * 请参考并使用 {@link #createSign(Map, String, String, boolean)}
+   * 请参考并使用 {@link #createSign(Map, String, String, boolean)}.
    */
   @Deprecated
   public static String createSign(Map params, String signKey) {
@@ -44,7 +45,7 @@ public class SignUtils {
   }
 
   /**
-   * 微信支付签名算法(详见:https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=4_3)
+   * 微信支付签名算法(详见:https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=4_3).
    *
    * @param xmlBean          Bean里的属性如果存在XML注解,则使用其作为key,否则使用变量名
    * @param signType         签名类型,如果为空,则默认为MD5
@@ -57,27 +58,25 @@ public class SignUtils {
   }
 
   /**
-   * 微信支付签名算法(详见:https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=4_3)
+   * 微信支付签名算法(详见:https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=4_3).
    *
-   * @param params           参数信息
-   * @param signType         签名类型,如果为空,则默认为MD5
-   * @param signKey          签名Key
-   * @param isIgnoreSignType 签名时,是否忽略signType
+   * @param params         参数信息
+   * @param signType       签名类型,如果为空,则默认为MD5
+   * @param signKey        签名Key
+   * @param ignoreSignType 签名时,是否忽略signType
    * @return 签名字符串
    */
-  public static String createSign(Map params, String signType, String signKey, boolean isIgnoreSignType) {
+  public static String createSign(Map params, String signType, String signKey, boolean ignoreSignType) {
     SortedMap sortedMap = new TreeMap<>(params);
 
     StringBuilder toSign = new StringBuilder();
     for (String key : sortedMap.keySet()) {
       String value = params.get(key);
       boolean shouldSign = false;
-      if (isIgnoreSignType && "sign_type".equals(key)) {
+      if (ignoreSignType && "sign_type".equals(key)) {
         shouldSign = false;
       } else if (StringUtils.isNotEmpty(value)
-        && !Lists.newArrayList(
-        "sign", "key", "xmlString", "xmlDoc", "couponList").contains(key)
-        ) {
+        && !Lists.newArrayList("sign", "key", "xmlString", "xmlDoc", "couponList").contains(key)) {
         shouldSign = true;
       }
 
@@ -88,18 +87,18 @@ public class SignUtils {
 
     toSign.append("key=").append(signKey);
     if (SignType.HMAC_SHA256.equals(signType)) {
-      return createHMACSha256Sign(toSign.toString(), signKey);
+      return createHmacSha256Sign(toSign.toString(), signKey);
     } else {
       return DigestUtils.md5Hex(toSign.toString()).toUpperCase();
     }
   }
 
-  private static String createHMACSha256Sign(String message, String key) {
+  private static String createHmacSha256Sign(String message, String key) {
     try {
-      Mac hmacSHA256 = Mac.getInstance("HmacSHA256");
+      Mac sha256 = Mac.getInstance("HmacSHA256");
       SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "HmacSHA256");
-      hmacSHA256.init(secretKeySpec);
-      byte[] bytes = hmacSHA256.doFinal(message.getBytes());
+      sha256.init(secretKeySpec);
+      byte[] bytes = sha256.doFinal(message.getBytes());
       return Hex.encodeHexString(bytes).toUpperCase();
     } catch (NoSuchAlgorithmException | InvalidKeyException e) {
       log.error(e.getMessage(), e);
@@ -109,7 +108,7 @@ public class SignUtils {
   }
 
   /**
-   * 校验签名是否正确
+   * 校验签名是否正确.
    *
    * @param xmlBean  Bean需要标记有XML注解
    * @param signType 签名类型,如果为空,则默认为MD5
@@ -121,7 +120,7 @@ public class SignUtils {
   }
 
   /**
-   * 校验签名是否正确
+   * 校验签名是否正确.
    *
    * @param params   需要校验的参数Map
    * @param signType 签名类型,如果为空,则默认为MD5
diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/WxPayServiceAbstractImplTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/WxPayServiceAbstractImplTest.java
index 84a9156ba..9c293103b 100644
--- a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/WxPayServiceAbstractImplTest.java
+++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/WxPayServiceAbstractImplTest.java
@@ -2,6 +2,7 @@ package com.github.binarywang.wxpay.service.impl;
 
 import com.github.binarywang.utils.qrcode.QrcodeUtils;
 import com.github.binarywang.wxpay.bean.coupon.*;
+import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
 import com.github.binarywang.wxpay.bean.order.WxPayAppOrderResult;
 import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
 import com.github.binarywang.wxpay.bean.order.WxPayNativeOrderResult;
@@ -398,9 +399,43 @@ public class WxPayServiceAbstractImplTest {
     this.logger.info(result);
   }
 
+  /**
+   * @see {@link com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResultTest}
+   * @throws Exception
+   */
   @Test
   public void testParseOrderNotifyResult() throws Exception {
-    // 请参考com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResultTest里的单元测试
+    // 请参考com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResultTest 里的单元测试
+
+    String xmlString = "\n" +
+      "  1 \n" +
+      "  2 \n" +
+      "   10000 \n" +
+      "   100 \n" +
+      "   10001 \n" +
+      "   200 \n" +
+      " ";
+
+    WxPayOrderNotifyResult result = this.payService.parseOrderNotifyResult(xmlString);
+    System.out.println(result);
   }
 
   @Test