diff --git a/quality-checks/google_checks.xml b/quality-checks/google_checks.xml index 9fe031d9..af449802 100644 --- a/quality-checks/google_checks.xml +++ b/quality-checks/google_checks.xml @@ -40,7 +40,7 @@ - + @@ -52,7 +52,7 @@ - + diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java index fac0843d..63807492 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java @@ -4,13 +4,13 @@ import java.util.HashMap; import java.util.Map; /** - * 微信开发所使用到的常量类 + * 微信开发所使用到的常量类. * * @author chanjarster & binarywang */ public class WxConsts { /** - * 微信推送过来的消息的类型,和发送给微信xml格式消息的消息类型 + * 微信推送过来的消息的类型,和发送给微信xml格式消息的消息类型. */ public static class XmlMsgType { public static final String TEXT = "text"; @@ -31,24 +31,57 @@ public class WxConsts { } /** - * 主动发送消息(即客服消息)的消息类型 + * 主动发送消息(即客服消息)的消息类型. */ public static class KefuMsgType { - public static final String TEXT = "text";//文本消息 - public static final String IMAGE = "image";//图片消息 - public static final String VOICE = "voice";//语音消息 - public static final String VIDEO = "video";//视频消息 - public static final String MUSIC = "music";//音乐消息 - public static final String NEWS = "news";//图文消息(点击跳转到外链) - public static final String MPNEWS = "mpnews";//图文消息(点击跳转到图文消息页面) - public static final String FILE = "file";//发送文件(CP专用) - public static final String TEXTCARD = "textcard";//文本卡片消息(CP专用) - public static final String WXCARD = "wxcard";//卡券消息 + /** + * 文本消息. + */ + public static final String TEXT = "text"; + /** + * 图片消息. + */ + public static final String IMAGE = "image"; + /** + * 语音消息. + */ + public static final String VOICE = "voice"; + /** + * 视频消息. + */ + public static final String VIDEO = "video"; + /** + * 音乐消息. + */ + public static final String MUSIC = "music"; + /** + * 图文消息(点击跳转到外链). + */ + public static final String NEWS = "news"; + /** + * 图文消息(点击跳转到图文消息页面). + */ + public static final String MPNEWS = "mpnews"; + /** + * 发送文件(CP专用). + */ + public static final String FILE = "file"; + /** + * 文本卡片消息(CP专用). + */ + public static final String TEXTCARD = "textcard"; + /** + * 卡券消息. + */ + public static final String WXCARD = "wxcard"; + /** + * 转发到客服的消息. + */ public static final String TRANSFER_CUSTOMER_SERVICE = "transfer_customer_service"; } /** - * 表示是否是保密消息,0表示否,1表示是,默认0 + * 表示是否是保密消息,0表示否,1表示是,默认0. */ public static class KefuMsgSafe { public static final String NO = "0"; @@ -56,7 +89,7 @@ public class WxConsts { } /** - * 群发消息的消息类型 + * 群发消息的消息类型. */ public static class MassMsgType { public static final String MPNEWS = "mpnews"; @@ -67,7 +100,7 @@ public class WxConsts { } /** - * 群发消息后微信端推送给服务器的反馈消息 + * 群发消息后微信端推送给服务器的反馈消息. */ public static class MassMsgStatus { public static final String SEND_SUCCESS = "send success"; @@ -83,7 +116,7 @@ public class WxConsts { public static final String ERR_21000 = "err(21000)"; /** - * 群发反馈消息代码所对应的文字描述 + * 群发反馈消息代码所对应的文字描述. */ public static final Map STATUS_DESC = new HashMap<>(); @@ -103,7 +136,7 @@ public class WxConsts { } /** - * 微信端推送过来的事件类型 + * 微信端推送过来的事件类型. */ public static class EventType { public static final String SUBSCRIBE = "subscribe"; @@ -124,7 +157,7 @@ public class WxConsts { } /** - * 上传多媒体(临时素材)文件的类型 + * 上传多媒体(临时素材)文件的类型. */ public static class MediaFileType { public static final String IMAGE = "image"; @@ -135,78 +168,78 @@ public class WxConsts { } /** - * 自定义菜单的按钮类型 + * 自定义菜单的按钮类型. */ public static class MenuButtonType { /** - * 点击推事件 + * 点击推事件. */ public static final String CLICK = "click"; /** - * 跳转URL + * 跳转URL. */ public static final String VIEW = "view"; /** - * 跳转到小程序 + * 跳转到小程序. */ public static final String MINIPROGRAM = "miniprogram"; /** - * 扫码推事件 + * 扫码推事件. */ public static final String SCANCODE_PUSH = "scancode_push"; /** - * 扫码推事件且弹出“消息接收中”提示框 + * 扫码推事件且弹出“消息接收中”提示框. */ public static final String SCANCODE_WAITMSG = "scancode_waitmsg"; /** - * 弹出系统拍照发图 + * 弹出系统拍照发图. */ public static final String PIC_SYSPHOTO = "pic_sysphoto"; /** - * 弹出拍照或者相册发图 + * 弹出拍照或者相册发图. */ public static final String PIC_PHOTO_OR_ALBUM = "pic_photo_or_album"; /** - * 弹出微信相册发图器 + * 弹出微信相册发图器. */ public static final String PIC_WEIXIN = "pic_weixin"; /** - * 弹出地理位置选择器 + * 弹出地理位置选择器. */ public static final String LOCATION_SELECT = "location_select"; /** - * 下发消息(除文本消息) + * 下发消息(除文本消息). */ public static final String MEDIA_ID = "media_id"; /** - * 跳转图文消息URL + * 跳转图文消息URL. */ public static final String VIEW_LIMITED = "view_limited"; } /** - * oauth2网页授权的scope + * oauth2网页授权的scope. */ public static class OAuth2Scope { /** - * 不弹出授权页面,直接跳转,只能获取用户openid + * 不弹出授权页面,直接跳转,只能获取用户openid. */ public static final String SNSAPI_BASE = "snsapi_base"; /** - * 弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息 + * 弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息. */ public static final String SNSAPI_USERINFO = "snsapi_userinfo"; } /** - * 网页应用登录授权作用域 + * 网页应用登录授权作用域. */ public static class QrConnectScope { public static final String SNSAPI_LOGIN = "snsapi_login"; } /** - * 永久素材类型 + * 永久素材类型. */ public static class MaterialType { public static final String NEWS = "news"; diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxErrorExceptionHandler.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxErrorExceptionHandler.java index d6acf55b..5117c765 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxErrorExceptionHandler.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxErrorExceptionHandler.java @@ -3,7 +3,7 @@ package me.chanjar.weixin.common.api; import me.chanjar.weixin.common.exception.WxErrorException; /** - * WxErrorException处理器 + * WxErrorException处理器. */ public interface WxErrorExceptionHandler { diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxMessageDuplicateChecker.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxMessageDuplicateChecker.java index 831458a4..fdb0cd81 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxMessageDuplicateChecker.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxMessageDuplicateChecker.java @@ -2,22 +2,21 @@ package me.chanjar.weixin.common.api; /** *
- * 消息重复检查器
+ * 消息重复检查器.
  * 微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次
  * 
*/ 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 1281e260..d8be08f4 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 msgId2Timestamp = new ConcurrentHashMap<>(); /** - * 后台清理线程是否已经开启 + * 后台清理线程是否已经开启. */ private final AtomicBoolean backgroundProcessStarted = new AtomicBoolean(false); /** - * WxMsgIdInMemoryDuplicateChecker构造函数 + * 无参构造方法. *
    * 一个消息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 entry : WxMessageInMemoryDuplicateChecker.this.msgId2Timestamp.entrySet()) { + for (Map.Entry entry : + WxMessageInMemoryDuplicateChecker.this.msgId2Timestamp.entrySet()) { if (now - entry.getValue() > WxMessageInMemoryDuplicateChecker.this.timeToLive) { WxMessageInMemoryDuplicateChecker.this.msgId2Timestamp.entrySet().remove(entry); } diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenu.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenu.java index 4e61a465..d82431c9 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenu.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenu.java @@ -11,7 +11,7 @@ import java.util.ArrayList; import java.util.List; /** - * 菜单(公众号和企业号共用的) + * 菜单(公众号和企业号共用的). * * @author Daniel Qian */ @@ -36,7 +36,8 @@ public class WxMenu implements Serializable { * 相比 http://mp.weixin.qq.com/wiki/13/43de8269be54a0a6f64413e4dfa94f39.html 的格式,外层多套了一个menu */ public static WxMenu fromJson(InputStream is) { - return WxGsonBuilder.create().fromJson(new InputStreamReader(is, StandardCharsets.UTF_8), WxMenu.class); + return WxGsonBuilder.create() + .fromJson(new InputStreamReader(is, StandardCharsets.UTF_8), WxMenu.class); } public List getButtons() { diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenuButton.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenuButton.java index aa6ea4cf..1c32ef10 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenuButton.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenuButton.java @@ -12,7 +12,7 @@ public class WxMenuButton implements Serializable { /** *
-   * 菜单的响应动作类型:
+   * 菜单的响应动作类型.
    * 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 efc42fbb..dffae948 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 46c0ae89..809d015a 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 939b6247..fcd56c48 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 d3e5a1c1..b99b09fb 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 2eb71b52..80f81992 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 c86ed1ff..e08ef4df 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 b4ad7517..f329dd30 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 70d7cf4b..c353534c 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 24d9e99b..9b35df89 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 8c6ec52a..578bf68c 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 5aaf5ea5..d49999c5 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 5298160f..fe8dc580 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 99284475..efb9d856 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 84a9156b..9c293103 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" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " 1\n" + + " \n" + + " \n" + + " 2\n" + + " \n" + + " 10000\n" + + " 100\n" + + " \n" + + " 10001\n" + + " 200\n" + + ""; + + WxPayOrderNotifyResult result = this.payService.parseOrderNotifyResult(xmlString); + System.out.println(result); } @Test