From f40cec572048c1b4cfdec87a7a20d08b4cc48144 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Mon, 1 Aug 2016 09:06:41 +0800 Subject: [PATCH 01/55] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4aa99770..e89b3edc 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ com.github.binarywang weixin-java-mp - 1.3.5 + 2.0.0 ``` @@ -57,7 +57,7 @@ com.github.binarywang weixin-java-cp - 1.3.5 + 2.0.0 ``` From 65fb373c392f4988b8ac6a0857070dfb3c915c7a Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Mon, 1 Aug 2016 09:15:14 +0800 Subject: [PATCH 02/55] =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=8F=B7=E6=9B=B4?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=202.1.0-SNAPSHOT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- weixin-java-common/pom.xml | 2 +- weixin-java-cp/pom.xml | 2 +- weixin-java-mp/pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index a6cfb54b..22d63ba0 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.github.binarywang weixin-java-parent - 2.0.0 + 2.1.0-SNAPSHOT pom WeiXin Java Tools - Parent 微信公众号、企业号上级POM diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml index eb8e7572..684cae1d 100644 --- a/weixin-java-common/pom.xml +++ b/weixin-java-common/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang weixin-java-parent - 2.0.0 + 2.1.0-SNAPSHOT weixin-java-common diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml index c8ab21c9..0d2c217b 100644 --- a/weixin-java-cp/pom.xml +++ b/weixin-java-cp/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang weixin-java-parent - 2.0.0 + 2.1.0-SNAPSHOT weixin-java-cp diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml index 8b84e8b8..516f058c 100644 --- a/weixin-java-mp/pom.xml +++ b/weixin-java-mp/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang weixin-java-parent - 2.0.0 + 2.1.0-SNAPSHOT weixin-java-mp WeiXin Java Tools - MP From 49d561c11731a034c3f20f0410c70c380fd2fff3 Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Mon, 1 Aug 2016 09:16:09 +0800 Subject: [PATCH 03/55] =?UTF-8?q?=E4=BC=98=E5=8C=96WxError=E7=B1=BB?= =?UTF-8?q?=E7=9A=84toString=E6=96=B9=E6=B3=95=EF=BC=8C=E9=81=BF=E5=85=8D?= =?UTF-8?q?=E8=BE=93=E5=87=BA=E9=87=8D=E5=A4=8D=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/me/chanjar/weixin/common/bean/result/WxError.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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 66e22ee7..12d4a3e6 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 @@ -50,7 +50,10 @@ public class WxError implements Serializable { @Override public String toString() { - return "微信错误: errcode=" + errorCode + ", errmsg=" + errorMsg + "\njson:" + json; + if(json != null){ + return json; + } + return "错误: Code=" + errorCode + ", Msg=" + errorMsg; } public static Builder newBuilder(){ From 8b1c320b49d195fa98b9f7493c7a4897dd95ec22 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Mon, 1 Aug 2016 10:09:47 +0800 Subject: [PATCH 04/55] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e89b3edc..ead0ba3f 100644 --- a/README.md +++ b/README.md @@ -33,8 +33,8 @@ ## 版本说明 * 本项目定为每月发布一次正式版,版本号格式为X.X.0(如2.0.0,2.1.0等),月初或月底发布新版本,遇到重大问题需修复会及时提交新版本,欢迎大家随时提交Pull Request。 -* BUG修复和新特性一般会先发布成小版本作为临时版本(如2.0.1,2.0.2等,即尾号不为0,以区别于正式版), 目前最新版本号为![Maven Central](https://img.shields.io/maven-central/v/com.github.binarywang/weixin-java-parent.svg) 。 -也可以通过访问如下地址查看所有最新的版本: +* BUG修复和新特性一般会先发布成小版本作为临时版本(如2.0.1,2.0.2等,即尾号不为0,以区别于正式版). +* 目前最新版本号为![Maven Central](https://img.shields.io/maven-central/v/com.github.binarywang/weixin-java-parent.svg) ,也可以通过访问如下地址查看所有最新的版本: - 公众号 - 企业号 From baf99d6809799f2bca2e638a0dedf53674fb8f1e Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Mon, 1 Aug 2016 10:28:10 +0800 Subject: [PATCH 05/55] =?UTF-8?q?=E8=B0=83=E6=95=B4readme=E9=83=A8?= =?UTF-8?q?=E5=88=86=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index ead0ba3f..428d1e93 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # Weixin Java Tools 微信公众号/企业号开发Java SDK -## weixin-java-tools [![Open Source Love](https://badges.frapsoft.com/os/v1/open-source.svg?v=103)](https://github.com/ellerbrock/open-source-badge/) ![Maven Central](https://img.shields.io/maven-central/v/com.github.binarywang/weixin-java-parent.svg) [![Build Status](https://travis-ci.org/binarywang/weixin-java-tools.svg?branch=develop)](https://travis-ci.org/binarywang/weixin-java-tools) +## [![Join QQ Group](http://pub.idqqimg.com/wpa/images/group.png)](http://shang.qq.com/wpa/qunwpa?idkey=078f7a153d243853e24cf2b542e7a6ccbf2a592bc138080f84d11297f736ec46) [![Open Source Love](https://badges.frapsoft.com/os/v1/open-source.svg?v=103)](https://github.com/ellerbrock/open-source-badge/) ![Maven Central](https://img.shields.io/maven-central/v/com.github.binarywang/weixin-java-parent.svg) [![Build Status](https://travis-ci.org/binarywang/weixin-java-tools.svg?branch=develop)](https://travis-ci.org/binarywang/weixin-java-tools) ### 声明:本项目基于chanjarster/weixin-java-tools,由于原作者长期没有维护,故单独维护和发布,且发布到maven上的groupId也会不同。 @@ -25,7 +25,7 @@ =========== ## 开发交流工具: -* QQ群:343954419 weixin-java-tools +* QQ群:343954419 [![Join QQ Group](http://pub.idqqimg.com/wpa/images/group.png)](http://shang.qq.com/wpa/qunwpa?idkey=078f7a153d243853e24cf2b542e7a6ccbf2a592bc138080f84d11297f736ec46) * 注意:为保证入群成员质量,请申请入群时认真输入Github帐号ID,即你的github主页地址https://github.com/XXXX 中最后的部分XXXX的内容,谢谢~ * 微信群: 因二维码有时间限制,如有想加入微信群的,请入QQ群后咨询获取最新入群二维码。 @@ -33,10 +33,10 @@ ## 版本说明 * 本项目定为每月发布一次正式版,版本号格式为X.X.0(如2.0.0,2.1.0等),月初或月底发布新版本,遇到重大问题需修复会及时提交新版本,欢迎大家随时提交Pull Request。 -* BUG修复和新特性一般会先发布成小版本作为临时版本(如2.0.1,2.0.2等,即尾号不为0,以区别于正式版). -* 目前最新版本号为![Maven Central](https://img.shields.io/maven-central/v/com.github.binarywang/weixin-java-parent.svg) ,也可以通过访问如下地址查看所有最新的版本: -- 公众号 -- 企业号 +* BUG修复和新特性一般会先发布成小版本作为临时版本(如2.0.1,2.0.2等,即尾号不为0,以区别于正式版)。 +* 目前最新版本号为 ![Maven Central](https://img.shields.io/maven-central/v/com.github.binarywang/weixin-java-parent.svg) ,也可以通过访问如下地址查看所有最新的版本: +- [【公众号】](http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22com.github.binarywang%22%20AND%20a%3A%22weixin-java-mp%22) +- [【企业号】](http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22com.github.binarywang%22%20AND%20a%3A%22weixin-java-cp%22) ## Quick Start From 6643498a66dc0f565fee5264ae2ccb4a5479aa53 Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Tue, 2 Aug 2016 19:40:44 +0800 Subject: [PATCH 06/55] code clean up for common module --- .../chanjar/weixin/common/api/WxConsts.java | 92 +++-- .../common/api/WxMessageDuplicateChecker.java | 9 +- .../WxMessageInMemoryDuplicateChecker.java | 3 +- .../weixin/common/bean/WxAccessToken.java | 10 +- .../weixin/common/bean/WxJsapiSignature.java | 6 +- .../me/chanjar/weixin/common/bean/WxMenu.java | 108 +++--- .../weixin/common/bean/result/WxError.java | 38 +- .../bean/result/WxMediaUploadResult.java | 12 +- .../common/exception/WxErrorException.java | 4 +- .../weixin/common/session/Constants.java | 2 +- .../common/session/InternalSession.java | 10 +- .../session/InternalSessionManager.java | 25 +- .../common/session/LocalStrings.properties | 1 - .../common/session/StandardSession.java | 152 ++++---- .../session/StandardSessionManager.java | 140 ++++--- .../TooManyActiveSessionsException.java | 59 ++- .../weixin/common/util/StringUtils.java | 22 +- .../weixin/common/util/crypto/ByteGroup.java | 32 +- .../common/util/crypto/PKCS7Encoder.java | 92 ++--- .../weixin/common/util/crypto/SHA1.java | 6 +- .../common/util/crypto/WxCryptUtil.java | 102 ++--- .../weixin/common/util/fs/FileUtils.java | 16 +- .../util/http/ApacheHttpClientBuilder.java | 6 + .../DefaultApacheHttpHttpClientBuilder.java | 40 +- .../util/http/InputStreamResponseHandler.java | 8 +- .../util/http/JoddGetRequestExecutor.java | 66 ++-- .../util/http/JoddPostRequestExecutor.java | 54 +-- .../http/MediaDownloadRequestExecutor.java | 13 +- .../util/http/MediaUploadRequestExecutor.java | 13 +- .../common/util/http/RequestExecutor.java | 12 +- .../util/http/SimpleGetRequestExecutor.java | 5 +- .../util/http/SimplePostRequestExecutor.java | 5 +- .../common/util/http/Utf8ResponseHandler.java | 8 +- .../weixin/common/util/json/GsonHelper.java | 194 +++++----- .../util/json/WxAccessTokenAdapter.java | 4 +- .../common/util/json/WxErrorAdapter.java | 4 +- .../common/util/json/WxGsonBuilder.java | 2 +- .../util/json/WxMediaUploadResultAdapter.java | 4 +- .../common/util/json/WxMenuGsonAdapter.java | 33 +- .../weixin/common/util/res/StringManager.java | 364 +++++++++--------- .../common/util/xml/XStreamInitializer.java | 5 +- .../weixin/common/bean/WxAccessTokenTest.java | 2 +- .../weixin/common/bean/WxErrorTest.java | 6 +- .../weixin/common/bean/WxMenuTest.java | 150 ++++---- .../weixin/common/session/SessionTest.java | 4 +- ...WxMessageInMemoryDuplicateCheckerTest.java | 2 +- .../common/util/crypto/WxCryptUtilTest.java | 2 +- 47 files changed, 963 insertions(+), 984 deletions(-) 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 0c9661d2..e45643b7 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 @@ -19,7 +19,7 @@ public class WxConsts { public static final String XML_MSG_LINK = "link"; public static final String XML_MSG_EVENT = "event"; public static final String XML_TRANSFER_CUSTOMER_SERVICE = "transfer_customer_service"; - + /////////////////////// // 主动发送消息(即客服消息)的消息类型 /////////////////////// @@ -33,7 +33,7 @@ public class WxConsts { public static final String CUSTOM_MSG_TRANSFER_CUSTOMER_SERVICE = "transfer_customer_service"; public static final String CUSTOM_MSG_SAFE_NO = "0"; public static final String CUSTOM_MSG_SAFE_YES = "1"; - + /////////////////////// // 群发消息的消息类型 /////////////////////// @@ -42,7 +42,7 @@ public class WxConsts { public static final String MASS_MSG_VOICE = "voice"; public static final String MASS_MSG_IMAGE = "image"; public static final String MASS_MSG_VIDEO = "mpvideo"; - + /////////////////////// // 群发消息后微信端推送给服务器的反馈消息 /////////////////////// @@ -57,25 +57,11 @@ public class WxConsts { public static final String MASS_ST_涉嫌版权 = "err(20013)"; public static final String MASS_ST_涉嫌互推_互相宣传 = "err(22000)"; public static final String MASS_ST_涉嫌其他 = "err(21000)"; - + /** * 群发反馈消息代码所对应的文字描述 */ public static final Map MASS_ST_2_DESC = new HashMap(); - static { - MASS_ST_2_DESC.put(MASS_ST_SUCCESS, "发送成功"); - MASS_ST_2_DESC.put(MASS_ST_FAIL, "发送失败"); - MASS_ST_2_DESC.put(MASS_ST_涉嫌广告, "涉嫌广告"); - MASS_ST_2_DESC.put(MASS_ST_涉嫌政治, "涉嫌政治"); - MASS_ST_2_DESC.put(MASS_ST_涉嫌社会, "涉嫌社会"); - MASS_ST_2_DESC.put(MASS_ST_涉嫌色情, "涉嫌色情"); - MASS_ST_2_DESC.put(MASS_ST_涉嫌违法犯罪, "涉嫌违法犯罪"); - MASS_ST_2_DESC.put(MASS_ST_涉嫌欺诈, "涉嫌欺诈"); - MASS_ST_2_DESC.put(MASS_ST_涉嫌版权, "涉嫌版权"); - MASS_ST_2_DESC.put(MASS_ST_涉嫌互推_互相宣传, "涉嫌互推_互相宣传"); - MASS_ST_2_DESC.put(MASS_ST_涉嫌其他, "涉嫌其他"); - } - /////////////////////// // 微信端推送过来的事件类型 /////////////////////// @@ -103,11 +89,9 @@ public class WxConsts { public static final String EVT_USER_VIEW_CARD = "user_view_card"; public static final String EVT_USER_ENTER_SESSION_FROM_CARD = "user_enter_session_from_card"; public static final String EVT_CARD_SKU_REMIND = "card_sku_remind"; // 库存报警 - public static final String EVT_KF_CREATE_SESSION = "kf_create_session"; // 客服接入会话 public static final String EVT_KF_CLOSE_SESSION = "kf_close_session"; // 客服关闭会话 public static final String EVT_KF_SWITCH_SESSION = "kf_switch_session"; // 客服转接会话 - /////////////////////// // 上传多媒体文件的类型 /////////////////////// @@ -116,7 +100,6 @@ public class WxConsts { public static final String MEDIA_VIDEO = "video"; public static final String MEDIA_THUMB = "thumb"; public static final String MEDIA_FILE = "file"; - /////////////////////// // 文件类型 /////////////////////// @@ -124,40 +107,63 @@ public class WxConsts { public static final String FILE_MP3 = "mp3"; public static final String FILE_AMR = "amr"; public static final String FILE_MP4 = "mp4"; + /** + * 点击推事件 + */ + public static final String BUTTON_CLICK = "click"; /////////////////////// // 自定义菜单的按钮类型 /////////////////////// - /** 点击推事件 */ - public static final String BUTTON_CLICK = "click"; - /** 跳转URL */ + /** + * 跳转URL + */ public static final String BUTTON_VIEW = "view"; - /** 扫码推事件 */ + /** + * 扫码推事件 + */ public static final String BUTTON_SCANCODE_PUSH = "scancode_push"; - /** 扫码推事件且弹出“消息接收中”提示框 */ + /** + * 扫码推事件且弹出“消息接收中”提示框 + */ public static final String BUTTON_SCANCODE_WAITMSG = "scancode_waitmsg"; - /** 弹出系统拍照发图 */ + /** + * 弹出系统拍照发图 + */ public static final String BUTTON_PIC_SYSPHOTO = "pic_sysphoto"; - /** 弹出拍照或者相册发图 */ + /** + * 弹出拍照或者相册发图 + */ public static final String BUTTON_PIC_PHOTO_OR_ALBUM = "pic_photo_or_album"; - /** 弹出微信相册发图器 */ + /** + * 弹出微信相册发图器 + */ public static final String BUTTON_PIC_WEIXIN = "pic_weixin"; - /** 弹出地理位置选择器 */ + /** + * 弹出地理位置选择器 + */ public static final String BUTTON_LOCATION_SELECT = "location_select"; - /** 下发消息(除文本消息) */ + /** + * 下发消息(除文本消息) + */ public static final String BUTTON_MEDIA_ID = "media_id"; - /** 跳转图文消息URL */ + /** + * 跳转图文消息URL + */ public static final String BUTTON_VIEW_LIMITED = "view_limited"; + /** + * 不弹出授权页面,直接跳转,只能获取用户openid + */ + public static final String OAUTH2_SCOPE_BASE = "snsapi_base"; /////////////////////// // oauth2网页授权的scope /////////////////////// - /** 不弹出授权页面,直接跳转,只能获取用户openid */ - public static final String OAUTH2_SCOPE_BASE = "snsapi_base"; - /** 弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息 */ + /** + * 弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息 + */ public static final String OAUTH2_SCOPE_USER_INFO = "snsapi_userinfo"; - /////////////////////// // 永久素材类型 /////////////////////// @@ -165,4 +171,18 @@ public class WxConsts { public static final String MATERIAL_VOICE = "voice"; public static final String MATERIAL_IMAGE = "image"; public static final String MATERIAL_VIDEO = "video"; + + static { + MASS_ST_2_DESC.put(MASS_ST_SUCCESS, "发送成功"); + MASS_ST_2_DESC.put(MASS_ST_FAIL, "发送失败"); + MASS_ST_2_DESC.put(MASS_ST_涉嫌广告, "涉嫌广告"); + MASS_ST_2_DESC.put(MASS_ST_涉嫌政治, "涉嫌政治"); + MASS_ST_2_DESC.put(MASS_ST_涉嫌社会, "涉嫌社会"); + MASS_ST_2_DESC.put(MASS_ST_涉嫌色情, "涉嫌色情"); + MASS_ST_2_DESC.put(MASS_ST_涉嫌违法犯罪, "涉嫌违法犯罪"); + MASS_ST_2_DESC.put(MASS_ST_涉嫌欺诈, "涉嫌欺诈"); + MASS_ST_2_DESC.put(MASS_ST_涉嫌版权, "涉嫌版权"); + MASS_ST_2_DESC.put(MASS_ST_涉嫌互推_互相宣传, "涉嫌互推_互相宣传"); + MASS_ST_2_DESC.put(MASS_ST_涉嫌其他, "涉嫌其他"); + } } 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 2bcc98f8..831458a4 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 @@ -10,15 +10,16 @@ public interface WxMessageDuplicateChecker { /** *

公众号的排重方式

- * + *

*

普通消息:关于重试的消息排重,推荐使用msgid排重。文档参考

*

事件消息:关于重试的消息排重,推荐使用FromUserName + CreateTime 排重。文档参考

- * + *

*

企业号的排重方式

- * + *

* 官方文档完全没有写,参照公众号的方式排重。 - * + *

*

或者可以采取更简单的方式,如果有MsgId就用MsgId排重,如果没有就用FromUserName+CreateTime排重

+ * * @param messageId messageId需要根据上面讲的方式构造 * @return 如果是重复消息,返回true,否则返回false */ 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 5b0f4e4e..e0d4d08c 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 @@ -46,7 +46,8 @@ public class WxMessageInMemoryDuplicateChecker implements WxMessageDuplicateChec /** * WxMsgIdInMemoryDuplicateChecker构造函数 - * @param timeToLive 一个消息ID在内存的过期时间:毫秒 + * + * @param timeToLive 一个消息ID在内存的过期时间:毫秒 * @param clearPeriod 每隔多少周期检查消息ID是否过期:毫秒 */ public WxMessageInMemoryDuplicateChecker(Long timeToLive, Long clearPeriod) { diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxAccessToken.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxAccessToken.java index ce69a104..eedecb84 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxAccessToken.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxAccessToken.java @@ -8,9 +8,13 @@ public class WxAccessToken implements Serializable { private static final long serialVersionUID = 8709719312922168909L; private String accessToken; - + private int expiresIn = -1; + public static WxAccessToken fromJson(String json) { + return WxGsonBuilder.create().fromJson(json, WxAccessToken.class); + } + public String getAccessToken() { return accessToken; } @@ -27,8 +31,4 @@ public class WxAccessToken implements Serializable { this.expiresIn = expiresIn; } - public static WxAccessToken fromJson(String json) { - return WxGsonBuilder.create().fromJson(json, WxAccessToken.class); - } - } diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxJsapiSignature.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxJsapiSignature.java index 74f0b1b1..312860df 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxJsapiSignature.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxJsapiSignature.java @@ -9,7 +9,7 @@ public class WxJsapiSignature implements Serializable { private static final long serialVersionUID = -1116808193154384804L; private String appid; - + private String noncestr; private long timestamp; @@ -51,11 +51,11 @@ public class WxJsapiSignature implements Serializable { } public String getAppid() { - return appid; + return appid; } public void setAppid(String appid) { - this.appid = appid; + this.appid = appid; } } diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxMenu.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxMenu.java index d236f62b..3c530e85 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxMenu.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxMenu.java @@ -1,5 +1,7 @@ package me.chanjar.weixin.common.bean; +import me.chanjar.weixin.common.util.json.WxGsonBuilder; + import java.io.InputStream; import java.io.InputStreamReader; import java.io.Serializable; @@ -7,12 +9,10 @@ import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; -import me.chanjar.weixin.common.util.json.WxGsonBuilder; - /** * 企业号菜单 - * @author Daniel Qian * + * @author Daniel Qian */ public class WxMenu implements Serializable { @@ -21,26 +21,6 @@ public class WxMenu implements Serializable { private List buttons = new ArrayList(); private WxMenuRule matchRule; - - public List getButtons() { - return buttons; - } - - public void setButtons(List buttons) { - this.buttons = buttons; - } - - public WxMenuRule getMatchRule() { - return matchRule; - } - - public void setMatchRule(WxMenuRule matchRule) { - this.matchRule = matchRule; - } - - public String toJson() { - return WxGsonBuilder.create().toJson(this); - } /** * 要用 http://mp.weixin.qq.com/wiki/16/ff9b7b85220e1396ffa16794a9d95adc.html 格式来反序列化 @@ -58,11 +38,31 @@ public class WxMenu implements Serializable { return WxGsonBuilder.create().fromJson(new InputStreamReader(is, StandardCharsets.UTF_8), WxMenu.class); } + public List getButtons() { + return buttons; + } + + public void setButtons(List buttons) { + this.buttons = buttons; + } + + public WxMenuRule getMatchRule() { + return matchRule; + } + + public void setMatchRule(WxMenuRule matchRule) { + this.matchRule = matchRule; + } + + public String toJson() { + return WxGsonBuilder.create().toJson(this); + } + @Override public String toString() { return "WxMenu{" + - "buttons=" + buttons + - '}'; + "buttons=" + buttons + + '}'; } public static class WxMenuButton { @@ -71,7 +71,7 @@ public class WxMenu implements Serializable { private String name; private String key; private String url; - + private List subButtons = new ArrayList(); public String getType() { @@ -117,15 +117,15 @@ public class WxMenu implements Serializable { @Override public String toString() { return "WxMenuButton{" + - "type='" + type + '\'' + - ", name='" + name + '\'' + - ", key='" + key + '\'' + - ", url='" + url + '\'' + - ", subButtons=" + subButtons + - '}'; + "type='" + type + '\'' + + ", name='" + name + '\'' + + ", key='" + key + '\'' + + ", url='" + url + '\'' + + ", subButtons=" + subButtons + + '}'; } } - + public static class WxMenuRule { private String tagId; private String sex; @@ -134,51 +134,51 @@ public class WxMenu implements Serializable { private String city; private String clientPlatformType; private String language; - + public String getTagId() { return tagId; } - + public void setTagId(String tagId) { this.tagId = tagId; } - + public String getSex() { return sex; } - + public void setSex(String sex) { this.sex = sex; } - + public String getCountry() { return country; } - + public void setCountry(String country) { this.country = country; } - + public String getProvince() { return province; } - + public void setProvince(String province) { this.province = province; } - + public String getCity() { return city; } - + public void setCity(String city) { this.city = city; } - + public String getClientPlatformType() { return clientPlatformType; } - + public void setClientPlatformType(String clientPlatformType) { this.clientPlatformType = clientPlatformType; } @@ -194,15 +194,15 @@ public class WxMenu implements Serializable { @Override public String toString() { return "matchrule:{" + - "tag_id='" + tagId + '\'' + - ", sex='" + sex + '\'' + - ", country" + country + '\'' + - ", province" + province + '\'' + - ", city" + city + '\'' + - ", client_platform_type" + clientPlatformType + '\'' + - ", language" + language + '\'' + - "}"; + "tag_id='" + tagId + '\'' + + ", sex='" + sex + '\'' + + ", country" + country + '\'' + + ", province" + province + '\'' + + ", city" + city + '\'' + + ", client_platform_type" + clientPlatformType + '\'' + + ", language" + language + '\'' + + "}"; } } - + } 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 12d4a3e6..070ec720 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 @@ -6,19 +6,28 @@ import java.io.Serializable; /** * 微信错误码说明,请阅读: 全局返回码说明 - * @author Daniel Qian * + * @author Daniel Qian */ public class WxError implements Serializable { private static final long serialVersionUID = 7869786563361406291L; private int errorCode; - + private String errorMsg; private String json; - + + public static WxError fromJson(String json) { + WxError error = WxGsonBuilder.create().fromJson(json, WxError.class); + return error; + } + + public static Builder newBuilder() { + return new Builder(); + } + public int getErrorCode() { return errorCode; } @@ -43,43 +52,34 @@ public class WxError implements Serializable { this.json = json; } - public static WxError fromJson(String json) { - WxError error = WxGsonBuilder.create().fromJson(json, WxError.class); - return error; - } - @Override public String toString() { - if(json != null){ + if (json != null) { return json; } return "错误: Code=" + errorCode + ", Msg=" + errorMsg; } - public static Builder newBuilder(){ - return new Builder(); - } - - public static class Builder{ + public static class Builder { private int errorCode; private String errorMsg; - + public Builder setErrorCode(int errorCode) { this.errorCode = errorCode; return this; } - + public Builder setErrorMsg(String errorMsg) { this.errorMsg = errorMsg; return this; } - - public WxError build(){ + + public WxError build() { WxError wxError = new WxError(); wxError.setErrorCode(this.errorCode); wxError.setErrorMsg(this.errorMsg); return wxError; } - + } } diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxMediaUploadResult.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxMediaUploadResult.java index 500dc000..2e4b5fcd 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxMediaUploadResult.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxMediaUploadResult.java @@ -6,12 +6,16 @@ import java.io.Serializable; public class WxMediaUploadResult implements Serializable { private static final long serialVersionUID = 330834334738622341L; - + private String type; private String mediaId; private String thumbMediaId; private long createdAt; + public static WxMediaUploadResult fromJson(String json) { + return WxGsonBuilder.create().fromJson(json, WxMediaUploadResult.class); + } + public String getType() { return type; } @@ -44,14 +48,10 @@ public class WxMediaUploadResult implements Serializable { this.thumbMediaId = thumbMediaId; } - public static WxMediaUploadResult fromJson(String json) { - return WxGsonBuilder.create().fromJson(json, WxMediaUploadResult.class); - } - @Override public String toString() { return "WxUploadResult [type=" + type + ", media_id=" + mediaId + ", thumb_media_id=" + thumbMediaId - + ", created_at=" + createdAt + "]"; + + ", created_at=" + createdAt + "]"; } } diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/exception/WxErrorException.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/exception/WxErrorException.java index d1dc569b..7e2e1941 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/exception/WxErrorException.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/exception/WxErrorException.java @@ -5,7 +5,7 @@ import me.chanjar.weixin.common.bean.result.WxError; public class WxErrorException extends Exception { private static final long serialVersionUID = -6357149550353160810L; - + private WxError error; public WxErrorException(WxError error) { @@ -17,5 +17,5 @@ public class WxErrorException extends Exception { return error; } - + } diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/session/Constants.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/session/Constants.java index 33518f17..f30a0ae0 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/session/Constants.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/session/Constants.java @@ -26,6 +26,6 @@ package me.chanjar.weixin.common.session; public class Constants { - public static final String Package = "me.chanjar.weixin.common.session"; + public static final String Package = "me.chanjar.weixin.common.session"; } diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/session/InternalSession.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/session/InternalSession.java index 283672af..77d4d282 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/session/InternalSession.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/session/InternalSession.java @@ -8,6 +8,11 @@ public interface InternalSession { */ WxSession getSession(); + /** + * Return the isValid flag for this session. + */ + boolean isValid(); + /** * Set the isValid flag for this session. * @@ -15,11 +20,6 @@ public interface InternalSession { */ void setValid(boolean isValid); - /** - * Return the isValid flag for this session. - */ - boolean isValid(); - /** * Return the session identifier for this session. */ diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/session/InternalSessionManager.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/session/InternalSessionManager.java index bb9a8dca..a92e1071 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/session/InternalSessionManager.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/session/InternalSessionManager.java @@ -7,11 +7,10 @@ public interface InternalSessionManager { * specified session id (if any); otherwise return null. * * @param id The session id for the session to be returned - * - * @exception IllegalStateException if a new session cannot be - * instantiated for any reason - * @exception java.io.IOException if an input/output error occurs while - * processing this request + * @throws IllegalStateException if a new session cannot be + * instantiated for any reason + * @throws java.io.IOException if an input/output error occurs while + * processing this request */ InternalSession findSession(String id); @@ -23,10 +22,10 @@ public interface InternalSessionManager { * null. * * @param sessionId The session id which should be used to create the - * new session; if null, a new session id will be - * generated - * @exception IllegalStateException if a new session cannot be - * instantiated for any reason + * new session; if null, a new session id will be + * generated + * @throws IllegalStateException if a new session cannot be + * instantiated for any reason */ InternalSession createSession(String sessionId); @@ -40,8 +39,8 @@ public interface InternalSessionManager { /** * Remove this Session from the active Sessions for this Manager. * - * @param session Session to be removed - * @param update Should the expiration statistics be updated + * @param session Session to be removed + * @param update Should the expiration statistics be updated */ void remove(InternalSession session, boolean update); @@ -59,6 +58,7 @@ public interface InternalSessionManager { * @return number of sessions active */ int getActiveSessions(); + /** * Get a session from the recycled ones or create a new empty one. * The PersistentManager manager does not need to create session data @@ -88,6 +88,7 @@ public interface InternalSessionManager { * 要和{@link #setBackgroundProcessorDelay(int)}联合起来看 * 如果把这个数字设置为6(默认),那么就是说manager要等待 6 * backgroundProcessorDay的时间才会清理过期session * + * * @param processExpiresFrequency the new manager checks frequency */ void setProcessExpiresFrequency(int processExpiresFrequency); @@ -97,6 +98,7 @@ public interface InternalSessionManager { * Set the manager background processor delay * 设置manager sleep几秒,尝试执行一次background操作(清理过期session) * + * * @param backgroundProcessorDelay */ void setBackgroundProcessorDelay(int backgroundProcessorDelay); @@ -106,6 +108,7 @@ public interface InternalSessionManager { * Set the maximum number of active Sessions allowed, or -1 for * no limit. * 设置最大活跃session数,默认无限 + * * @param max The new maximum number of sessions */ void setMaxActiveSessions(int max); diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/session/LocalStrings.properties b/weixin-java-common/src/main/java/me/chanjar/weixin/common/session/LocalStrings.properties index ede528f7..d3ded84b 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/session/LocalStrings.properties +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/session/LocalStrings.properties @@ -12,7 +12,6 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. - applicationSession.session.ise=invalid session state applicationSession.value.iae=null value fileStore.saving=Saving Session {0} to file {1} diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/session/StandardSession.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/session/StandardSession.java index b482c2b7..9212c619 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/session/StandardSession.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/session/StandardSession.java @@ -12,17 +12,68 @@ public class StandardSession implements WxSession, InternalSession { * The string manager for this package. */ protected static final StringManager sm = - StringManager.getManager(Constants.Package); - + StringManager.getManager(Constants.Package); + /** + * Type array. + */ + protected static final String EMPTY_ARRAY[] = new String[0]; // ------------------------------ WxSession protected Map attributes = new ConcurrentHashMap(); + /** + * The session identifier of this Session. + */ + protected String id = null; + /** + * Flag indicating whether this session is valid or not. + */ + protected volatile boolean isValid = false; + /** + * We are currently processing a session expiration, so bypass + * certain IllegalStateException tests. NOTE: This value is not + * included in the serialized version of this object. + */ + protected transient volatile boolean expiring = false; + /** + * The Manager with which this Session is associated. + */ + protected transient InternalSessionManager manager = null; + + // ------------------------------ InternalSession + /** + * The time this session was created, in milliseconds since midnight, + * January 1, 1970 GMT. + */ + protected long creationTime = 0L; + /** + * The current accessed time for this session. + */ + protected volatile long thisAccessedTime = creationTime; + /** + * The default maximum inactive interval for Sessions created by + * this Manager. + */ + protected int maxInactiveInterval = 30 * 60; + /** + * The facade associated with this session. NOTE: This value is not + * included in the serialized version of this object. + */ + protected transient StandardSessionFacade facade = null; + /** + * The access count for this session. + */ + protected transient AtomicInteger accessCount = null; + + public StandardSession(InternalSessionManager manager) { + this.manager = manager; + this.accessCount = new AtomicInteger(); + } @Override public Object getAttribute(String name) { if (!isValidInternal()) throw new IllegalStateException - (sm.getString("sessionImpl.getAttribute.ise")); + (sm.getString("sessionImpl.getAttribute.ise")); if (name == null) return null; @@ -33,7 +84,7 @@ public class StandardSession implements WxSession, InternalSession { public Enumeration getAttributeNames() { if (!isValidInternal()) throw new IllegalStateException - (sm.getString("sessionImpl.getAttributeNames.ise")); + (sm.getString("sessionImpl.getAttributeNames.ise")); Set names = new HashSet(); names.addAll(attributes.keySet()); @@ -45,7 +96,7 @@ public class StandardSession implements WxSession, InternalSession { // Name cannot be null if (name == null) throw new IllegalArgumentException - (sm.getString("sessionImpl.setAttribute.namenull")); + (sm.getString("sessionImpl.setAttribute.namenull")); // Null value is the same as removeAttribute() if (value == null) { @@ -56,97 +107,32 @@ public class StandardSession implements WxSession, InternalSession { // Validate our current state if (!isValidInternal()) throw new IllegalStateException(sm.getString( - "sessionImpl.setAttribute.ise", getIdInternal())); + "sessionImpl.setAttribute.ise", getIdInternal())); attributes.put(name, value); } - @Override public void removeAttribute(String name) { removeAttributeInternal(name); } - @Override public void invalidate() { if (!isValidInternal()) throw new IllegalStateException - (sm.getString("sessionImpl.invalidate.ise")); + (sm.getString("sessionImpl.invalidate.ise")); // Cause this session to expire expire(); } - // ------------------------------ InternalSession - /** - * The session identifier of this Session. - */ - protected String id = null; - - /** - * Flag indicating whether this session is valid or not. - */ - protected volatile boolean isValid = false; - - /** - * We are currently processing a session expiration, so bypass - * certain IllegalStateException tests. NOTE: This value is not - * included in the serialized version of this object. - */ - protected transient volatile boolean expiring = false; - - /** - * The Manager with which this Session is associated. - */ - protected transient InternalSessionManager manager = null; - - /** - * Type array. - */ - protected static final String EMPTY_ARRAY[] = new String[0]; - - /** - * The time this session was created, in milliseconds since midnight, - * January 1, 1970 GMT. - */ - protected long creationTime = 0L; - - /** - * The current accessed time for this session. - */ - protected volatile long thisAccessedTime = creationTime; - - /** - * The default maximum inactive interval for Sessions created by - * this Manager. - */ - protected int maxInactiveInterval = 30 * 60; - - /** - * The facade associated with this session. NOTE: This value is not - * included in the serialized version of this object. - */ - protected transient StandardSessionFacade facade = null; - - /** - * The access count for this session. - */ - protected transient AtomicInteger accessCount = null; - - - public StandardSession(InternalSessionManager manager) { - this.manager = manager; - this.accessCount = new AtomicInteger(); - } - - @Override public WxSession getSession() { - if (facade == null){ + if (facade == null) { facade = new StandardSessionFacade(this); } return (facade); @@ -161,16 +147,6 @@ public class StandardSession implements WxSession, InternalSession { return this.isValid; } - /** - * Set the isValid flag for this session. - * - * @param isValid The new value for the isValid flag - */ - @Override - public void setValid(boolean isValid) { - this.isValid = isValid; - } - @Override public boolean isValid() { if (!this.isValid) { @@ -197,6 +173,16 @@ public class StandardSession implements WxSession, InternalSession { return this.isValid; } + /** + * Set the isValid flag for this session. + * + * @param isValid The new value for the isValid flag + */ + @Override + public void setValid(boolean isValid) { + this.isValid = isValid; + } + @Override public String getIdInternal() { return (this.id); diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/session/StandardSessionManager.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/session/StandardSessionManager.java index f3a02695..cd14a1fd 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/session/StandardSessionManager.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/session/StandardSessionManager.java @@ -13,60 +13,26 @@ import java.util.concurrent.atomic.AtomicBoolean; */ public class StandardSessionManager implements WxSessionManager, InternalSessionManager { - protected final Logger log = LoggerFactory.getLogger(StandardSessionManager.class); - protected static final StringManager sm = - StringManager.getManager(Constants.Package); - + StringManager.getManager(Constants.Package); /** - * The set of currently active Sessions for this Manager, keyed by - * session identifier. + * The descriptive name of this Manager implementation (for logging). */ - protected Map sessions = new ConcurrentHashMap(); - - @Override - public WxSession getSession(String sessionId) { - return getSession(sessionId, true); - } - - @Override - public WxSession getSession(String sessionId, boolean create) { - if (sessionId == null) { - throw new IllegalStateException - (sm.getString("sessionManagerImpl.getSession.ise")); - } - - InternalSession session = findSession(sessionId); - if ((session != null) && !session.isValid()) { - session = null; - } - if (session != null) { - session.access(); - return session.getSession(); - } - - // Create a new session if requested and the response is not committed - if (!create) { - return (null); - } - - session = createSession(sessionId); - - if (session == null) { - return null; - } - - session.access(); - return session.getSession(); - } + private static final String name = "SessionManagerImpl"; + protected final Logger log = LoggerFactory.getLogger(StandardSessionManager.class); + private final Object maxActiveUpdateLock = new Object(); + /** + * 后台清理线程是否已经开启 + */ + private final AtomicBoolean backgroundProcessStarted = new AtomicBoolean(false); // -------------------------------------- InternalSessionManager /** - * The descriptive name of this Manager implementation (for logging). + * The set of currently active Sessions for this Manager, keyed by + * session identifier. */ - private static final String name = "SessionManagerImpl"; - + protected Map sessions = new ConcurrentHashMap(); /** * The maximum number of active Sessions allowed, or -1 for no limit. */ @@ -84,22 +50,13 @@ public class StandardSessionManager implements WxSessionManager, InternalSession protected int maxInactiveInterval = 30 * 60; // Number of sessions created by this manager - protected long sessionCounter=0; - - protected volatile int maxActive=0; - - private final Object maxActiveUpdateLock = new Object(); + protected long sessionCounter = 0; + protected volatile int maxActive = 0; /** * Processing time during session expiration. */ protected long processingTime = 0; - - /** - * Iteration count for background processing. - */ - private int count = 0; - /** * Frequency of the session expiration, and related manager operations. * Manager operations will be done once for the specified amount of @@ -107,16 +64,50 @@ public class StandardSessionManager implements WxSessionManager, InternalSession * checks will occur). */ protected int processExpiresFrequency = 6; - /** * background processor delay in seconds */ protected int backgroundProcessorDelay = 10; - /** - * 后台清理线程是否已经开启 + * Iteration count for background processing. */ - private final AtomicBoolean backgroundProcessStarted = new AtomicBoolean(false); + private int count = 0; + + @Override + public WxSession getSession(String sessionId) { + return getSession(sessionId, true); + } + + @Override + public WxSession getSession(String sessionId, boolean create) { + if (sessionId == null) { + throw new IllegalStateException + (sm.getString("sessionManagerImpl.getSession.ise")); + } + + InternalSession session = findSession(sessionId); + if ((session != null) && !session.isValid()) { + session = null; + } + if (session != null) { + session.access(); + return session.getSession(); + } + + // Create a new session if requested and the response is not committed + if (!create) { + return (null); + } + + session = createSession(sessionId); + + if (session == null) { + return null; + } + + session.access(); + return session.getSession(); + } @Override public void remove(InternalSession session) { @@ -131,7 +122,6 @@ public class StandardSessionManager implements WxSessionManager, InternalSession } - @Override public InternalSession findSession(String id) { @@ -145,15 +135,15 @@ public class StandardSessionManager implements WxSessionManager, InternalSession public InternalSession createSession(String sessionId) { if (sessionId == null) { throw new IllegalStateException - (sm.getString("sessionManagerImpl.createSession.ise")); + (sm.getString("sessionManagerImpl.createSession.ise")); } if ((maxActiveSessions >= 0) && - (getActiveSessions() >= maxActiveSessions)) { + (getActiveSessions() >= maxActiveSessions)) { rejectedSessions++; throw new TooManyActiveSessionsException( - sm.getString("sessionManagerImpl.createSession.tmase"), - maxActiveSessions); + sm.getString("sessionManagerImpl.createSession.tmase"), + maxActiveSessions); } // Recycle or create a Session instance @@ -216,14 +206,14 @@ public class StandardSessionManager implements WxSessionManager, InternalSession sessions.put(session.getIdInternal(), session); int size = getActiveSessions(); - if( size > maxActive ) { - synchronized(maxActiveUpdateLock) { - if( size > maxActive ) { + if (size > maxActive) { + synchronized (maxActiveUpdateLock) { + if (size > maxActive) { maxActive = size; } } } - + } /** @@ -251,19 +241,19 @@ public class StandardSessionManager implements WxSessionManager, InternalSession long timeNow = System.currentTimeMillis(); InternalSession sessions[] = findSessions(); - int expireHere = 0 ; + int expireHere = 0; - if(log.isDebugEnabled()) + if (log.isDebugEnabled()) log.debug("Start expire sessions {} at {} sessioncount {}", getName(), timeNow, sessions.length); for (int i = 0; i < sessions.length; i++) { - if (sessions[i]!=null && !sessions[i].isValid()) { + if (sessions[i] != null && !sessions[i].isValid()) { expireHere++; } } long timeEnd = System.currentTimeMillis(); - if(log.isDebugEnabled()) + if (log.isDebugEnabled()) log.debug("End expire sessions {} processingTime {} expired sessions: {}", getName(), timeEnd - timeNow, expireHere); - processingTime += ( timeEnd - timeNow ); + processingTime += (timeEnd - timeNow); } diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/session/TooManyActiveSessionsException.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/session/TooManyActiveSessionsException.java index bd0c0f2b..69fd89f8 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/session/TooManyActiveSessionsException.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/session/TooManyActiveSessionsException.java @@ -21,37 +21,34 @@ package me.chanjar.weixin.common.session; * reached and the server is refusing to create any new sessions. */ public class TooManyActiveSessionsException - extends IllegalStateException -{ - private static final long serialVersionUID = 1L; + extends IllegalStateException { + private static final long serialVersionUID = 1L; - /** - * The maximum number of active sessions the server will tolerate. - */ - private final int maxActiveSessions; + /** + * The maximum number of active sessions the server will tolerate. + */ + private final int maxActiveSessions; - /** - * Creates a new TooManyActiveSessionsException. - * - * @param message A description for the exception. - * @param maxActive The maximum number of active sessions allowed by the - * session manager. - */ - public TooManyActiveSessionsException(String message, - int maxActive) - { - super(message); - - maxActiveSessions = maxActive; - } - - /** - * Gets the maximum number of sessions allowed by the session manager. - * - * @return The maximum number of sessions allowed by the session manager. - */ - public int getMaxActiveSessions() - { - return maxActiveSessions; - } + /** + * Creates a new TooManyActiveSessionsException. + * + * @param message A description for the exception. + * @param maxActive The maximum number of active sessions allowed by the + * session manager. + */ + public TooManyActiveSessionsException(String message, + int maxActive) { + super(message); + + maxActiveSessions = maxActive; + } + + /** + * Gets the maximum number of sessions allowed by the session manager. + * + * @return The maximum number of sessions allowed by the session manager. + */ + public int getMaxActiveSessions() { + return maxActiveSessions; + } } diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/StringUtils.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/StringUtils.java index 4234a8c8..49acaeea 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/StringUtils.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/StringUtils.java @@ -7,7 +7,7 @@ public class StringUtils { /** *

Checks if a CharSequence is whitespace, empty ("") or null.

- * + *

*

    * StringUtils.isBlank(null)      = true
    * StringUtils.isBlank("")        = true
@@ -16,9 +16,8 @@ public class StringUtils {
    * StringUtils.isBlank("  bob  ") = false
    * 
* - * @param cs the CharSequence to check, may be null + * @param cs the CharSequence to check, may be null * @return {@code true} if the CharSequence is null, empty or whitespace - * @since 2.0 * @since 3.0 Changed signature from isBlank(String) to isBlank(CharSequence) */ public static boolean isBlank(CharSequence cs) { @@ -36,7 +35,7 @@ public class StringUtils { /** *

Checks if a CharSequence is not empty (""), not null and not whitespace only.

- * + *

*

    * StringUtils.isNotBlank(null)      = false
    * StringUtils.isNotBlank("")        = false
@@ -45,10 +44,9 @@ public class StringUtils {
    * StringUtils.isNotBlank("  bob  ") = true
    * 
* - * @param cs the CharSequence to check, may be null + * @param cs the CharSequence to check, may be null * @return {@code true} if the CharSequence is - * not empty and not null and not whitespace - * @since 2.0 + * not empty and not null and not whitespace * @since 3.0 Changed signature from isNotBlank(String) to isNotBlank(CharSequence) */ public static boolean isNotBlank(CharSequence cs) { @@ -57,7 +55,7 @@ public class StringUtils { /** *

Checks if a CharSequence is empty ("") or null.

- * + *

*

    * StringUtils.isEmpty(null)      = true
    * StringUtils.isEmpty("")        = true
@@ -65,12 +63,12 @@ public class StringUtils {
    * StringUtils.isEmpty("bob")     = false
    * StringUtils.isEmpty("  bob  ") = false
    * 
- * + *

*

NOTE: This method changed in Lang version 2.0. * It no longer trims the CharSequence. * That functionality is available in isBlank().

* - * @param cs the CharSequence to check, may be null + * @param cs the CharSequence to check, may be null * @return {@code true} if the CharSequence is empty or null * @since 3.0 Changed signature from isEmpty(String) to isEmpty(CharSequence) */ @@ -80,7 +78,7 @@ public class StringUtils { /** *

Checks if a CharSequence is not empty ("") and not null.

- * + *

*

    * StringUtils.isNotEmpty(null)      = false
    * StringUtils.isNotEmpty("")        = false
@@ -89,7 +87,7 @@ public class StringUtils {
    * StringUtils.isNotEmpty("  bob  ") = true
    * 
* - * @param cs the CharSequence to check, may be null + * @param cs the CharSequence to check, may be null * @return {@code true} if the CharSequence is not empty and not null * @since 3.0 Changed signature from isNotEmpty(String) to isNotEmpty(CharSequence) */ diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/ByteGroup.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/ByteGroup.java index de777dc9..6cd4a5ef 100755 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/ByteGroup.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/ByteGroup.java @@ -3,24 +3,24 @@ package me.chanjar.weixin.common.util.crypto; import java.util.ArrayList; public class ByteGroup { - ArrayList byteContainer = new ArrayList(); + ArrayList byteContainer = new ArrayList(); public byte[] toBytes() { - byte[] bytes = new byte[byteContainer.size()]; - for (int i = 0; i < byteContainer.size(); i++) { - bytes[i] = byteContainer.get(i); - } - return bytes; - } + byte[] bytes = new byte[byteContainer.size()]; + for (int i = 0; i < byteContainer.size(); i++) { + bytes[i] = byteContainer.get(i); + } + return bytes; + } - public ByteGroup addBytes(byte[] bytes) { - for (byte b : bytes) { - byteContainer.add(b); - } - return this; - } + public ByteGroup addBytes(byte[] bytes) { + for (byte b : bytes) { + byteContainer.add(b); + } + return this; + } - public int size() { - return byteContainer.size(); - } + public int size() { + return byteContainer.size(); + } } diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/PKCS7Encoder.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/PKCS7Encoder.java index 35771c47..2a01aae0 100755 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/PKCS7Encoder.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/PKCS7Encoder.java @@ -1,6 +1,6 @@ /** * 对公众平台发送给公众账号的消息加解密示例代码. - * + * * @copyright Copyright (c) 1998-2014 Tencent Inc. */ @@ -16,53 +16,53 @@ import java.util.Arrays; */ public class PKCS7Encoder { - private static final Charset CHARSET = Charset.forName("utf-8"); - private static final int BLOCK_SIZE = 32; + private static final Charset CHARSET = Charset.forName("utf-8"); + private static final int BLOCK_SIZE = 32; - /** - * 获得对明文进行补位填充的字节. - * - * @param count 需要进行填充补位操作的明文字节个数 - * @return 补齐用的字节数组 - */ - public static byte[] encode(int count) { - // 计算需要填充的位数 - int amountToPad = BLOCK_SIZE - (count % BLOCK_SIZE); - if (amountToPad == 0) { - amountToPad = BLOCK_SIZE; - } - // 获得补位所用的字符 - char padChr = chr(amountToPad); - String tmp = new String(); - for (int index = 0; index < amountToPad; index++) { - tmp += padChr; - } - return tmp.getBytes(CHARSET); - } + /** + * 获得对明文进行补位填充的字节. + * + * @param count 需要进行填充补位操作的明文字节个数 + * @return 补齐用的字节数组 + */ + public static byte[] encode(int count) { + // 计算需要填充的位数 + int amountToPad = BLOCK_SIZE - (count % BLOCK_SIZE); + if (amountToPad == 0) { + amountToPad = BLOCK_SIZE; + } + // 获得补位所用的字符 + char padChr = chr(amountToPad); + String tmp = new String(); + for (int index = 0; index < amountToPad; index++) { + tmp += padChr; + } + return tmp.getBytes(CHARSET); + } - /** - * 删除解密后明文的补位字符 - * - * @param decrypted 解密后的明文 - * @return 删除补位字符后的明文 - */ - public static byte[] decode(byte[] decrypted) { - int pad = (int) decrypted[decrypted.length - 1]; - if (pad < 1 || pad > 32) { - pad = 0; - } - return Arrays.copyOfRange(decrypted, 0, decrypted.length - pad); - } + /** + * 删除解密后明文的补位字符 + * + * @param decrypted 解密后的明文 + * @return 删除补位字符后的明文 + */ + public static byte[] decode(byte[] decrypted) { + int pad = (int) decrypted[decrypted.length - 1]; + if (pad < 1 || pad > 32) { + pad = 0; + } + return Arrays.copyOfRange(decrypted, 0, decrypted.length - pad); + } - /** - * 将数字转化成ASCII码对应的字符,用于对明文进行补码 - * - * @param a 需要转化的数字 - * @return 转化得到的字符 - */ - public static char chr(int a) { - byte target = (byte) (a & 0xFF); - return (char) target; - } + /** + * 将数字转化成ASCII码对应的字符,用于对明文进行补码 + * + * @param a 需要转化的数字 + * @return 转化得到的字符 + */ + public static char chr(int a) { + byte target = (byte) (a & 0xFF); + return (char) target; + } } diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/SHA1.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/SHA1.java index 38a6c28d..4f7503c6 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/SHA1.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/SHA1.java @@ -1,10 +1,10 @@ package me.chanjar.weixin.common.util.crypto; +import org.apache.commons.codec.digest.DigestUtils; + import java.security.NoSuchAlgorithmException; import java.util.Arrays; -import org.apache.commons.codec.digest.DigestUtils; - /** * Created by Daniel Qian on 14/10/19. */ @@ -37,4 +37,4 @@ public class SHA1 { } return DigestUtils.sha1Hex(sb.toString()); } - } +} diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/WxCryptUtil.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/WxCryptUtil.java index 87413334..c1341e7b 100755 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/WxCryptUtil.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/WxCryptUtil.java @@ -2,6 +2,10 @@ * 对公众平台发送给公众账号的消息加解密示例代码. * * @copyright Copyright (c) 1998-2014 Tencent Inc. + *

+ * 针对org.apache.commons.codec.binary.Base64, + * 需要导入架包commons-codec-1.9(或commons-codec-1.8等其他版本) + * 官方下载地址:http://commons.apache.org/proper/commons-codec/download_codec.cgi */ // ------------------------------------------------------------------------ @@ -62,12 +66,51 @@ public class WxCryptUtil { * @param appidOrCorpid 公众平台appid/corpid */ public WxCryptUtil(String token, String encodingAesKey, - String appidOrCorpid) { + String appidOrCorpid) { this.token = token; this.appidOrCorpid = appidOrCorpid; this.aesKey = Base64.decodeBase64(encodingAesKey + "="); } + /** + * 微信公众号支付签名算法(详见:http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=4_3) + * @param packageParams 原始参数 + * @param signKey 加密Key(即 商户Key) + * @return 签名字符串 + */ + public static String createSign(Map packageParams, + String signKey) { + SortedMap sortedMap = new TreeMap(); + sortedMap.putAll(packageParams); + + List keys = new ArrayList(packageParams.keySet()); + Collections.sort(keys); + + StringBuffer toSign = new StringBuffer(); + for (String key : keys) { + String value = packageParams.get(key); + if (null != value && !"".equals(value) && !"sign".equals(key) + && !"key".equals(key)) { + toSign.append(key + "=" + value + "&"); + } + } + toSign.append("key=" + signKey); + String sign = DigestUtils.md5Hex(toSign.toString()).toUpperCase(); + return sign; + } + + static String extractEncryptPart(String xml) { + try { + DocumentBuilder db = builderLocal.get(); + Document document = db.parse(new InputSource(new StringReader(xml))); + + Element root = document.getDocumentElement(); + return root.getElementsByTagName("Encrypt").item(0).getTextContent(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + /** * 将公众平台回复用户的消息加密打包. *

    @@ -107,7 +150,7 @@ public class WxCryptUtil { byte[] randomStringBytes = randomStr.getBytes(CHARSET); byte[] plainTextBytes = plainText.getBytes(CHARSET); byte[] bytesOfSizeInNetworkOrder = number2BytesInNetworkOrder( - plainTextBytes.length); + plainTextBytes.length); byte[] appIdBytes = appidOrCorpid.getBytes(CHARSET); // randomStr + networkBytesOrder + text + appid @@ -157,7 +200,7 @@ public class WxCryptUtil { * @return 解密后的原文 */ public String decrypt(String msgSignature, String timeStamp, String nonce, - String encryptedXml) { + String encryptedXml) { // 密钥,公众账号的app corpSecret // 提取密文 String cipherText = extractEncryptPart(encryptedXml); @@ -190,7 +233,7 @@ public class WxCryptUtil { Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); SecretKeySpec key_spec = new SecretKeySpec(aesKey, "AES"); IvParameterSpec iv = new IvParameterSpec( - Arrays.copyOfRange(aesKey, 0, 16)); + Arrays.copyOfRange(aesKey, 0, 16)); cipher.init(Cipher.DECRYPT_MODE, key_spec, iv); // 使用BASE64对密文进行解码 @@ -213,9 +256,9 @@ public class WxCryptUtil { int xmlLength = bytesNetworkOrder2Number(networkOrder); xmlContent = new String(Arrays.copyOfRange(bytes, 20, 20 + xmlLength), - CHARSET); + CHARSET); from_appid = new String( - Arrays.copyOfRange(bytes, 20 + xmlLength, bytes.length), CHARSET); + Arrays.copyOfRange(bytes, 20 + xmlLength, bytes.length), CHARSET); } catch (Exception e) { throw new RuntimeException(e); } @@ -229,33 +272,6 @@ public class WxCryptUtil { } - /** - * 微信公众号支付签名算法(详见:http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=4_3) - * @param packageParams 原始参数 - * @param signKey 加密Key(即 商户Key) - * @return 签名字符串 - */ - public static String createSign(Map packageParams, - String signKey) { - SortedMap sortedMap = new TreeMap(); - sortedMap.putAll(packageParams); - - List keys = new ArrayList(packageParams.keySet()); - Collections.sort(keys); - - StringBuffer toSign = new StringBuffer(); - for (String key : keys) { - String value = packageParams.get(key); - if (null != value && !"".equals(value) && !"sign".equals(key) - && !"key".equals(key)) { - toSign.append(key + "=" + value + "&"); - } - } - toSign.append("key=" + signKey); - String sign = DigestUtils.md5Hex(toSign.toString()).toUpperCase(); - return sign; - } - /** * 将一个数字转换成生成4个字节的网络字节序bytes数组 * @@ -308,24 +324,12 @@ public class WxCryptUtil { * @return 生成的xml字符串 */ private String generateXml(String encrypt, String signature, String timestamp, - String nonce) { + String nonce) { String format = "\n" + "\n" - + "\n" - + "%3$s\n" + "\n" - + ""; + + "\n" + + "%3$s\n" + "\n" + + ""; return String.format(format, encrypt, signature, timestamp, nonce); } - static String extractEncryptPart(String xml) { - try { - DocumentBuilder db = builderLocal.get(); - Document document = db.parse(new InputSource(new StringReader(xml))); - - Element root = document.getDocumentElement(); - return root.getElementsByTagName("Encrypt").item(0).getTextContent(); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - } diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/fs/FileUtils.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/fs/FileUtils.java index 35c50e3f..706ced39 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/fs/FileUtils.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/fs/FileUtils.java @@ -10,17 +10,18 @@ public class FileUtils { /** * 创建临时文件 + * * @param inputStream - * @param name 文件名 - * @param ext 扩展名 - * @param tmpDirFile 临时文件夹目录 + * @param name 文件名 + * @param ext 扩展名 + * @param tmpDirFile 临时文件夹目录 */ public static File createTmpFile(InputStream inputStream, String name, String ext, File tmpDirFile) throws IOException { FileOutputStream fos = null; try { File tmpFile; if (tmpDirFile == null) { - tmpFile = File.createTempFile(name, '.' + ext); + tmpFile = File.createTempFile(name, '.' + ext); } else { tmpFile = File.createTempFile(name, '.' + ext, tmpDirFile); } @@ -51,12 +52,13 @@ public class FileUtils { /** * 创建临时文件 + * * @param inputStream - * @param name 文件名 - * @param ext 扩展名 + * @param name 文件名 + * @param ext 扩展名 */ public static File createTmpFile(InputStream inputStream, String name, String ext) throws IOException { return createTmpFile(inputStream, name, ext, null); } - + } diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/ApacheHttpClientBuilder.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/ApacheHttpClientBuilder.java index c821d86c..8bd900ca 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/ApacheHttpClientBuilder.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/ApacheHttpClientBuilder.java @@ -10,36 +10,42 @@ public interface ApacheHttpClientBuilder { /** * 构建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 */ ApacheHttpClientBuilder sslConnectionSocketFactory(SSLConnectionSocketFactory sslConnectionSocketFactory); diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/DefaultApacheHttpHttpClientBuilder.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/DefaultApacheHttpHttpClientBuilder.java index aa20fa0b..d4701fca 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/DefaultApacheHttpHttpClientBuilder.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/DefaultApacheHttpHttpClientBuilder.java @@ -94,7 +94,7 @@ public class DefaultApacheHttpHttpClientBuilder implements ApacheHttpClientBuild return this; } - public ApacheHttpClientBuilder sslConnectionSocketFactory(SSLConnectionSocketFactory sslConnectionSocketFactory){ + public ApacheHttpClientBuilder sslConnectionSocketFactory(SSLConnectionSocketFactory sslConnectionSocketFactory) { this.sslConnectionSocketFactory = sslConnectionSocketFactory; return this; } @@ -103,18 +103,18 @@ public class DefaultApacheHttpHttpClientBuilder implements ApacheHttpClientBuild return idleConnectionMonitorThread; } - private void prepare(){ + private void prepare() { Registry registry = RegistryBuilder.create() - .register("http", plainConnectionSocketFactory) - .register("https", sslConnectionSocketFactory) - .build(); + .register("http", plainConnectionSocketFactory) + .register("https", sslConnectionSocketFactory) + .build(); connectionManager = new PoolingHttpClientConnectionManager(registry); connectionManager.setMaxTotal(maxTotalConn); connectionManager.setDefaultMaxPerRoute(maxConnPerHost); connectionManager.setDefaultSocketConfig( - SocketConfig.copy(SocketConfig.DEFAULT) - .setSoTimeout(soTimeout) - .build() + SocketConfig.copy(SocketConfig.DEFAULT) + .setSoTimeout(soTimeout) + .build() ); idleConnectionMonitorThread = new IdleConnectionMonitorThread(connectionManager, idleConnTimeout, checkWaitTime); @@ -122,22 +122,22 @@ public class DefaultApacheHttpHttpClientBuilder implements ApacheHttpClientBuild idleConnectionMonitorThread.start(); httpClientBuilder = HttpClients.custom() - .setConnectionManager(connectionManager) - .setDefaultRequestConfig( - RequestConfig.custom() - .setSocketTimeout(soTimeout) - .setConnectTimeout(connectionTimeout) - .setConnectionRequestTimeout(connectionRequestTimeout) - .build() - ) - .setRetryHandler(httpRequestRetryHandler); + .setConnectionManager(connectionManager) + .setDefaultRequestConfig( + RequestConfig.custom() + .setSocketTimeout(soTimeout) + .setConnectTimeout(connectionTimeout) + .setConnectionRequestTimeout(connectionRequestTimeout) + .build() + ) + .setRetryHandler(httpRequestRetryHandler); if (StringUtils.isNotBlank(httpProxyHost) && StringUtils.isNotBlank(httpProxyUsername)) { // 使用代理服务器 需要用户认证的代理服务器 CredentialsProvider credsProvider = new BasicCredentialsProvider(); credsProvider.setCredentials( - new AuthScope(httpProxyHost, httpProxyPort), - new UsernamePasswordCredentials(httpProxyUsername, httpProxyPassword)); + new AuthScope(httpProxyHost, httpProxyPort), + new UsernamePasswordCredentials(httpProxyUsername, httpProxyPassword)); httpClientBuilder.setDefaultCredentialsProvider(credsProvider); } @@ -148,7 +148,7 @@ public class DefaultApacheHttpHttpClientBuilder implements ApacheHttpClientBuild } public CloseableHttpClient build() { - if(!prepared){ + if (!prepared) { prepare(); prepared = true; } diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/InputStreamResponseHandler.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/InputStreamResponseHandler.java index 1bf13b9c..6433c472 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/InputStreamResponseHandler.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/InputStreamResponseHandler.java @@ -1,8 +1,5 @@ package me.chanjar.weixin.common.util.http; -import java.io.IOException; -import java.io.InputStream; - import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.StatusLine; @@ -10,10 +7,13 @@ import org.apache.http.client.HttpResponseException; import org.apache.http.client.ResponseHandler; import org.apache.http.util.EntityUtils; +import java.io.IOException; +import java.io.InputStream; + public class InputStreamResponseHandler implements ResponseHandler { public static final ResponseHandler INSTANCE = new InputStreamResponseHandler(); - + public InputStream handleResponse(final HttpResponse response) throws IOException { final StatusLine statusLine = response.getStatusLine(); final HttpEntity entity = response.getEntity(); diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/JoddGetRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/JoddGetRequestExecutor.java index 10011304..a2ff7a56 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/JoddGetRequestExecutor.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/JoddGetRequestExecutor.java @@ -18,39 +18,39 @@ import java.io.IOException; */ public class JoddGetRequestExecutor implements RequestExecutor { - @Override - public String execute(CloseableHttpClient httpclient, HttpHost httpProxy, String uri, - String queryParam) throws WxErrorException, IOException { - if (queryParam != null) { - if (uri.indexOf('?') == -1) { - uri += '?'; - } - uri += uri.endsWith("?") ? queryParam : '&' + queryParam; - } - - SocketHttpConnectionProvider provider = new SocketHttpConnectionProvider(); - - if (httpProxy != null) { - ProxyInfo proxyInfoObj = new ProxyInfo( - ProxyInfo.ProxyType.HTTP, - httpProxy.getHostName(), - httpProxy.getPort(), "", ""); - provider.useProxy(proxyInfoObj); - } - - HttpRequest request = HttpRequest.get(uri); - request.method("GET"); - request.charset("UTF-8"); - - HttpResponse response = request.open(provider).send(); - response.charset("UTF-8"); - String result = response.bodyText(); - - WxError error = WxError.fromJson(result); - if (error.getErrorCode() != 0) { - throw new WxErrorException(error); - } - return result; + @Override + public String execute(CloseableHttpClient httpclient, HttpHost httpProxy, String uri, + String queryParam) throws WxErrorException, IOException { + if (queryParam != null) { + if (uri.indexOf('?') == -1) { + uri += '?'; + } + uri += uri.endsWith("?") ? queryParam : '&' + queryParam; } + SocketHttpConnectionProvider provider = new SocketHttpConnectionProvider(); + + if (httpProxy != null) { + ProxyInfo proxyInfoObj = new ProxyInfo( + ProxyInfo.ProxyType.HTTP, + httpProxy.getHostName(), + httpProxy.getPort(), "", ""); + provider.useProxy(proxyInfoObj); + } + + HttpRequest request = HttpRequest.get(uri); + request.method("GET"); + request.charset("UTF-8"); + + HttpResponse response = request.open(provider).send(); + response.charset("UTF-8"); + String result = response.bodyText(); + + WxError error = WxError.fromJson(result); + if (error.getErrorCode() != 0) { + throw new WxErrorException(error); + } + return result; + } + } diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/JoddPostRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/JoddPostRequestExecutor.java index d054835b..771fb46e 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/JoddPostRequestExecutor.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/JoddPostRequestExecutor.java @@ -18,33 +18,33 @@ import java.io.IOException; */ public class JoddPostRequestExecutor implements RequestExecutor { - @Override - public String execute(CloseableHttpClient httpclient, HttpHost httpProxy, String uri, - String postEntity) throws WxErrorException, IOException { - SocketHttpConnectionProvider provider = new SocketHttpConnectionProvider(); - - if (httpProxy != null) { - ProxyInfo proxyInfoObj = new ProxyInfo( - ProxyInfo.ProxyType.HTTP, - httpProxy.getAddress().getHostAddress(), - httpProxy.getPort(), "", ""); - provider.useProxy(proxyInfoObj); - } - - HttpRequest request = HttpRequest.get(uri); - request.method("POST"); - request.charset("UTF-8"); - request.bodyText(postEntity); - - HttpResponse response = request.open(provider).send(); - response.charset("UTF-8"); - String result = response.bodyText(); - - WxError error = WxError.fromJson(result); - if (error.getErrorCode() != 0) { - throw new WxErrorException(error); - } - return result; + @Override + public String execute(CloseableHttpClient httpclient, HttpHost httpProxy, String uri, + String postEntity) throws WxErrorException, IOException { + SocketHttpConnectionProvider provider = new SocketHttpConnectionProvider(); + + if (httpProxy != null) { + ProxyInfo proxyInfoObj = new ProxyInfo( + ProxyInfo.ProxyType.HTTP, + httpProxy.getAddress().getHostAddress(), + httpProxy.getPort(), "", ""); + provider.useProxy(proxyInfoObj); } + HttpRequest request = HttpRequest.get(uri); + request.method("POST"); + request.charset("UTF-8"); + request.bodyText(postEntity); + + HttpResponse response = request.open(provider).send(); + response.charset("UTF-8"); + String result = response.bodyText(); + + WxError error = WxError.fromJson(result); + if (error.getErrorCode() != 0) { + throw new WxErrorException(error); + } + return result; + } + } 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 306ac258..5ffac4bf 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 @@ -6,7 +6,6 @@ import me.chanjar.weixin.common.util.StringUtils; import me.chanjar.weixin.common.util.fs.FileUtils; import org.apache.http.Header; import org.apache.http.HttpHost; -import org.apache.http.client.ClientProtocolException; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; @@ -21,11 +20,11 @@ import java.util.regex.Pattern; /** * 下载媒体文件请求执行器,请求的参数是String, 返回的结果是File - * @author Daniel Qian * + * @author Daniel Qian */ public class MediaDownloadRequestExecutor implements RequestExecutor { - + private File tmpDirFile; public MediaDownloadRequestExecutor() { @@ -36,7 +35,7 @@ public class MediaDownloadRequestExecutor implements RequestExecutor { @@ -33,10 +32,10 @@ public class MediaUploadRequestExecutor implements RequestExecutor { /** - * * @param httpclient 传入的httpClient - * @param httpProxy http代理对象,如果没有配置代理则为空 - * @param uri uri - * @param data 数据 + * @param httpProxy http代理对象,如果没有配置代理则为空 + * @param uri uri + * @param data 数据 * @throws WxErrorException * @throws ClientProtocolException * @throws 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 36852377..ec221e28 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 @@ -3,7 +3,6 @@ package me.chanjar.weixin.common.util.http; import me.chanjar.weixin.common.bean.result.WxError; import me.chanjar.weixin.common.exception.WxErrorException; import org.apache.http.HttpHost; -import org.apache.http.client.ClientProtocolException; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; @@ -13,8 +12,8 @@ import java.io.IOException; /** * 简单的GET请求执行器,请求的参数是String, 返回的结果也是String - * @author Daniel Qian * + * @author Daniel Qian */ public class SimpleGetRequestExecutor implements RequestExecutor { @@ -39,7 +38,7 @@ public class SimpleGetRequestExecutor implements RequestExecutor throw new WxErrorException(error); } return responseContent; - }finally { + } finally { httpGet.releaseConnection(); } } diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimplePostRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimplePostRequestExecutor.java index e60ee06f..ad67bd51 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimplePostRequestExecutor.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimplePostRequestExecutor.java @@ -4,7 +4,6 @@ import me.chanjar.weixin.common.bean.result.WxError; import me.chanjar.weixin.common.exception.WxErrorException; import org.apache.http.Consts; import org.apache.http.HttpHost; -import org.apache.http.client.ClientProtocolException; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; @@ -15,8 +14,8 @@ import java.io.IOException; /** * 简单的POST请求执行器,请求的参数是String, 返回的结果也是String - * @author Daniel Qian * + * @author Daniel Qian */ public class SimplePostRequestExecutor implements RequestExecutor { @@ -40,7 +39,7 @@ public class SimplePostRequestExecutor implements RequestExecutor { public static final ResponseHandler INSTANCE = new Utf8ResponseHandler(); - + public String handleResponse(final HttpResponse response) throws IOException { final StatusLine statusLine = response.getStatusLine(); final HttpEntity entity = response.getEntity(); diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/GsonHelper.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/GsonHelper.java index 9c274569..3c106fbf 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/GsonHelper.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/GsonHelper.java @@ -15,101 +15,101 @@ import com.google.gson.JsonObject; public class GsonHelper { - public static boolean isNull(JsonElement element) { - return element == null || element.isJsonNull(); - } - - public static boolean isNotNull(JsonElement element) { - return !isNull(element); - } - - public static Long getLong(JsonObject json, String property) { - return getAsLong(json.get(property)); - } - - public static long getPrimitiveLong(JsonObject json, String property) { - return getAsPrimitiveLong(json.get(property)); - } - - public static Integer getInteger(JsonObject json, String property) { - return getAsInteger(json.get(property)); - } - - public static int getPrimitiveInteger(JsonObject json, String property) { - return getAsPrimitiveInt(json.get(property)); - } - - public static Double getDouble(JsonObject json, String property) { - return getAsDouble(json.get(property)); - } - - public static double getPrimitiveDouble(JsonObject json, String property) { - return getAsPrimitiveDouble(json.get(property)); - } - - public static Float getFloat(JsonObject json, String property) { - return getAsFloat(json.get(property)); - } - - public static float getPrimitiveFloat(JsonObject json, String property) { - return getAsPrimitiveFloat(json.get(property)); - } - - public static Boolean getBoolean(JsonObject json, String property) { - return getAsBoolean(json.get(property)); - } - - public static String getString(JsonObject json, String property) { - return getAsString(json.get(property)); - } - - public static String getAsString(JsonElement element) { - return isNull(element) ? null : element.getAsString(); - } - - public static Long getAsLong(JsonElement element) { - return isNull(element) ? null : element.getAsLong(); - } - - public static long getAsPrimitiveLong(JsonElement element) { - Long r = getAsLong(element); - return r == null ? 0l : r; - } - - public static Integer getAsInteger(JsonElement element) { - return isNull(element) ? null : element.getAsInt(); - } - - public static int getAsPrimitiveInt(JsonElement element) { - Integer r = getAsInteger(element); - return r == null ? 0 : r; - } - - public static Boolean getAsBoolean(JsonElement element) { - return isNull(element) ? null : element.getAsBoolean(); - } - - public static boolean getAsPrimitiveBool(JsonElement element) { - Boolean r = getAsBoolean(element); - return r != null && r.booleanValue(); - } - - public static Double getAsDouble(JsonElement element) { - return isNull(element) ? null : element.getAsDouble(); - } - - public static double getAsPrimitiveDouble(JsonElement element) { - Double r = getAsDouble(element); - return r == null ? 0d : r; - } - - public static Float getAsFloat(JsonElement element) { - return isNull(element) ? null : element.getAsFloat(); - } - - public static float getAsPrimitiveFloat(JsonElement element) { - Float r = getAsFloat(element); - return r == null ? 0f : r; - } - + public static boolean isNull(JsonElement element) { + return element == null || element.isJsonNull(); + } + + public static boolean isNotNull(JsonElement element) { + return !isNull(element); + } + + public static Long getLong(JsonObject json, String property) { + return getAsLong(json.get(property)); + } + + public static long getPrimitiveLong(JsonObject json, String property) { + return getAsPrimitiveLong(json.get(property)); + } + + public static Integer getInteger(JsonObject json, String property) { + return getAsInteger(json.get(property)); + } + + public static int getPrimitiveInteger(JsonObject json, String property) { + return getAsPrimitiveInt(json.get(property)); + } + + public static Double getDouble(JsonObject json, String property) { + return getAsDouble(json.get(property)); + } + + public static double getPrimitiveDouble(JsonObject json, String property) { + return getAsPrimitiveDouble(json.get(property)); + } + + public static Float getFloat(JsonObject json, String property) { + return getAsFloat(json.get(property)); + } + + public static float getPrimitiveFloat(JsonObject json, String property) { + return getAsPrimitiveFloat(json.get(property)); + } + + public static Boolean getBoolean(JsonObject json, String property) { + return getAsBoolean(json.get(property)); + } + + public static String getString(JsonObject json, String property) { + return getAsString(json.get(property)); + } + + public static String getAsString(JsonElement element) { + return isNull(element) ? null : element.getAsString(); + } + + public static Long getAsLong(JsonElement element) { + return isNull(element) ? null : element.getAsLong(); + } + + public static long getAsPrimitiveLong(JsonElement element) { + Long r = getAsLong(element); + return r == null ? 0l : r; + } + + public static Integer getAsInteger(JsonElement element) { + return isNull(element) ? null : element.getAsInt(); + } + + public static int getAsPrimitiveInt(JsonElement element) { + Integer r = getAsInteger(element); + return r == null ? 0 : r; + } + + public static Boolean getAsBoolean(JsonElement element) { + return isNull(element) ? null : element.getAsBoolean(); + } + + public static boolean getAsPrimitiveBool(JsonElement element) { + Boolean r = getAsBoolean(element); + return r != null && r.booleanValue(); + } + + public static Double getAsDouble(JsonElement element) { + return isNull(element) ? null : element.getAsDouble(); + } + + public static double getAsPrimitiveDouble(JsonElement element) { + Double r = getAsDouble(element); + return r == null ? 0d : r; + } + + public static Float getAsFloat(JsonElement element) { + return isNull(element) ? null : element.getAsFloat(); + } + + public static float getAsPrimitiveFloat(JsonElement element) { + Float r = getAsFloat(element); + return r == null ? 0f : r; + } + } diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxAccessTokenAdapter.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxAccessTokenAdapter.java index cfe4edb2..58be83ac 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxAccessTokenAdapter.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxAccessTokenAdapter.java @@ -14,9 +14,7 @@ import me.chanjar.weixin.common.bean.WxAccessToken; import java.lang.reflect.Type; /** - * * @author Daniel Qian - * */ public class WxAccessTokenAdapter implements JsonDeserializer { @@ -32,5 +30,5 @@ public class WxAccessTokenAdapter implements JsonDeserializer { } return accessToken; } - + } diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxErrorAdapter.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxErrorAdapter.java index 74b9ded8..30c3708d 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxErrorAdapter.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxErrorAdapter.java @@ -14,9 +14,7 @@ import me.chanjar.weixin.common.bean.result.WxError; import java.lang.reflect.Type; /** - * * @author Daniel Qian - * */ public class WxErrorAdapter implements JsonDeserializer { @@ -33,5 +31,5 @@ public class WxErrorAdapter implements JsonDeserializer { wxError.setJson(json.toString()); return wxError; } - + } diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxGsonBuilder.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxGsonBuilder.java index 7aa56965..072ee38b 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxGsonBuilder.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxGsonBuilder.java @@ -2,9 +2,9 @@ package me.chanjar.weixin.common.util.json; import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import me.chanjar.weixin.common.bean.WxAccessToken; import me.chanjar.weixin.common.bean.WxMenu; import me.chanjar.weixin.common.bean.result.WxError; -import me.chanjar.weixin.common.bean.WxAccessToken; import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; public class WxGsonBuilder { diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxMediaUploadResultAdapter.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxMediaUploadResultAdapter.java index 35eb18b4..16317a40 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxMediaUploadResultAdapter.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxMediaUploadResultAdapter.java @@ -14,9 +14,7 @@ import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; import java.lang.reflect.Type; /** - * * @author Daniel Qian - * */ public class WxMediaUploadResultAdapter implements JsonDeserializer { @@ -38,5 +36,5 @@ public class WxMediaUploadResultAdapter implements JsonDeserializer, JsonDeserializer { @@ -36,11 +27,11 @@ public class WxMenuGsonAdapter implements JsonSerializer, JsonDeserializ buttonArray.add(buttonJson); } json.add("button", buttonArray); - + if (menu.getMatchRule() != null) { json.add("matchrule", convertToJson(menu.getMatchRule())); } - + return json; } @@ -60,15 +51,15 @@ public class WxMenuGsonAdapter implements JsonSerializer, JsonDeserializ return buttonJson; } - protected JsonObject convertToJson(WxMenu.WxMenuRule menuRule){ + protected JsonObject convertToJson(WxMenu.WxMenuRule menuRule) { JsonObject matchRule = new JsonObject(); - matchRule.addProperty("tag_id",menuRule.getTagId()); - matchRule.addProperty("sex",menuRule.getSex()); - matchRule.addProperty("country",menuRule.getCountry()); - matchRule.addProperty("province",menuRule.getProvince()); - matchRule.addProperty("city",menuRule.getCity()); - matchRule.addProperty("client_platform_type",menuRule.getClientPlatformType()); - matchRule.addProperty("language",menuRule.getLanguage()); + matchRule.addProperty("tag_id", menuRule.getTagId()); + matchRule.addProperty("sex", menuRule.getSex()); + matchRule.addProperty("country", menuRule.getCountry()); + matchRule.addProperty("province", menuRule.getProvince()); + matchRule.addProperty("city", menuRule.getCity()); + matchRule.addProperty("client_platform_type", menuRule.getClientPlatformType()); + matchRule.addProperty("language", menuRule.getLanguage()); return matchRule; } @@ -96,7 +87,7 @@ public class WxMenuGsonAdapter implements JsonSerializer, JsonDeserializ } return menu; } - + protected WxMenu.WxMenuButton convertFromJson(JsonObject json) { WxMenu.WxMenuButton button = new WxMenu.WxMenuButton(); button.setName(GsonHelper.getString(json, "name")); diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/res/StringManager.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/res/StringManager.java index 0abe4d89..94303fec 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/res/StringManager.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/res/StringManager.java @@ -18,30 +18,24 @@ package me.chanjar.weixin.common.util.res; import java.text.MessageFormat; -import java.util.Enumeration; -import java.util.Hashtable; -import java.util.LinkedHashMap; -import java.util.Locale; -import java.util.Map; -import java.util.MissingResourceException; -import java.util.ResourceBundle; +import java.util.*; /** * An internationalization / localization helper class which reduces * the bother of handling ResourceBundles and takes care of the * common cases of message formating which otherwise require the * creation of Object arrays and such. - * + *

    *

    The StringManager operates on a package basis. One StringManager * per package can be created and accessed via the getManager method * call. - * + *

    *

    The StringManager will look for a ResourceBundle named by * the package name given plus the suffix of "LocalStrings". In * practice, this means that the localized information will be contained * in a LocalStrings.properties file located in the package * directory of the classpath. - * + *

    *

    Please see the documentation for java.util.ResourceBundle for * more information. * @@ -52,152 +46,80 @@ import java.util.ResourceBundle; */ public class StringManager { - private static int LOCALE_CACHE_SIZE = 10; - - /** - * The ResourceBundle for this StringManager. - */ - private final ResourceBundle bundle; - private final Locale locale; - - /** - * Creates a new StringManager for a given package. This is a - * private method and all access to it is arbitrated by the - * static getManager method call so that only one StringManager - * per package will be created. - * - * @param packageName Name of package to create StringManager for. - */ - private StringManager(String packageName, Locale locale) { - String bundleName = packageName + ".LocalStrings"; - ResourceBundle bnd = null; + private static final Map> managers = + new Hashtable>(); + private static int LOCALE_CACHE_SIZE = 10; + /** + * The ResourceBundle for this StringManager. + */ + private final ResourceBundle bundle; + private final Locale locale; + + /** + * Creates a new StringManager for a given package. This is a + * private method and all access to it is arbitrated by the + * static getManager method call so that only one StringManager + * per package will be created. + * + * @param packageName Name of package to create StringManager for. + */ + private StringManager(String packageName, Locale locale) { + String bundleName = packageName + ".LocalStrings"; + ResourceBundle bnd = null; + try { + bnd = ResourceBundle.getBundle(bundleName, locale); + } catch (MissingResourceException ex) { + // Try from the current loader (that's the case for trusted apps) + // Should only be required if using a TC5 style classloader structure + // where common != shared != server + ClassLoader cl = Thread.currentThread().getContextClassLoader(); + if (cl != null) { try { - bnd = ResourceBundle.getBundle(bundleName, locale); - } catch( MissingResourceException ex ) { - // Try from the current loader (that's the case for trusted apps) - // Should only be required if using a TC5 style classloader structure - // where common != shared != server - ClassLoader cl = Thread.currentThread().getContextClassLoader(); - if( cl != null ) { - try { - bnd = ResourceBundle.getBundle(bundleName, locale, cl); - } catch(MissingResourceException ex2) { - // Ignore - } - } - } - bundle = bnd; - // Get the actual locale, which may be different from the requested one - if (bundle != null) { - Locale bundleLocale = bundle.getLocale(); - if (bundleLocale.equals(Locale.ROOT)) { - this.locale = Locale.ENGLISH; - } else { - this.locale = bundleLocale; - } - } else { - this.locale = null; + bnd = ResourceBundle.getBundle(bundleName, locale, cl); + } catch (MissingResourceException ex2) { + // Ignore } + } } - - /** - Get a string from the underlying resource bundle or return - null if the String is not found. - - @param key to desired resource String - @return resource String matching key from underlying - bundle or null if not found. - @throws IllegalArgumentException if key is null. - */ - public String getString(String key) { - if(key == null){ - String msg = "key may not have a null value"; - - throw new IllegalArgumentException(msg); - } - - String str = null; - - try { - // Avoid NPE if bundle is null and treat it like an MRE - if (bundle != null) { - str = bundle.getString(key); - } - } catch(MissingResourceException mre) { - //bad: shouldn't mask an exception the following way: - // str = "[cannot find message associated with key '" + key + - // "' due to " + mre + "]"; - // because it hides the fact that the String was missing - // from the calling code. - //good: could just throw the exception (or wrap it in another) - // but that would probably cause much havoc on existing - // code. - //better: consistent with container pattern to - // simply return null. Calling code can then do - // a null check. - str = null; - } - - return str; + bundle = bnd; + // Get the actual locale, which may be different from the requested one + if (bundle != null) { + Locale bundleLocale = bundle.getLocale(); + if (bundleLocale.equals(Locale.ROOT)) { + this.locale = Locale.ENGLISH; + } else { + this.locale = bundleLocale; + } + } else { + this.locale = null; } - - /** - * Get a string from the underlying resource bundle and format - * it with the given set of arguments. - * - * @param key - * @param args - */ - public String getString(final String key, final Object... args) { - String value = getString(key); - if (value == null) { - value = key; - } - - MessageFormat mf = new MessageFormat(value); - mf.setLocale(locale); - return mf.format(args, new StringBuffer(), null).toString(); - } - - /** - * Identify the Locale this StringManager is associated with - */ - public Locale getLocale() { - return locale; - } - - // -------------------------------------------------------------- - // STATIC SUPPORT METHODS - // -------------------------------------------------------------- - - private static final Map> managers = - new Hashtable>(); - - /** - * Get the StringManager for a particular package. If a manager for - * a package already exists, it will be reused, else a new - * StringManager will be created and returned. - * - * @param packageName The package name - */ - public static final synchronized StringManager getManager( - String packageName) { - return getManager(packageName, Locale.getDefault()); - } - - /** - * Get the StringManager for a particular package and Locale. If a manager - * for a package/Locale combination already exists, it will be reused, else - * a new StringManager will be created and returned. - * - * @param packageName The package name - * @param locale The Locale - */ - public static final synchronized StringManager getManager( - String packageName, Locale locale) { - - Map map = managers.get(packageName); - if (map == null) { + } + + /** + * Get the StringManager for a particular package. If a manager for + * a package already exists, it will be reused, else a new + * StringManager will be created and returned. + * + * @param packageName The package name + */ + public static final synchronized StringManager getManager( + String packageName) { + return getManager(packageName, Locale.getDefault()); + } + + /** + * Get the StringManager for a particular package and Locale. If a manager + * for a package/Locale combination already exists, it will be reused, else + * a new StringManager will be created and returned. + * + * @param packageName The package name + * @param locale The Locale + */ + public static final synchronized StringManager getManager( + String packageName, Locale locale) { + + Map map = managers.get(packageName); + if (map == null) { /* * Don't want the HashMap to be expanded beyond LOCALE_CACHE_SIZE. * Expansion occurs when size() exceeds capacity. Therefore keep @@ -206,43 +128,113 @@ public class StringManager { * for removal needs to use one less than the maximum desired size * */ - map = new LinkedHashMap(LOCALE_CACHE_SIZE, 1, true) { - private static final long serialVersionUID = 1L; - @Override - protected boolean removeEldestEntry( - Map.Entry eldest) { - return size() > (LOCALE_CACHE_SIZE - 1); - } - }; - managers.put(packageName, map); - } + map = new LinkedHashMap(LOCALE_CACHE_SIZE, 1, true) { + private static final long serialVersionUID = 1L; - StringManager mgr = map.get(locale); - if (mgr == null) { - mgr = new StringManager(packageName, locale); - map.put(locale, mgr); + @Override + protected boolean removeEldestEntry( + Map.Entry eldest) { + return size() > (LOCALE_CACHE_SIZE - 1); } - return mgr; + }; + managers.put(packageName, map); } - /** - * Retrieve the StringManager for a list of Locales. The first StringManager - * found will be returned. - * - * @param requestedLocales the list of Locales - * - * @return the found StringManager or the default StringManager - */ - public static StringManager getManager(String packageName, - Enumeration requestedLocales) { - while (requestedLocales.hasMoreElements()) { - Locale locale = requestedLocales.nextElement(); - StringManager result = getManager(packageName, locale); - if (result.getLocale().equals(locale)) { - return result; - } - } - // Return the default - return getManager(packageName); + StringManager mgr = map.get(locale); + if (mgr == null) { + mgr = new StringManager(packageName, locale); + map.put(locale, mgr); } + return mgr; + } + + // -------------------------------------------------------------- + // STATIC SUPPORT METHODS + // -------------------------------------------------------------- + + /** + * Retrieve the StringManager for a list of Locales. The first StringManager + * found will be returned. + * + * @param requestedLocales the list of Locales + * @return the found StringManager or the default StringManager + */ + public static StringManager getManager(String packageName, + Enumeration requestedLocales) { + while (requestedLocales.hasMoreElements()) { + Locale locale = requestedLocales.nextElement(); + StringManager result = getManager(packageName, locale); + if (result.getLocale().equals(locale)) { + return result; + } + } + // Return the default + return getManager(packageName); + } + + /** + * Get a string from the underlying resource bundle or return + * null if the String is not found. + * + * @param key to desired resource String + * @return resource String matching key from underlying + * bundle or null if not found. + * @throws IllegalArgumentException if key is null. + */ + public String getString(String key) { + if (key == null) { + String msg = "key may not have a null value"; + + throw new IllegalArgumentException(msg); + } + + String str = null; + + try { + // Avoid NPE if bundle is null and treat it like an MRE + if (bundle != null) { + str = bundle.getString(key); + } + } catch (MissingResourceException mre) { + //bad: shouldn't mask an exception the following way: + // str = "[cannot find message associated with key '" + key + + // "' due to " + mre + "]"; + // because it hides the fact that the String was missing + // from the calling code. + //good: could just throw the exception (or wrap it in another) + // but that would probably cause much havoc on existing + // code. + //better: consistent with container pattern to + // simply return null. Calling code can then do + // a null check. + str = null; + } + + return str; + } + + /** + * Get a string from the underlying resource bundle and format + * it with the given set of arguments. + * + * @param key + * @param args + */ + public String getString(final String key, final Object... args) { + String value = getString(key); + if (value == null) { + value = key; + } + + MessageFormat mf = new MessageFormat(value); + mf.setLocale(locale); + return mf.format(args, new StringBuffer(), null).toString(); + } + + /** + * Identify the Locale this StringManager is associated with + */ + public Locale getLocale() { + return locale; + } } diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/XStreamInitializer.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/XStreamInitializer.java index 1caa0a06..109acfc0 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/XStreamInitializer.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/XStreamInitializer.java @@ -1,7 +1,5 @@ package me.chanjar.weixin.common.util.xml; -import java.io.Writer; - import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.core.util.QuickWriter; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; @@ -10,6 +8,8 @@ import com.thoughtworks.xstream.io.xml.XppDriver; import com.thoughtworks.xstream.security.NullPermission; import com.thoughtworks.xstream.security.PrimitiveTypePermission; +import java.io.Writer; + public class XStreamInitializer { public static XStream getInstance() { @@ -22,6 +22,7 @@ public class XStreamInitializer { protected String SUFFIX_CDATA = "]]>"; protected String PREFIX_MEDIA_ID = ""; protected String SUFFIX_MEDIA_ID = ""; + @Override protected void writeText(QuickWriter writer, String text) { if (text.startsWith(PREFIX_CDATA) && text.endsWith(SUFFIX_CDATA)) { diff --git a/weixin-java-common/src/test/java/me/chanjar/weixin/common/bean/WxAccessTokenTest.java b/weixin-java-common/src/test/java/me/chanjar/weixin/common/bean/WxAccessTokenTest.java index d236c631..b2bc7fe7 100644 --- a/weixin-java-common/src/test/java/me/chanjar/weixin/common/bean/WxAccessTokenTest.java +++ b/weixin-java-common/src/test/java/me/chanjar/weixin/common/bean/WxAccessTokenTest.java @@ -14,5 +14,5 @@ public class WxAccessTokenTest { Assert.assertTrue(wxError.getExpiresIn() == 7200); } - + } diff --git a/weixin-java-common/src/test/java/me/chanjar/weixin/common/bean/WxErrorTest.java b/weixin-java-common/src/test/java/me/chanjar/weixin/common/bean/WxErrorTest.java index 51e9dab3..3fe40795 100644 --- a/weixin-java-common/src/test/java/me/chanjar/weixin/common/bean/WxErrorTest.java +++ b/weixin-java-common/src/test/java/me/chanjar/weixin/common/bean/WxErrorTest.java @@ -15,7 +15,7 @@ public class WxErrorTest { Assert.assertEquals(wxError.getErrorMsg(), "invalid openid"); } - + public void testFromBadJson1() { String json = "{ \"errcode\": 40003, \"errmsg\": \"invalid openid\", \"media_id\": \"12323423dsfafsf232f\" }"; @@ -24,7 +24,7 @@ public class WxErrorTest { Assert.assertEquals(wxError.getErrorMsg(), "invalid openid"); } - + public void testFromBadJson2() { String json = "{\"access_token\":\"ACCESS_TOKEN\",\"expires_in\":7200}"; @@ -33,5 +33,5 @@ public class WxErrorTest { Assert.assertEquals(wxError.getErrorMsg(), null); } - + } diff --git a/weixin-java-common/src/test/java/me/chanjar/weixin/common/bean/WxMenuTest.java b/weixin-java-common/src/test/java/me/chanjar/weixin/common/bean/WxMenuTest.java index 2ae12c2c..b7492b37 100644 --- a/weixin-java-common/src/test/java/me/chanjar/weixin/common/bean/WxMenuTest.java +++ b/weixin-java-common/src/test/java/me/chanjar/weixin/common/bean/WxMenuTest.java @@ -8,51 +8,51 @@ import org.testng.annotations.Test; @Test public class WxMenuTest { - @Test(dataProvider="wxReturnMenu") + @Test(dataProvider = "wxReturnMenu") public void testFromJson(String json) { WxMenu menu = WxMenu.fromJson(json); Assert.assertEquals(menu.getButtons().size(), 3); } - - @Test(dataProvider="wxPushMenu") + + @Test(dataProvider = "wxPushMenu") public void testToJson(String json) { WxMenu menu = new WxMenu(); WxMenuButton button1 = new WxMenuButton(); button1.setType("click"); button1.setName("今日歌曲"); button1.setKey("V1001_TODAY_MUSIC"); - + WxMenuButton button2 = new WxMenuButton(); button2.setType("click"); button2.setName("歌手简介"); button2.setKey("V1001_TODAY_SINGER"); - + WxMenuButton button3 = new WxMenuButton(); button3.setName("菜单"); - + menu.getButtons().add(button1); menu.getButtons().add(button2); menu.getButtons().add(button3); - + WxMenuButton button31 = new WxMenuButton(); button31.setType("view"); button31.setName("搜索"); button31.setUrl("http://www.soso.com/"); - + WxMenuButton button32 = new WxMenuButton(); button32.setType("view"); button32.setName("视频"); button32.setUrl("http://v.qq.com/"); - + WxMenuButton button33 = new WxMenuButton(); button33.setType("click"); button33.setName("赞一下我们"); button33.setKey("V1001_GOOD"); - + button3.getSubButtons().add(button31); button3.getSubButtons().add(button32); button3.getSubButtons().add(button33); - + Assert.assertEquals(menu.toJson(), json); } @@ -78,82 +78,82 @@ public class WxMenuTest { Assert.assertEquals(menu.toJson(), json); } - + @DataProvider public Object[][] wxReturnMenu() { - Object[][] res = menuJson(); + Object[][] res = menuJson(); String json = "{ \"menu\" : " + res[0][0] + " }"; - return new Object[][] { - new Object[] { json } + return new Object[][]{ + new Object[]{json} }; } - - @DataProvider(name="wxPushMenu") + + @DataProvider(name = "wxPushMenu") public Object[][] menuJson() { - String json = - "{" - +"\"button\":[" - +"{" - +"\"type\":\"click\"," - +"\"name\":\"今日歌曲\"," - +"\"key\":\"V1001_TODAY_MUSIC\"" - +"}," - +"{" - +"\"type\":\"click\"," - +"\"name\":\"歌手简介\"," - +"\"key\":\"V1001_TODAY_SINGER\"" - +"}," - +"{" - +"\"name\":\"菜单\"," - +"\"sub_button\":[" - +"{" - +"\"type\":\"view\"," - +"\"name\":\"搜索\"," - +"\"url\":\"http://www.soso.com/\"" - +"}," - +"{" - +"\"type\":\"view\"," - +"\"name\":\"视频\"," - +"\"url\":\"http://v.qq.com/\"" - +"}," - +"{" - +"\"type\":\"click\"," - +"\"name\":\"赞一下我们\"," - +"\"key\":\"V1001_GOOD\"" - +"}" - +"]" - +"}" - +"]" - +"}"; - return new Object[][] { - new Object[] { json } + String json = + "{" + + "\"button\":[" + + "{" + + "\"type\":\"click\"," + + "\"name\":\"今日歌曲\"," + + "\"key\":\"V1001_TODAY_MUSIC\"" + + "}," + + "{" + + "\"type\":\"click\"," + + "\"name\":\"歌手简介\"," + + "\"key\":\"V1001_TODAY_SINGER\"" + + "}," + + "{" + + "\"name\":\"菜单\"," + + "\"sub_button\":[" + + "{" + + "\"type\":\"view\"," + + "\"name\":\"搜索\"," + + "\"url\":\"http://www.soso.com/\"" + + "}," + + "{" + + "\"type\":\"view\"," + + "\"name\":\"视频\"," + + "\"url\":\"http://v.qq.com/\"" + + "}," + + "{" + + "\"type\":\"click\"," + + "\"name\":\"赞一下我们\"," + + "\"key\":\"V1001_GOOD\"" + + "}" + + "]" + + "}" + + "]" + + "}"; + return new Object[][]{ + new Object[]{json} }; } @DataProvider(name = "wxAddConditionalMenu") - public Object[][] addConditionalMenuJson(){ + public Object[][] addConditionalMenuJson() { String json = - "{" - +"\"button\":[" - +"{" - +"\"type\":\"click\"," - +"\"name\":\"今日歌曲\"," - +"\"key\":\"V1001_TODAY_MUSIC\"" - +"}" - +"]," - +"\"matchrule\":{" - +"\"group_id\":\"2\"," - +"\"sex\":\"1\"," - +"\"country\":\"中国\"," - +"\"province\":\"广东\"," - +"\"city\":\"广州\"," - +"\"client_platform_type\":\"2\"," - +"\"language\":\"zh_CN\"" - +"}" - +"}"; + "{" + + "\"button\":[" + + "{" + + "\"type\":\"click\"," + + "\"name\":\"今日歌曲\"," + + "\"key\":\"V1001_TODAY_MUSIC\"" + + "}" + + "]," + + "\"matchrule\":{" + + "\"group_id\":\"2\"," + + "\"sex\":\"1\"," + + "\"country\":\"中国\"," + + "\"province\":\"广东\"," + + "\"city\":\"广州\"," + + "\"client_platform_type\":\"2\"," + + "\"language\":\"zh_CN\"" + + "}" + + "}"; return new Object[][]{ - new Object[]{json} + new Object[]{json} }; } - + } diff --git a/weixin-java-common/src/test/java/me/chanjar/weixin/common/session/SessionTest.java b/weixin-java-common/src/test/java/me/chanjar/weixin/common/session/SessionTest.java index bcb029b1..ce246636 100644 --- a/weixin-java-common/src/test/java/me/chanjar/weixin/common/session/SessionTest.java +++ b/weixin-java-common/src/test/java/me/chanjar/weixin/common/session/SessionTest.java @@ -10,8 +10,8 @@ public class SessionTest { @DataProvider public Object[][] getSessionManager() { - return new Object[][] { - new Object[] { new StandardSessionManager() } + return new Object[][]{ + new Object[]{new StandardSessionManager()} }; } diff --git a/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/WxMessageInMemoryDuplicateCheckerTest.java b/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/WxMessageInMemoryDuplicateCheckerTest.java index 7369d637..a3a243a4 100644 --- a/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/WxMessageInMemoryDuplicateCheckerTest.java +++ b/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/WxMessageInMemoryDuplicateCheckerTest.java @@ -8,7 +8,7 @@ import org.testng.annotations.Test; public class WxMessageInMemoryDuplicateCheckerTest { public void test() throws InterruptedException { - Long[] msgIds = new Long[] { 1l, 2l, 3l, 4l, 5l, 6l, 7l, 8l }; + Long[] msgIds = new Long[]{1l, 2l, 3l, 4l, 5l, 6l, 7l, 8l}; WxMessageInMemoryDuplicateChecker checker = new WxMessageInMemoryDuplicateChecker(2000l, 1000l); // 第一次检查 diff --git a/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/crypto/WxCryptUtilTest.java b/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/crypto/WxCryptUtilTest.java index 15b08c26..ab6c8db9 100755 --- a/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/crypto/WxCryptUtilTest.java +++ b/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/crypto/WxCryptUtilTest.java @@ -69,7 +69,7 @@ public class WxCryptUtilTest { } public void testValidateSignatureError() throws ParserConfigurationException, SAXException, - IOException { + IOException { try { WxCryptUtil pc = new WxCryptUtil(token, encodingAesKey, appId); String afterEncrpt = pc.encrypt(replyMsg); From f7a64a7cf6126f8dff0c93b195de2ec8e0906842 Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Tue, 2 Aug 2016 19:48:06 +0800 Subject: [PATCH 07/55] =?UTF-8?q?=E5=B0=86=E8=8F=9C=E5=8D=95=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E7=9A=84=E7=B1=BB=E8=BD=AC=E7=A7=BB=E5=88=B0=E5=8D=95?= =?UTF-8?q?=E7=8B=AC=E7=9A=84=E5=8C=85=E9=87=8C=E6=96=B9=E4=BE=BF=E7=AE=A1?= =?UTF-8?q?=E7=90=86=EF=BC=8C=E4=BB=A5=E4=BE=BF=E4=BA=8E=E6=9F=90=E4=BA=9B?= =?UTF-8?q?=E7=89=B9=E6=AE=8A=E9=9C=80=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../me/chanjar/weixin/common/bean/WxMenu.java | 208 ------------------ .../weixin/common/bean/menu/WxMenu.java | 69 ++++++ .../weixin/common/bean/menu/WxMenuButton.java | 62 ++++++ .../weixin/common/bean/menu/WxMenuRule.java | 75 +++++++ .../common/util/json/WxGsonBuilder.java | 3 +- .../common/util/json/WxMenuGsonAdapter.java | 31 ++- .../weixin/common/bean/WxMenuTest.java | 7 +- .../me/chanjar/weixin/cp/api/WxCpService.java | 12 +- .../weixin/cp/api/WxCpServiceImpl.java | 47 ++-- .../chanjar/weixin/cp/api/WxMenuAPITest.java | 12 +- .../weixin/mp/api/WxMpMenuService.java | 2 +- .../mp/api/impl/WxMpMenuServiceImpl.java | 2 +- .../mp/api/impl/WxMpMenuServiceImplTest.java | 14 +- 13 files changed, 285 insertions(+), 259 deletions(-) delete mode 100644 weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxMenu.java create mode 100644 weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenu.java create mode 100644 weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenuButton.java create mode 100644 weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenuRule.java diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxMenu.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxMenu.java deleted file mode 100644 index 3c530e85..00000000 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxMenu.java +++ /dev/null @@ -1,208 +0,0 @@ -package me.chanjar.weixin.common.bean; - -import me.chanjar.weixin.common.util.json.WxGsonBuilder; - -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.Serializable; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.List; - -/** - * 企业号菜单 - * - * @author Daniel Qian - */ -public class WxMenu implements Serializable { - - private static final long serialVersionUID = -7083914585539687746L; - - private List buttons = new ArrayList(); - - private WxMenuRule matchRule; - - /** - * 要用 http://mp.weixin.qq.com/wiki/16/ff9b7b85220e1396ffa16794a9d95adc.html 格式来反序列化 - * 相比 http://mp.weixin.qq.com/wiki/13/43de8269be54a0a6f64413e4dfa94f39.html 的格式,外层多套了一个menu - */ - public static WxMenu fromJson(String json) { - return WxGsonBuilder.create().fromJson(json, WxMenu.class); - } - - /** - * 要用 http://mp.weixin.qq.com/wiki/16/ff9b7b85220e1396ffa16794a9d95adc.html 格式来反序列化 - * 相比 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); - } - - public List getButtons() { - return buttons; - } - - public void setButtons(List buttons) { - this.buttons = buttons; - } - - public WxMenuRule getMatchRule() { - return matchRule; - } - - public void setMatchRule(WxMenuRule matchRule) { - this.matchRule = matchRule; - } - - public String toJson() { - return WxGsonBuilder.create().toJson(this); - } - - @Override - public String toString() { - return "WxMenu{" + - "buttons=" + buttons + - '}'; - } - - public static class WxMenuButton { - - private String type; - private String name; - private String key; - private String url; - - private List subButtons = new ArrayList(); - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getKey() { - return key; - } - - public void setKey(String key) { - this.key = key; - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - public List getSubButtons() { - return subButtons; - } - - public void setSubButtons(List subButtons) { - this.subButtons = subButtons; - } - - @Override - public String toString() { - return "WxMenuButton{" + - "type='" + type + '\'' + - ", name='" + name + '\'' + - ", key='" + key + '\'' + - ", url='" + url + '\'' + - ", subButtons=" + subButtons + - '}'; - } - } - - public static class WxMenuRule { - private String tagId; - private String sex; - private String country; - private String province; - private String city; - private String clientPlatformType; - private String language; - - public String getTagId() { - return tagId; - } - - public void setTagId(String tagId) { - this.tagId = tagId; - } - - public String getSex() { - return sex; - } - - public void setSex(String sex) { - this.sex = sex; - } - - public String getCountry() { - return country; - } - - public void setCountry(String country) { - this.country = country; - } - - public String getProvince() { - return province; - } - - public void setProvince(String province) { - this.province = province; - } - - public String getCity() { - return city; - } - - public void setCity(String city) { - this.city = city; - } - - public String getClientPlatformType() { - return clientPlatformType; - } - - public void setClientPlatformType(String clientPlatformType) { - this.clientPlatformType = clientPlatformType; - } - - public String getLanguage() { - return language; - } - - public void setLanguage(String language) { - this.language = language; - } - - @Override - public String toString() { - return "matchrule:{" + - "tag_id='" + tagId + '\'' + - ", sex='" + sex + '\'' + - ", country" + country + '\'' + - ", province" + province + '\'' + - ", city" + city + '\'' + - ", client_platform_type" + clientPlatformType + '\'' + - ", language" + language + '\'' + - "}"; - } - } - -} 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 new file mode 100644 index 00000000..7989b39a --- /dev/null +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenu.java @@ -0,0 +1,69 @@ +package me.chanjar.weixin.common.bean.menu; + +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Serializable; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; + +import me.chanjar.weixin.common.bean.menu.WxMenuButton; +import me.chanjar.weixin.common.util.json.WxGsonBuilder; + +/** + * 企业号菜单 + * + * @author Daniel Qian + */ +public class WxMenu implements Serializable { + + private static final long serialVersionUID = -7083914585539687746L; + + private List buttons = new ArrayList(); + + private WxMenuRule matchRule; + + /** + * 要用 http://mp.weixin.qq.com/wiki/16/ff9b7b85220e1396ffa16794a9d95adc.html 格式来反序列化 + * 相比 http://mp.weixin.qq.com/wiki/13/43de8269be54a0a6f64413e4dfa94f39.html 的格式,外层多套了一个menu + */ + public static WxMenu fromJson(String json) { + return WxGsonBuilder.create().fromJson(json, WxMenu.class); + } + + /** + * 要用 http://mp.weixin.qq.com/wiki/16/ff9b7b85220e1396ffa16794a9d95adc.html 格式来反序列化 + * 相比 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); + } + + public List getButtons() { + return buttons; + } + + public void setButtons(List buttons) { + this.buttons = buttons; + } + + public WxMenuRule getMatchRule() { + return matchRule; + } + + public void setMatchRule(WxMenuRule matchRule) { + this.matchRule = matchRule; + } + + public String toJson() { + return WxGsonBuilder.create().toJson(this); + } + + @Override + public String toString() { + return "WxMenu{" + + "buttons=" + buttons + + '}'; + } + +} 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 new file mode 100644 index 00000000..3acf0370 --- /dev/null +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenuButton.java @@ -0,0 +1,62 @@ +package me.chanjar.weixin.common.bean.menu; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +public class WxMenuButton { + + private String type; + private String name; + private String key; + private String url; + + private List subButtons = new ArrayList(); + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public List getSubButtons() { + return subButtons; + } + + public void setSubButtons(List subButtons) { + this.subButtons = subButtons; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE); + } +} \ No newline at end of file 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 new file mode 100644 index 00000000..5cb9d8fe --- /dev/null +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenuRule.java @@ -0,0 +1,75 @@ +package me.chanjar.weixin.common.bean.menu; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +public class WxMenuRule { + private String tagId; + private String sex; + private String country; + private String province; + private String city; + private String clientPlatformType; + private String language; + + public String getTagId() { + return tagId; + } + + public void setTagId(String tagId) { + this.tagId = tagId; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public String getCountry() { + return country; + } + + public void setCountry(String country) { + this.country = country; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getClientPlatformType() { + return clientPlatformType; + } + + public void setClientPlatformType(String clientPlatformType) { + this.clientPlatformType = clientPlatformType; + } + + public String getLanguage() { + return language; + } + + public void setLanguage(String language) { + this.language = language; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE); + } +} \ No newline at end of file diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxGsonBuilder.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxGsonBuilder.java index 072ee38b..100ef523 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxGsonBuilder.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxGsonBuilder.java @@ -2,8 +2,9 @@ package me.chanjar.weixin.common.util.json; import com.google.gson.Gson; import com.google.gson.GsonBuilder; + import me.chanjar.weixin.common.bean.WxAccessToken; -import me.chanjar.weixin.common.bean.WxMenu; +import me.chanjar.weixin.common.bean.menu.WxMenu; import me.chanjar.weixin.common.bean.result.WxError; import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxMenuGsonAdapter.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxMenuGsonAdapter.java index 486c9578..75f07824 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxMenuGsonAdapter.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxMenuGsonAdapter.java @@ -8,11 +8,22 @@ */ package me.chanjar.weixin.common.util.json; -import com.google.gson.*; -import me.chanjar.weixin.common.bean.WxMenu; - import java.lang.reflect.Type; +import com.google.gson.JsonArray; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; + +import me.chanjar.weixin.common.bean.menu.WxMenu; +import me.chanjar.weixin.common.bean.menu.WxMenuButton; +import me.chanjar.weixin.common.bean.menu.WxMenuRule; + + /** * @author Daniel Qian */ @@ -22,7 +33,7 @@ public class WxMenuGsonAdapter implements JsonSerializer, JsonDeserializ JsonObject json = new JsonObject(); JsonArray buttonArray = new JsonArray(); - for (WxMenu.WxMenuButton button : menu.getButtons()) { + for (WxMenuButton button : menu.getButtons()) { JsonObject buttonJson = convertToJson(button); buttonArray.add(buttonJson); } @@ -35,7 +46,7 @@ public class WxMenuGsonAdapter implements JsonSerializer, JsonDeserializ return json; } - protected JsonObject convertToJson(WxMenu.WxMenuButton button) { + protected JsonObject convertToJson(WxMenuButton button) { JsonObject buttonJson = new JsonObject(); buttonJson.addProperty("type", button.getType()); buttonJson.addProperty("name", button.getName()); @@ -43,7 +54,7 @@ public class WxMenuGsonAdapter implements JsonSerializer, JsonDeserializ buttonJson.addProperty("url", button.getUrl()); if (button.getSubButtons() != null && button.getSubButtons().size() > 0) { JsonArray buttonArray = new JsonArray(); - for (WxMenu.WxMenuButton sub_button : button.getSubButtons()) { + for (WxMenuButton sub_button : button.getSubButtons()) { buttonArray.add(convertToJson(sub_button)); } buttonJson.add("sub_button", buttonArray); @@ -51,7 +62,7 @@ public class WxMenuGsonAdapter implements JsonSerializer, JsonDeserializ return buttonJson; } - protected JsonObject convertToJson(WxMenu.WxMenuRule menuRule) { + protected JsonObject convertToJson(WxMenuRule menuRule) { JsonObject matchRule = new JsonObject(); matchRule.addProperty("tag_id", menuRule.getTagId()); matchRule.addProperty("sex", menuRule.getSex()); @@ -74,7 +85,7 @@ public class WxMenuGsonAdapter implements JsonSerializer, JsonDeserializ JsonArray buttonsJson = menuJson.get("button").getAsJsonArray(); for (int i = 0; i < buttonsJson.size(); i++) { JsonObject buttonJson = buttonsJson.get(i).getAsJsonObject(); - WxMenu.WxMenuButton button = convertFromJson(buttonJson); + WxMenuButton button = convertFromJson(buttonJson); menu.getButtons().add(button); if (buttonJson.get("sub_button") == null || buttonJson.get("sub_button").isJsonNull()) { continue; @@ -88,8 +99,8 @@ public class WxMenuGsonAdapter implements JsonSerializer, JsonDeserializ return menu; } - protected WxMenu.WxMenuButton convertFromJson(JsonObject json) { - WxMenu.WxMenuButton button = new WxMenu.WxMenuButton(); + protected WxMenuButton convertFromJson(JsonObject json) { + WxMenuButton button = new WxMenuButton(); button.setName(GsonHelper.getString(json, "name")); button.setKey(GsonHelper.getString(json, "key")); button.setUrl(GsonHelper.getString(json, "url")); diff --git a/weixin-java-common/src/test/java/me/chanjar/weixin/common/bean/WxMenuTest.java b/weixin-java-common/src/test/java/me/chanjar/weixin/common/bean/WxMenuTest.java index b7492b37..e2a0c2c1 100644 --- a/weixin-java-common/src/test/java/me/chanjar/weixin/common/bean/WxMenuTest.java +++ b/weixin-java-common/src/test/java/me/chanjar/weixin/common/bean/WxMenuTest.java @@ -1,10 +1,13 @@ package me.chanjar.weixin.common.bean; -import me.chanjar.weixin.common.bean.WxMenu.WxMenuButton; import org.testng.Assert; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; +import me.chanjar.weixin.common.bean.menu.WxMenu; +import me.chanjar.weixin.common.bean.menu.WxMenuButton; +import me.chanjar.weixin.common.bean.menu.WxMenuRule; + @Test public class WxMenuTest { @@ -66,7 +69,7 @@ public class WxMenuTest { menu.getButtons().add(button1); - WxMenu.WxMenuRule wxMenuRule = new WxMenu.WxMenuRule(); + WxMenuRule wxMenuRule = new WxMenuRule(); wxMenuRule.setTagId("2"); wxMenuRule.setSex("1"); wxMenuRule.setCountry("中国"); diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java index 7cf9332a..e00f57fa 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java @@ -1,7 +1,12 @@ package me.chanjar.weixin.cp.api; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.List; + import me.chanjar.weixin.common.bean.WxJsapiSignature; -import me.chanjar.weixin.common.bean.WxMenu; +import me.chanjar.weixin.common.bean.menu.WxMenu; import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.common.session.WxSession; @@ -12,11 +17,6 @@ import me.chanjar.weixin.cp.bean.WxCpMessage; import me.chanjar.weixin.cp.bean.WxCpTag; import me.chanjar.weixin.cp.bean.WxCpUser; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.util.List; - /** * 微信API的Service */ diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java index 1cf517ab..a3858493 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java @@ -1,5 +1,23 @@ package me.chanjar.weixin.cp.api; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.StringReader; +import java.security.NoSuchAlgorithmException; +import java.util.List; +import java.util.UUID; + +import org.apache.http.HttpHost; +import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.BasicResponseHandler; +import org.apache.http.impl.client.CloseableHttpClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; @@ -7,9 +25,10 @@ import com.google.gson.JsonPrimitive; import com.google.gson.internal.Streams; import com.google.gson.reflect.TypeToken; import com.google.gson.stream.JsonReader; + import me.chanjar.weixin.common.bean.WxAccessToken; import me.chanjar.weixin.common.bean.WxJsapiSignature; -import me.chanjar.weixin.common.bean.WxMenu; +import me.chanjar.weixin.common.bean.menu.WxMenu; import me.chanjar.weixin.common.bean.result.WxError; import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; import me.chanjar.weixin.common.exception.WxErrorException; @@ -20,30 +39,20 @@ import me.chanjar.weixin.common.util.RandomUtils; import me.chanjar.weixin.common.util.StringUtils; import me.chanjar.weixin.common.util.crypto.SHA1; import me.chanjar.weixin.common.util.fs.FileUtils; -import me.chanjar.weixin.common.util.http.*; +import me.chanjar.weixin.common.util.http.ApacheHttpClientBuilder; +import me.chanjar.weixin.common.util.http.DefaultApacheHttpHttpClientBuilder; +import me.chanjar.weixin.common.util.http.MediaDownloadRequestExecutor; +import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor; +import me.chanjar.weixin.common.util.http.RequestExecutor; +import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor; +import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor; +import me.chanjar.weixin.common.util.http.URIUtil; import me.chanjar.weixin.common.util.json.GsonHelper; import me.chanjar.weixin.cp.bean.WxCpDepart; import me.chanjar.weixin.cp.bean.WxCpMessage; import me.chanjar.weixin.cp.bean.WxCpTag; import me.chanjar.weixin.cp.bean.WxCpUser; import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; -import org.apache.http.HttpHost; -import org.apache.http.client.ClientProtocolException; -import org.apache.http.client.config.RequestConfig; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.impl.client.BasicResponseHandler; -import org.apache.http.impl.client.CloseableHttpClient; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.StringReader; -import java.security.NoSuchAlgorithmException; -import java.util.List; -import java.util.UUID; public class WxCpServiceImpl implements WxCpService { diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxMenuAPITest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxMenuAPITest.java index ca5b5991..395a48da 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxMenuAPITest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxMenuAPITest.java @@ -1,15 +1,17 @@ package me.chanjar.weixin.cp.api; -import com.google.inject.Inject; -import me.chanjar.weixin.common.api.WxConsts; -import me.chanjar.weixin.common.bean.WxMenu; -import me.chanjar.weixin.common.bean.WxMenu.WxMenuButton; -import me.chanjar.weixin.common.exception.WxErrorException; import org.testng.Assert; import org.testng.annotations.DataProvider; import org.testng.annotations.Guice; import org.testng.annotations.Test; +import com.google.inject.Inject; + +import me.chanjar.weixin.common.api.WxConsts; +import me.chanjar.weixin.common.bean.menu.WxMenu; +import me.chanjar.weixin.common.bean.menu.WxMenuButton; +import me.chanjar.weixin.common.exception.WxErrorException; + /** * 测试菜单 * @author Daniel Qian diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMenuService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMenuService.java index 31ce48d3..22217801 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMenuService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMenuService.java @@ -1,6 +1,6 @@ package me.chanjar.weixin.mp.api; -import me.chanjar.weixin.common.bean.WxMenu; +import me.chanjar.weixin.common.bean.menu.WxMenu; import me.chanjar.weixin.common.exception.WxErrorException; /** diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMenuServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMenuServiceImpl.java index bfad1e06..28dbff91 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMenuServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMenuServiceImpl.java @@ -1,6 +1,6 @@ package me.chanjar.weixin.mp.api.impl; -import me.chanjar.weixin.common.bean.WxMenu; +import me.chanjar.weixin.common.bean.menu.WxMenu; import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor; import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor; diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMenuServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMenuServiceImplTest.java index 0cbae4db..1e0b60dd 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMenuServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMenuServiceImplTest.java @@ -1,16 +1,18 @@ package me.chanjar.weixin.mp.api.impl; -import com.google.inject.Inject; -import me.chanjar.weixin.common.api.WxConsts; -import me.chanjar.weixin.common.bean.WxMenu; -import me.chanjar.weixin.common.bean.WxMenu.WxMenuButton; -import me.chanjar.weixin.common.exception.WxErrorException; -import me.chanjar.weixin.mp.api.ApiTestModule; import org.testng.Assert; import org.testng.annotations.DataProvider; import org.testng.annotations.Guice; import org.testng.annotations.Test; +import com.google.inject.Inject; + +import me.chanjar.weixin.common.api.WxConsts; +import me.chanjar.weixin.common.bean.menu.WxMenu; +import me.chanjar.weixin.common.bean.menu.WxMenuButton; +import me.chanjar.weixin.common.exception.WxErrorException; +import me.chanjar.weixin.mp.api.ApiTestModule; + /** * 测试菜单 * @author chanjarster From d05da579a8e6c579e5b148586899f67c2f7bf175 Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Tue, 2 Aug 2016 19:49:27 +0800 Subject: [PATCH 08/55] code clean up for cp module --- .../weixin/cp/api/WxCpConfigStorage.java | 8 +- .../cp/api/WxCpInMemoryConfigStorage.java | 70 +++---- .../weixin/cp/api/WxCpMessageHandler.java | 1 - .../weixin/cp/api/WxCpMessageRouter.java | 42 ++-- .../weixin/cp/api/WxCpMessageRouterRule.java | 46 ++-- .../me/chanjar/weixin/cp/api/WxCpService.java | 72 ++++--- .../weixin/cp/api/WxCpServiceImpl.java | 163 +++++++------- .../me/chanjar/weixin/cp/bean/WxCpDepart.java | 18 +- .../chanjar/weixin/cp/bean/WxCpMessage.java | 127 ++++++----- .../me/chanjar/weixin/cp/bean/WxCpTag.java | 8 +- .../me/chanjar/weixin/cp/bean/WxCpUser.java | 18 +- .../weixin/cp/bean/WxCpXmlMessage.java | 198 +++++++++--------- .../cp/bean/WxCpXmlOutImageMessage.java | 8 +- .../weixin/cp/bean/WxCpXmlOutMessage.java | 78 +++---- .../weixin/cp/bean/WxCpXmlOutNewsMessage.java | 27 ++- .../weixin/cp/bean/WxCpXmlOutTextMessage.java | 8 +- .../cp/bean/WxCpXmlOutVideoMessage.java | 12 +- .../cp/bean/WxCpXmlOutVoiceMessage.java | 8 +- .../cp/bean/messagebuilder/BaseBuilder.java | 2 +- .../cp/bean/messagebuilder/FileBuilder.java | 2 +- .../cp/bean/messagebuilder/ImageBuilder.java | 2 +- .../cp/bean/messagebuilder/NewsBuilder.java | 4 +- .../cp/bean/messagebuilder/TextBuilder.java | 2 +- .../cp/bean/messagebuilder/VideoBuilder.java | 2 +- .../cp/bean/messagebuilder/VoiceBuilder.java | 2 +- .../cp/bean/outxmlbuilder/BaseBuilder.java | 12 +- .../cp/bean/outxmlbuilder/ImageBuilder.java | 3 +- .../cp/bean/outxmlbuilder/NewsBuilder.java | 9 +- .../cp/bean/outxmlbuilder/TextBuilder.java | 2 +- .../cp/bean/outxmlbuilder/VideoBuilder.java | 8 +- .../cp/bean/outxmlbuilder/VoiceBuilder.java | 5 +- .../weixin/cp/util/crypto/WxCpCryptUtil.java | 4 + .../cp/util/json/WxCpDepartGsonAdapter.java | 2 +- .../cp/util/json/WxCpMessageGsonAdapter.java | 4 +- .../cp/util/json/WxCpTagGsonAdapter.java | 2 +- .../cp/util/json/WxCpUserGsonAdapter.java | 8 +- .../cp/util/xml/XStreamTransformer.java | 10 +- .../chanjar/weixin/cp/api/ApiTestModule.java | 35 ++-- .../weixin/cp/api/WxCpBaseAPITest.java | 2 +- .../weixin/cp/api/WxCpBusyRetryTest.java | 6 +- .../weixin/cp/api/WxCpDepartAPITest.java | 2 +- .../weixin/cp/api/WxCpMediaAPITest.java | 30 +-- .../weixin/cp/api/WxCpMessageAPITest.java | 12 +- .../weixin/cp/api/WxCpMessageRouterTest.java | 180 ++++++++-------- .../chanjar/weixin/cp/api/WxCpTagAPITest.java | 4 +- .../weixin/cp/api/WxCpUserAPITest.java | 2 +- .../chanjar/weixin/cp/api/WxMenuAPITest.java | 58 +++-- .../weixin/cp/bean/WxCpMessageTest.java | 26 +-- .../weixin/cp/bean/WxCpXmlMessageTest.java | 88 ++++---- .../cp/bean/WxCpXmlOutImageMessageTest.java | 46 ++-- .../cp/bean/WxCpXmlOutNewsMessageTest.java | 114 +++++----- .../cp/bean/WxCpXmlOutTextMessageTest.java | 48 ++--- .../cp/bean/WxCpXmlOutVideoMessageTest.java | 74 +++---- .../cp/bean/WxCpXmlOutVoiceMessageTest.java | 46 ++-- .../demo/WxCpDemoInMemoryConfigStorage.java | 13 +- .../weixin/cp/demo/WxCpDemoServer.java | 96 ++++----- .../weixin/cp/demo/WxCpEndpointServlet.java | 6 +- .../weixin/cp/demo/WxCpOAuth2Servlet.java | 5 +- 58 files changed, 966 insertions(+), 924 deletions(-) diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpConfigStorage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpConfigStorage.java index 2b2ccf1d..4e4ab238 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpConfigStorage.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpConfigStorage.java @@ -7,8 +7,8 @@ import java.io.File; /** * 微信客户端配置存储 - * @author Daniel Qian * + * @author Daniel Qian */ public interface WxCpConfigStorage { @@ -36,12 +36,13 @@ public interface WxCpConfigStorage { /** * 应该是线程安全的 + * * @param jsapiTicket */ void updateJsapiTicket(String jsapiTicket, int expiresInSeconds); String getCorpId(); - + String getCorpSecret(); String getAgentId(); @@ -61,11 +62,12 @@ public interface WxCpConfigStorage { String getHttp_proxy_username(); String getHttp_proxy_password(); - + File getTmpDirFile(); /** * http client builder + * * @return ApacheHttpClientBuilder */ ApacheHttpClientBuilder getApacheHttpClientBuilder(); diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpInMemoryConfigStorage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpInMemoryConfigStorage.java index 5e0ba777..52d0c93b 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpInMemoryConfigStorage.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpInMemoryConfigStorage.java @@ -7,8 +7,8 @@ import java.io.File; /** * 基于内存的微信配置provider,在实际生产环境中应该将这些配置持久化 - * @author Daniel Qian * + * @author Daniel Qian */ public class WxCpInMemoryConfigStorage implements WxCpConfigStorage { @@ -39,6 +39,10 @@ public class WxCpInMemoryConfigStorage implements WxCpConfigStorage { return this.accessToken; } + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } + public boolean isAccessTokenExpired() { return System.currentTimeMillis() > this.expiresTime; } @@ -50,7 +54,7 @@ public class WxCpInMemoryConfigStorage implements WxCpConfigStorage { public synchronized void updateAccessToken(WxAccessToken accessToken) { updateAccessToken(accessToken.getAccessToken(), accessToken.getExpiresIn()); } - + public synchronized void updateAccessToken(String accessToken, int expiresInSeconds) { this.accessToken = accessToken; this.expiresTime = System.currentTimeMillis() + (expiresInSeconds - 200) * 1000l; @@ -91,28 +95,32 @@ public class WxCpInMemoryConfigStorage implements WxCpConfigStorage { return this.corpId; } + public void setCorpId(String corpId) { + this.corpId = corpId; + } + public String getCorpSecret() { return this.corpSecret; } - public String getToken() { - return this.token; + public void setCorpSecret(String corpSecret) { + this.corpSecret = corpSecret; } - public long getExpiresTime() { - return this.expiresTime; + public String getToken() { + return this.token; } - public void setCorpId(String corpId) { - this.corpId = corpId; + public void setToken(String token) { + this.token = token; } - public void setCorpSecret(String corpSecret) { - this.corpSecret = corpSecret; + public long getExpiresTime() { + return this.expiresTime; } - public void setToken(String token) { - this.token = token; + public void setExpiresTime(long expiresTime) { + this.expiresTime = expiresTime; } public String getAesKey() { @@ -123,14 +131,6 @@ public class WxCpInMemoryConfigStorage implements WxCpConfigStorage { this.aesKey = aesKey; } - public void setAccessToken(String accessToken) { - this.accessToken = accessToken; - } - - public void setExpiresTime(long expiresTime) { - this.expiresTime = expiresTime; - } - public String getAgentId() { return agentId; } @@ -183,21 +183,21 @@ public class WxCpInMemoryConfigStorage implements WxCpConfigStorage { @Override public String toString() { return "WxCpInMemoryConfigStorage{" + - "corpId='" + corpId + '\'' + - ", corpSecret='" + corpSecret + '\'' + - ", token='" + token + '\'' + - ", accessToken='" + accessToken + '\'' + - ", aesKey='" + aesKey + '\'' + - ", agentId='" + agentId + '\'' + - ", expiresTime=" + expiresTime + - ", http_proxy_host='" + http_proxy_host + '\'' + - ", http_proxy_port=" + http_proxy_port + - ", http_proxy_username='" + http_proxy_username + '\'' + - ", http_proxy_password='" + http_proxy_password + '\'' + - ", jsapiTicket='" + jsapiTicket + '\'' + - ", jsapiTicketExpiresTime='" + jsapiTicketExpiresTime + '\'' + - ", tmpDirFile='" + tmpDirFile + '\'' + - '}'; + "corpId='" + corpId + '\'' + + ", corpSecret='" + corpSecret + '\'' + + ", token='" + token + '\'' + + ", accessToken='" + accessToken + '\'' + + ", aesKey='" + aesKey + '\'' + + ", agentId='" + agentId + '\'' + + ", expiresTime=" + expiresTime + + ", http_proxy_host='" + http_proxy_host + '\'' + + ", http_proxy_port=" + http_proxy_port + + ", http_proxy_username='" + http_proxy_username + '\'' + + ", http_proxy_password='" + http_proxy_password + '\'' + + ", jsapiTicket='" + jsapiTicket + '\'' + + ", jsapiTicketExpiresTime='" + jsapiTicketExpiresTime + '\'' + + ", tmpDirFile='" + tmpDirFile + '\'' + + '}'; } public File getTmpDirFile() { diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageHandler.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageHandler.java index 36649c46..9a3920a2 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageHandler.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageHandler.java @@ -1,7 +1,6 @@ package me.chanjar.weixin.cp.api; import me.chanjar.weixin.common.exception.WxErrorException; -import me.chanjar.weixin.common.session.WxSession; import me.chanjar.weixin.common.session.WxSessionManager; import me.chanjar.weixin.cp.bean.WxCpXmlMessage; import me.chanjar.weixin.cp.bean.WxCpXmlOutMessage; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageRouter.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageRouter.java index f7e5286b..bdda1886 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageRouter.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageRouter.java @@ -1,13 +1,13 @@ package me.chanjar.weixin.cp.api; +import me.chanjar.weixin.common.api.WxErrorExceptionHandler; +import me.chanjar.weixin.common.api.WxMessageDuplicateChecker; +import me.chanjar.weixin.common.api.WxMessageInMemoryDuplicateChecker; import me.chanjar.weixin.common.session.InternalSession; import me.chanjar.weixin.common.session.InternalSessionManager; import me.chanjar.weixin.common.session.StandardSessionManager; import me.chanjar.weixin.common.session.WxSessionManager; import me.chanjar.weixin.common.util.LogExceptionHandler; -import me.chanjar.weixin.common.api.WxErrorExceptionHandler; -import me.chanjar.weixin.common.api.WxMessageDuplicateChecker; -import me.chanjar.weixin.common.api.WxMessageInMemoryDuplicateChecker; import me.chanjar.weixin.cp.bean.WxCpXmlMessage; import me.chanjar.weixin.cp.bean.WxCpXmlOutMessage; import org.slf4j.Logger; @@ -45,15 +45,13 @@ import java.util.concurrent.Future; * router.route(message); * * - * @author Daniel Qian * + * @author Daniel Qian */ public class WxCpMessageRouter { - protected final Logger log = LoggerFactory.getLogger(WxCpMessageRouter.class); - private static final int DEFAULT_THREAD_POOL_SIZE = 100; - + protected final Logger log = LoggerFactory.getLogger(WxCpMessageRouter.class); private final List rules = new ArrayList(); private final WxCpService wxCpService; @@ -79,6 +77,7 @@ public class WxCpMessageRouter { * 设置自定义的 {@link ExecutorService} * 如果不调用该方法,默认使用 Executors.newFixedThreadPool(100) * + * * @param executorService */ public void setExecutorService(ExecutorService executorService) { @@ -90,6 +89,7 @@ public class WxCpMessageRouter { * 设置自定义的 {@link me.chanjar.weixin.common.api.WxMessageDuplicateChecker} * 如果不调用该方法,默认使用 {@link me.chanjar.weixin.common.api.WxMessageInMemoryDuplicateChecker} * + * * @param messageDuplicateChecker */ public void setMessageDuplicateChecker(WxMessageDuplicateChecker messageDuplicateChecker) { @@ -101,6 +101,7 @@ public class WxCpMessageRouter { * 设置自定义的{@link me.chanjar.weixin.common.session.WxSessionManager} * 如果不调用该方法,默认使用 {@link me.chanjar.weixin.common.session.StandardSessionManager} * + * * @param sessionManager */ public void setSessionManager(WxSessionManager sessionManager) { @@ -112,6 +113,7 @@ public class WxCpMessageRouter { * 设置自定义的{@link me.chanjar.weixin.common.api.WxErrorExceptionHandler} * 如果不调用该方法,默认使用 {@link me.chanjar.weixin.common.util.LogExceptionHandler} * + * * @param exceptionHandler */ public void setExceptionHandler(WxErrorExceptionHandler exceptionHandler) { @@ -131,6 +133,7 @@ public class WxCpMessageRouter { /** * 处理微信消息 + * * @param wxMessage */ public WxCpXmlOutMessage route(final WxCpXmlMessage wxMessage) { @@ -144,7 +147,7 @@ public class WxCpMessageRouter { for (final WxCpMessageRouterRule rule : rules) { if (rule.test(wxMessage)) { matchRules.add(rule); - if(!rule.isReEnter()) { + if (!rule.isReEnter()) { break; } } @@ -158,13 +161,13 @@ public class WxCpMessageRouter { final List futures = new ArrayList(); for (final WxCpMessageRouterRule rule : matchRules) { // 返回最后一个非异步的rule的执行结果 - if(rule.isAsync()) { + if (rule.isAsync()) { futures.add( - executorService.submit(new Runnable() { - public void run() { - rule.service(wxMessage, wxCpService, sessionManager, exceptionHandler); - } - }) + executorService.submit(new Runnable() { + public void run() { + rule.service(wxMessage, wxCpService, sessionManager, exceptionHandler); + } + }) ); } else { res = rule.service(wxMessage, wxCpService, sessionManager, exceptionHandler); @@ -201,10 +204,10 @@ public class WxCpMessageRouter { String messageId = ""; if (wxMessage.getMsgId() == null) { messageId = String.valueOf(wxMessage.getCreateTime()) - + "-" +String.valueOf(wxMessage.getAgentId() == null ? "" : wxMessage.getAgentId()) - + "-" + wxMessage.getFromUserName() - + "-" + String.valueOf(wxMessage.getEventKey() == null ? "" : wxMessage.getEventKey()) - + "-" + String.valueOf(wxMessage.getEvent() == null ? "" : wxMessage.getEvent()) + + "-" + String.valueOf(wxMessage.getAgentId() == null ? "" : wxMessage.getAgentId()) + + "-" + wxMessage.getFromUserName() + + "-" + String.valueOf(wxMessage.getEventKey() == null ? "" : wxMessage.getEventKey()) + + "-" + String.valueOf(wxMessage.getEvent() == null ? "" : wxMessage.getEvent()) ; } else { messageId = String.valueOf(wxMessage.getMsgId()); @@ -216,11 +219,12 @@ public class WxCpMessageRouter { /** * 对session的访问结束 + * * @param wxMessage */ protected void sessionEndAccess(WxCpXmlMessage wxMessage) { - InternalSession session = ((InternalSessionManager)sessionManager).findSession(wxMessage.getFromUserName()); + InternalSession session = ((InternalSessionManager) sessionManager).findSession(wxMessage.getFromUserName()); if (session != null) { session.endAccess(); } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageRouterRule.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageRouterRule.java index 6d683323..a987841c 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageRouterRule.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageRouterRule.java @@ -1,8 +1,8 @@ package me.chanjar.weixin.cp.api; +import me.chanjar.weixin.common.api.WxErrorExceptionHandler; import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.common.session.WxSessionManager; -import me.chanjar.weixin.common.api.WxErrorExceptionHandler; import me.chanjar.weixin.cp.bean.WxCpXmlMessage; import me.chanjar.weixin.cp.bean.WxCpXmlOutMessage; @@ -186,7 +186,6 @@ public class WxCpMessageRouterRule { /** * 规则结束,代表如果一个消息匹配该规则,那么它将不再会进入其他规则 - * */ public WxCpMessageRouter end() { this.routerBuilder.getRules().add(this); @@ -195,7 +194,6 @@ public class WxCpMessageRouterRule { /** * 规则结束,但是消息还会进入其他规则 - * */ public WxCpMessageRouter next() { this.reEnter = true; @@ -204,24 +202,24 @@ public class WxCpMessageRouterRule { protected boolean test(WxCpXmlMessage wxMessage) { return - (this.fromUser == null || this.fromUser.equals(wxMessage.getFromUserName())) - && - (this.agentId == null || this.agentId.equals(wxMessage.getAgentId())) - && - (this.msgType == null || this.msgType.equals(wxMessage.getMsgType())) - && - (this.event == null || this.event.equals(wxMessage.getEvent())) - && - (this.eventKey == null || this.eventKey.equals(wxMessage.getEventKey())) - && - (this.content == null || this.content - .equals(wxMessage.getContent() == null ? null : wxMessage.getContent().trim())) - && - (this.rContent == null || Pattern - .matches(this.rContent, wxMessage.getContent() == null ? "" : wxMessage.getContent().trim())) - && - (this.matcher == null || this.matcher.match(wxMessage)) - ; + (this.fromUser == null || this.fromUser.equals(wxMessage.getFromUserName())) + && + (this.agentId == null || this.agentId.equals(wxMessage.getAgentId())) + && + (this.msgType == null || this.msgType.equals(wxMessage.getMsgType())) + && + (this.event == null || this.event.equals(wxMessage.getEvent())) + && + (this.eventKey == null || this.eventKey.equals(wxMessage.getEventKey())) + && + (this.content == null || this.content + .equals(wxMessage.getContent() == null ? null : wxMessage.getContent().trim())) + && + (this.rContent == null || Pattern + .matches(this.rContent, wxMessage.getContent() == null ? "" : wxMessage.getContent().trim())) + && + (this.matcher == null || this.matcher.match(wxMessage)) + ; } /** @@ -231,9 +229,9 @@ public class WxCpMessageRouterRule { * @return true 代表继续执行别的router,false 代表停止执行别的router */ protected WxCpXmlOutMessage service(WxCpXmlMessage wxMessage, - WxCpService wxCpService, - WxSessionManager sessionManager, - WxErrorExceptionHandler exceptionHandler) { + WxCpService wxCpService, + WxSessionManager sessionManager, + WxErrorExceptionHandler exceptionHandler) { try { diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java index e00f57fa..e428b2c2 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java @@ -1,10 +1,5 @@ package me.chanjar.weixin.cp.api; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.util.List; - import me.chanjar.weixin.common.bean.WxJsapiSignature; import me.chanjar.weixin.common.bean.menu.WxMenu; import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; @@ -17,6 +12,11 @@ import me.chanjar.weixin.cp.bean.WxCpMessage; import me.chanjar.weixin.cp.bean.WxCpTag; import me.chanjar.weixin.cp.bean.WxCpUser; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.List; + /** * 微信API的Service */ @@ -47,8 +47,9 @@ public interface WxCpService { /** * 获取access_token, 不强制刷新access_token - * @see #getAccessToken(boolean) + * * @throws WxErrorException + * @see #getAccessToken(boolean) */ String getAccessToken() throws WxErrorException; @@ -60,6 +61,7 @@ public interface WxCpService { * 程序员在非必要情况下尽量不要主动调用此方法 * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=获取access_token * + * * @param forceRefresh 强制刷新 * @throws me.chanjar.weixin.common.exception.WxErrorException */ @@ -67,8 +69,9 @@ public interface WxCpService { /** * 获得jsapi_ticket,不强制刷新jsapi_ticket - * @see #getJsapiTicket(boolean) + * * @throws WxErrorException + * @see #getJsapiTicket(boolean) */ String getJsapiTicket() throws WxErrorException; @@ -79,6 +82,7 @@ public interface WxCpService { * * 详情请见:http://qydev.weixin.qq.com/wiki/index.php?title=微信JS接口#.E9.99.84.E5.BD.951-JS-SDK.E4.BD.BF.E7.94.A8.E6.9D.83.E9.99.90.E7.AD.BE.E5.90.8D.E7.AE.97.E6.B3.95 * + * * @param forceRefresh 强制刷新 * @throws WxErrorException */ @@ -90,7 +94,8 @@ public interface WxCpService { * * 详情请见:http://qydev.weixin.qq.com/wiki/index.php?title=微信JS接口#.E9.99.84.E5.BD.951-JS-SDK.E4.BD.BF.E7.94.A8.E6.9D.83.E9.99.90.E7.AD.BE.E5.90.8D.E7.AE.97.E6.B3.95 * - * @param url url + * + * @param url url */ WxJsapiSignature createJsapiSignature(String url) throws WxErrorException; @@ -111,7 +116,7 @@ public interface WxCpService { * @throws WxErrorException */ WxMediaUploadResult mediaUpload(String mediaType, String fileType, InputStream inputStream) - throws WxErrorException, IOException; + throws WxErrorException, IOException; /** * @param mediaType @@ -128,9 +133,9 @@ public interface WxCpService { * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=上传下载多媒体文件 * * + * @param media_id * @return 保存到本地的临时文件 * @throws WxErrorException - * @param media_id */ File mediaDownload(String media_id) throws WxErrorException; @@ -152,10 +157,10 @@ public interface WxCpService { * * 注意: 这个方法使用WxCpConfigStorage里的agentId * - * @see #menuCreate(String, me.chanjar.weixin.common.bean.WxMenu) * * @param menu * @throws WxErrorException + * @see #menuCreate(String, me.chanjar.weixin.common.bean.WxMenu) */ void menuCreate(WxMenu menu) throws WxErrorException; @@ -166,11 +171,11 @@ public interface WxCpService { * * 注意: 这个方法不使用WxCpConfigStorage里的agentId,需要开发人员自己给出 * - * @see #menuCreate(me.chanjar.weixin.common.bean.WxMenu) * * @param agentId 企业号应用的id * @param menu * @throws WxErrorException + * @see #menuCreate(me.chanjar.weixin.common.bean.WxMenu) */ void menuCreate(String agentId, WxMenu menu) throws WxErrorException; @@ -181,9 +186,9 @@ public interface WxCpService { * * 注意: 这个方法使用WxCpConfigStorage里的agentId * - * @see #menuDelete(String) * * @throws WxErrorException + * @see #menuDelete(String) */ void menuDelete() throws WxErrorException; @@ -194,10 +199,10 @@ public interface WxCpService { * * 注意: 这个方法不使用WxCpConfigStorage里的agentId,需要开发人员自己给出 * - * @see #menuDelete() * * @param agentId 企业号应用的id * @throws WxErrorException + * @see #menuDelete() */ void menuDelete(String agentId) throws WxErrorException; @@ -208,9 +213,9 @@ public interface WxCpService { * * 注意: 这个方法使用WxCpConfigStorage里的agentId * - * @see #menuGet(String) * * @throws WxErrorException + * @see #menuGet(String) */ WxMenu menuGet() throws WxErrorException; @@ -221,10 +226,10 @@ public interface WxCpService { * * 注意: 这个方法不使用WxCpConfigStorage里的agentId,需要开发人员自己给出 * - * @see #menuGet() * * @param agentId 企业号应用的id * @throws WxErrorException + * @see #menuGet() */ WxMenu menuGet(String agentId) throws WxErrorException; @@ -279,9 +284,10 @@ public interface WxCpService { * * http://qydev.weixin.qq.com/wiki/index.php?title=管理成员#.E8.8E.B7.E5.8F.96.E9.83.A8.E9.97.A8.E6.88.90.E5.91.98.28.E8.AF.A6.E6.83.85.29 * - * @param departId 必填。部门id - * @param fetchChild 非必填。1/0:是否递归获取子部门下面的成员 - * @param status 非必填。0获取全部员工,1获取已关注成员列表,2获取禁用成员列表,4获取未关注成员列表。status可叠加 + * + * @param departId 必填。部门id + * @param fetchChild 非必填。1/0:是否递归获取子部门下面的成员 + * @param status 非必填。0获取全部员工,1获取已关注成员列表,2获取禁用成员列表,4获取未关注成员列表。status可叠加 * @throws WxErrorException */ List userList(Integer departId, Boolean fetchChild, Integer status) throws WxErrorException; @@ -330,7 +336,8 @@ public interface WxCpService { * * http://qydev.weixin.qq.com/wiki/index.php?title=管理成员#.E6.89.B9.E9.87.8F.E5.88.A0.E9.99.A4.E6.88.90.E5.91.98 * - * @param userids 员工UserID列表。对应管理端的帐号 + * + * @param userids 员工UserID列表。对应管理端的帐号 * @throws WxErrorException */ void userDelete(String[] userids) throws WxErrorException; @@ -367,7 +374,6 @@ public interface WxCpService { /** * 获得标签列表 - * */ List tagGet() throws WxErrorException; @@ -391,6 +397,7 @@ public interface WxCpService { * 构造oauth2授权的url连接 * 详情请见: http://qydev.weixin.qq.com/wiki/index.php?title=企业获取code * + * * @param redirectUri * @param state * @return url @@ -405,10 +412,10 @@ public interface WxCpService { * * 注意: 这个方法使用WxCpConfigStorage里的agentId * - * @see #oauth2getUserInfo(String, String) * * @param code * @return [userid, deviceid] + * @see #oauth2getUserInfo(String, String) */ String[] oauth2getUserInfo(String code) throws WxErrorException; @@ -420,11 +427,11 @@ public interface WxCpService { * * 注意: 这个方法不使用WxCpConfigStorage里的agentId,需要开发人员自己给出 * - * @see #oauth2getUserInfo(String) * * @param agentId 企业号应用的id * @param code * @return [userid, deviceid] + * @see #oauth2getUserInfo(String) */ String[] oauth2getUserInfo(String agentId, String code) throws WxErrorException; @@ -442,8 +449,9 @@ public interface WxCpService { * 邀请成员关注 * http://qydev.weixin.qq.com/wiki/index.php?title=管理成员#.E9.82.80.E8.AF.B7.E6.88.90.E5.91.98.E5.85.B3.E6.B3.A8 * - * @param userId 用户的userid - * @param inviteTips 推送到微信上的提示语(只有认证号可以使用)。当使用微信推送时,该字段默认为“请关注XXX企业号”,邮件邀请时,该字段无效。 + * + * @param userId 用户的userid + * @param inviteTips 推送到微信上的提示语(只有认证号可以使用)。当使用微信推送时,该字段默认为“请关注XXX企业号”,邮件邀请时,该字段无效。 * @return 1:微信邀请 2.邮件邀请 * @throws WxErrorException */ @@ -454,6 +462,7 @@ public interface WxCpService { * 获取微信服务器的ip段 * http://qydev.weixin.qq.com/wiki/index.php?title=回调模式#.E8.8E.B7.E5.8F.96.E5.BE.AE.E4.BF.A1.E6.9C.8D.E5.8A.A1.E5.99.A8.E7.9A.84ip.E6.AE.B5 * + * * @return { "ip_list": ["101.226.103.*", "101.226.62.*"] } * @throws WxErrorException */ @@ -461,6 +470,7 @@ public interface WxCpService { /** * 当本Service没有实现某个API的时候,可以用这个,针对所有微信API中的GET请求 + * * @param url * @param queryParam * @throws WxErrorException @@ -469,6 +479,7 @@ public interface WxCpService { /** * 当本Service没有实现某个API的时候,可以用这个,针对所有微信API中的POST请求 + * * @param url * @param postData * @throws WxErrorException @@ -481,6 +492,7 @@ public interface WxCpService { * 比{@link #get}和{@link #post}方法更灵活,可以自己构造RequestExecutor用来处理不同的参数和不同的返回类型。 * 可以参考,{@link me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor}的实现方法 * + * * @param executor * @param uri * @param data @@ -502,6 +514,7 @@ public interface WxCpService { * 设置当微信系统响应系统繁忙时,要等待多少 retrySleepMillis(ms) * 2^(重试次数 - 1) 再发起重试 * 默认:1000ms * + * * @param retrySleepMillis */ void setRetrySleepMillis(int retrySleepMillis); @@ -511,19 +524,22 @@ public interface WxCpService { * 设置当微信系统响应系统繁忙时,最大重试次数 * 默认:5次 * + * * @param maxRetryTimes */ void setMaxRetryTimes(int maxRetryTimes); /** * 获取某个sessionId对应的session,如果sessionId没有对应的session,则新建一个并返回。 + * * @param id id可以为任意字符串,建议使用FromUserName作为id */ WxSession getSession(String id); /** * 获取某个sessionId对应的session,如果sessionId没有对应的session,若create为true则新建一个,否则返回null。 - * @param id id可以为任意字符串,建议使用FromUserName作为id + * + * @param id id可以为任意字符串,建议使用FromUserName作为id * @param create */ WxSession getSession(String id, boolean create); @@ -533,12 +549,14 @@ public interface WxCpService { * 设置WxSessionManager,只有当需要使用个性化的WxSessionManager的时候才需要调用此方法, * WxCpService默认使用的是{@link me.chanjar.weixin.common.session.StandardSessionManager} * + * * @param sessionManager */ void setSessionManager(WxSessionManager sessionManager); /** * 上传部门列表覆盖企业号上的部门信息 + * * @param mediaId * @throws WxErrorException */ @@ -546,6 +564,7 @@ public interface WxCpService { /** * 上传用户列表覆盖企业号上的用户信息 + * * @param mediaId * @throws WxErrorException */ @@ -553,6 +572,7 @@ public interface WxCpService { /** * 获取异步任务结果 + * * @param joinId * @throws WxErrorException */ diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java index a3858493..10deacc1 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java @@ -1,23 +1,5 @@ package me.chanjar.weixin.cp.api; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.StringReader; -import java.security.NoSuchAlgorithmException; -import java.util.List; -import java.util.UUID; - -import org.apache.http.HttpHost; -import org.apache.http.client.ClientProtocolException; -import org.apache.http.client.config.RequestConfig; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.impl.client.BasicResponseHandler; -import org.apache.http.impl.client.CloseableHttpClient; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; @@ -25,7 +7,6 @@ import com.google.gson.JsonPrimitive; import com.google.gson.internal.Streams; import com.google.gson.reflect.TypeToken; import com.google.gson.stream.JsonReader; - import me.chanjar.weixin.common.bean.WxAccessToken; import me.chanjar.weixin.common.bean.WxJsapiSignature; import me.chanjar.weixin.common.bean.menu.WxMenu; @@ -39,20 +20,30 @@ import me.chanjar.weixin.common.util.RandomUtils; import me.chanjar.weixin.common.util.StringUtils; import me.chanjar.weixin.common.util.crypto.SHA1; import me.chanjar.weixin.common.util.fs.FileUtils; -import me.chanjar.weixin.common.util.http.ApacheHttpClientBuilder; -import me.chanjar.weixin.common.util.http.DefaultApacheHttpHttpClientBuilder; -import me.chanjar.weixin.common.util.http.MediaDownloadRequestExecutor; -import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor; -import me.chanjar.weixin.common.util.http.RequestExecutor; -import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor; -import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor; -import me.chanjar.weixin.common.util.http.URIUtil; +import me.chanjar.weixin.common.util.http.*; import me.chanjar.weixin.common.util.json.GsonHelper; import me.chanjar.weixin.cp.bean.WxCpDepart; import me.chanjar.weixin.cp.bean.WxCpMessage; import me.chanjar.weixin.cp.bean.WxCpTag; import me.chanjar.weixin.cp.bean.WxCpUser; import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; +import org.apache.http.HttpHost; +import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.BasicResponseHandler; +import org.apache.http.impl.client.CloseableHttpClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.StringReader; +import java.security.NoSuchAlgorithmException; +import java.util.List; +import java.util.UUID; public class WxCpServiceImpl implements WxCpService { @@ -73,17 +64,13 @@ public class WxCpServiceImpl implements WxCpService { protected CloseableHttpClient httpClient; protected HttpHost httpProxy; - - private int retrySleepMillis = 1000; - - private int maxRetryTimes = 5; - protected WxSessionManager sessionManager = new StandardSessionManager(); - /** * 临时文件目录 */ protected File tmpDirFile; + private int retrySleepMillis = 1000; + private int maxRetryTimes = 5; public boolean checkSignature(String msgSignature, String timestamp, String nonce, String data) { try { @@ -110,8 +97,8 @@ public class WxCpServiceImpl implements WxCpService { synchronized (globalAccessTokenRefreshLock) { if (wxCpConfigStorage.isAccessTokenExpired()) { String url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?" - + "&corpid=" + wxCpConfigStorage.getCorpId() - + "&corpsecret=" + wxCpConfigStorage.getCorpSecret(); + + "&corpid=" + wxCpConfigStorage.getCorpId() + + "&corpsecret=" + wxCpConfigStorage.getCorpSecret(); try { HttpGet httpGet = new HttpGet(url); if (httpProxy != null) { @@ -122,7 +109,7 @@ public class WxCpServiceImpl implements WxCpService { String resultContent = null; try (CloseableHttpResponse response = httpclient.execute(httpGet)) { resultContent = new BasicResponseHandler().handleResponse(response); - }finally { + } finally { httpGet.releaseConnection(); } WxError error = WxError.fromJson(resultContent); @@ -172,10 +159,10 @@ public class WxCpServiceImpl implements WxCpService { String jsapiTicket = getJsapiTicket(false); try { String signature = SHA1.genWithAmple( - "jsapi_ticket=" + jsapiTicket, - "noncestr=" + noncestr, - "timestamp=" + timestamp, - "url=" + url + "jsapi_ticket=" + jsapiTicket, + "noncestr=" + noncestr, + "timestamp=" + timestamp, + "url=" + url ); WxJsapiSignature jsapiSignature = new WxJsapiSignature(); jsapiSignature.setTimestamp(timestamp); @@ -236,7 +223,7 @@ public class WxCpServiceImpl implements WxCpService { } public WxMediaUploadResult mediaUpload(String mediaType, String fileType, InputStream inputStream) - throws WxErrorException, IOException { + throws WxErrorException, IOException { return mediaUpload(mediaType, FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), fileType)); } @@ -254,9 +241,9 @@ public class WxCpServiceImpl implements WxCpService { public Integer departCreate(WxCpDepart depart) throws WxErrorException { String url = "https://qyapi.weixin.qq.com/cgi-bin/department/create"; String responseContent = execute( - new SimplePostRequestExecutor(), - url, - depart.toJson()); + new SimplePostRequestExecutor(), + url, + depart.toJson()); JsonElement tmpJsonElement = Streams.parse(new JsonReader(new StringReader(responseContent))); return GsonHelper.getAsInteger(tmpJsonElement.getAsJsonObject().get("id")); } @@ -280,11 +267,11 @@ public class WxCpServiceImpl implements WxCpService { */ JsonElement tmpJsonElement = Streams.parse(new JsonReader(new StringReader(responseContent))); return WxCpGsonBuilder.INSTANCE.create() - .fromJson( - tmpJsonElement.getAsJsonObject().get("department"), - new TypeToken>() { - }.getType() - ); + .fromJson( + tmpJsonElement.getAsJsonObject().get("department"), + new TypeToken>() { + }.getType() + ); } @Override @@ -340,10 +327,11 @@ public class WxCpServiceImpl implements WxCpService { String responseContent = get(url, params); JsonElement tmpJsonElement = Streams.parse(new JsonReader(new StringReader(responseContent))); return WxCpGsonBuilder.INSTANCE.create() - .fromJson( - tmpJsonElement.getAsJsonObject().get("userlist"), - new TypeToken>() { }.getType() - ); + .fromJson( + tmpJsonElement.getAsJsonObject().get("userlist"), + new TypeToken>() { + }.getType() + ); } @Override @@ -362,10 +350,11 @@ public class WxCpServiceImpl implements WxCpService { String responseContent = get(url, params); JsonElement tmpJsonElement = Streams.parse(new JsonReader(new StringReader(responseContent))); return WxCpGsonBuilder.INSTANCE.create() - .fromJson( - tmpJsonElement.getAsJsonObject().get("userlist"), - new TypeToken>() { }.getType() - ); + .fromJson( + tmpJsonElement.getAsJsonObject().get("userlist"), + new TypeToken>() { + }.getType() + ); } @Override @@ -399,11 +388,11 @@ public class WxCpServiceImpl implements WxCpService { String responseContent = get(url, null); JsonElement tmpJsonElement = Streams.parse(new JsonReader(new StringReader(responseContent))); return WxCpGsonBuilder.INSTANCE.create() - .fromJson( - tmpJsonElement.getAsJsonObject().get("taglist"), - new TypeToken>() { - }.getType() - ); + .fromJson( + tmpJsonElement.getAsJsonObject().get("taglist"), + new TypeToken>() { + }.getType() + ); } @Override @@ -412,10 +401,11 @@ public class WxCpServiceImpl implements WxCpService { String responseContent = get(url, null); JsonElement tmpJsonElement = Streams.parse(new JsonReader(new StringReader(responseContent))); return WxCpGsonBuilder.INSTANCE.create() - .fromJson( - tmpJsonElement.getAsJsonObject().get("userlist"), - new TypeToken>() { }.getType() - ); + .fromJson( + tmpJsonElement.getAsJsonObject().get("userlist"), + new TypeToken>() { + }.getType() + ); } @Override @@ -455,7 +445,7 @@ public class WxCpServiceImpl implements WxCpService { @Override public String oauth2buildAuthorizationUrl(String redirectUri, String state) { - String url = "https://open.weixin.qq.com/connect/oauth2/authorize?" ; + String url = "https://open.weixin.qq.com/connect/oauth2/authorize?"; url += "appid=" + wxCpConfigStorage.getCorpId(); url += "&redirect_uri=" + URIUtil.encodeURIComponent(redirectUri); url += "&response_type=code"; @@ -475,12 +465,12 @@ public class WxCpServiceImpl implements WxCpService { @Override public String[] oauth2getUserInfo(String agentId, String code) throws WxErrorException { String url = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?" - + "code=" + code - + "&agendid=" + agentId; + + "code=" + code + + "&agendid=" + agentId; String responseText = get(url, null); JsonElement je = Streams.parse(new JsonReader(new StringReader(responseText))); JsonObject jo = je.getAsJsonObject(); - return new String[] {GsonHelper.getString(jo, "UserId"), GsonHelper.getString(jo, "DeviceId")}; + return new String[]{GsonHelper.getString(jo, "UserId"), GsonHelper.getString(jo, "DeviceId")}; } @Override @@ -503,7 +493,7 @@ public class WxCpServiceImpl implements WxCpService { JsonElement tmpJsonElement = Streams.parse(new JsonReader(new StringReader(responseContent))); JsonArray jsonArray = tmpJsonElement.getAsJsonObject().get("ip_list").getAsJsonArray(); String[] ips = new String[jsonArray.size()]; - for(int i = 0; i < jsonArray.size(); i++) { + for (int i = 0; i < jsonArray.size(); i++) { ips[i] = jsonArray.get(i).getAsString(); } return ips; @@ -542,7 +532,7 @@ public class WxCpServiceImpl implements WxCpService { throw e; } } - } while(++retryTimes < maxRetryTimes); + } while (++retryTimes < maxRetryTimes); throw new RuntimeException("微信服务端异常,超出重试次数"); } @@ -580,6 +570,7 @@ public class WxCpServiceImpl implements WxCpService { throw new RuntimeException(e); } } + protected CloseableHttpClient getHttpclient() { return httpClient; } @@ -591,9 +582,9 @@ public class WxCpServiceImpl implements WxCpService { apacheHttpClientBuilder = DefaultApacheHttpHttpClientBuilder.get(); } apacheHttpClientBuilder.httpProxyHost(wxCpConfigStorage.getHttp_proxy_host()) - .httpProxyPort(wxCpConfigStorage.getHttp_proxy_port()) - .httpProxyUsername(wxCpConfigStorage.getHttp_proxy_username()) - .httpProxyPassword(wxCpConfigStorage.getHttp_proxy_password()); + .httpProxyPort(wxCpConfigStorage.getHttp_proxy_port()) + .httpProxyUsername(wxCpConfigStorage.getHttp_proxy_username()) + .httpProxyPassword(wxCpConfigStorage.getHttp_proxy_password()); httpClient = apacheHttpClientBuilder.build(); } @@ -630,27 +621,27 @@ public class WxCpServiceImpl implements WxCpService { public void setSessionManager(WxSessionManager sessionManager) { this.sessionManager = sessionManager; } - + @Override public String replaceParty(String mediaId) throws WxErrorException { - String url = "https://qyapi.weixin.qq.com/cgi-bin/batch/replaceparty"; - JsonObject jsonObject = new JsonObject(); - jsonObject.addProperty("media_id", mediaId); - return post(url, jsonObject.toString()); + String url = "https://qyapi.weixin.qq.com/cgi-bin/batch/replaceparty"; + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("media_id", mediaId); + return post(url, jsonObject.toString()); } @Override public String replaceUser(String mediaId) throws WxErrorException { - String url = "https://qyapi.weixin.qq.com/cgi-bin/batch/replaceuser"; - JsonObject jsonObject = new JsonObject(); - jsonObject.addProperty("media_id", mediaId); - return post(url, jsonObject.toString()); + String url = "https://qyapi.weixin.qq.com/cgi-bin/batch/replaceuser"; + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("media_id", mediaId); + return post(url, jsonObject.toString()); } @Override public String getTaskResult(String joinId) throws WxErrorException { - String url = "https://qyapi.weixin.qq.com/cgi-bin/batch/getresult?jobid="+joinId; - return get(url, null); + String url = "https://qyapi.weixin.qq.com/cgi-bin/batch/getresult?jobid=" + joinId; + return get(url, null); } public File getTmpDirFile() { diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpDepart.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpDepart.java index 04fb46fd..e2bfbd39 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpDepart.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpDepart.java @@ -16,6 +16,10 @@ public class WxCpDepart implements Serializable { private Integer parentId; private Integer order; + public static WxCpDepart fromJson(String json) { + return WxCpGsonBuilder.create().fromJson(json, WxCpDepart.class); + } + public Integer getId() { return id; } @@ -48,10 +52,6 @@ public class WxCpDepart implements Serializable { this.order = order; } - public static WxCpDepart fromJson(String json) { - return WxCpGsonBuilder.create().fromJson(json, WxCpDepart.class); - } - public String toJson() { return WxCpGsonBuilder.create().toJson(this); } @@ -59,10 +59,10 @@ public class WxCpDepart implements Serializable { @Override public String toString() { return "WxCpDepart{" + - "id=" + id + - ", name='" + name + '\'' + - ", parentId=" + parentId + - ", order=" + order + - '}'; + "id=" + id + + ", name='" + name + '\'' + + ", parentId=" + parentId + + ", order=" + order + + '}'; } } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMessage.java index 25734aef..89611525 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMessage.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMessage.java @@ -9,8 +9,8 @@ import java.util.List; /** * 消息 - * @author Daniel Qian * + * @author Daniel Qian */ public class WxCpMessage implements Serializable { @@ -29,9 +29,52 @@ public class WxCpMessage implements Serializable { private String safe; private List articles = new ArrayList(); + /** + * 获得文本消息builder + */ + public static TextBuilder TEXT() { + return new TextBuilder(); + } + + /** + * 获得图片消息builder + */ + public static ImageBuilder IMAGE() { + return new ImageBuilder(); + } + + /** + * 获得语音消息builder + */ + public static VoiceBuilder VOICE() { + return new VoiceBuilder(); + } + + /** + * 获得视频消息builder + */ + public static VideoBuilder VIDEO() { + return new VideoBuilder(); + } + + /** + * 获得图文消息builder + */ + public static NewsBuilder NEWS() { + return new NewsBuilder(); + } + + /** + * 获得文件消息builder + */ + public static FileBuilder FILE() { + return new FileBuilder(); + } + public String getToUser() { return toUser; } + public void setToUser(String toUser) { this.toUser = toUser; } @@ -64,14 +107,6 @@ public class WxCpMessage implements Serializable { return msgType; } - public String getSafe() { - return safe; - } - - public void setSafe(String safe) { - this.safe = safe; - } - /** *

        * 请使用
    @@ -82,56 +117,81 @@ public class WxCpMessage implements Serializable {
        * {@link me.chanjar.weixin.common.api.WxConsts#CUSTOM_MSG_VIDEO}
        * {@link me.chanjar.weixin.common.api.WxConsts#CUSTOM_MSG_NEWS}
        * 
    + * * @param msgType */ public void setMsgType(String msgType) { this.msgType = msgType; } + + public String getSafe() { + return safe; + } + + public void setSafe(String safe) { + this.safe = safe; + } + public String getContent() { return content; } + public void setContent(String content) { this.content = content; } + public String getMediaId() { return mediaId; } + public void setMediaId(String mediaId) { this.mediaId = mediaId; } + public String getThumbMediaId() { return thumbMediaId; } + public void setThumbMediaId(String thumbMediaId) { this.thumbMediaId = thumbMediaId; } + public String getTitle() { return title; } + public void setTitle(String title) { this.title = title; } + public String getDescription() { return description; } + public void setDescription(String description) { this.description = description; } + public String getMusicUrl() { return musicUrl; } + public void setMusicUrl(String musicUrl) { this.musicUrl = musicUrl; } + public String getHqMusicUrl() { return hqMusicUrl; } + public void setHqMusicUrl(String hqMusicUrl) { this.hqMusicUrl = hqMusicUrl; } + public List getArticles() { return articles; } + public void setArticles(List articles) { this.articles = articles; } @@ -150,70 +210,35 @@ public class WxCpMessage implements Serializable { public String getTitle() { return title; } + public void setTitle(String title) { this.title = title; } + public String getDescription() { return description; } + public void setDescription(String description) { this.description = description; } + public String getUrl() { return url; } + public void setUrl(String url) { this.url = url; } + public String getPicUrl() { return picUrl; } + public void setPicUrl(String picUrl) { this.picUrl = picUrl; } } - /** - * 获得文本消息builder - */ - public static TextBuilder TEXT() { - return new TextBuilder(); - } - - /** - * 获得图片消息builder - */ - public static ImageBuilder IMAGE() { - return new ImageBuilder(); - } - - /** - * 获得语音消息builder - */ - public static VoiceBuilder VOICE() { - return new VoiceBuilder(); - } - - /** - * 获得视频消息builder - */ - public static VideoBuilder VIDEO() { - return new VideoBuilder(); - } - - /** - * 获得图文消息builder - */ - public static NewsBuilder NEWS() { - return new NewsBuilder(); - } - - /** - * 获得文件消息builder - */ - public static FileBuilder FILE() { - return new FileBuilder(); - } - } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTag.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTag.java index 6c5d42c6..72fd6628 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTag.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTag.java @@ -23,6 +23,10 @@ public class WxCpTag implements Serializable { this.name = name; } + public static WxCpTag fromJson(String json) { + return WxCpGsonBuilder.create().fromJson(json, WxCpTag.class); + } + public String getName() { return name; } @@ -39,10 +43,6 @@ public class WxCpTag implements Serializable { this.id = id; } - public static WxCpTag fromJson(String json) { - return WxCpGsonBuilder.create().fromJson(json, WxCpTag.class); - } - public String toJson() { return WxCpGsonBuilder.create().toJson(this); } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUser.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUser.java index 58b1d5ca..e96206eb 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUser.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUser.java @@ -13,6 +13,7 @@ import java.util.List; */ public class WxCpUser implements Serializable { + private final List extAttrs = new ArrayList(); private String userId; private String name; private Integer[] departIds; @@ -25,7 +26,10 @@ public class WxCpUser implements Serializable { private String avatar; private Integer status; private Integer enable; - private final List extAttrs = new ArrayList(); + + public static WxCpUser fromJson(String json) { + return WxCpGsonBuilder.INSTANCE.create().fromJson(json, WxCpUser.class); + } public String getUserId() { return userId; @@ -116,13 +120,13 @@ public class WxCpUser implements Serializable { } public Integer getEnable() { - return enable; + return enable; } - + public void setEnable(Integer enable) { - this.enable = enable; + this.enable = enable; } - + public void addExtAttr(String name, String value) { this.extAttrs.add(new Attr(name, value)); } @@ -135,10 +139,6 @@ public class WxCpUser implements Serializable { return WxCpGsonBuilder.INSTANCE.create().toJson(this); } - public static WxCpUser fromJson(String json) { - return WxCpGsonBuilder.INSTANCE.create().fromJson(json, WxCpUser.class); - } - public static class Attr { private String name; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlMessage.java index eaf926e2..0b833e06 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlMessage.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlMessage.java @@ -36,41 +36,41 @@ public class WxCpXmlMessage implements Serializable { private Integer agentId; @XStreamAlias("ToUserName") - @XStreamConverter(value=XStreamCDataConverter.class) + @XStreamConverter(value = XStreamCDataConverter.class) private String toUserName; @XStreamAlias("FromUserName") - @XStreamConverter(value=XStreamCDataConverter.class) + @XStreamConverter(value = XStreamCDataConverter.class) private String fromUserName; @XStreamAlias("CreateTime") private Long createTime; @XStreamAlias("MsgType") - @XStreamConverter(value=XStreamCDataConverter.class) + @XStreamConverter(value = XStreamCDataConverter.class) private String msgType; @XStreamAlias("Content") - @XStreamConverter(value=XStreamCDataConverter.class) + @XStreamConverter(value = XStreamCDataConverter.class) private String content; @XStreamAlias("MsgId") private Long msgId; @XStreamAlias("PicUrl") - @XStreamConverter(value=XStreamCDataConverter.class) + @XStreamConverter(value = XStreamCDataConverter.class) private String picUrl; @XStreamAlias("MediaId") - @XStreamConverter(value=XStreamCDataConverter.class) + @XStreamConverter(value = XStreamCDataConverter.class) private String mediaId; @XStreamAlias("Format") - @XStreamConverter(value=XStreamCDataConverter.class) + @XStreamConverter(value = XStreamCDataConverter.class) private String format; @XStreamAlias("ThumbMediaId") - @XStreamConverter(value=XStreamCDataConverter.class) + @XStreamConverter(value = XStreamCDataConverter.class) private String thumbMediaId; @XStreamAlias("Location_X") @@ -83,31 +83,31 @@ public class WxCpXmlMessage implements Serializable { private Double scale; @XStreamAlias("Label") - @XStreamConverter(value=XStreamCDataConverter.class) + @XStreamConverter(value = XStreamCDataConverter.class) private String label; @XStreamAlias("Title") - @XStreamConverter(value=XStreamCDataConverter.class) + @XStreamConverter(value = XStreamCDataConverter.class) private String title; @XStreamAlias("Description") - @XStreamConverter(value=XStreamCDataConverter.class) + @XStreamConverter(value = XStreamCDataConverter.class) private String description; @XStreamAlias("Url") - @XStreamConverter(value=XStreamCDataConverter.class) + @XStreamConverter(value = XStreamCDataConverter.class) private String url; @XStreamAlias("Event") - @XStreamConverter(value=XStreamCDataConverter.class) + @XStreamConverter(value = XStreamCDataConverter.class) private String event; @XStreamAlias("EventKey") - @XStreamConverter(value=XStreamCDataConverter.class) + @XStreamConverter(value = XStreamCDataConverter.class) private String eventKey; @XStreamAlias("Ticket") - @XStreamConverter(value=XStreamCDataConverter.class) + @XStreamConverter(value = XStreamCDataConverter.class) private String ticket; @XStreamAlias("Latitude") @@ -120,7 +120,7 @@ public class WxCpXmlMessage implements Serializable { private Double precision; @XStreamAlias("Recognition") - @XStreamConverter(value=XStreamCDataConverter.class) + @XStreamConverter(value = XStreamCDataConverter.class) private String recognition; /////////////////////////////////////// @@ -130,7 +130,7 @@ public class WxCpXmlMessage implements Serializable { * 群发的结果 */ @XStreamAlias("Status") - @XStreamConverter(value=XStreamCDataConverter.class) + @XStreamConverter(value = XStreamCDataConverter.class) private String status; /** * group_id下粉丝数;或者openid_list中的粉丝数 @@ -162,6 +162,43 @@ public class WxCpXmlMessage implements Serializable { @XStreamAlias("SendLocationInfo") private SendLocationInfo sendLocationInfo = new SendLocationInfo(); + protected static WxCpXmlMessage fromXml(String xml) { + return XStreamTransformer.fromXml(WxCpXmlMessage.class, xml); + } + + protected static WxCpXmlMessage fromXml(InputStream is) { + return XStreamTransformer.fromXml(WxCpXmlMessage.class, is); + } + + /** + * 从加密字符串转换 + * + * @param encryptedXml + * @param wxCpConfigStorage + * @param timestamp + * @param nonce + * @param msgSignature + */ + public static WxCpXmlMessage fromEncryptedXml( + String encryptedXml, + WxCpConfigStorage wxCpConfigStorage, + String timestamp, String nonce, String msgSignature) { + WxCpCryptUtil cryptUtil = new WxCpCryptUtil(wxCpConfigStorage); + String plainText = cryptUtil.decrypt(msgSignature, timestamp, nonce, encryptedXml); + return fromXml(plainText); + } + + public static WxCpXmlMessage fromEncryptedXml( + InputStream is, + WxCpConfigStorage wxCpConfigStorage, + String timestamp, String nonce, String msgSignature) { + try { + return fromEncryptedXml(IOUtils.toString(is, "UTF-8"), wxCpConfigStorage, timestamp, nonce, msgSignature); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + public Integer getAgentId() { return agentId; } @@ -197,7 +234,6 @@ public class WxCpXmlMessage implements Serializable { * {@link me.chanjar.weixin.common.api.WxConsts#XML_MSG_LINK} * {@link me.chanjar.weixin.common.api.WxConsts#XML_MSG_EVENT} * - * */ public String getMsgType() { return msgType; @@ -387,43 +423,6 @@ public class WxCpXmlMessage implements Serializable { this.fromUserName = fromUserName; } - protected static WxCpXmlMessage fromXml(String xml) { - return XStreamTransformer.fromXml(WxCpXmlMessage.class, xml); - } - - protected static WxCpXmlMessage fromXml(InputStream is) { - return XStreamTransformer.fromXml(WxCpXmlMessage.class, is); - } - - /** - * 从加密字符串转换 - * - * @param encryptedXml - * @param wxCpConfigStorage - * @param timestamp - * @param nonce - * @param msgSignature - */ - public static WxCpXmlMessage fromEncryptedXml( - String encryptedXml, - WxCpConfigStorage wxCpConfigStorage, - String timestamp, String nonce, String msgSignature) { - WxCpCryptUtil cryptUtil = new WxCpCryptUtil(wxCpConfigStorage); - String plainText = cryptUtil.decrypt(msgSignature, timestamp, nonce, encryptedXml); - return fromXml(plainText); - } - - public static WxCpXmlMessage fromEncryptedXml( - InputStream is, - WxCpConfigStorage wxCpConfigStorage, - String timestamp, String nonce, String msgSignature) { - try { - return fromEncryptedXml(IOUtils.toString(is, "UTF-8"), wxCpConfigStorage, timestamp, nonce, msgSignature); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - public String getStatus() { return status; } @@ -491,51 +490,51 @@ public class WxCpXmlMessage implements Serializable { @Override public String toString() { return "WxCpXmlMessage{" + - "agentId=" + agentId + - ", toUserName='" + toUserName + '\'' + - ", fromUserName='" + fromUserName + '\'' + - ", createTime=" + createTime + - ", msgType='" + msgType + '\'' + - ", content='" + content + '\'' + - ", msgId=" + msgId + - ", picUrl='" + picUrl + '\'' + - ", mediaId='" + mediaId + '\'' + - ", format='" + format + '\'' + - ", thumbMediaId='" + thumbMediaId + '\'' + - ", locationX=" + locationX + - ", locationY=" + locationY + - ", scale=" + scale + - ", label='" + label + '\'' + - ", title='" + title + '\'' + - ", description='" + description + '\'' + - ", url='" + url + '\'' + - ", event='" + event + '\'' + - ", eventKey='" + eventKey + '\'' + - ", ticket='" + ticket + '\'' + - ", latitude=" + latitude + - ", longitude=" + longitude + - ", precision=" + precision + - ", recognition='" + recognition + '\'' + - ", status='" + status + '\'' + - ", totalCount=" + totalCount + - ", filterCount=" + filterCount + - ", sentCount=" + sentCount + - ", errorCount=" + errorCount + - ", scanCodeInfo=" + scanCodeInfo + - ", sendPicsInfo=" + sendPicsInfo + - ", sendLocationInfo=" + sendLocationInfo + - '}'; + "agentId=" + agentId + + ", toUserName='" + toUserName + '\'' + + ", fromUserName='" + fromUserName + '\'' + + ", createTime=" + createTime + + ", msgType='" + msgType + '\'' + + ", content='" + content + '\'' + + ", msgId=" + msgId + + ", picUrl='" + picUrl + '\'' + + ", mediaId='" + mediaId + '\'' + + ", format='" + format + '\'' + + ", thumbMediaId='" + thumbMediaId + '\'' + + ", locationX=" + locationX + + ", locationY=" + locationY + + ", scale=" + scale + + ", label='" + label + '\'' + + ", title='" + title + '\'' + + ", description='" + description + '\'' + + ", url='" + url + '\'' + + ", event='" + event + '\'' + + ", eventKey='" + eventKey + '\'' + + ", ticket='" + ticket + '\'' + + ", latitude=" + latitude + + ", longitude=" + longitude + + ", precision=" + precision + + ", recognition='" + recognition + '\'' + + ", status='" + status + '\'' + + ", totalCount=" + totalCount + + ", filterCount=" + filterCount + + ", sentCount=" + sentCount + + ", errorCount=" + errorCount + + ", scanCodeInfo=" + scanCodeInfo + + ", sendPicsInfo=" + sendPicsInfo + + ", sendLocationInfo=" + sendLocationInfo + + '}'; } @XStreamAlias("ScanCodeInfo") public static class ScanCodeInfo { @XStreamAlias("ScanType") - @XStreamConverter(value=XStreamCDataConverter.class) + @XStreamConverter(value = XStreamCDataConverter.class) private String scanType; @XStreamAlias("ScanResult") - @XStreamConverter(value=XStreamCDataConverter.class) + @XStreamConverter(value = XStreamCDataConverter.class) private String scanResult; /** @@ -566,11 +565,10 @@ public class WxCpXmlMessage implements Serializable { @XStreamAlias("SendPicsInfo") public static class SendPicsInfo { - @XStreamAlias("Count") - private Long count; - @XStreamAlias("PicList") protected final List picList = new ArrayList(); + @XStreamAlias("Count") + private Long count; public Long getCount() { return count; @@ -588,7 +586,7 @@ public class WxCpXmlMessage implements Serializable { public static class Item { @XStreamAlias("PicMd5Sum") - @XStreamConverter(value=XStreamCDataConverter.class) + @XStreamConverter(value = XStreamCDataConverter.class) private String PicMd5Sum; public String getPicMd5Sum() { @@ -605,23 +603,23 @@ public class WxCpXmlMessage implements Serializable { public static class SendLocationInfo { @XStreamAlias("Location_X") - @XStreamConverter(value=XStreamCDataConverter.class) + @XStreamConverter(value = XStreamCDataConverter.class) private String locationX; @XStreamAlias("Location_Y") - @XStreamConverter(value=XStreamCDataConverter.class) + @XStreamConverter(value = XStreamCDataConverter.class) private String locationY; @XStreamAlias("Scale") - @XStreamConverter(value=XStreamCDataConverter.class) + @XStreamConverter(value = XStreamCDataConverter.class) private String scale; @XStreamAlias("Label") - @XStreamConverter(value=XStreamCDataConverter.class) + @XStreamConverter(value = XStreamCDataConverter.class) private String label; @XStreamAlias("Poiname") - @XStreamConverter(value=XStreamCDataConverter.class) + @XStreamConverter(value = XStreamCDataConverter.class) private String poiname; public String getLocationX() { diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutImageMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutImageMessage.java index 9706a5aa..1bf4a33f 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutImageMessage.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutImageMessage.java @@ -7,15 +7,15 @@ import me.chanjar.weixin.common.util.xml.XStreamMediaIdConverter; @XStreamAlias("xml") public class WxCpXmlOutImageMessage extends WxCpXmlOutMessage { - + @XStreamAlias("Image") - @XStreamConverter(value=XStreamMediaIdConverter.class) + @XStreamConverter(value = XStreamMediaIdConverter.class) private String mediaId; public WxCpXmlOutImageMessage() { this.msgType = WxConsts.XML_MSG_IMAGE; } - + public String getMediaId() { return mediaId; } @@ -23,5 +23,5 @@ public class WxCpXmlOutImageMessage extends WxCpXmlOutMessage { public void setMediaId(String mediaId) { this.mediaId = mediaId; } - + } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutMessage.java index eccfbecd..257778bf 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutMessage.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutMessage.java @@ -12,20 +12,55 @@ import me.chanjar.weixin.cp.util.xml.XStreamTransformer; public abstract class WxCpXmlOutMessage { @XStreamAlias("ToUserName") - @XStreamConverter(value=XStreamCDataConverter.class) + @XStreamConverter(value = XStreamCDataConverter.class) protected String toUserName; @XStreamAlias("FromUserName") - @XStreamConverter(value=XStreamCDataConverter.class) + @XStreamConverter(value = XStreamCDataConverter.class) protected String fromUserName; @XStreamAlias("CreateTime") protected Long createTime; @XStreamAlias("MsgType") - @XStreamConverter(value=XStreamCDataConverter.class) + @XStreamConverter(value = XStreamCDataConverter.class) protected String msgType; + /** + * 获得文本消息builder + */ + public static TextBuilder TEXT() { + return new TextBuilder(); + } + + /** + * 获得图片消息builder + */ + public static ImageBuilder IMAGE() { + return new ImageBuilder(); + } + + /** + * 获得语音消息builder + */ + public static VoiceBuilder VOICE() { + return new VoiceBuilder(); + } + + /** + * 获得视频消息builder + */ + public static VideoBuilder VIDEO() { + return new VideoBuilder(); + } + + /** + * 获得图文消息builder + */ + public static NewsBuilder NEWS() { + return new NewsBuilder(); + } + public String getToUserName() { return toUserName; } @@ -59,7 +94,7 @@ public abstract class WxCpXmlOutMessage { } protected String toXml() { - return XStreamTransformer.toXml((Class)this.getClass(), this); + return XStreamTransformer.toXml((Class) this.getClass(), this); } /** @@ -70,39 +105,4 @@ public abstract class WxCpXmlOutMessage { WxCpCryptUtil pc = new WxCpCryptUtil(wxCpConfigStorage); return pc.encrypt(plainXml); } - - /** - * 获得文本消息builder - */ - public static TextBuilder TEXT() { - return new TextBuilder(); - } - - /** - * 获得图片消息builder - */ - public static ImageBuilder IMAGE() { - return new ImageBuilder(); - } - - /** - * 获得语音消息builder - */ - public static VoiceBuilder VOICE() { - return new VoiceBuilder(); - } - - /** - * 获得视频消息builder - */ - public static VideoBuilder VIDEO() { - return new VideoBuilder(); - } - - /** - * 获得图文消息builder - */ - public static NewsBuilder NEWS() { - return new NewsBuilder(); - } } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutNewsMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutNewsMessage.java index 79c35ba9..3b7ae3af 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutNewsMessage.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutNewsMessage.java @@ -11,12 +11,11 @@ import java.util.List; @XStreamAlias("xml") public class WxCpXmlOutNewsMessage extends WxCpXmlOutMessage { - @XStreamAlias("ArticleCount") - protected int articleCount; - @XStreamAlias("Articles") protected final List articles = new ArrayList(); - + @XStreamAlias("ArticleCount") + protected int articleCount; + public WxCpXmlOutNewsMessage() { this.msgType = WxConsts.XML_MSG_NEWS; } @@ -29,31 +28,31 @@ public class WxCpXmlOutNewsMessage extends WxCpXmlOutMessage { this.articles.add(item); this.articleCount = this.articles.size(); } - + public List getArticles() { return articles; } - - + + @XStreamAlias("item") public static class Item { - + @XStreamAlias("Title") - @XStreamConverter(value=XStreamCDataConverter.class) + @XStreamConverter(value = XStreamCDataConverter.class) private String Title; @XStreamAlias("Description") - @XStreamConverter(value=XStreamCDataConverter.class) + @XStreamConverter(value = XStreamCDataConverter.class) private String Description; @XStreamAlias("PicUrl") - @XStreamConverter(value=XStreamCDataConverter.class) + @XStreamConverter(value = XStreamCDataConverter.class) private String PicUrl; - + @XStreamAlias("Url") - @XStreamConverter(value=XStreamCDataConverter.class) + @XStreamConverter(value = XStreamCDataConverter.class) private String Url; - + public String getTitle() { return Title; } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutTextMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutTextMessage.java index f2096ba8..e9dd7183 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutTextMessage.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutTextMessage.java @@ -7,15 +7,15 @@ import me.chanjar.weixin.common.util.xml.XStreamCDataConverter; @XStreamAlias("xml") public class WxCpXmlOutTextMessage extends WxCpXmlOutMessage { - + @XStreamAlias("Content") - @XStreamConverter(value=XStreamCDataConverter.class) + @XStreamConverter(value = XStreamCDataConverter.class) private String content; public WxCpXmlOutTextMessage() { this.msgType = WxConsts.XML_MSG_TEXT; } - + public String getContent() { return content; } @@ -24,5 +24,5 @@ public class WxCpXmlOutTextMessage extends WxCpXmlOutMessage { this.content = content; } - + } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutVideoMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutVideoMessage.java index 537147b6..b5e15801 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutVideoMessage.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutVideoMessage.java @@ -38,21 +38,21 @@ public class WxCpXmlOutVideoMessage extends WxCpXmlOutMessage { public void setDescription(String description) { video.setDescription(description); } - + @XStreamAlias("Video") public static class Video { - + @XStreamAlias("MediaId") - @XStreamConverter(value=XStreamCDataConverter.class) + @XStreamConverter(value = XStreamCDataConverter.class) private String mediaId; @XStreamAlias("Title") - @XStreamConverter(value=XStreamCDataConverter.class) + @XStreamConverter(value = XStreamCDataConverter.class) private String title; @XStreamAlias("Description") - @XStreamConverter(value=XStreamCDataConverter.class) + @XStreamConverter(value = XStreamCDataConverter.class) private String description; public String getMediaId() { @@ -78,7 +78,7 @@ public class WxCpXmlOutVideoMessage extends WxCpXmlOutMessage { public void setDescription(String description) { this.description = description; } - + } } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutVoiceMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutVoiceMessage.java index 54c53dc6..1730a0cf 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutVoiceMessage.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutVoiceMessage.java @@ -7,15 +7,15 @@ import me.chanjar.weixin.common.util.xml.XStreamMediaIdConverter; @XStreamAlias("xml") public class WxCpXmlOutVoiceMessage extends WxCpXmlOutMessage { - + @XStreamAlias("Voice") - @XStreamConverter(value=XStreamMediaIdConverter.class) + @XStreamConverter(value = XStreamMediaIdConverter.class) private String mediaId; public WxCpXmlOutVoiceMessage() { this.msgType = WxConsts.XML_MSG_VOICE; } - + public String getMediaId() { return mediaId; } @@ -23,5 +23,5 @@ public class WxCpXmlOutVoiceMessage extends WxCpXmlOutMessage { public void setMediaId(String mediaId) { this.mediaId = mediaId; } - + } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/BaseBuilder.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/BaseBuilder.java index ee075baf..035777d8 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/BaseBuilder.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/BaseBuilder.java @@ -44,7 +44,7 @@ public class BaseBuilder { m.setToParty(this.toParty); m.setToTag(this.toTag); m.setSafe( - (this.safe == null || "".equals(this.safe))? WxConsts.CUSTOM_MSG_SAFE_NO: this.safe); + (this.safe == null || "".equals(this.safe)) ? WxConsts.CUSTOM_MSG_SAFE_NO : this.safe); return m; } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/FileBuilder.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/FileBuilder.java index ac15b5ee..d8295454 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/FileBuilder.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/FileBuilder.java @@ -8,8 +8,8 @@ import me.chanjar.weixin.cp.bean.WxCpMessage; *
      * 用法: WxCustomMessage m = WxCustomMessage.FILE().mediaId(...).toUser(...).build();
      * 
    - * @author Daniel Qian * + * @author Daniel Qian */ public final class FileBuilder extends BaseBuilder { private String mediaId; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/ImageBuilder.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/ImageBuilder.java index 5098708a..99195c26 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/ImageBuilder.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/ImageBuilder.java @@ -8,8 +8,8 @@ import me.chanjar.weixin.cp.bean.WxCpMessage; *
      * 用法: WxCustomMessage m = WxCustomMessage.IMAGE().mediaId(...).toUser(...).build();
      * 
    - * @author Daniel Qian * + * @author Daniel Qian */ public final class ImageBuilder extends BaseBuilder { private String mediaId; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/NewsBuilder.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/NewsBuilder.java index 0711b6f5..e2d2086a 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/NewsBuilder.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/NewsBuilder.java @@ -12,13 +12,13 @@ import java.util.List; * 用法: * WxCustomMessage m = WxCustomMessage.NEWS().addArticle(article).toUser(...).build(); * - * @author Daniel Qian * + * @author Daniel Qian */ public final class NewsBuilder extends BaseBuilder { private List articles = new ArrayList(); - + public NewsBuilder() { this.msgType = WxConsts.CUSTOM_MSG_NEWS; } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/TextBuilder.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/TextBuilder.java index 44a75b8f..076db2f1 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/TextBuilder.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/TextBuilder.java @@ -8,8 +8,8 @@ import me.chanjar.weixin.cp.bean.WxCpMessage; *
      * 用法: WxCustomMessage m = WxCustomMessage.TEXT().content(...).toUser(...).build();
      * 
    - * @author Daniel Qian * + * @author Daniel Qian */ public final class TextBuilder extends BaseBuilder { private String content; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/VideoBuilder.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/VideoBuilder.java index 32990fa3..66dfc553 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/VideoBuilder.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/VideoBuilder.java @@ -14,8 +14,8 @@ import me.chanjar.weixin.cp.bean.WxCpMessage; * .toUser(...) * .build(); * - * @author Daniel Qian * + * @author Daniel Qian */ public final class VideoBuilder extends BaseBuilder { private String mediaId; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/VoiceBuilder.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/VoiceBuilder.java index 99914fcd..10b2b0fe 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/VoiceBuilder.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/VoiceBuilder.java @@ -8,8 +8,8 @@ import me.chanjar.weixin.cp.bean.WxCpMessage; *
      * 用法: WxCustomMessage m = WxCustomMessage.VOICE().mediaId(...).toUser(...).build();
      * 
    - * @author Daniel Qian * + * @author Daniel Qian */ public final class VoiceBuilder extends BaseBuilder { private String mediaId; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/outxmlbuilder/BaseBuilder.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/outxmlbuilder/BaseBuilder.java index 78ba1074..03eb8f54 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/outxmlbuilder/BaseBuilder.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/outxmlbuilder/BaseBuilder.java @@ -3,27 +3,27 @@ package me.chanjar.weixin.cp.bean.outxmlbuilder; import me.chanjar.weixin.cp.bean.WxCpXmlOutMessage; public abstract class BaseBuilder { - + protected String toUserName; - + protected String fromUserName; - + public BuilderType toUser(String touser) { this.toUserName = touser; return (BuilderType) this; } - + public BuilderType fromUser(String fromusername) { this.fromUserName = fromusername; return (BuilderType) this; } public abstract ValueType build(); - + public void setCommon(WxCpXmlOutMessage m) { m.setToUserName(this.toUserName); m.setFromUserName(this.fromUserName); m.setCreateTime(System.currentTimeMillis() / 1000l); } - + } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/outxmlbuilder/ImageBuilder.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/outxmlbuilder/ImageBuilder.java index ac3b7fc9..ae774e40 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/outxmlbuilder/ImageBuilder.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/outxmlbuilder/ImageBuilder.java @@ -4,6 +4,7 @@ import me.chanjar.weixin.cp.bean.WxCpXmlOutImageMessage; /** * 图片消息builder + * * @author Daniel Qian */ public final class ImageBuilder extends BaseBuilder { @@ -21,5 +22,5 @@ public final class ImageBuilder extends BaseBuilder { protected final List articles = new ArrayList(); - + public NewsBuilder addArticle(Item item) { this.articles.add(item); return this; } - + public WxCpXmlOutNewsMessage build() { WxCpXmlOutNewsMessage m = new WxCpXmlOutNewsMessage(); - for(Item item : articles) { + for (Item item : articles) { m.addArticle(item); } setCommon(m); return m; } - + } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/outxmlbuilder/TextBuilder.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/outxmlbuilder/TextBuilder.java index 5b1c2ae6..909a0ec9 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/outxmlbuilder/TextBuilder.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/outxmlbuilder/TextBuilder.java @@ -4,8 +4,8 @@ import me.chanjar.weixin.cp.bean.WxCpXmlOutTextMessage; /** * 文本消息builder - * @author Daniel Qian * + * @author Daniel Qian */ public final class TextBuilder extends BaseBuilder { private String content; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/outxmlbuilder/VideoBuilder.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/outxmlbuilder/VideoBuilder.java index 1bb42ff2..f54b6d11 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/outxmlbuilder/VideoBuilder.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/outxmlbuilder/VideoBuilder.java @@ -4,8 +4,8 @@ import me.chanjar.weixin.cp.bean.WxCpXmlOutVideoMessage; /** * 视频消息builder - * @author Daniel Qian * + * @author Daniel Qian */ public final class VideoBuilder extends BaseBuilder { @@ -17,15 +17,17 @@ public final class VideoBuilder extends BaseBuilder { @@ -14,12 +15,12 @@ public final class VoiceBuilder extends BaseBuilder + * 针对org.apache.commons.codec.binary.Base64, + * 需要导入架包commons-codec-1.9(或commons-codec-1.8等其他版本) + * 官方下载地址:http://commons.apache.org/proper/commons-codec/download_codec.cgi */ // ------------------------------------------------------------------------ diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpDepartGsonAdapter.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpDepartGsonAdapter.java index 723d50db..c6cb1ad7 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpDepartGsonAdapter.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpDepartGsonAdapter.java @@ -37,7 +37,7 @@ public class WxCpDepartGsonAdapter implements JsonSerializer, JsonDe } public WxCpDepart deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) - throws JsonParseException { + throws JsonParseException { WxCpDepart depart = new WxCpDepart(); JsonObject departJson = json.getAsJsonObject(); if (departJson.get("id") != null && !departJson.get("id").isJsonNull()) { 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 9c262a31..45df80b3 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 @@ -16,9 +16,7 @@ import me.chanjar.weixin.cp.bean.WxCpMessage; import java.lang.reflect.Type; /** - * * @author Daniel Qian - * */ public class WxCpMessageGsonAdapter implements JsonSerializer { @@ -83,7 +81,7 @@ public class WxCpMessageGsonAdapter implements JsonSerializer { newsJsonObject.add("articles", articleJsonArray); messageJson.add("news", newsJsonObject); } - + return messageJson; } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpTagGsonAdapter.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpTagGsonAdapter.java index 1b7a2834..b8599a1c 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpTagGsonAdapter.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpTagGsonAdapter.java @@ -27,7 +27,7 @@ public class WxCpTagGsonAdapter implements JsonSerializer, JsonDeserial } public WxCpTag deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) - throws JsonParseException { + throws JsonParseException { JsonObject jsonObject = json.getAsJsonObject(); return new WxCpTag(GsonHelper.getString(jsonObject, "tagid"), GsonHelper.getString(jsonObject, "tagname")); } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapter.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapter.java index 0984644b..7a88f47e 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapter.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapter.java @@ -20,13 +20,13 @@ import java.lang.reflect.Type; public class WxCpUserGsonAdapter implements JsonDeserializer, JsonSerializer { public WxCpUser deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) - throws JsonParseException { + throws JsonParseException { JsonObject o = json.getAsJsonObject(); WxCpUser user = new WxCpUser(); user.setUserId(GsonHelper.getString(o, "userid")); user.setName(GsonHelper.getString(o, "name")); - if(o.get("department") != null) { + if (o.get("department") != null) { JsonArray departJsonArray = o.get("department").getAsJsonArray(); Integer[] departIds = new Integer[departJsonArray.size()]; int i = 0; @@ -49,8 +49,8 @@ public class WxCpUserGsonAdapter implements JsonDeserializer, JsonSeri JsonArray attrJsonElements = o.get("extattr").getAsJsonObject().get("attrs").getAsJsonArray(); for (JsonElement attrJsonElement : attrJsonElements) { WxCpUser.Attr attr = new WxCpUser.Attr( - GsonHelper.getString(attrJsonElement.getAsJsonObject(), "name"), - GsonHelper.getString(attrJsonElement.getAsJsonObject(), "value") + GsonHelper.getString(attrJsonElement.getAsJsonObject(), "name"), + GsonHelper.getString(attrJsonElement.getAsJsonObject(), "value") ); user.getExtAttrs().add(attr); } 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 9bcd5eda..ae46d8f2 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 @@ -29,16 +29,16 @@ public class XStreamTransformer { /** * 注册扩展消息的解析器 - * @param clz 类型 + * + * @param clz 类型 * @param xStream xml解析器 - */ - public static void register(Class clz,XStream xStream){ - CLASS_2_XSTREAM_INSTANCE.put(clz,xStream); + */ + public static void register(Class clz, XStream xStream) { + CLASS_2_XSTREAM_INSTANCE.put(clz, xStream); } /** * pojo -> xml - * */ public static String toXml(Class clazz, T object) { return CLASS_2_XSTREAM_INSTANCE.get(clazz).toXML(object); diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/ApiTestModule.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/ApiTestModule.java index bb3690bc..5235486b 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/ApiTestModule.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/ApiTestModule.java @@ -10,17 +10,6 @@ import java.io.InputStream; public class ApiTestModule implements Module { - @Override - public void configure(Binder binder) { - InputStream is1 = ClassLoader.getSystemResourceAsStream("test-config.xml"); - WxXmlCpInMemoryConfigStorage config = fromXml(WxXmlCpInMemoryConfigStorage.class, is1); - WxCpServiceImpl wxService = new WxCpServiceImpl(); - wxService.setWxCpConfigStorage(config); - - binder.bind(WxCpServiceImpl.class).toInstance(wxService); - binder.bind(WxCpConfigStorage.class).toInstance(config); - } - public static T fromXml(Class clazz, InputStream is) { XStream xstream = XStreamInitializer.getInstance(); xstream.alias("xml", clazz); @@ -28,9 +17,20 @@ public class ApiTestModule implements Module { return (T) xstream.fromXML(is); } + @Override + public void configure(Binder binder) { + InputStream is1 = ClassLoader.getSystemResourceAsStream("test-config.xml"); + WxXmlCpInMemoryConfigStorage config = fromXml(WxXmlCpInMemoryConfigStorage.class, is1); + WxCpServiceImpl wxService = new WxCpServiceImpl(); + wxService.setWxCpConfigStorage(config); + + binder.bind(WxCpServiceImpl.class).toInstance(wxService); + binder.bind(WxCpConfigStorage.class).toInstance(config); + } + @XStreamAlias("xml") public static class WxXmlCpInMemoryConfigStorage extends WxCpInMemoryConfigStorage { - + protected String userId; protected String departmentId; @@ -40,6 +40,7 @@ public class ApiTestModule implements Module { public String getUserId() { return userId; } + public void setUserId(String userId) { this.userId = userId; } @@ -63,11 +64,11 @@ public class ApiTestModule implements Module { @Override public String toString() { return super.toString() + " > WxXmlCpConfigStorage{" + - "userId='" + userId + '\'' + - ", departmentId='" + departmentId + '\'' + - ", tagId='" + tagId + '\'' + - '}'; + "userId='" + userId + '\'' + + ", departmentId='" + departmentId + '\'' + + ", tagId='" + tagId + '\'' + + '}'; } } - + } diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpBaseAPITest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpBaseAPITest.java index d8757f34..9f2b60f8 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpBaseAPITest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpBaseAPITest.java @@ -9,8 +9,8 @@ import org.testng.annotations.Test; /** * 基础API测试 - * @author Daniel Qian * + * @author Daniel Qian */ @Test(groups = "baseAPI") @Guice(modules = ApiTestModule.class) diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpBusyRetryTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpBusyRetryTest.java index cf129088..989a69e6 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpBusyRetryTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpBusyRetryTest.java @@ -14,7 +14,7 @@ import java.util.concurrent.Future; @Test public class WxCpBusyRetryTest { - @DataProvider(name="getService") + @DataProvider(name = "getService") public Object[][] getService() { WxCpService service = new WxCpServiceImpl() { @@ -28,8 +28,8 @@ public class WxCpBusyRetryTest { service.setMaxRetryTimes(3); service.setRetrySleepMillis(500); - return new Object[][] { - new Object[] { service } + return new Object[][]{ + new Object[]{service} }; } diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpDepartAPITest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpDepartAPITest.java index 28779e65..cb8db0d5 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpDepartAPITest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpDepartAPITest.java @@ -44,7 +44,7 @@ public class WxCpDepartAPITest { } } - @Test(dependsOnMethods = { "testDepartGet", "testDepartCreate" }) + @Test(dependsOnMethods = {"testDepartGet", "testDepartCreate"}) public void testDepartUpdate() throws WxErrorException { System.out.println("=================更新部门"); depart.setName("子部门改名" + System.currentTimeMillis()); diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMediaAPITest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMediaAPITest.java index c67acab1..e880ad07 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMediaAPITest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMediaAPITest.java @@ -16,8 +16,8 @@ import java.util.List; /** * 测试多媒体文件上传下载 - * @author Daniel Qian * + * @author Daniel Qian */ //@Test(groups="mediaAPI", dependsOnGroups="baseAPI") @Test @@ -28,15 +28,15 @@ public class WxCpMediaAPITest { protected WxCpServiceImpl wxService; private List media_ids = new ArrayList(); - - @Test(dataProvider="uploadMedia") + + @Test(dataProvider = "uploadMedia") public void testUploadMedia(String mediaType, String fileType, String fileName) throws WxErrorException, IOException { InputStream inputStream = ClassLoader.getSystemResourceAsStream(fileName); WxMediaUploadResult res = wxService.mediaUpload(mediaType, fileType, inputStream); Assert.assertNotNull(res.getType()); Assert.assertNotNull(res.getCreatedAt()); Assert.assertTrue(res.getMediaId() != null || res.getThumbMediaId() != null); - + if (res.getMediaId() != null) { media_ids.add(res.getMediaId()); } @@ -44,29 +44,29 @@ public class WxCpMediaAPITest { media_ids.add(res.getThumbMediaId()); } } - + @DataProvider public Object[][] uploadMedia() { - return new Object[][] { - new Object[] { WxConsts.MEDIA_IMAGE, WxConsts.FILE_JPG, "mm.jpeg" }, - new Object[] { WxConsts.MEDIA_VOICE, WxConsts.FILE_MP3, "mm.mp3" }, - new Object[] { WxConsts.MEDIA_VIDEO, WxConsts.FILE_MP4, "mm.mp4" }, - new Object[] { WxConsts.MEDIA_FILE, WxConsts.FILE_JPG, "mm.jpeg" } + return new Object[][]{ + new Object[]{WxConsts.MEDIA_IMAGE, WxConsts.FILE_JPG, "mm.jpeg"}, + new Object[]{WxConsts.MEDIA_VOICE, WxConsts.FILE_MP3, "mm.mp3"}, + new Object[]{WxConsts.MEDIA_VIDEO, WxConsts.FILE_MP4, "mm.mp4"}, + new Object[]{WxConsts.MEDIA_FILE, WxConsts.FILE_JPG, "mm.jpeg"} }; } - - @Test(dependsOnMethods = { "testUploadMedia" }, dataProvider="downloadMedia") + + @Test(dependsOnMethods = {"testUploadMedia"}, dataProvider = "downloadMedia") public void testDownloadMedia(String media_id) throws WxErrorException { wxService.mediaDownload(media_id); } - + @DataProvider public Object[][] downloadMedia() { Object[][] params = new Object[this.media_ids.size()][]; for (int i = 0; i < this.media_ids.size(); i++) { - params[i] = new Object[] { this.media_ids.get(i) }; + params[i] = new Object[]{this.media_ids.get(i)}; } return params; } - + } diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMessageAPITest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMessageAPITest.java index ee16f56f..9810435e 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMessageAPITest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMessageAPITest.java @@ -12,7 +12,7 @@ import org.testng.annotations.Test; * @author Daniel Qian * */ -@Test(groups="customMessageAPI", dependsOnGroups = "baseAPI") +@Test(groups = "customMessageAPI", dependsOnGroups = "baseAPI") @Guice(modules = ApiTestModule.class) public class WxCpMessageAPITest { @@ -29,11 +29,11 @@ public class WxCpMessageAPITest { wxService.messageSend(message1); WxCpMessage message2 = WxCpMessage - .TEXT() - .agentId(configStorage.getAgentId()) - .toUser(configStorage.getUserId()) - .content("欢迎欢迎,热烈欢迎\n换行测试\n超链接:Hello World") - .build(); + .TEXT() + .agentId(configStorage.getAgentId()) + .toUser(configStorage.getUserId()) + .content("欢迎欢迎,热烈欢迎\n换行测试\n超链接:Hello World") + .build(); wxService.messageSend(message2); } diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMessageRouterTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMessageRouterTest.java index ccf981dd..a5e40968 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMessageRouterTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMessageRouterTest.java @@ -13,45 +13,45 @@ import java.util.Map; /** * 测试消息路由器 - * @author Daniel Qian * + * @author Daniel Qian */ @Test public class WxCpMessageRouterTest { - + @Test(enabled = false) public void prepare(boolean async, StringBuffer sb, WxCpMessageRouter router) { router - .rule() - .async(async) - .msgType(WxConsts.XML_MSG_TEXT).event(WxConsts.EVT_CLICK).eventKey("KEY_1").content("CONTENT_1") - .handler(new WxEchoCpMessageHandler(sb, "COMBINE_4")) - .end() - .rule() - .async(async) - .msgType(WxConsts.XML_MSG_TEXT).event(WxConsts.EVT_CLICK).eventKey("KEY_1") - .handler(new WxEchoCpMessageHandler(sb, "COMBINE_3")) - .end() - .rule() - .async(async) - .msgType(WxConsts.XML_MSG_TEXT).event(WxConsts.EVT_CLICK) - .handler(new WxEchoCpMessageHandler(sb, "COMBINE_2")) - .end() - .rule().async(async).msgType(WxConsts.XML_MSG_TEXT).handler(new WxEchoCpMessageHandler(sb, WxConsts.XML_MSG_TEXT)).end() - .rule().async(async).event(WxConsts.EVT_CLICK).handler(new WxEchoCpMessageHandler(sb, WxConsts.EVT_CLICK)).end() - .rule().async(async).eventKey("KEY_1").handler(new WxEchoCpMessageHandler(sb, "KEY_1")).end() - .rule().async(async).content("CONTENT_1").handler(new WxEchoCpMessageHandler(sb, "CONTENT_1")).end() - .rule().async(async).rContent(".*bc.*").handler(new WxEchoCpMessageHandler(sb, "abcd")).end() - .rule().async(async).matcher(new WxCpMessageMatcher() { - @Override - public boolean match(WxCpXmlMessage message) { - return "strangeformat".equals(message.getFormat()); - } - }).handler(new WxEchoCpMessageHandler(sb, "matcher")).end() - .rule().async(async).handler(new WxEchoCpMessageHandler(sb, "ALL")).end(); + .rule() + .async(async) + .msgType(WxConsts.XML_MSG_TEXT).event(WxConsts.EVT_CLICK).eventKey("KEY_1").content("CONTENT_1") + .handler(new WxEchoCpMessageHandler(sb, "COMBINE_4")) + .end() + .rule() + .async(async) + .msgType(WxConsts.XML_MSG_TEXT).event(WxConsts.EVT_CLICK).eventKey("KEY_1") + .handler(new WxEchoCpMessageHandler(sb, "COMBINE_3")) + .end() + .rule() + .async(async) + .msgType(WxConsts.XML_MSG_TEXT).event(WxConsts.EVT_CLICK) + .handler(new WxEchoCpMessageHandler(sb, "COMBINE_2")) + .end() + .rule().async(async).msgType(WxConsts.XML_MSG_TEXT).handler(new WxEchoCpMessageHandler(sb, WxConsts.XML_MSG_TEXT)).end() + .rule().async(async).event(WxConsts.EVT_CLICK).handler(new WxEchoCpMessageHandler(sb, WxConsts.EVT_CLICK)).end() + .rule().async(async).eventKey("KEY_1").handler(new WxEchoCpMessageHandler(sb, "KEY_1")).end() + .rule().async(async).content("CONTENT_1").handler(new WxEchoCpMessageHandler(sb, "CONTENT_1")).end() + .rule().async(async).rContent(".*bc.*").handler(new WxEchoCpMessageHandler(sb, "abcd")).end() + .rule().async(async).matcher(new WxCpMessageMatcher() { + @Override + public boolean match(WxCpXmlMessage message) { + return "strangeformat".equals(message.getFormat()); + } + }).handler(new WxEchoCpMessageHandler(sb, "matcher")).end() + .rule().async(async).handler(new WxEchoCpMessageHandler(sb, "ALL")).end(); } - - @Test(dataProvider="messages-1") + + @Test(dataProvider = "messages-1") public void testSync(WxCpXmlMessage message, String expected) { StringBuffer sb = new StringBuffer(); WxCpMessageRouter router = new WxCpMessageRouter(null); @@ -59,27 +59,27 @@ public class WxCpMessageRouterTest { router.route(message); Assert.assertEquals(sb.toString(), expected); } - - @Test(dataProvider="messages-1") + + @Test(dataProvider = "messages-1") public void testAsync(WxCpXmlMessage message, String expected) throws InterruptedException { StringBuffer sb = new StringBuffer(); WxCpMessageRouter router = new WxCpMessageRouter(null); - prepare(true, sb, router); + prepare(true, sb, router); router.route(message); Thread.sleep(500l); Assert.assertEquals(sb.toString(), expected); } - + public void testConcurrency() throws InterruptedException { final WxCpMessageRouter router = new WxCpMessageRouter(null); router.rule().handler(new WxCpMessageHandler() { @Override public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map context, WxCpService wxCpService, - WxSessionManager sessionManager) { + WxSessionManager sessionManager) { return null; } }).end(); - + final WxCpXmlMessage m = new WxCpXmlMessage(); Runnable r = new Runnable() { @Override @@ -94,27 +94,27 @@ public class WxCpMessageRouterTest { for (int i = 0; i < 10; i++) { new Thread(r).start(); } - + Thread.sleep(1000l * 2); } - @DataProvider(name="messages-1") + @DataProvider(name = "messages-1") public Object[][] messages2() { WxCpXmlMessage message1 = new WxCpXmlMessage(); message1.setMsgType(WxConsts.XML_MSG_TEXT); - + WxCpXmlMessage message2 = new WxCpXmlMessage(); message2.setEvent(WxConsts.EVT_CLICK); - + WxCpXmlMessage message3 = new WxCpXmlMessage(); message3.setEventKey("KEY_1"); - + WxCpXmlMessage message4 = new WxCpXmlMessage(); message4.setContent("CONTENT_1"); - + WxCpXmlMessage message5 = new WxCpXmlMessage(); message5.setContent("BLA"); - + WxCpXmlMessage message6 = new WxCpXmlMessage(); message6.setContent("abcd"); @@ -124,12 +124,12 @@ public class WxCpMessageRouterTest { WxCpXmlMessage c2 = new WxCpXmlMessage(); c2.setMsgType(WxConsts.XML_MSG_TEXT); c2.setEvent(WxConsts.EVT_CLICK); - + WxCpXmlMessage c3 = new WxCpXmlMessage(); c3.setMsgType(WxConsts.XML_MSG_TEXT); c3.setEvent(WxConsts.EVT_CLICK); c3.setEventKey("KEY_1"); - + WxCpXmlMessage c4 = new WxCpXmlMessage(); c4.setMsgType(WxConsts.XML_MSG_TEXT); c4.setEvent(WxConsts.EVT_CLICK); @@ -137,37 +137,18 @@ public class WxCpMessageRouterTest { c4.setContent("CONTENT_1"); - return new Object[][] { - new Object[] { message1, WxConsts.XML_MSG_TEXT + "," }, - new Object[] { message2, WxConsts.EVT_CLICK + "," }, - new Object[] { message3, "KEY_1," }, - new Object[] { message4, "CONTENT_1," }, - new Object[] { message5, "ALL," }, - new Object[] { message6, "abcd," }, - new Object[] { message7, "matcher," }, - new Object[] { c2, "COMBINE_2," }, - new Object[] { c3, "COMBINE_3," }, - new Object[] { c4, "COMBINE_4," } + return new Object[][]{ + new Object[]{message1, WxConsts.XML_MSG_TEXT + ","}, + new Object[]{message2, WxConsts.EVT_CLICK + ","}, + new Object[]{message3, "KEY_1,"}, + new Object[]{message4, "CONTENT_1,"}, + new Object[]{message5, "ALL,"}, + new Object[]{message6, "abcd,"}, + new Object[]{message7, "matcher,"}, + new Object[]{c2, "COMBINE_2,"}, + new Object[]{c3, "COMBINE_3,"}, + new Object[]{c4, "COMBINE_4,"} }; - - } - - public static class WxEchoCpMessageHandler implements WxCpMessageHandler { - - private StringBuffer sb; - private String echoStr; - - public WxEchoCpMessageHandler(StringBuffer sb, String echoStr) { - this.sb = sb; - this.echoStr = echoStr; - } - - @Override - public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map context, WxCpService wxCpService, - WxSessionManager sessionManager) { - sb.append(this.echoStr).append(','); - return null; - } } @@ -180,8 +161,8 @@ public class WxCpMessageRouterTest { ism.setProcessExpiresFrequency(1); ism.setBackgroundProcessorDelay(1); - return new Object[][] { - new Object[] { ism } + return new Object[][]{ + new Object[]{ism} }; } @@ -193,8 +174,8 @@ public class WxCpMessageRouterTest { final WxCpMessageRouter router = new WxCpMessageRouter(null); router.setSessionManager(ism); router - .rule().async(false).handler(new WxSessionMessageHandler()).next() - .rule().async(false).handler(new WxSessionMessageHandler()).end(); + .rule().async(false).handler(new WxSessionMessageHandler()).next() + .rule().async(false).handler(new WxSessionMessageHandler()).end(); WxCpXmlMessage msg = new WxCpXmlMessage(); msg.setFromUserName("abc"); @@ -213,8 +194,8 @@ public class WxCpMessageRouterTest { final WxCpMessageRouter router = new WxCpMessageRouter(null); router.setSessionManager(ism); router - .rule().async(false).handler(new WxSessionMessageHandler()).next() - .rule().async(true).handler(new WxSessionMessageHandler()).end(); + .rule().async(false).handler(new WxSessionMessageHandler()).next() + .rule().async(true).handler(new WxSessionMessageHandler()).end(); WxCpXmlMessage msg = new WxCpXmlMessage(); msg.setFromUserName("abc"); @@ -227,8 +208,8 @@ public class WxCpMessageRouterTest { final WxCpMessageRouter router = new WxCpMessageRouter(null); router.setSessionManager(ism); router - .rule().async(true).handler(new WxSessionMessageHandler()).next() - .rule().async(false).handler(new WxSessionMessageHandler()).end(); + .rule().async(true).handler(new WxSessionMessageHandler()).next() + .rule().async(false).handler(new WxSessionMessageHandler()).end(); WxCpXmlMessage msg = new WxCpXmlMessage(); msg.setFromUserName("abc"); @@ -247,8 +228,8 @@ public class WxCpMessageRouterTest { final WxCpMessageRouter router = new WxCpMessageRouter(null); router.setSessionManager(ism); router - .rule().async(true).handler(new WxSessionMessageHandler()).next() - .rule().async(true).handler(new WxSessionMessageHandler()).end(); + .rule().async(true).handler(new WxSessionMessageHandler()).next() + .rule().async(true).handler(new WxSessionMessageHandler()).end(); WxCpXmlMessage msg = new WxCpXmlMessage(); msg.setFromUserName("abc"); @@ -267,7 +248,7 @@ public class WxCpMessageRouterTest { final WxCpMessageRouter router = new WxCpMessageRouter(null); router.setSessionManager(ism); router - .rule().async(false).handler(new WxSessionMessageHandler()).end(); + .rule().async(false).handler(new WxSessionMessageHandler()).end(); WxCpXmlMessage msg = new WxCpXmlMessage(); msg.setFromUserName("abc"); @@ -281,7 +262,7 @@ public class WxCpMessageRouterTest { final WxCpMessageRouter router = new WxCpMessageRouter(null); router.setSessionManager(ism); router - .rule().async(true).handler(new WxSessionMessageHandler()).end(); + .rule().async(true).handler(new WxSessionMessageHandler()).end(); WxCpXmlMessage msg = new WxCpXmlMessage(); msg.setFromUserName("abc"); @@ -292,11 +273,30 @@ public class WxCpMessageRouterTest { } } - public static class WxSessionMessageHandler implements WxCpMessageHandler { + public static class WxEchoCpMessageHandler implements WxCpMessageHandler { + + private StringBuffer sb; + private String echoStr; + + public WxEchoCpMessageHandler(StringBuffer sb, String echoStr) { + this.sb = sb; + this.echoStr = echoStr; + } + + @Override + public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map context, WxCpService wxCpService, + WxSessionManager sessionManager) { + sb.append(this.echoStr).append(','); + return null; + } + + } + + public static class WxSessionMessageHandler implements WxCpMessageHandler { @Override public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map context, WxCpService wxCpService, - WxSessionManager sessionManager) { + WxSessionManager sessionManager) { sessionManager.getSession(wxMessage.getFromUserName()); return null; } diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpTagAPITest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpTagAPITest.java index b101eeb6..130b0722 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpTagAPITest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpTagAPITest.java @@ -41,7 +41,7 @@ public class WxCpTagAPITest { @Test(dependsOnMethods = "testTagGet") public void testTagAddUsers() throws Exception { List userIds = new ArrayList(); - userIds.add(((ApiTestModule.WxXmlCpInMemoryConfigStorage)configStorage).getUserId()); + userIds.add(((ApiTestModule.WxXmlCpInMemoryConfigStorage) configStorage).getUserId()); wxService.tagAddUsers(tagId, userIds, null); } @@ -54,7 +54,7 @@ public class WxCpTagAPITest { @Test(dependsOnMethods = "testTagGetUsers") public void testTagRemoveUsers() throws Exception { List userIds = new ArrayList(); - userIds.add(((ApiTestModule.WxXmlCpInMemoryConfigStorage)configStorage).getUserId()); + userIds.add(((ApiTestModule.WxXmlCpInMemoryConfigStorage) configStorage).getUserId()); wxService.tagRemoveUsers(tagId, userIds); } diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpUserAPITest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpUserAPITest.java index c444eec5..8c5d2064 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpUserAPITest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpUserAPITest.java @@ -28,7 +28,7 @@ public class WxCpUserAPITest { WxCpUser user = new WxCpUser(); user.setUserId("some.woman"); user.setName("Some Woman"); - user.setDepartIds(new Integer[] { 9, 8 }); + user.setDepartIds(new Integer[]{9, 8}); user.setEmail("none@none.com"); user.setGender("女"); user.setMobile("13560084979"); diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxMenuAPITest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxMenuAPITest.java index 395a48da..8fe136b9 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxMenuAPITest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxMenuAPITest.java @@ -1,90 +1,88 @@ package me.chanjar.weixin.cp.api; -import org.testng.Assert; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Guice; -import org.testng.annotations.Test; - import com.google.inject.Inject; - import me.chanjar.weixin.common.api.WxConsts; import me.chanjar.weixin.common.bean.menu.WxMenu; import me.chanjar.weixin.common.bean.menu.WxMenuButton; import me.chanjar.weixin.common.exception.WxErrorException; +import org.testng.Assert; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Guice; +import org.testng.annotations.Test; /** * 测试菜单 - * @author Daniel Qian * + * @author Daniel Qian */ -@Test(groups="menuAPI", dependsOnGroups="baseAPI") +@Test(groups = "menuAPI", dependsOnGroups = "baseAPI") @Guice(modules = ApiTestModule.class) public class WxMenuAPITest { @Inject protected WxCpServiceImpl wxService; - + @Test(dataProvider = "menu") public void testCreateMenu(WxMenu wxMenu) throws WxErrorException { wxService.menuCreate(wxMenu); } - - @Test(dependsOnMethods = { "testCreateMenu"}) + + @Test(dependsOnMethods = {"testCreateMenu"}) public void testGetMenu() throws WxErrorException { Assert.assertNotNull(wxService.menuGet()); } - - @Test(dependsOnMethods = { "testGetMenu"}) + + @Test(dependsOnMethods = {"testGetMenu"}) public void testDeleteMenu() throws WxErrorException { wxService.menuDelete(); } - - @DataProvider(name="menu") + + @DataProvider(name = "menu") public Object[][] getMenu() { WxMenu menu = new WxMenu(); WxMenuButton button1 = new WxMenuButton(); button1.setType(WxConsts.BUTTON_CLICK); button1.setName("今日歌曲"); button1.setKey("V1001_TODAY_MUSIC"); - + WxMenuButton button2 = new WxMenuButton(); button2.setType(WxConsts.BUTTON_CLICK); button2.setName("歌手简介"); button2.setKey("V1001_TODAY_SINGER"); - + WxMenuButton button3 = new WxMenuButton(); button3.setName("菜单"); - + menu.getButtons().add(button1); menu.getButtons().add(button2); menu.getButtons().add(button3); - + WxMenuButton button31 = new WxMenuButton(); button31.setType(WxConsts.BUTTON_VIEW); button31.setName("搜索"); button31.setUrl("http://www.soso.com/"); - + WxMenuButton button32 = new WxMenuButton(); button32.setType(WxConsts.BUTTON_VIEW); button32.setName("视频"); button32.setUrl("http://v.qq.com/"); - + WxMenuButton button33 = new WxMenuButton(); button33.setType(WxConsts.BUTTON_CLICK); button33.setName("赞一下我们"); button33.setKey("V1001_GOOD"); - + button3.getSubButtons().add(button31); button3.getSubButtons().add(button32); button3.getSubButtons().add(button33); - - return new Object[][] { - new Object[] { - menu - } + + return new Object[][]{ + new Object[]{ + menu + } }; - + } - - + + } diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpMessageTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpMessageTest.java index f9dbe657..12b62e34 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpMessageTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpMessageTest.java @@ -15,12 +15,12 @@ public class WxCpMessageTest { reply.setContent("sfsfdsdf"); Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"text\",\"text\":{\"content\":\"sfsfdsdf\"}}"); } - + public void testTextBuild() { WxCpMessage reply = WxCpMessage.TEXT().toUser("OPENID").content("sfsfdsdf").build(); Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"text\",\"text\":{\"content\":\"sfsfdsdf\"}}"); } - + public void testImageReply() { WxCpMessage reply = new WxCpMessage(); reply.setToUser("OPENID"); @@ -28,12 +28,12 @@ public class WxCpMessageTest { reply.setMediaId("MEDIA_ID"); Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"image\",\"image\":{\"media_id\":\"MEDIA_ID\"}}"); } - + public void testImageBuild() { WxCpMessage reply = WxCpMessage.IMAGE().toUser("OPENID").mediaId("MEDIA_ID").build(); Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"image\",\"image\":{\"media_id\":\"MEDIA_ID\"}}"); } - + public void testVoiceReply() { WxCpMessage reply = new WxCpMessage(); reply.setToUser("OPENID"); @@ -41,12 +41,12 @@ public class WxCpMessageTest { reply.setMediaId("MEDIA_ID"); Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"voice\",\"voice\":{\"media_id\":\"MEDIA_ID\"}}"); } - + public void testVoiceBuild() { WxCpMessage reply = WxCpMessage.VOICE().toUser("OPENID").mediaId("MEDIA_ID").build(); Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"voice\",\"voice\":{\"media_id\":\"MEDIA_ID\"}}"); } - + public void testVideoReply() { WxCpMessage reply = new WxCpMessage(); reply.setToUser("OPENID"); @@ -57,24 +57,24 @@ public class WxCpMessageTest { reply.setDescription("DESCRIPTION"); Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"video\",\"video\":{\"media_id\":\"MEDIA_ID\",\"thumb_media_id\":\"MEDIA_ID\",\"title\":\"TITLE\",\"description\":\"DESCRIPTION\"}}"); } - + public void testVideoBuild() { WxCpMessage reply = WxCpMessage.VIDEO().toUser("OPENID").title("TITLE").mediaId("MEDIA_ID").thumbMediaId("MEDIA_ID").description("DESCRIPTION").build(); Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"video\",\"video\":{\"media_id\":\"MEDIA_ID\",\"thumb_media_id\":\"MEDIA_ID\",\"title\":\"TITLE\",\"description\":\"DESCRIPTION\"}}"); } - + public void testNewsReply() { WxCpMessage reply = new WxCpMessage(); reply.setToUser("OPENID"); reply.setMsgType(WxConsts.CUSTOM_MSG_NEWS); - + WxArticle article1 = new WxArticle(); article1.setUrl("URL"); article1.setPicUrl("PIC_URL"); article1.setDescription("Is Really A Happy Day"); article1.setTitle("Happy Day"); reply.getArticles().add(article1); - + WxArticle article2 = new WxArticle(); article2.setUrl("URL"); article2.setPicUrl("PIC_URL"); @@ -85,14 +85,14 @@ public class WxCpMessageTest { Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"news\",\"news\":{\"articles\":[{\"title\":\"Happy Day\",\"description\":\"Is Really A Happy Day\",\"url\":\"URL\",\"picurl\":\"PIC_URL\"},{\"title\":\"Happy Day\",\"description\":\"Is Really A Happy Day\",\"url\":\"URL\",\"picurl\":\"PIC_URL\"}]}}"); } - + public void testNewsBuild() { WxArticle article1 = new WxArticle(); article1.setUrl("URL"); article1.setPicUrl("PIC_URL"); article1.setDescription("Is Really A Happy Day"); article1.setTitle("Happy Day"); - + WxArticle article2 = new WxArticle(); article2.setUrl("URL"); article2.setPicUrl("PIC_URL"); @@ -103,5 +103,5 @@ public class WxCpMessageTest { Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"news\",\"news\":{\"articles\":[{\"title\":\"Happy Day\",\"description\":\"Is Really A Happy Day\",\"url\":\"URL\",\"picurl\":\"PIC_URL\"},{\"title\":\"Happy Day\",\"description\":\"Is Really A Happy Day\",\"url\":\"URL\",\"picurl\":\"PIC_URL\"}]}}"); } - + } diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlMessageTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlMessageTest.java index b4b75c9c..270fa1d3 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlMessageTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlMessageTest.java @@ -10,49 +10,49 @@ public class WxCpXmlMessageTest { public void testFromXml() { String xml = "" - + "" - + " " - + "1348831860" - + "" - + "" - + "1234567890123456" - + "" - + "" - + "" - + "" - + "23.134521" - + "113.358803" - + "20" - + "" - + "" - + "" - + "<![CDATA[公众平台官网链接]]>" - + "" - + "" - + "" - + "23.137466" - + "113.352425" - + "119.385040" - + "" - + " " - + " " - + "" - + "" - + " 1\n" - + " " - + " " - + " " - + " " - + " " - + "" - + "" - + " \n" - + " \n" - + " \n" - + " \n" - + " \n" - + "" - + ""; + + "" + + " " + + "1348831860" + + "" + + "" + + "1234567890123456" + + "" + + "" + + "" + + "" + + "23.134521" + + "113.358803" + + "20" + + "" + + "" + + "" + + "<![CDATA[公众平台官网链接]]>" + + "" + + "" + + "" + + "23.137466" + + "113.352425" + + "119.385040" + + "" + + " " + + " " + + "" + + "" + + " 1\n" + + " " + + " " + + " " + + " " + + " " + + "" + + "" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "" + + ""; WxCpXmlMessage wxMessage = WxCpXmlMessage.fromXml(xml); Assert.assertEquals(wxMessage.getToUserName(), "toUser"); Assert.assertEquals(wxMessage.getFromUserName(), "fromUser"); @@ -87,5 +87,5 @@ public class WxCpXmlMessageTest { Assert.assertEquals(wxMessage.getSendLocationInfo().getLabel(), " 广州市海珠区客村艺苑路 106号"); Assert.assertEquals(wxMessage.getSendLocationInfo().getPoiname(), "wo de poi"); } - + } diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlOutImageMessageTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlOutImageMessageTest.java index aef4ec45..8ace5d0a 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlOutImageMessageTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlOutImageMessageTest.java @@ -12,37 +12,37 @@ public class WxCpXmlOutImageMessageTest { m.setCreateTime(1122l); m.setFromUserName("from"); m.setToUserName("to"); - + String expected = "" - + "" - + "" - + "1122" - + "" - + "" - + ""; + + "" + + "" + + "1122" + + "" + + "" + + ""; System.out.println(m.toXml()); Assert.assertEquals(m.toXml().replaceAll("\\s", ""), expected.replaceAll("\\s", "")); } - + public void testBuild() { WxCpXmlOutImageMessage m = WxCpXmlOutMessage.IMAGE().mediaId("ddfefesfsdfef").fromUser("from").toUser("to").build(); String expected = "" - + "" - + "" - + "1122" - + "" - + "" - + ""; + + "" + + "" + + "1122" + + "" + + "" + + ""; System.out.println(m.toXml()); Assert.assertEquals( - m - .toXml() - .replaceAll("\\s", "") - .replaceAll(".*?", ""), - expected - .replaceAll("\\s", "") - .replaceAll(".*?", "") - ); - + m + .toXml() + .replaceAll("\\s", "") + .replaceAll(".*?", ""), + expected + .replaceAll("\\s", "") + .replaceAll(".*?", "") + ); + } } diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlOutNewsMessageTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlOutNewsMessageTest.java index 7848bfcd..bd66743c 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlOutNewsMessageTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlOutNewsMessageTest.java @@ -11,7 +11,7 @@ public class WxCpXmlOutNewsMessageTest { m.setCreateTime(1122l); m.setFromUserName("fromUser"); m.setToUserName("toUser"); - + WxCpXmlOutNewsMessage.Item item = new WxCpXmlOutNewsMessage.Item(); item.setDescription("description"); item.setPicUrl("picUrl"); @@ -20,74 +20,74 @@ public class WxCpXmlOutNewsMessageTest { m.addArticle(item); m.addArticle(item); String expected = "" - + "" - + "" - + "1122" - + "" - + " 2" - + " " - + " " - + " <![CDATA[title]]>" - + " " - + " " - + " " - + " " - + " " - + " <![CDATA[title]]>" - + " " - + " " - + " " - + " " - + " " - + ""; + + "" + + "" + + "1122" + + "" + + " 2" + + " " + + " " + + " <![CDATA[title]]>" + + " " + + " " + + " " + + " " + + " " + + " <![CDATA[title]]>" + + " " + + " " + + " " + + " " + + " " + + ""; System.out.println(m.toXml()); Assert.assertEquals(m.toXml().replaceAll("\\s", ""), expected.replaceAll("\\s", "")); } - + public void testBuild() { WxCpXmlOutNewsMessage.Item item = new WxCpXmlOutNewsMessage.Item(); item.setDescription("description"); item.setPicUrl("picUrl"); item.setTitle("title"); item.setUrl("url"); - + WxCpXmlOutNewsMessage m = WxCpXmlOutMessage.NEWS() - .fromUser("fromUser") - .toUser("toUser") - .addArticle(item) - .addArticle(item) - .build(); + .fromUser("fromUser") + .toUser("toUser") + .addArticle(item) + .addArticle(item) + .build(); String expected = "" - + "" - + "" - + "1122" - + "" - + " 2" - + " " - + " " - + " <![CDATA[title]]>" - + " " - + " " - + " " - + " " - + " " - + " <![CDATA[title]]>" - + " " - + " " - + " " - + " " - + " " - + ""; + + "" + + "" + + "1122" + + "" + + " 2" + + " " + + " " + + " <![CDATA[title]]>" + + " " + + " " + + " " + + " " + + " " + + " <![CDATA[title]]>" + + " " + + " " + + " " + + " " + + " " + + ""; System.out.println(m.toXml()); Assert.assertEquals( - m - .toXml() - .replaceAll("\\s", "") - .replaceAll(".*?", ""), - expected - .replaceAll("\\s", "") - .replaceAll(".*?", "") - ); + m + .toXml() + .replaceAll("\\s", "") + .replaceAll(".*?", ""), + expected + .replaceAll("\\s", "") + .replaceAll(".*?", "") + ); } - + } diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlOutTextMessageTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlOutTextMessageTest.java index 75343cb4..57fcf8eb 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlOutTextMessageTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlOutTextMessageTest.java @@ -12,39 +12,39 @@ public class WxCpXmlOutTextMessageTest { m.setCreateTime(1122l); m.setFromUserName("from"); m.setToUserName("to"); - + String expected = "" - + "" - + "" - + "1122" - + "" - + "" - + ""; + + "" + + "" + + "1122" + + "" + + "" + + ""; System.out.println(m.toXml()); Assert.assertEquals(m.toXml().replaceAll("\\s", ""), expected.replaceAll("\\s", "")); } - + public void testBuild() { WxCpXmlOutTextMessage m = WxCpXmlOutMessage.TEXT().content("content").fromUser("from").toUser("to").build(); String expected = "" - + "" - + "" - + "1122" - + "" - + "" - + ""; + + "" + + "" + + "1122" + + "" + + "" + + ""; System.out.println(m.toXml()); Assert.assertEquals( - m - .toXml() - .replaceAll("\\s", "") - .replaceAll(".*?", ""), - expected - .replaceAll("\\s", "") - .replaceAll(".*?", "") - ); - + m + .toXml() + .replaceAll("\\s", "") + .replaceAll(".*?", ""), + expected + .replaceAll("\\s", "") + .replaceAll(".*?", "") + ); + } - + } diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlOutVideoMessageTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlOutVideoMessageTest.java index 61e1cbfb..512dfef3 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlOutVideoMessageTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlOutVideoMessageTest.java @@ -14,51 +14,51 @@ public class WxCpXmlOutVideoMessageTest { m.setCreateTime(1122l); m.setFromUserName("fromUser"); m.setToUserName("toUser"); - + String expected = "" - + "" - + "" - + "1122" - + "" - + " " - + ""; + + "" + + "" + + "1122" + + "" + + " " + + ""; System.out.println(m.toXml()); Assert.assertEquals(m.toXml().replaceAll("\\s", ""), expected.replaceAll("\\s", "")); } - + public void testBuild() { WxCpXmlOutVideoMessage m = WxCpXmlOutMessage.VIDEO() - .mediaId("media_id") - .fromUser("fromUser") - .toUser("toUser") - .title("title") - .description("ddfff") - .build(); + .mediaId("media_id") + .fromUser("fromUser") + .toUser("toUser") + .title("title") + .description("ddfff") + .build(); String expected = "" - + "" - + "" - + "1122" - + "" - + " " - + ""; + + "" + + "" + + "1122" + + "" + + " " + + ""; System.out.println(m.toXml()); Assert.assertEquals( - m - .toXml() - .replaceAll("\\s", "") - .replaceAll(".*?", ""), - expected - .replaceAll("\\s", "") - .replaceAll(".*?", "") - ); + m + .toXml() + .replaceAll("\\s", "") + .replaceAll(".*?", ""), + expected + .replaceAll("\\s", "") + .replaceAll(".*?", "") + ); } - + } diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlOutVoiceMessageTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlOutVoiceMessageTest.java index 897f5c37..26db29c3 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlOutVoiceMessageTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlOutVoiceMessageTest.java @@ -12,37 +12,37 @@ public class WxCpXmlOutVoiceMessageTest { m.setCreateTime(1122l); m.setFromUserName("from"); m.setToUserName("to"); - + String expected = "" - + "" - + "" - + "1122" - + "" - + "" - + ""; + + "" + + "" + + "1122" + + "" + + "" + + ""; System.out.println(m.toXml()); Assert.assertEquals(m.toXml().replaceAll("\\s", ""), expected.replaceAll("\\s", "")); } - + public void testBuild() { WxCpXmlOutVoiceMessage m = WxCpXmlOutMessage.VOICE().mediaId("ddfefesfsdfef").fromUser("from").toUser("to").build(); String expected = "" - + "" - + "" - + "1122" - + "" - + "" - + ""; + + "" + + "" + + "1122" + + "" + + "" + + ""; System.out.println(m.toXml()); Assert.assertEquals( - m - .toXml() - .replaceAll("\\s", "") - .replaceAll(".*?", ""), - expected - .replaceAll("\\s", "") - .replaceAll(".*?", "") - ); + m + .toXml() + .replaceAll("\\s", "") + .replaceAll(".*?", ""), + expected + .replaceAll("\\s", "") + .replaceAll(".*?", "") + ); } - + } diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpDemoInMemoryConfigStorage.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpDemoInMemoryConfigStorage.java index 52219868..f883e311 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpDemoInMemoryConfigStorage.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpDemoInMemoryConfigStorage.java @@ -13,17 +13,16 @@ import java.io.InputStream; @XStreamAlias("xml") class WxCpDemoInMemoryConfigStorage extends WxCpInMemoryConfigStorage { - @Override - public String toString() { - return "SimpleWxConfigProvider [appidOrCorpid=" + corpId + ", corpSecret=" + corpSecret + ", accessToken=" + accessToken - + ", expiresTime=" + expiresTime + ", token=" + token + ", aesKey=" + aesKey + "]"; - } - - public static WxCpDemoInMemoryConfigStorage fromXml(InputStream is) { XStream xstream = XStreamInitializer.getInstance(); xstream.processAnnotations(WxCpDemoInMemoryConfigStorage.class); return (WxCpDemoInMemoryConfigStorage) xstream.fromXML(is); } + @Override + public String toString() { + return "SimpleWxConfigProvider [appidOrCorpid=" + corpId + ", corpSecret=" + corpSecret + ", accessToken=" + accessToken + + ", expiresTime=" + expiresTime + ", token=" + token + ", aesKey=" + aesKey + "]"; + } + } diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpDemoServer.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpDemoServer.java index 3d808945..10af3c57 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpDemoServer.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpDemoServer.java @@ -37,54 +37,54 @@ public class WxCpDemoServer { } private static void initWeixin() { - InputStream is1 = ClassLoader.getSystemResourceAsStream("test-config.xml"); - WxCpDemoInMemoryConfigStorage config = WxCpDemoInMemoryConfigStorage.fromXml(is1); - - wxCpConfigStorage = config; - wxCpService = new WxCpServiceImpl(); - wxCpService.setWxCpConfigStorage(config); - - WxCpMessageHandler handler = new WxCpMessageHandler() { - @Override - public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map context, - WxCpService wxCpService, WxSessionManager sessionManager) { - WxCpXmlOutTextMessage m = WxCpXmlOutMessage - .TEXT() - .content("测试加密消息") - .fromUser(wxMessage.getToUserName()) - .toUser(wxMessage.getFromUserName()) - .build(); - return m; - } - }; - - WxCpMessageHandler oauth2handler = new WxCpMessageHandler() { - @Override - public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map context, - WxCpService wxCpService, WxSessionManager sessionManager) { - String href = "测试oauth2"; - return WxCpXmlOutMessage - .TEXT() - .content(href) - .fromUser(wxMessage.getToUserName()) - .toUser(wxMessage.getFromUserName()).build(); - } - }; - - wxCpMessageRouter = new WxCpMessageRouter(wxCpService); - wxCpMessageRouter - .rule() - .async(false) - .content("哈哈") // 拦截内容为“哈哈”的消息 - .handler(handler) - .end() - .rule() - .async(false) - .content("oauth") - .handler(oauth2handler) - .end() - ; + InputStream is1 = ClassLoader.getSystemResourceAsStream("test-config.xml"); + WxCpDemoInMemoryConfigStorage config = WxCpDemoInMemoryConfigStorage.fromXml(is1); + + wxCpConfigStorage = config; + wxCpService = new WxCpServiceImpl(); + wxCpService.setWxCpConfigStorage(config); + + WxCpMessageHandler handler = new WxCpMessageHandler() { + @Override + public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map context, + WxCpService wxCpService, WxSessionManager sessionManager) { + WxCpXmlOutTextMessage m = WxCpXmlOutMessage + .TEXT() + .content("测试加密消息") + .fromUser(wxMessage.getToUserName()) + .toUser(wxMessage.getFromUserName()) + .build(); + return m; + } + }; + + WxCpMessageHandler oauth2handler = new WxCpMessageHandler() { + @Override + public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map context, + WxCpService wxCpService, WxSessionManager sessionManager) { + String href = "测试oauth2"; + return WxCpXmlOutMessage + .TEXT() + .content(href) + .fromUser(wxMessage.getToUserName()) + .toUser(wxMessage.getFromUserName()).build(); + } + }; + + wxCpMessageRouter = new WxCpMessageRouter(wxCpService); + wxCpMessageRouter + .rule() + .async(false) + .content("哈哈") // 拦截内容为“哈哈”的消息 + .handler(handler) + .end() + .rule() + .async(false) + .content("oauth") + .handler(oauth2handler) + .end() + ; } } diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpEndpointServlet.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpEndpointServlet.java index 1fe8f592..67738d2b 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpEndpointServlet.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpEndpointServlet.java @@ -24,7 +24,7 @@ public class WxCpEndpointServlet extends HttpServlet { protected WxCpMessageRouter wxCpMessageRouter; public WxCpEndpointServlet(WxCpConfigStorage wxCpConfigStorage, WxCpService wxCpService, - WxCpMessageRouter wxCpMessageRouter) { + WxCpMessageRouter wxCpMessageRouter) { this.wxCpConfigStorage = wxCpConfigStorage; this.wxCpService = wxCpService; this.wxCpMessageRouter = wxCpMessageRouter; @@ -32,7 +32,7 @@ public class WxCpEndpointServlet extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { + throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); response.setStatus(HttpServletResponse.SC_OK); @@ -56,7 +56,7 @@ public class WxCpEndpointServlet extends HttpServlet { } WxCpXmlMessage inMessage = WxCpXmlMessage - .fromEncryptedXml(request.getInputStream(), wxCpConfigStorage, timestamp, nonce, msgSignature); + .fromEncryptedXml(request.getInputStream(), wxCpConfigStorage, timestamp, nonce, msgSignature); WxCpXmlOutMessage outMessage = wxCpMessageRouter.route(inMessage); if (outMessage != null) { response.getWriter().write(outMessage.toEncryptedXml(wxCpConfigStorage)); diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpOAuth2Servlet.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpOAuth2Servlet.java index e0800061..80dc565d 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpOAuth2Servlet.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpOAuth2Servlet.java @@ -18,8 +18,9 @@ public class WxCpOAuth2Servlet extends HttpServlet { this.wxCpService = wxCpService; } - @Override protected void service(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { + @Override + protected void service(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); response.setStatus(HttpServletResponse.SC_OK); From f65c6f7d59f9519e052f692b277e17e8af32b854 Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Tue, 9 Aug 2016 09:59:41 +0800 Subject: [PATCH 09/55] Update README.md --- README.md | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 428d1e93..b58c3b58 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,10 @@ ## [![Join QQ Group](http://pub.idqqimg.com/wpa/images/group.png)](http://shang.qq.com/wpa/qunwpa?idkey=078f7a153d243853e24cf2b542e7a6ccbf2a592bc138080f84d11297f736ec46) [![Open Source Love](https://badges.frapsoft.com/os/v1/open-source.svg?v=103)](https://github.com/ellerbrock/open-source-badge/) ![Maven Central](https://img.shields.io/maven-central/v/com.github.binarywang/weixin-java-parent.svg) [![Build Status](https://travis-ci.org/binarywang/weixin-java-tools.svg?branch=develop)](https://travis-ci.org/binarywang/weixin-java-tools) -### 声明:本项目基于chanjarster/weixin-java-tools,由于原作者长期没有维护,故单独维护和发布,且发布到maven上的groupId也会不同。 -#### 最新更新:2.0.0版发布!!! on 2016-07-31 -##### 由于本次更新涉及接口调整比较大,主要是公众号的调整,企业号无过多调整,主要是为了解决主接口类过于庞大不方便管理的问题,将接口实现代码按模块进行拆分。因此版本号直接从1.X.X直接升级到2.0.0,所以如果习惯于1.X.X版本的同学不想做过多更改的话,请慎重考虑升级到最新版本。 +### 声明:本项目Fork自chanjarster/weixin-java-tools,但由于原项目已停止维护,故单独维护和发布,且发布到maven上的groupId也会不同,详细信息见下文。 + +### 最新更新:2.0.0版发布!!! on 2016-07-31 +#### 由于本次更新涉及接口调整比较大,主要是公众号的调整,企业号无过多调整,主要是为了解决主接口类过于庞大不方便管理的问题,将接口实现代码按模块进行拆分。因此版本号直接从1.X.X直接升级到2.0.0,所以如果习惯于1.X.X版本的同学不想做过多更改的话,请慎重考虑升级到最新版本。 --- #### 本项目主要存放在github上,地址为 : @@ -19,7 +20,7 @@ ## 目前可参考的Demo项目: * https://github.com/wechat-group/weixin-java-tools-springmvc * https://github.com/wechat-group/weixin-mp-demo -* =========以下为备份仓库,会保持跟主仓库同步 +* ===========以下为备份仓库,会保持跟主仓库同步 * http://git.oschina.net/binary/weixin-mp-demo * https://bitbucket.org/binarywang/weixin-mp-demo @@ -41,7 +42,7 @@ ## Quick Start -如果要开发公众号(订阅号、服务号)应用,在你的maven项目中添加: +* 如果要开发公众号(订阅号、服务号)应用,在你的maven项目中添加: ```xml @@ -51,7 +52,7 @@ ``` -如果要开发企业号应用,在你的maven项目中添加: +* 如果要开发企业号应用,在你的maven项目中添加: ```xml @@ -61,9 +62,7 @@ ``` - ## 关于Pull Request -非常欢迎和感谢对本项目发起Pull Request的同学,不过本项目基于[git flow](https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow)开发流程,因此在发起Pull Request的时候请选择develop分支。 - -且本项目代码风格是用2个空格代表一个tab,因此在发起PR时注意一下,否则很容易发生在IDE格式化代码后与原代码产生大量diff,这样我在阅读PR的时候就很困难。 +* 非常欢迎和感谢对本项目发起Pull Request的同学,不过本项目基于[git flow](https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow)开发流程,因此在发起Pull Request的时候请选择develop分支。 +* 本项目代码风格是用2个空格代表一个Tab,因此在发起PR时请注意一下,否则很容易在IDE格式化代码后与原代码产生大量diff,这样在阅读PR的时候就比较困难。 From 8a4f1e61f1a582498ee8b07b9c3148fc3f798b0c Mon Sep 17 00:00:00 2001 From: tanzx Date: Wed, 10 Aug 2016 20:33:04 +0800 Subject: [PATCH 10/55] =?UTF-8?q?=E5=8D=A1=E5=88=B8service=E6=9E=84?= =?UTF-8?q?=E9=80=A0=E6=96=B9=E6=B3=95=E6=94=B9=E4=B8=BApublic?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java index 40d35572..7a39f0f8 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java @@ -38,7 +38,7 @@ public class WxMpCardServiceImpl implements WxMpCardService { private WxMpService wxMpService; - WxMpCardServiceImpl(WxMpService wxMpService) { + public WxMpCardServiceImpl(WxMpService wxMpService) { this.wxMpService = wxMpService; } From ccecac9e5ed591b54330f971011b15fac9a00fdf Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Thu, 11 Aug 2016 09:22:07 +0800 Subject: [PATCH 11/55] Update README.md --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b58c3b58..57119c7b 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,9 @@ ``` -## 关于Pull Request +## 关于代码贡献 -* 非常欢迎和感谢对本项目发起Pull Request的同学,不过本项目基于[git flow](https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow)开发流程,因此在发起Pull Request的时候请选择develop分支。 -* 本项目代码风格是用2个空格代表一个Tab,因此在发起PR时请注意一下,否则很容易在IDE格式化代码后与原代码产生大量diff,这样在阅读PR的时候就比较困难。 +* 非常欢迎和感谢对本项目发起Pull Request的同学,本项目可以采用两种方式接受代码贡献: +* 第一种就是基于[Git Flow](https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow)开发流程,因此在发起Pull Request的时候请选择develop分支。 +* 另外一种贡献代码的方式就是加入SDK Developers开发组,如果对自己的代码足够自信,可以随时提交代码,注意要随时进行单元测试,保证提交代码没有明显问题,具体加入方式,请咨询管理员。 +* 本项目代码风格为使用2个空格代表一个Tab,因此在提交代码时请注意一下,否则很容易在IDE格式化代码后与原代码产生大量diff,这样会给其他人阅读代码带来极大的困扰。 From 5057f2d846d9c251c532aaab09a695c518436a9e Mon Sep 17 00:00:00 2001 From: gaigeshen Date: Fri, 12 Aug 2016 10:20:11 +0800 Subject: [PATCH 12/55] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=94=9F=E6=88=90?= =?UTF-8?q?=E6=8E=88=E6=9D=83=E9=93=BE=E6=8E=A5=E6=96=B9=E6=B3=95=EF=BC=8C?= =?UTF-8?q?=E9=87=8D=E5=AE=9A=E5=90=91=E9=93=BE=E6=8E=A5=E5=8F=AF=E7=9B=B4?= =?UTF-8?q?=E6=8E=A5=E8=AF=BB=E5=8F=96=E9=85=8D=E7=BD=AE=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/me/chanjar/weixin/cp/api/WxCpService.java | 10 ++++++++++ .../java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java | 8 ++++++++ 2 files changed, 18 insertions(+) diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java index e428b2c2..428dc29c 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java @@ -392,6 +392,16 @@ public interface WxCpService { */ void tagAddUsers(String tagId, List userIds, List partyIds) throws WxErrorException; + /** + *
    +   * 构造oauth2授权的url连接
    +   * 
    + * + * @param state + * @return + */ + String oauth2buildAuthorizationUrl(String state); + /** *
        * 构造oauth2授权的url连接
    diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java
    index 10deacc1..b3e587ea 100644
    --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java
    +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java
    @@ -444,6 +444,14 @@ public class WxCpServiceImpl implements WxCpService {
       }
     
       @Override
    +	public String oauth2buildAuthorizationUrl(String state) {
    +  	return this.oauth2buildAuthorizationUrl(
    +  		this.wxCpConfigStorage.getOauth2redirectUri(),
    +  		state
    +  	);
    +	}
    +
    +	@Override
       public String oauth2buildAuthorizationUrl(String redirectUri, String state) {
         String url = "https://open.weixin.qq.com/connect/oauth2/authorize?";
         url += "appid=" + wxCpConfigStorage.getCorpId();
    
    From 4bd7e613f0c70675454230d00044e66496117c18 Mon Sep 17 00:00:00 2001
    From: BinaryWang 
    Date: Sat, 13 Aug 2016 10:46:45 +0800
    Subject: [PATCH 13/55] =?UTF-8?q?=E8=A7=84=E8=8C=83=E4=BB=A3=E7=A0=81?=
     =?UTF-8?q?=E5=91=BD=E5=90=8D=E6=A0=BC=E5=BC=8F?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../weixin/mp/api/WxMpConfigStorage.java      |  8 +--
     .../mp/api/WxMpInMemoryConfigStorage.java     | 68 +++++++------------
     2 files changed, 29 insertions(+), 47 deletions(-)
    
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpConfigStorage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpConfigStorage.java
    index 0cf9d2e1..3a2e7654 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpConfigStorage.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpConfigStorage.java
    @@ -81,13 +81,13 @@ public interface WxMpConfigStorage {
     
       String getOauth2redirectUri();
     
    -  String getHttp_proxy_host();
    +  String getHttpProxyHost();
     
    -  int getHttp_proxy_port();
    +  int getHttpProxyPort();
     
    -  String getHttp_proxy_username();
    +  String getHttpProxyUsername();
     
    -  String getHttp_proxy_password();
    +  String getHttpProxyPassword();
       
       File getTmpDirFile();
     
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpInMemoryConfigStorage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpInMemoryConfigStorage.java
    index 024f914a..885077a3 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpInMemoryConfigStorage.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpInMemoryConfigStorage.java
    @@ -4,6 +4,10 @@ import me.chanjar.weixin.common.bean.WxAccessToken;
     import me.chanjar.weixin.common.util.http.ApacheHttpClientBuilder;
     
     import javax.net.ssl.SSLContext;
    +
    +import org.apache.commons.lang3.builder.ToStringBuilder;
    +import org.apache.commons.lang3.builder.ToStringStyle;
    +
     import java.io.File;
     
     /**
    @@ -24,10 +28,10 @@ public class WxMpInMemoryConfigStorage implements WxMpConfigStorage {
     
       protected volatile String oauth2redirectUri;
     
    -  protected volatile String http_proxy_host;
    -  protected volatile int http_proxy_port;
    -  protected volatile String http_proxy_username;
    -  protected volatile String http_proxy_password;
    +  protected volatile String httpProxyHost;
    +  protected volatile int httpProxyPort;
    +  protected volatile String httpProxyUsername;
    +  protected volatile String httpProxyPassword;
     
       protected volatile String jsapiTicket;
       protected volatile long jsapiTicketExpiresTime;
    @@ -187,63 +191,41 @@ public class WxMpInMemoryConfigStorage implements WxMpConfigStorage {
         this.oauth2redirectUri = oauth2redirectUri;
       }
     
    -  @Override
    -  public String getHttp_proxy_host() {
    -    return this.http_proxy_host;
    +  public String getHttpProxyHost() {
    +    return this.httpProxyHost;
       }
     
    -  public void setHttp_proxy_host(String http_proxy_host) {
    -    this.http_proxy_host = http_proxy_host;
    +  public void setHttpProxyHost(String httpProxyHost) {
    +    this.httpProxyHost = httpProxyHost;
       }
     
    -  @Override
    -  public int getHttp_proxy_port() {
    -    return this.http_proxy_port;
    +  public int getHttpProxyPort() {
    +    return this.httpProxyPort;
       }
     
    -  public void setHttp_proxy_port(int http_proxy_port) {
    -    this.http_proxy_port = http_proxy_port;
    +  public void setHttpProxyPort(int httpProxyPort) {
    +    this.httpProxyPort = httpProxyPort;
       }
     
    -  @Override
    -  public String getHttp_proxy_username() {
    -    return this.http_proxy_username;
    +  public String getHttpProxyUsername() {
    +    return this.httpProxyUsername;
       }
     
    -  public void setHttp_proxy_username(String http_proxy_username) {
    -    this.http_proxy_username = http_proxy_username;
    +  public void setHttpProxyUsername(String httpProxyUsername) {
    +    this.httpProxyUsername = httpProxyUsername;
       }
     
    -  @Override
    -  public String getHttp_proxy_password() {
    -    return this.http_proxy_password;
    +  public String getHttpProxyPassword() {
    +    return this.httpProxyPassword;
       }
     
    -  public void setHttp_proxy_password(String http_proxy_password) {
    -    this.http_proxy_password = http_proxy_password;
    +  public void setHttpProxyPassword(String httpProxyPassword) {
    +    this.httpProxyPassword = httpProxyPassword;
       }
     
       @Override
       public String toString() {
    -    return "WxMpInMemoryConfigStorage{" +
    -        "appId='" + this.appId + '\'' +
    -        ", secret='" + this.secret + '\'' +
    -        ", token='" + this.token + '\'' +
    -        ", partnerId='" + this.partnerId + '\'' +
    -        ", partnerKey='" + this.partnerKey + '\'' +
    -        ", accessToken='" + this.accessToken + '\'' +
    -        ", aesKey='" + this.aesKey + '\'' +
    -        ", expiresTime=" + this.expiresTime +
    -        ", http_proxy_host='" + this.http_proxy_host + '\'' +
    -        ", http_proxy_port=" + this.http_proxy_port +
    -        ", http_proxy_username='" + this.http_proxy_username + '\'' +
    -        ", http_proxy_password='" + this.http_proxy_password + '\'' +
    -        ", jsapiTicket='" + this.jsapiTicket + '\'' +
    -        ", jsapiTicketExpiresTime='" + this.jsapiTicketExpiresTime + '\'' +
    -        ", cardApiTicket='" + this.cardApiTicket + '\'' +
    -        ", cardApiTicketExpiresTime='" + this.cardApiTicketExpiresTime + '\'' +
    -        ", tmpDirFile='" + this.tmpDirFile + '\'' +
    -        '}';
    +    return ToStringBuilder.reflectionToString(this,ToStringStyle.JSON_STYLE);
       }
     
       @Override
    
    From a154e3065afc9eb259df2f1bf5bfb2d1396881bb Mon Sep 17 00:00:00 2001
    From: BinaryWang 
    Date: Sat, 13 Aug 2016 10:49:47 +0800
    Subject: [PATCH 14/55] =?UTF-8?q?=E6=8F=90=E5=87=BA=E9=83=A8=E5=88=86?=
     =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=B8=BA=E6=96=B9=E6=B3=95=EF=BC=8C=E6=B8=85?=
     =?UTF-8?q?=E6=99=B0=E5=8C=96=E4=BB=A3=E7=A0=81=E7=BB=93=E6=9E=84?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../weixin/mp/api/impl/WxMpServiceImpl.java   | 24 +++++++++++--------
     1 file changed, 14 insertions(+), 10 deletions(-)
    
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java
    index f0ca0d17..eb62ed73 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java
    @@ -67,10 +67,6 @@ public class WxMpServiceImpl implements WxMpService {
     
       private HttpHost httpProxy;
     
    -  public HttpHost getHttpProxy() {
    -    return this.httpProxy;
    -  }
    -
       private int retrySleepMillis = 1000;
     
       private int maxRetryTimes = 5;
    @@ -421,6 +417,10 @@ public class WxMpServiceImpl implements WxMpService {
           throw new RuntimeException(e);
         }
       }
    +  
    +  public HttpHost getHttpProxy() {
    +    return this.httpProxy;
    +  }
     
       public CloseableHttpClient getHttpclient() {
         return this.httpClient;
    @@ -429,19 +429,23 @@ public class WxMpServiceImpl implements WxMpService {
       @Override
       public void setWxMpConfigStorage(WxMpConfigStorage wxConfigProvider) {
         this.wxMpConfigStorage = wxConfigProvider;
    +    this.initHttpClient();
    +  }
     
    +  private void initHttpClient() {
         ApacheHttpClientBuilder apacheHttpClientBuilder = this.wxMpConfigStorage.getApacheHttpClientBuilder();
         if (null == apacheHttpClientBuilder) {
           apacheHttpClientBuilder = DefaultApacheHttpHttpClientBuilder.get();
         }
    -    apacheHttpClientBuilder.httpProxyHost(this.wxMpConfigStorage.getHttp_proxy_host())
    -      .httpProxyPort(this.wxMpConfigStorage.getHttp_proxy_port())
    -      .httpProxyUsername(this.wxMpConfigStorage.getHttp_proxy_username())
    -      .httpProxyPassword(this.wxMpConfigStorage.getHttp_proxy_password());
    +    
    +    apacheHttpClientBuilder.httpProxyHost(this.wxMpConfigStorage.getHttpProxyHost())
    +      .httpProxyPort(this.wxMpConfigStorage.getHttpProxyPort())
    +      .httpProxyUsername(this.wxMpConfigStorage.getHttpProxyUsername())
    +      .httpProxyPassword(this.wxMpConfigStorage.getHttpProxyPassword());
     
    -    if (wxConfigProvider.getSSLContext() != null){
    +    if (this.wxMpConfigStorage.getSSLContext() != null){
           SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
    -          wxConfigProvider.getSSLContext(),
    +          this.wxMpConfigStorage.getSSLContext(),
               new String[] { "TLSv1" },
               null,
               SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
    
    From ff2cd99cf4c4d9539554dacb145e9f00dd629dfd Mon Sep 17 00:00:00 2001
    From: gaigeshen 
    Date: Tue, 16 Aug 2016 10:08:14 +0800
    Subject: [PATCH 15/55] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=88=9B=E5=BB=BAJS-AP?=
     =?UTF-8?q?I=E7=AD=BE=E5=90=8D=E7=9A=84=E6=BC=8F=E6=B4=9E?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java   | 4 ++++
     1 file changed, 4 insertions(+)
    
    diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java
    index b3e587ea..991b9be1 100644
    --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java
    +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java
    @@ -169,6 +169,10 @@ public class WxCpServiceImpl implements WxCpService {
           jsapiSignature.setNoncestr(noncestr);
           jsapiSignature.setUrl(url);
           jsapiSignature.setSignature(signature);
    +      
    +      // Fixed bug
    +      jsapiSignature.setAppid(this.wxCpConfigStorage.getCorpId());
    +      
           return jsapiSignature;
         } catch (NoSuchAlgorithmException e) {
           throw new RuntimeException(e);
    
    From 87707fad97a62a5c8e3b9e4e866acbb46b03ddfd Mon Sep 17 00:00:00 2001
    From: gaigeshen 
    Date: Wed, 17 Aug 2016 15:12:29 +0800
    Subject: [PATCH 16/55] =?UTF-8?q?=E4=BC=81=E4=B8=9A=E5=8F=B7=E5=85=A8?=
     =?UTF-8?q?=E5=B1=80=E9=85=8D=E7=BD=AE=E5=AD=98=E5=82=A8=E6=B7=BB=E5=8A=A0?=
     =?UTF-8?q?Redis=E6=94=AF=E6=8C=81?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     pom.xml                                       |   6 +
     .../weixin/cp/api/WxCpJedisConfigStorage.java | 272 ++++++++++++++++++
     2 files changed, 278 insertions(+)
     create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpJedisConfigStorage.java
    
    diff --git a/pom.xml b/pom.xml
    index 22d63ba0..fb4652c5 100644
    --- a/pom.xml
    +++ b/pom.xml
    @@ -50,6 +50,7 @@
         1.1.2
         3.6.7
         2.8.0
    +    2.9.0
         2.7
         3.4
         2.5
    @@ -110,6 +111,11 @@
           jackson-databind
           ${jackson.version}
         
    +	
    +	  redis.clients
    +	  jedis
    +	  ${jedis.version}
    +	
       
       
       
    diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpJedisConfigStorage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpJedisConfigStorage.java
    new file mode 100644
    index 00000000..2c8e8bb6
    --- /dev/null
    +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpJedisConfigStorage.java
    @@ -0,0 +1,272 @@
    +package me.chanjar.weixin.cp.api;
    +
    +import java.io.File;
    +
    +import me.chanjar.weixin.common.bean.WxAccessToken;
    +import me.chanjar.weixin.common.util.http.ApacheHttpClientBuilder;
    +import redis.clients.jedis.Jedis;
    +import redis.clients.jedis.JedisPool;
    +
    +/**
    + * Jedis client implementor for wechat config storage
    + * 
    + * @author gaigeshen
    + */
    +public class WxCpJedisConfigStorage implements WxCpConfigStorage {
    +
    +	/* Redis keys here */
    +	private static final String ACCESS_TOKEN_KEY = "WX_CP_ACCESS_TOKEN";
    +	private static final String ACCESS_TOKEN_EXPIRES_TIME_KEY = "WX_CP_ACCESS_TOKEN_EXPIRES_TIME";
    +	private static final String JS_API_TICKET_KEY = "WX_CP_JS_API_TICKET";
    +	private static final String JS_API_TICKET_EXPIRES_TIME_KEY = "WX_CP_JS_API_TICKET_EXPIRES_TIME";
    +
    +	private volatile String corpId;
    +	private volatile String corpSecret;
    +
    +	private volatile String token;
    +	private volatile String aesKey;
    +	private volatile String agentId;
    +
    +	private volatile String oauth2redirectUri;
    +
    +	private volatile String http_proxy_host;
    +	private volatile int http_proxy_port;
    +	private volatile String http_proxy_username;
    +	private volatile String http_proxy_password;
    +
    +	private volatile File tmpDirFile;
    +
    +	private volatile ApacheHttpClientBuilder apacheHttpClientBuilder;
    +
    +	/* Redis clients pool */
    +	private final JedisPool jedisPool;
    +
    +	/**
    +	 * 
    +	 * 
    +	 * @param jedis
    +	 */
    +	public WxCpJedisConfigStorage(String host, int port) {
    +		this.jedisPool = new JedisPool(host, port);
    +	}
    +	
    +	/**
    +	 * 
    +	 * This method will be destroy jedis pool
    +	 */
    +	public void destroy() {
    +		this.jedisPool.destroy();
    +	}
    +	
    +	@Override
    +	public String getAccessToken() {
    +		try (Jedis jedis = this.jedisPool.getResource()) {
    +			return jedis.get(ACCESS_TOKEN_KEY);
    +		}
    +	}
    +	
    +	@Override
    +	public boolean isAccessTokenExpired() {
    +		try (Jedis jedis = this.jedisPool.getResource()) {
    +			String expiresTimeStr = jedis.get(ACCESS_TOKEN_EXPIRES_TIME_KEY);
    +			
    +			if (expiresTimeStr != null) {
    +				Long expiresTime = Long.parseLong(expiresTimeStr);
    +				return System.currentTimeMillis() > expiresTime;
    +			}
    +			
    +			return true;
    +			
    +		}
    +	}
    +
    +	@Override
    +	public void expireAccessToken() {
    +		try (Jedis jedis = this.jedisPool.getResource()) {
    +		  jedis.set(ACCESS_TOKEN_EXPIRES_TIME_KEY, "0");
    +		}
    +	}
    +
    +	@Override
    +	public synchronized void updateAccessToken(WxAccessToken accessToken) {
    +		this.updateAccessToken(accessToken.getAccessToken(), accessToken.getExpiresIn());
    +	}
    +
    +	@Override
    +	public synchronized void updateAccessToken(String accessToken, int expiresInSeconds) {
    +		try (Jedis jedis = this.jedisPool.getResource()) {
    +			jedis.set(ACCESS_TOKEN_KEY, accessToken);
    +			
    +			jedis.set(ACCESS_TOKEN_EXPIRES_TIME_KEY,
    +					(System.currentTimeMillis() + (expiresInSeconds - 200) * 1000L) + "");
    +		}
    +	}
    +
    +	@Override
    +	public String getJsapiTicket() {
    +		try (Jedis jedis = this.jedisPool.getResource()) {
    +		  return jedis.get(JS_API_TICKET_KEY);
    +		}
    +	}
    +
    +	@Override
    +	public boolean isJsapiTicketExpired() {
    +		
    +		try (Jedis jedis = this.jedisPool.getResource()) {
    +			String expiresTimeStr = jedis.get(JS_API_TICKET_EXPIRES_TIME_KEY);
    +			
    +			if (expiresTimeStr != null) {
    +				Long expiresTime = Long.parseLong(expiresTimeStr);
    +				return System.currentTimeMillis() > expiresTime;
    +			}
    +			
    +			return true;
    +			
    +		}
    +	}
    +
    +	@Override
    +	public void expireJsapiTicket() {
    +		try (Jedis jedis = this.jedisPool.getResource()) {
    +			jedis.set(JS_API_TICKET_EXPIRES_TIME_KEY, "0");
    +		}
    +	}
    +
    +	@Override
    +	public synchronized void updateJsapiTicket(String jsapiTicket, int expiresInSeconds) {
    +		
    +		try (Jedis jedis = this.jedisPool.getResource()) {
    +			jedis.set(JS_API_TICKET_KEY, jsapiTicket);
    +			
    +			jedis.set(JS_API_TICKET_EXPIRES_TIME_KEY,
    +					(System.currentTimeMillis() + (expiresInSeconds - 200) * 1000L + ""));
    +		}
    +		
    +	}
    +
    +	@Override
    +	public String getCorpId() {
    +		return this.corpId;
    +	}
    +
    +	@Override
    +	public String getCorpSecret() {
    +		return this.corpSecret;
    +	}
    +
    +	@Override
    +	public String getAgentId() {
    +		return this.agentId;
    +	}
    +
    +	@Override
    +	public String getToken() {
    +		return this.token;
    +	}
    +
    +	@Override
    +	public String getAesKey() {
    +		return this.aesKey;
    +	}
    +
    +	@Override
    +	public long getExpiresTime() {
    +		try (Jedis jedis = this.jedisPool.getResource()) {
    +			String expiresTimeStr = jedis.get(ACCESS_TOKEN_EXPIRES_TIME_KEY);
    +			
    +			if (expiresTimeStr != null) {
    +				Long expiresTime = Long.parseLong(expiresTimeStr);
    +				return expiresTime;
    +			}
    +			
    +			return 0L;
    +			
    +		}
    +	}
    +
    +	@Override
    +	public String getOauth2redirectUri() {
    +		return this.oauth2redirectUri;
    +	}
    +
    +	@Override
    +	public String getHttp_proxy_host() {
    +		return this.http_proxy_host;
    +	}
    +
    +	@Override
    +	public int getHttp_proxy_port() {
    +		return this.http_proxy_port;
    +	}
    +
    +	@Override
    +	public String getHttp_proxy_username() {
    +		return this.http_proxy_username;
    +	}
    +
    +	@Override
    +	public String getHttp_proxy_password() {
    +		return this.http_proxy_password;
    +	}
    +
    +	@Override
    +	public File getTmpDirFile() {
    +		return this.tmpDirFile;
    +	}
    +
    +	@Override
    +	public ApacheHttpClientBuilder getApacheHttpClientBuilder() {
    +		return this.apacheHttpClientBuilder;
    +	}
    +
    +	public void setCorpId(String corpId) {
    +		this.corpId = corpId;
    +	}
    +
    +	public void setCorpSecret(String corpSecret) {
    +		this.corpSecret = corpSecret;
    +	}
    +
    +	public void setToken(String token) {
    +		this.token = token;
    +	}
    +
    +	public void setAesKey(String aesKey) {
    +		this.aesKey = aesKey;
    +	}
    +
    +	public void setAgentId(String agentId) {
    +		this.agentId = agentId;
    +	}
    +
    +	// ============================ Setters below
    +	
    +	public void setOauth2redirectUri(String oauth2redirectUri) {
    +		this.oauth2redirectUri = oauth2redirectUri;
    +	}
    +
    +	public void setHttp_proxy_host(String http_proxy_host) {
    +		this.http_proxy_host = http_proxy_host;
    +	}
    +
    +	public void setHttp_proxy_port(int http_proxy_port) {
    +		this.http_proxy_port = http_proxy_port;
    +	}
    +
    +	public void setHttp_proxy_username(String http_proxy_username) {
    +		this.http_proxy_username = http_proxy_username;
    +	}
    +
    +	public void setHttp_proxy_password(String http_proxy_password) {
    +		this.http_proxy_password = http_proxy_password;
    +	}
    +
    +	public void setTmpDirFile(File tmpDirFile) {
    +		this.tmpDirFile = tmpDirFile;
    +	}
    +
    +	public void setApacheHttpClientBuilder(ApacheHttpClientBuilder apacheHttpClientBuilder) {
    +		this.apacheHttpClientBuilder = apacheHttpClientBuilder;
    +	}
    +
    +}
    
    From 977161cbeb36ede8dba83b1a52e6ef3faab51729 Mon Sep 17 00:00:00 2001
    From: BinaryWang 
    Date: Thu, 18 Aug 2016 13:55:39 +0800
    Subject: [PATCH 17/55] =?UTF-8?q?=E5=8E=BB=E6=8E=89=E5=A4=9A=E4=BD=99?=
     =?UTF-8?q?=E5=AE=B9=E6=98=93=E5=BC=95=E8=B5=B7=E8=AF=AF=E8=A7=A3=E7=9A=84?=
     =?UTF-8?q?=E6=B5=8B=E8=AF=95=E4=BD=BF=E7=94=A8=E7=9A=84=E6=8E=A5=E5=8F=A3?=
     =?UTF-8?q?=E6=96=B9=E6=B3=95oauth2buildAuthorizationUrl?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../me/chanjar/weixin/mp/api/WxMpService.java  | 10 ----------
     .../weixin/mp/api/impl/WxMpServiceImpl.java    |  5 -----
     .../weixin/mp/demo/DemoOAuth2Handler.java      | 18 +++++++++---------
     3 files changed, 9 insertions(+), 24 deletions(-)
    
    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 d1366152..31c65e64 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
    @@ -152,16 +152,6 @@ public interface WxMpService {
        */
       WxMpSemanticQueryResult semanticQuery(WxMpSemanticQuery semanticQuery) throws WxErrorException;
     
    -  /**
    -   * 
    -   * 构造oauth2授权的url连接
    -   * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=网页授权获取用户基本信息
    -   * 
    - * - * @return url - */ - String oauth2buildAuthorizationUrl(String scope, String state); - /** *
        * 构造oauth2授权的url连接
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java
    index eb62ed73..55b99293 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java
    @@ -238,11 +238,6 @@ public class WxMpServiceImpl implements WxMpService {
         return WxMpSemanticQueryResult.fromJson(responseContent);
       }
     
    -  @Override
    -  public String oauth2buildAuthorizationUrl(String scope, String state) {
    -    return this.oauth2buildAuthorizationUrl(this.wxMpConfigStorage.getOauth2redirectUri(), scope, state);
    -  }
    -
       @Override
       public String oauth2buildAuthorizationUrl(String redirectURI, String scope, String state) {
         StringBuilder url = new StringBuilder();
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoOAuth2Handler.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoOAuth2Handler.java
    index da3ec93c..de1c9546 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoOAuth2Handler.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoOAuth2Handler.java
    @@ -14,14 +14,14 @@ import java.util.Map;
      */
     public class DemoOAuth2Handler implements WxMpMessageHandler {
       @Override
    -  public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context,
    -      WxMpService wxMpService, WxSessionManager sessionManager) {
    -    String href = "测试oauth2";
    -    return WxMpXmlOutMessage
    -        .TEXT()
    -        .content(href)
    -        .fromUser(wxMessage.getToUserName())
    -        .toUser(wxMessage.getFromUserName()).build();
    +  public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage,
    +      Map context, WxMpService wxMpService,
    +      WxSessionManager sessionManager) {
    +    String href = "测试oauth2";
    +    return WxMpXmlOutMessage.TEXT().content(href)
    +        .fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName())
    +        .build();
       }
     }
    
    From 184e6d785a291fd8ac4196b1cee3dc5841b96aa0 Mon Sep 17 00:00:00 2001
    From: BinaryWang 
    Date: Thu, 18 Aug 2016 18:01:17 +0800
    Subject: [PATCH 18/55] =?UTF-8?q?WxMenuButton=E5=A2=9E=E5=8A=A0=E7=BC=BA?=
     =?UTF-8?q?=E5=A4=B1=E7=9A=84media=5Fid=E5=AD=97=E6=AE=B5?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../weixin/common/bean/menu/WxMenuButton.java    | 16 +++++++++++++---
     .../common/util/json/WxMenuGsonAdapter.java      |  2 ++
     2 files changed, 15 insertions(+), 3 deletions(-)
    
    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 3acf0370..88033400 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,9 +12,16 @@ public class WxMenuButton {
       private String name;
       private String key;
       private String url;
    +  private String mediaId;
     
       private List subButtons = new ArrayList();
     
    +  @Override
    +  public String toString() {
    +    return ToStringBuilder.reflectionToString(this, 
    +        ToStringStyle.JSON_STYLE);
    +  }
    +  
       public String getType() {
         return type;
       }
    @@ -55,8 +62,11 @@ public class WxMenuButton {
         this.subButtons = subButtons;
       }
     
    -  @Override
    -  public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
    +  public String getMediaId() {
    +    return mediaId;
    +  }
    +
    +  public void setMediaId(String mediaId) {
    +    this.mediaId = mediaId;
       }
     }
    \ No newline at end of file
    diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxMenuGsonAdapter.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxMenuGsonAdapter.java
    index 75f07824..744df7e1 100644
    --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxMenuGsonAdapter.java
    +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxMenuGsonAdapter.java
    @@ -52,6 +52,7 @@ public class WxMenuGsonAdapter implements JsonSerializer, JsonDeserializ
         buttonJson.addProperty("name", button.getName());
         buttonJson.addProperty("key", button.getKey());
         buttonJson.addProperty("url", button.getUrl());
    +    buttonJson.addProperty("media_id", button.getMediaId());
         if (button.getSubButtons() != null && button.getSubButtons().size() > 0) {
           JsonArray buttonArray = new JsonArray();
           for (WxMenuButton sub_button : button.getSubButtons()) {
    @@ -105,6 +106,7 @@ public class WxMenuGsonAdapter implements JsonSerializer, JsonDeserializ
         button.setKey(GsonHelper.getString(json, "key"));
         button.setUrl(GsonHelper.getString(json, "url"));
         button.setType(GsonHelper.getString(json, "type"));
    +    button.setMediaId(GsonHelper.getString(json, "media_id"));
         return button;
       }
     
    
    From c8d21e3fbac9418c4fae2cf64557852720f35c39 Mon Sep 17 00:00:00 2001
    From: BinaryWang 
    Date: Fri, 19 Aug 2016 09:45:33 +0800
    Subject: [PATCH 19/55] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96=E4=B8=8D?=
     =?UTF-8?q?=E8=A7=84=E8=8C=83=E7=9A=84=E4=BB=A3=E7=A0=81?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../mp/api/impl/WxMpPayServiceImpl.java       | 275 +++++++++++-------
     1 file changed, 174 insertions(+), 101 deletions(-)
    
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    index 81638b7a..ce7f9517 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    @@ -26,12 +26,15 @@ import java.util.TreeMap;
     
     /**
      * Created by Binary Wang on 2016/7/28.
    + *
      * @author binarywang (https://github.com/binarywang)
      */
     public class WxMpPayServiceImpl implements WxMpPayService {
     
       private final Logger log = LoggerFactory.getLogger(WxMpPayServiceImpl.class);
    -
    +  private final String[] REQUIRED_ORDER_PARAMETERS = new String[]{"appid",
    +          "mch_id", "body", "out_trade_no", "total_fee", "spbill_create_ip",
    +          "notify_url", "trade_type"};
       private HttpHost httpProxy;
       private WxMpServiceImpl wxMpService;
     
    @@ -41,10 +44,14 @@ public class WxMpPayServiceImpl implements WxMpPayService {
       }
     
       @Override
    -  public WxMpPrepayIdResult getPrepayId(String openId, String outTradeNo, double amt, String body, String tradeType, String ip, String callbackUrl) {
    +  public WxMpPrepayIdResult getPrepayId(String openId, String outTradeNo,
    +                                        double amt, String body, String tradeType, String ip,
    +                                        String callbackUrl) {
         Map packageParams = new HashMap<>();
    -    packageParams.put("appid", this.wxMpService.getWxMpConfigStorage().getAppId());
    -    packageParams.put("mch_id", this.wxMpService.getWxMpConfigStorage().getPartnerId());
    +    packageParams.put("appid",
    +            this.wxMpService.getWxMpConfigStorage().getAppId());
    +    packageParams.put("mch_id",
    +            this.wxMpService.getWxMpConfigStorage().getPartnerId());
         packageParams.put("body", body);
         packageParams.put("out_trade_no", outTradeNo);
         packageParams.put("total_fee", (int) (amt * 100) + "");
    @@ -58,62 +65,81 @@ public class WxMpPayServiceImpl implements WxMpPayService {
     
       @Override
       public WxMpPrepayIdResult getPrepayId(final Map parameters) {
    -    String nonce_str = System.currentTimeMillis() + "";
    -
         final SortedMap packageParams = new TreeMap<>(parameters);
    -    packageParams.put("appid", this.wxMpService.getWxMpConfigStorage().getAppId());
    -    packageParams.put("mch_id", this.wxMpService.getWxMpConfigStorage().getPartnerId());
    -    packageParams.put("nonce_str", nonce_str);
    +    packageParams.put("appid",
    +            this.wxMpService.getWxMpConfigStorage().getAppId());
    +    packageParams.put("mch_id",
    +            this.wxMpService.getWxMpConfigStorage().getPartnerId());
    +    packageParams.put("nonce_str", System.currentTimeMillis() + "");
         checkParameters(packageParams);
     
    -    String sign = WxCryptUtil.createSign(packageParams, this.wxMpService.getWxMpConfigStorage().getPartnerKey());
    +    String sign = WxCryptUtil.createSign(packageParams,
    +            this.wxMpService.getWxMpConfigStorage().getPartnerKey());
         packageParams.put("sign", sign);
     
         StringBuilder request = new StringBuilder("");
         for (Map.Entry para : packageParams.entrySet()) {
    -      request.append(String.format("<%s>%s", para.getKey(), para.getValue(), para.getKey()));
    +      request.append(String.format("<%s>%s", para.getKey(),
    +              para.getValue(), para.getKey()));
         }
    +
         request.append("");
     
    -    HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/pay/unifiedorder");
    +    HttpPost httpPost = new HttpPost(
    +            "https://api.mch.weixin.qq.com/pay/unifiedorder");
         if (this.httpProxy != null) {
    -      RequestConfig config = RequestConfig.custom().setProxy(this.httpProxy).build();
    +      RequestConfig config = RequestConfig.custom().setProxy(this.httpProxy)
    +              .build();
           httpPost.setConfig(config);
         }
     
         StringEntity entity = new StringEntity(request.toString(), Consts.UTF_8);
         httpPost.setEntity(entity);
    -    try(CloseableHttpResponse response = this.wxMpService.getHttpclient().execute(httpPost)) {
    -      String responseContent = Utf8ResponseHandler.INSTANCE.handleResponse(response);
    +    try (CloseableHttpResponse response = this.wxMpService.getHttpclient()
    +            .execute(httpPost)) {
    +      String responseContent = Utf8ResponseHandler.INSTANCE
    +              .handleResponse(response);
           XStream xstream = XStreamInitializer.getInstance();
           xstream.alias("xml", WxMpPrepayIdResult.class);
           return (WxMpPrepayIdResult) xstream.fromXML(responseContent);
         } catch (IOException e) {
    -      throw new RuntimeException("Failed to get prepay id due to IO exception.", e);
    -    }finally {
    +      throw new RuntimeException("Failed to get prepay id due to IO exception.",
    +              e);
    +    } finally {
           httpPost.releaseConnection();
         }
       }
     
    -  private final String[] REQUIRED_ORDER_PARAMETERS = new String[] { "appid", "mch_id", "body", "out_trade_no",
    -          "total_fee", "spbill_create_ip", "notify_url","trade_type"};
    -
       private void checkParameters(Map parameters) {
         for (String para : this.REQUIRED_ORDER_PARAMETERS) {
    -      if (!parameters.containsKey(para))
    -        throw new IllegalArgumentException("Reqiured argument '" + para + "' is missing.");
    +      if (!parameters.containsKey(para)) {
    +        throw new IllegalArgumentException(
    +                "Reqiured argument '" + para + "' is missing.");
    +      }
    +    }
    +
    +    if ("JSAPI".equals(parameters.get("trade_type"))
    +            && !parameters.containsKey("openid")) {
    +      throw new IllegalArgumentException(
    +              "Reqiured argument 'openid' is missing when trade_type is 'JSAPI'.");
    +    }
    +
    +    if ("NATIVE".equals(parameters.get("trade_type"))
    +            && !parameters.containsKey("product_id")) {
    +      throw new IllegalArgumentException(
    +              "Reqiured argument 'product_id' is missing when trade_type is 'NATIVE'.");
         }
    -    if ("JSAPI".equals(parameters.get("trade_type")) && !parameters.containsKey("openid"))
    -      throw new IllegalArgumentException("Reqiured argument 'openid' is missing when trade_type is 'JSAPI'.");
    -    if ("NATIVE".equals(parameters.get("trade_type")) && !parameters.containsKey("product_id"))
    -      throw new IllegalArgumentException("Reqiured argument 'product_id' is missing when trade_type is 'NATIVE'.");
       }
     
       @Override
    -  public Map getJsapiPayInfo(String openId,String outTradeNo, double amt, String body,String ip, String callbackUrl) throws WxErrorException {
    +  public Map getJsapiPayInfo(String openId, String outTradeNo,
    +                                             double amt, String body, String ip, String callbackUrl)
    +          throws WxErrorException {
         Map packageParams = new HashMap<>();
    -    packageParams.put("appid", this.wxMpService.getWxMpConfigStorage().getAppId());
    -    packageParams.put("mch_id", this.wxMpService.getWxMpConfigStorage().getPartnerId());
    +    packageParams.put("appid",
    +            this.wxMpService.getWxMpConfigStorage().getAppId());
    +    packageParams.put("mch_id",
    +            this.wxMpService.getWxMpConfigStorage().getPartnerId());
         packageParams.put("body", body);
         packageParams.put("out_trade_no", outTradeNo);
         packageParams.put("total_fee", (int) (amt * 100) + "");
    @@ -126,10 +152,14 @@ public class WxMpPayServiceImpl implements WxMpPayService {
       }
     
       @Override
    -  public Map getNativePayInfo(String productId,String outTradeNo, double amt, String body,String ip, String callbackUrl) throws WxErrorException{
    +  public Map getNativePayInfo(String productId,
    +                                              String outTradeNo, double amt, String body, String ip, String callbackUrl)
    +          throws WxErrorException {
         Map packageParams = new HashMap<>();
    -    packageParams.put("appid", this.wxMpService.getWxMpConfigStorage().getAppId());
    -    packageParams.put("mch_id", this.wxMpService.getWxMpConfigStorage().getPartnerId());
    +    packageParams.put("appid",
    +            this.wxMpService.getWxMpConfigStorage().getAppId());
    +    packageParams.put("mch_id",
    +            this.wxMpService.getWxMpConfigStorage().getPartnerId());
         packageParams.put("body", body);
         packageParams.put("out_trade_no", outTradeNo);
         packageParams.put("total_fee", (int) (amt * 100) + "");
    @@ -142,24 +172,28 @@ public class WxMpPayServiceImpl implements WxMpPayService {
       }
     
       @Override
    -  public Map getPayInfo(Map parameters) throws WxErrorException {
    +  public Map getPayInfo(Map parameters)
    +          throws WxErrorException {
         WxMpPrepayIdResult wxMpPrepayIdResult = getPrepayId(parameters);
     
         if (!"SUCCESS".equalsIgnoreCase(wxMpPrepayIdResult.getReturn_code())
    -            ||!"SUCCESS".equalsIgnoreCase(wxMpPrepayIdResult.getResult_code())) {
    +            || !"SUCCESS".equalsIgnoreCase(wxMpPrepayIdResult.getResult_code())) {
           WxError error = new WxError();
           error.setErrorCode(-1);
    -      error.setErrorMsg("return_code:" + wxMpPrepayIdResult.getReturn_code() +
    -              ";return_msg:" + wxMpPrepayIdResult.getReturn_msg() +
    -              ";result_code:" + wxMpPrepayIdResult.getResult_code() +
    -              ";err_code" + wxMpPrepayIdResult.getErr_code() +
    -              ";err_code_des" + wxMpPrepayIdResult.getErr_code_des());
    +      error.setErrorMsg("return_code:" + wxMpPrepayIdResult.getReturn_code()
    +              + ";return_msg:" + wxMpPrepayIdResult.getReturn_msg()
    +              + ";result_code:" + wxMpPrepayIdResult.getResult_code() + ";err_code"
    +              + wxMpPrepayIdResult.getErr_code() + ";err_code_des"
    +              + wxMpPrepayIdResult.getErr_code_des());
           throw new WxErrorException(error);
         }
     
         String prepayId = wxMpPrepayIdResult.getPrepay_id();
         if (prepayId == null || prepayId.equals("")) {
    -      throw new RuntimeException(String.format("Failed to get prepay id due to error code '%s'(%s).", wxMpPrepayIdResult.getErr_code(), wxMpPrepayIdResult.getErr_code_des()));
    +      throw new RuntimeException(
    +              String.format("Failed to get prepay id due to error code '%s'(%s).",
    +                      wxMpPrepayIdResult.getErr_code(),
    +                      wxMpPrepayIdResult.getErr_code_des()));
         }
     
         Map payInfo = new HashMap<>();
    @@ -169,52 +203,67 @@ public class WxMpPayServiceImpl implements WxMpPayService {
         payInfo.put("nonceStr", System.currentTimeMillis() + "");
         payInfo.put("package", "prepay_id=" + prepayId);
         payInfo.put("signType", "MD5");
    -    if("NATIVE".equals(parameters.get("trade_type"))){
    +    if ("NATIVE".equals(parameters.get("trade_type"))) {
           payInfo.put("codeUrl", wxMpPrepayIdResult.getCode_url());
         }
     
    -    String finalSign = WxCryptUtil.createSign(payInfo, this.wxMpService.getWxMpConfigStorage().getPartnerKey());
    +    String finalSign = WxCryptUtil.createSign(payInfo,
    +            this.wxMpService.getWxMpConfigStorage().getPartnerKey());
         payInfo.put("paySign", finalSign);
         return payInfo;
       }
     
       @Override
    -  public WxMpPayResult getJSSDKPayResult(String transactionId, String outTradeNo) {
    +  public WxMpPayResult getJSSDKPayResult(String transactionId,
    +                                         String outTradeNo) {
         String nonce_str = System.currentTimeMillis() + "";
     
         SortedMap packageParams = new TreeMap<>();
    -    packageParams.put("appid", this.wxMpService.getWxMpConfigStorage().getAppId());
    -    packageParams.put("mch_id", this.wxMpService.getWxMpConfigStorage().getPartnerId());
    -    if (transactionId != null && !"".equals(transactionId.trim()))
    +    packageParams.put("appid",
    +            this.wxMpService.getWxMpConfigStorage().getAppId());
    +    packageParams.put("mch_id",
    +            this.wxMpService.getWxMpConfigStorage().getPartnerId());
    +
    +    if (transactionId != null && !"".equals(transactionId.trim())) {
           packageParams.put("transaction_id", transactionId);
    -    else if (outTradeNo != null && !"".equals(outTradeNo.trim()))
    +    } else if (outTradeNo != null && !"".equals(outTradeNo.trim())) {
           packageParams.put("out_trade_no", outTradeNo);
    -    else
    -      throw new IllegalArgumentException("Either 'transactionId' or 'outTradeNo' must be given.");
    +    } else {
    +      throw new IllegalArgumentException(
    +              "Either 'transactionId' or 'outTradeNo' must be given.");
    +    }
    +
         packageParams.put("nonce_str", nonce_str);
    -    packageParams.put("sign", WxCryptUtil.createSign(packageParams, this.wxMpService.getWxMpConfigStorage().getPartnerKey()));
    +    packageParams.put("sign", WxCryptUtil.createSign(packageParams,
    +            this.wxMpService.getWxMpConfigStorage().getPartnerKey()));
     
         StringBuilder request = new StringBuilder("");
         for (Map.Entry para : packageParams.entrySet()) {
    -      request.append(String.format("<%s>%s", para.getKey(), para.getValue(), para.getKey()));
    +      request.append(String.format("<%s>%s", para.getKey(),
    +              para.getValue(), para.getKey()));
         }
         request.append("");
     
    -    HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/pay/orderquery");
    +    HttpPost httpPost = new HttpPost(
    +            "https://api.mch.weixin.qq.com/pay/orderquery");
         if (this.httpProxy != null) {
    -      RequestConfig config = RequestConfig.custom().setProxy(this.httpProxy).build();
    +      RequestConfig config = RequestConfig.custom().setProxy(this.httpProxy)
    +              .build();
           httpPost.setConfig(config);
         }
     
         StringEntity entity = new StringEntity(request.toString(), Consts.UTF_8);
         httpPost.setEntity(entity);
    -    try(CloseableHttpResponse response = this.wxMpService.getHttpclient().execute(httpPost)) {
    -      String responseContent = Utf8ResponseHandler.INSTANCE.handleResponse(response);
    +    try (CloseableHttpResponse response = this.wxMpService.getHttpclient()
    +            .execute(httpPost)) {
    +      String responseContent = Utf8ResponseHandler.INSTANCE
    +              .handleResponse(response);
           XStream xstream = XStreamInitializer.getInstance();
           xstream.alias("xml", WxMpPayResult.class);
           return (WxMpPayResult) xstream.fromXML(responseContent);
         } catch (IOException e) {
    -      throw new RuntimeException("Failed to query order due to IO exception.", e);
    +      throw new RuntimeException("Failed to query order due to IO exception.",
    +              e);
         }
       }
     
    @@ -224,7 +273,7 @@ public class WxMpPayServiceImpl implements WxMpPayService {
           XStream xstream = XStreamInitializer.getInstance();
           xstream.alias("xml", WxMpPayCallback.class);
           return (WxMpPayCallback) xstream.fromXML(xmlData);
    -    } catch (Exception e){
    +    } catch (Exception e) {
           e.printStackTrace();
         }
     
    @@ -232,102 +281,126 @@ public class WxMpPayServiceImpl implements WxMpPayService {
       }
     
       @Override
    -  public WxMpPayRefundResult refundPay(Map parameters) throws WxErrorException {
    +  public WxMpPayRefundResult refundPay(Map parameters)
    +          throws WxErrorException {
         SortedMap refundParams = new TreeMap<>(parameters);
    -    refundParams.put("appid", this.wxMpService.getWxMpConfigStorage().getAppId());
    -    refundParams.put("mch_id", this.wxMpService.getWxMpConfigStorage().getPartnerId());
    +    refundParams.put("appid",
    +            this.wxMpService.getWxMpConfigStorage().getAppId());
    +    refundParams.put("mch_id",
    +            this.wxMpService.getWxMpConfigStorage().getPartnerId());
         refundParams.put("nonce_str", System.currentTimeMillis() + "");
    -    refundParams.put("op_user_id", this.wxMpService.getWxMpConfigStorage().getPartnerId());
    -    String sign = WxCryptUtil.createSign(refundParams, this.wxMpService.getWxMpConfigStorage().getPartnerKey());
    +    refundParams.put("op_user_id",
    +            this.wxMpService.getWxMpConfigStorage().getPartnerId());
    +    String sign = WxCryptUtil.createSign(refundParams,
    +            this.wxMpService.getWxMpConfigStorage().getPartnerKey());
         refundParams.put("sign", sign);
     
         StringBuilder request = new StringBuilder("");
         for (Map.Entry para : refundParams.entrySet()) {
    -      request.append(String.format("<%s>%s", para.getKey(), para.getValue(), para.getKey()));
    +      request.append(String.format("<%s>%s", para.getKey(),
    +              para.getValue(), para.getKey()));
         }
         request.append("");
     
    -    HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/secapi/pay/refund");
    +    HttpPost httpPost = new HttpPost(
    +            "https://api.mch.weixin.qq.com/secapi/pay/refund");
         if (this.httpProxy != null) {
    -      RequestConfig config = RequestConfig.custom().setProxy(this.httpProxy).build();
    +      RequestConfig config = RequestConfig.custom().setProxy(this.httpProxy)
    +              .build();
           httpPost.setConfig(config);
         }
     
         StringEntity entity = new StringEntity(request.toString(), Consts.UTF_8);
         httpPost.setEntity(entity);
    -    try(CloseableHttpResponse response = this.wxMpService.getHttpclient().execute(httpPost)) {
    -      String responseContent = Utf8ResponseHandler.INSTANCE.handleResponse(response);
    +    try (CloseableHttpResponse response = this.wxMpService.getHttpclient()
    +            .execute(httpPost)) {
    +      String responseContent = Utf8ResponseHandler.INSTANCE
    +              .handleResponse(response);
           XStream xstream = XStreamInitializer.getInstance();
           xstream.processAnnotations(WxMpPayRefundResult.class);
    -      WxMpPayRefundResult wxMpPayRefundResult = (WxMpPayRefundResult) xstream.fromXML(responseContent);
    +      WxMpPayRefundResult wxMpPayRefundResult = (WxMpPayRefundResult) xstream
    +              .fromXML(responseContent);
     
           if (!"SUCCESS".equalsIgnoreCase(wxMpPayRefundResult.getResultCode())
    -              ||!"SUCCESS".equalsIgnoreCase(wxMpPayRefundResult.getReturnCode())) {
    +              || !"SUCCESS".equalsIgnoreCase(wxMpPayRefundResult.getReturnCode())) {
             WxError error = new WxError();
             error.setErrorCode(-1);
    -        error.setErrorMsg("return_code:" + wxMpPayRefundResult.getReturnCode() +
    -                ";return_msg:" + wxMpPayRefundResult.getReturnMsg() +
    -                ";result_code:" + wxMpPayRefundResult.getResultCode() +
    -                ";err_code" + wxMpPayRefundResult.getErrCode() +
    -                ";err_code_des" + wxMpPayRefundResult.getErrCodeDes());
    +        error.setErrorMsg("return_code:" + wxMpPayRefundResult.getReturnCode()
    +                + ";return_msg:" + wxMpPayRefundResult.getReturnMsg()
    +                + ";result_code:" + wxMpPayRefundResult.getResultCode()
    +                + ";err_code" + wxMpPayRefundResult.getErrCode() + ";err_code_des"
    +                + wxMpPayRefundResult.getErrCodeDes());
             throw new WxErrorException(error);
           }
     
           return wxMpPayRefundResult;
         } catch (IOException e) {
    -      this.log.error(MessageFormatter.format("The exception was happened when sending refund '{}'.",
    -                request.toString()).getMessage(), e);
    -      WxError error = new WxError();
    -      error.setErrorCode(-1);
    -      error.setErrorMsg("incorrect response.");
    -      throw new WxErrorException(error);
    -    }finally {
    +      String message = MessageFormatter
    +              .format("Exception happened when sending refund '{}'.",
    +                      request.toString())
    +              .getMessage();
    +      this.log.error(message, e);
    +      throw new WxErrorException(
    +              WxError.newBuilder().setErrorMsg(message).build());
    +    } finally {
           httpPost.releaseConnection();
         }
       }
     
       @Override
    -  public boolean checkJSSDKCallbackDataSignature(Map kvm, String signature) {
    -    return signature.equals(WxCryptUtil.createSign(kvm, this.wxMpService.getWxMpConfigStorage().getPartnerKey()));
    +  public boolean checkJSSDKCallbackDataSignature(Map kvm,
    +                                                 String signature) {
    +    return signature.equals(WxCryptUtil.createSign(kvm,
    +            this.wxMpService.getWxMpConfigStorage().getPartnerKey()));
       }
     
       @Override
    -  public WxRedpackResult sendRedpack(Map parameters) throws WxErrorException {
    -    String nonce_str = System.currentTimeMillis() + "";
    -
    +  public WxRedpackResult sendRedpack(Map parameters)
    +          throws WxErrorException {
         SortedMap packageParams = new TreeMap<>(parameters);
    -    packageParams.put("wxappid", this.wxMpService.getWxMpConfigStorage().getAppId());
    -    packageParams.put("mch_id", this.wxMpService.getWxMpConfigStorage().getPartnerId());
    -    packageParams.put("nonce_str", nonce_str);
    -
    -    String sign = WxCryptUtil.createSign(packageParams, this.wxMpService.getWxMpConfigStorage().getPartnerKey());
    +    packageParams.put("wxappid",
    +            this.wxMpService.getWxMpConfigStorage().getAppId());
    +    packageParams.put("mch_id",
    +            this.wxMpService.getWxMpConfigStorage().getPartnerId());
    +    packageParams.put("nonce_str", System.currentTimeMillis() + "");
    +
    +    String sign = WxCryptUtil.createSign(packageParams,
    +            this.wxMpService.getWxMpConfigStorage().getPartnerKey());
         packageParams.put("sign", sign);
     
         StringBuilder request = new StringBuilder("");
         for (Map.Entry para : packageParams.entrySet()) {
    -      request.append(String.format("<%s>%s", para.getKey(), para.getValue(), para.getKey()));
    +      request.append(String.format("<%s>%s", para.getKey(),
    +              para.getValue(), para.getKey()));
         }
    +
         request.append("");
     
    -    HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack");
    +    HttpPost httpPost = new HttpPost(
    +            "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack");
         if (this.httpProxy != null) {
    -      RequestConfig config = RequestConfig.custom().setProxy(this.httpProxy).build();
    +      RequestConfig config = RequestConfig.custom().setProxy(this.httpProxy)
    +              .build();
           httpPost.setConfig(config);
         }
     
         StringEntity entity = new StringEntity(request.toString(), Consts.UTF_8);
         httpPost.setEntity(entity);
    -    try(CloseableHttpResponse response = this.wxMpService.getHttpclient().execute(httpPost)) {
    -      String responseContent = Utf8ResponseHandler.INSTANCE.handleResponse(response);
    +    try (CloseableHttpResponse response = this.wxMpService.getHttpclient()
    +            .execute(httpPost)) {
    +      String responseContent = Utf8ResponseHandler.INSTANCE
    +              .handleResponse(response);
           XStream xstream = XStreamInitializer.getInstance();
           xstream.processAnnotations(WxRedpackResult.class);
           return (WxRedpackResult) xstream.fromXML(responseContent);
         } catch (IOException e) {
    -      this.log.error(MessageFormatter.format("The exception was happened when sending redpack '{}'.", request.toString()).getMessage(), e);
    -      WxError error = new WxError();
    -      error.setErrorCode(-1);
    -      throw new WxErrorException(error);
    -    }finally {
    +      String message = MessageFormatter
    +              .format("Exception occured when sending redpack '{}'.",
    +                      request.toString())
    +              .getMessage();
    +      this.log.error(message, e);
    +      throw new WxErrorException(WxError.newBuilder().setErrorMsg(message).build());
    +    } finally {
           httpPost.releaseConnection();
         }
       }
    
    From 30c914f4344ae03a8c0587b1083eb71e39998038 Mon Sep 17 00:00:00 2001
    From: BinaryWang 
    Date: Fri, 19 Aug 2016 10:51:30 +0800
    Subject: [PATCH 20/55] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=83=A8=E5=88=86javad?=
     =?UTF-8?q?oc?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../src/main/java/me/chanjar/weixin/cp/api/WxCpService.java | 6 +++---
     1 file changed, 3 insertions(+), 3 deletions(-)
    
    diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java
    index 428dc29c..e6f8f2ad 100644
    --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java
    +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java
    @@ -160,7 +160,7 @@ public interface WxCpService {
        *
        * @param menu
        * @throws WxErrorException
    -   * @see #menuCreate(String, me.chanjar.weixin.common.bean.WxMenu)
    +   * @see #menuCreate(String, me.chanjar.weixin.common.bean.menu.WxMenu)
        */
       void menuCreate(WxMenu menu) throws WxErrorException;
     
    @@ -175,7 +175,7 @@ public interface WxCpService {
        * @param agentId 企业号应用的id
        * @param menu
        * @throws WxErrorException
    -   * @see #menuCreate(me.chanjar.weixin.common.bean.WxMenu)
    +   * @see #menuCreate(me.chanjar.weixin.common.bean.menu.WxMenu)
        */
       void menuCreate(String agentId, WxMenu menu) throws WxErrorException;
     
    @@ -398,7 +398,7 @@ public interface WxCpService {
        * 
    * * @param state - * @return + * @return url */ String oauth2buildAuthorizationUrl(String state); From a7846f9da8e2c5c9ad691d24bb34d4fea45f7bb9 Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Mon, 22 Aug 2016 15:38:01 +0800 Subject: [PATCH 21/55] =?UTF-8?q?=E9=87=8D=E6=9E=84=E9=83=A8=E5=88=86?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=EF=BC=8C=E6=8A=BD=E5=8F=96=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=B8=BA=E5=8D=95=E7=8B=AC=E6=96=B9=E6=B3=95?= =?UTF-8?q?=EF=BC=8C=E5=B9=B6=E8=B0=83=E6=95=B4=E9=83=A8=E5=88=86=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E9=A1=BA=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/mp/api/impl/WxMpServiceImpl.java | 85 +++++++++---------- 1 file changed, 41 insertions(+), 44 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java index 55b99293..33fb1402 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java @@ -21,6 +21,7 @@ import org.apache.http.HttpHost; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; +import org.apache.http.conn.ssl.DefaultHostnameVerifier; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.impl.client.BasicResponseHandler; import org.apache.http.impl.client.CloseableHttpClient; @@ -209,6 +210,13 @@ public class WxMpServiceImpl implements WxMpService { return WxMpMassSendResult.fromJson(responseContent); } + @Override + public WxMpMassSendResult massMessagePreview(WxMpMassPreviewMessage wxMpMassPreviewMessage) throws Exception { + String url = "https://api.weixin.qq.com/cgi-bin/message/mass/preview"; + String responseContent = execute(new SimplePostRequestExecutor(), url, wxMpMassPreviewMessage.toJson()); + return WxMpMassSendResult.fromJson(responseContent); + } + @Override public String shortUrl(String long_url) throws WxErrorException { String url = "https://api.weixin.qq.com/cgi-bin/shorturl"; @@ -226,11 +234,30 @@ public class WxMpServiceImpl implements WxMpService { String responseContent = execute(new SimplePostRequestExecutor(), url, templateMessage.toJson()); JsonElement tmpJsonElement = Streams.parse(new JsonReader(new StringReader(responseContent))); final JsonObject jsonObject = tmpJsonElement.getAsJsonObject(); - if (jsonObject.get("errcode").getAsInt() == 0) + if (jsonObject.get("errcode").getAsInt() == 0){ return jsonObject.get("msgid").getAsString(); + } + throw new WxErrorException(WxError.fromJson(responseContent)); } + @Override + public String setIndustry(WxMpIndustry wxMpIndustry) throws WxErrorException { + if (null == wxMpIndustry.getPrimaryIndustry() || null == wxMpIndustry.getPrimaryIndustry().getId() + || null == wxMpIndustry.getSecondIndustry() || null == wxMpIndustry.getSecondIndustry().getId()) { + throw new IllegalArgumentException("industry id is empty"); + } + String url = "https://api.weixin.qq.com/cgi-bin/template/api_set_industry"; + return execute(new SimplePostRequestExecutor(), url, wxMpIndustry.toJson()); + } + + @Override + public WxMpIndustry getIndustry() throws WxErrorException { + String url = "https://api.weixin.qq.com/cgi-bin/template/get_industry"; + String responseContent = execute(new SimpleGetRequestExecutor(), url, null); + return WxMpIndustry.fromJson(responseContent); + } + @Override public WxMpSemanticQueryResult semanticQuery(WxMpSemanticQuery semanticQuery) throws WxErrorException { String url = "https://api.weixin.qq.com/semantic/semproxy/search"; @@ -253,6 +280,16 @@ public class WxMpServiceImpl implements WxMpService { return url.toString(); } + private WxMpOAuth2AccessToken getOAuth2AccessToken(StringBuilder url) throws WxErrorException { + try { + RequestExecutor executor = new SimpleGetRequestExecutor(); + String responseText = executor.execute(this.getHttpclient(), this.httpProxy, url.toString(), null); + return WxMpOAuth2AccessToken.fromJson(responseText); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + @Override public WxMpOAuth2AccessToken oauth2getAccessToken(String code) throws WxErrorException { StringBuilder url = new StringBuilder(); @@ -262,13 +299,7 @@ public class WxMpServiceImpl implements WxMpService { url.append("&code=").append(code); url.append("&grant_type=authorization_code"); - try { - RequestExecutor executor = new SimpleGetRequestExecutor(); - String responseText = executor.execute(getHttpclient(), this.httpProxy, url.toString(), null); - return WxMpOAuth2AccessToken.fromJson(responseText); - } catch (IOException e) { - throw new RuntimeException(e); - } + return this.getOAuth2AccessToken(url); } @Override @@ -279,13 +310,7 @@ public class WxMpServiceImpl implements WxMpService { url.append("&grant_type=refresh_token"); url.append("&refresh_token=").append(refreshToken); - try { - RequestExecutor executor = new SimpleGetRequestExecutor(); - String responseText = executor.execute(getHttpclient(), this.httpProxy, url.toString(), null); - return WxMpOAuth2AccessToken.fromJson(responseText); - } catch (IOException e) { - throw new RuntimeException(e); - } + return this.getOAuth2AccessToken(url); } @Override @@ -440,10 +465,7 @@ public class WxMpServiceImpl implements WxMpService { if (this.wxMpConfigStorage.getSSLContext() != null){ SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory( - this.wxMpConfigStorage.getSSLContext(), - new String[] { "TLSv1" }, - null, - SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); + this.wxMpConfigStorage.getSSLContext(), new String[] { "TLSv1" }, null, new DefaultHostnameVerifier()); apacheHttpClientBuilder.sslConnectionSocketFactory(sslsf); } @@ -460,36 +482,11 @@ public class WxMpServiceImpl implements WxMpService { this.retrySleepMillis = retrySleepMillis; } - @Override public void setMaxRetryTimes(int maxRetryTimes) { this.maxRetryTimes = maxRetryTimes; } - @Override - public WxMpMassSendResult massMessagePreview(WxMpMassPreviewMessage wxMpMassPreviewMessage) throws Exception { - String url = "https://api.weixin.qq.com/cgi-bin/message/mass/preview"; - String responseContent = execute(new SimplePostRequestExecutor(), url, wxMpMassPreviewMessage.toJson()); - return WxMpMassSendResult.fromJson(responseContent); - } - - @Override - public String setIndustry(WxMpIndustry wxMpIndustry) throws WxErrorException { - if (null == wxMpIndustry.getPrimaryIndustry() || null == wxMpIndustry.getPrimaryIndustry().getId() - || null == wxMpIndustry.getSecondIndustry() || null == wxMpIndustry.getSecondIndustry().getId()) { - throw new IllegalArgumentException("industry id is empty"); - } - String url = "https://api.weixin.qq.com/cgi-bin/template/api_set_industry"; - return execute(new SimplePostRequestExecutor(), url, wxMpIndustry.toJson()); - } - - @Override - public WxMpIndustry getIndustry() throws WxErrorException { - String url = "https://api.weixin.qq.com/cgi-bin/template/get_industry"; - String responseContent = execute(new SimpleGetRequestExecutor(), url, null); - return WxMpIndustry.fromJson(responseContent); - } - @Override public WxMpKefuService getKefuService() { return this.kefuService; From f2e251a09d5c8e9f0d82e9930d6f471348ae63ff Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Mon, 22 Aug 2016 16:07:41 +0800 Subject: [PATCH 22/55] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=83=A8=E5=88=86?= =?UTF-8?q?=E5=AF=BC=E8=87=B4warning=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/mp/api/impl/WxMpServiceImpl.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java index 33fb1402..be74fbc5 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java @@ -3,8 +3,7 @@ package me.chanjar.weixin.mp.api.impl; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; -import com.google.gson.internal.Streams; -import com.google.gson.stream.JsonReader; +import com.google.gson.JsonParser; import me.chanjar.weixin.common.bean.WxAccessToken; import me.chanjar.weixin.common.bean.WxJsapiSignature; import me.chanjar.weixin.common.bean.result.WxError; @@ -29,11 +28,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; -import java.io.StringReader; import java.security.NoSuchAlgorithmException; public class WxMpServiceImpl implements WxMpService { + private static final JsonParser JSON_PARSER = new JsonParser(); + protected final Logger log = LoggerFactory.getLogger(WxMpServiceImpl.class); /** @@ -141,7 +141,7 @@ public class WxMpServiceImpl implements WxMpService { if (this.wxMpConfigStorage.isJsapiTicketExpired()) { String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi"; String responseContent = execute(new SimpleGetRequestExecutor(), url, null); - JsonElement tmpJsonElement = Streams.parse(new JsonReader(new StringReader(responseContent))); + JsonElement tmpJsonElement = JSON_PARSER.parse(responseContent); JsonObject tmpJsonObject = tmpJsonElement.getAsJsonObject(); String jsapiTicket = tmpJsonObject.get("ticket").getAsString(); int expiresInSeconds = tmpJsonObject.get("expires_in").getAsInt(); @@ -224,7 +224,7 @@ public class WxMpServiceImpl implements WxMpService { o.addProperty("action", "long2short"); o.addProperty("long_url", long_url); String responseContent = execute(new SimplePostRequestExecutor(), url, o.toString()); - JsonElement tmpJsonElement = Streams.parse(new JsonReader(new StringReader(responseContent))); + JsonElement tmpJsonElement = JSON_PARSER.parse(responseContent); return tmpJsonElement.getAsJsonObject().get("short_url").getAsString(); } @@ -232,7 +232,7 @@ public class WxMpServiceImpl implements WxMpService { public String templateSend(WxMpTemplateMessage templateMessage) throws WxErrorException { String url = "https://api.weixin.qq.com/cgi-bin/message/template/send"; String responseContent = execute(new SimplePostRequestExecutor(), url, templateMessage.toJson()); - JsonElement tmpJsonElement = Streams.parse(new JsonReader(new StringReader(responseContent))); + JsonElement tmpJsonElement = JSON_PARSER.parse(responseContent); final JsonObject jsonObject = tmpJsonElement.getAsJsonObject(); if (jsonObject.get("errcode").getAsInt() == 0){ return jsonObject.get("msgid").getAsString(); @@ -356,7 +356,7 @@ public class WxMpServiceImpl implements WxMpService { public String[] getCallbackIP() throws WxErrorException { String url = "https://api.weixin.qq.com/cgi-bin/getcallbackip"; String responseContent = get(url, null); - JsonElement tmpJsonElement = Streams.parse(new JsonReader(new StringReader(responseContent))); + JsonElement tmpJsonElement = JSON_PARSER.parse(responseContent); JsonArray ipList = tmpJsonElement.getAsJsonObject().get("ip_list").getAsJsonArray(); String[] ipArray = new String[ipList.size()]; for (int i = 0; i < ipList.size(); i++) { From a70f937d76b634a2d1170ca8be7127752a3f0381 Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Tue, 23 Aug 2016 16:01:22 +0800 Subject: [PATCH 23/55] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96pom=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index fb4652c5..54370f46 100644 --- a/pom.xml +++ b/pom.xml @@ -111,13 +111,13 @@ jackson-databind ${jackson.version} - - redis.clients - jedis - ${jedis.version} - + + redis.clients + jedis + ${jedis.version} + - + From bb0147bd574ed8fabfd724b3842a52be2c1ee0b0 Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Tue, 23 Aug 2016 18:00:34 +0800 Subject: [PATCH 24/55] =?UTF-8?q?=E8=BD=AC=E7=A7=BB=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E5=88=86=E6=9E=90=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3=E4=B8=BA?= =?UTF-8?q?=E5=8D=95=E7=8B=AC=E7=B1=BB=EF=BC=8C=E4=B8=BA=E4=BB=A5=E5=90=8E?= =?UTF-8?q?=E5=AE=8C=E5=96=84=E8=A1=A5=E5=85=85=E7=BB=9F=E8=AE=A1=E5=88=86?= =?UTF-8?q?=E6=9E=90=E6=8E=A5=E5=8F=A3=E5=81=9A=E5=87=86=E5=A4=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/mp/api/WxMpDataCubeService.java | 37 +++++++++++++ .../me/chanjar/weixin/mp/api/WxMpService.java | 7 +++ .../weixin/mp/api/WxMpUserService.java | 27 ---------- .../mp/api/impl/WxMpDataCubeServiceImpl.java | 52 +++++++++++++++++++ .../weixin/mp/api/impl/WxMpServiceImpl.java | 7 +++ .../mp/api/impl/WxMpUserServiceImpl.java | 37 +------------ .../api/impl/WxMpDataCubeServiceImplTest.java | 51 ++++++++++++++++++ .../mp/api/impl/WxMpUserServiceImplTest.java | 35 ++----------- 8 files changed, 160 insertions(+), 93 deletions(-) create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpDataCubeService.java create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImpl.java create mode 100644 weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImplTest.java diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpDataCubeService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpDataCubeService.java new file mode 100644 index 00000000..f42829e7 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpDataCubeService.java @@ -0,0 +1,37 @@ +package me.chanjar.weixin.mp.api; + +import java.util.Date; +import java.util.List; + +import me.chanjar.weixin.common.exception.WxErrorException; +import me.chanjar.weixin.mp.bean.result.WxMpUserCumulate; +import me.chanjar.weixin.mp.bean.result.WxMpUserSummary; + +/** + * 统计分析相关接口 + * Created by Binary Wang on 2016/8/23. + * @author binarywang (https://github.com/binarywang) + */ +public interface WxMpDataCubeService { + /** + *
    +   * 获取用户增减数据
    +   * http://mp.weixin.qq.com/wiki/3/ecfed6e1a0a03b5f35e5efac98e864b7.html
    +   * 
    + * + * @param beginDate 最大时间跨度7天 + * @param endDate endDate不能早于begingDate + */ + List getUserSummary(Date beginDate, Date endDate) throws WxErrorException; + + /** + *
    +   * 获取累计用户数据
    +   * http://mp.weixin.qq.com/wiki/3/ecfed6e1a0a03b5f35e5efac98e864b7.html
    +   * 
    + * + * @param beginDate 最大时间跨度7天 + * @param endDate endDate不能早于begingDate + */ + List getUserCumulate(Date beginDate, Date endDate) throws WxErrorException; +} 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 31c65e64..7acd2342 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 @@ -336,4 +336,11 @@ public interface WxMpService { * @return WxMpPayService */ WxMpPayService getPayService(); + + /** + * 返回数据分析统计相关接口的方法实现类,以方便调用个其各种接口 + * + * @return WxMpDataCubeService + */ + WxMpDataCubeService getDataCubeService(); } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserService.java index 0705e990..a071b0a2 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserService.java @@ -2,12 +2,7 @@ package me.chanjar.weixin.mp.api; import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.mp.bean.result.WxMpUser; -import me.chanjar.weixin.mp.bean.result.WxMpUserCumulate; import me.chanjar.weixin.mp.bean.result.WxMpUserList; -import me.chanjar.weixin.mp.bean.result.WxMpUserSummary; - -import java.util.Date; -import java.util.List; /** * 用户管理和统计相关操作接口 @@ -47,26 +42,4 @@ public interface WxMpUserService { * @param next_openid 可选,第一个拉取的OPENID,null为从头开始拉取 */ WxMpUserList userList(String next_openid) throws WxErrorException; - - /** - *
    -   * 获取用户增减数据
    -   * http://mp.weixin.qq.com/wiki/3/ecfed6e1a0a03b5f35e5efac98e864b7.html
    -   * 
    - * - * @param beginDate 最大时间跨度7天 - * @param endDate endDate不能早于begingDate - */ - List dataCubeUserSummary(Date beginDate, Date endDate) throws WxErrorException; - - /** - *
    -   * 获取累计用户数据
    -   * http://mp.weixin.qq.com/wiki/3/ecfed6e1a0a03b5f35e5efac98e864b7.html
    -   * 
    - * - * @param beginDate 最大时间跨度7天 - * @param endDate endDate不能早于begingDate - */ - List dataCubeUserCumulate(Date beginDate, Date endDate) throws WxErrorException; } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImpl.java new file mode 100644 index 00000000..3b577713 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImpl.java @@ -0,0 +1,52 @@ +package me.chanjar.weixin.mp.api.impl; + +import java.util.Date; +import java.util.List; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.reflect.TypeToken; + +import me.chanjar.weixin.common.exception.WxErrorException; +import me.chanjar.weixin.mp.api.WxMpDataCubeService; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.result.WxMpUserCumulate; +import me.chanjar.weixin.mp.bean.result.WxMpUserSummary; +import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; + +/** + * Created by Binary Wang on 2016/8/23. + * @author binarywang (https://github.com/binarywang) + */ +public class WxMpDataCubeServiceImpl implements WxMpDataCubeService { + private static final String API_URL_PREFIX = "https://api.weixin.qq.com/datacube"; + private WxMpService wxMpService; + + public WxMpDataCubeServiceImpl(WxMpService wxMpService) { + this.wxMpService = wxMpService; + } + + @Override + public List getUserSummary(Date beginDate, Date endDate) throws WxErrorException { + String url = API_URL_PREFIX + "/getusersummary"; + JsonObject param = new JsonObject(); + param.addProperty("begin_date", WxMpService.SIMPLE_DATE_FORMAT.format(beginDate)); + param.addProperty("end_date", WxMpService.SIMPLE_DATE_FORMAT.format(endDate)); + String responseContent = this.wxMpService.post(url, param.toString()); + return WxMpGsonBuilder.INSTANCE.create().fromJson(new JsonParser().parse(responseContent).getAsJsonObject().get("list"), + new TypeToken>() { + }.getType()); + } + + @Override + public List getUserCumulate(Date beginDate, Date endDate) throws WxErrorException { + String url = API_URL_PREFIX + "/getusercumulate"; + JsonObject param = new JsonObject(); + param.addProperty("begin_date", WxMpService.SIMPLE_DATE_FORMAT.format(beginDate)); + param.addProperty("end_date", WxMpService.SIMPLE_DATE_FORMAT.format(endDate)); + String responseContent = this.wxMpService.post(url, param.toString()); + return WxMpGsonBuilder.INSTANCE.create().fromJson(new JsonParser().parse(responseContent).getAsJsonObject().get("list"), + new TypeToken>() { + }.getType()); + } +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java index be74fbc5..f510d01f 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java @@ -64,6 +64,8 @@ public class WxMpServiceImpl implements WxMpService { private WxMpPayService payService = new WxMpPayServiceImpl(this); + private WxMpDataCubeService dataCubeService = new WxMpDataCubeServiceImpl(this); + private CloseableHttpClient httpClient; private HttpHost httpProxy; @@ -527,4 +529,9 @@ public class WxMpServiceImpl implements WxMpService { return this.payService; } + @Override + public WxMpDataCubeService getDataCubeService() { + return this.dataCubeService; + } + } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImpl.java index f2ceac34..c05eeb9f 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImpl.java @@ -1,24 +1,14 @@ package me.chanjar.weixin.mp.api.impl; -import com.google.gson.JsonElement; import com.google.gson.JsonObject; -import com.google.gson.internal.Streams; -import com.google.gson.reflect.TypeToken; -import com.google.gson.stream.JsonReader; + import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor; import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor; import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.api.WxMpUserService; import me.chanjar.weixin.mp.bean.result.WxMpUser; -import me.chanjar.weixin.mp.bean.result.WxMpUserCumulate; import me.chanjar.weixin.mp.bean.result.WxMpUserList; -import me.chanjar.weixin.mp.bean.result.WxMpUserSummary; -import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; - -import java.io.StringReader; -import java.util.Date; -import java.util.List; /** * Created by Binary Wang on 2016/7/21. @@ -55,29 +45,4 @@ public class WxMpUserServiceImpl implements WxMpUserService { return WxMpUserList.fromJson(responseContent); } - @Override - public List dataCubeUserSummary(Date beginDate, Date endDate) throws WxErrorException { - String url = "https://api.weixin.qq.com/datacube/getusersummary"; - JsonObject param = new JsonObject(); - param.addProperty("begin_date", WxMpService.SIMPLE_DATE_FORMAT.format(beginDate)); - param.addProperty("end_date", WxMpService.SIMPLE_DATE_FORMAT.format(endDate)); - String responseContent = this.wxMpService.post(url, param.toString()); - JsonElement tmpJsonElement = Streams.parse(new JsonReader(new StringReader(responseContent))); - return WxMpGsonBuilder.INSTANCE.create().fromJson(tmpJsonElement.getAsJsonObject().get("list"), - new TypeToken>() { - }.getType()); - } - - @Override - public List dataCubeUserCumulate(Date beginDate, Date endDate) throws WxErrorException { - String url = "https://api.weixin.qq.com/datacube/getusercumulate"; - JsonObject param = new JsonObject(); - param.addProperty("begin_date", WxMpService.SIMPLE_DATE_FORMAT.format(beginDate)); - param.addProperty("end_date", WxMpService.SIMPLE_DATE_FORMAT.format(endDate)); - String responseContent = this.wxMpService.post(url, param.toString()); - JsonElement tmpJsonElement = Streams.parse(new JsonReader(new StringReader(responseContent))); - return WxMpGsonBuilder.INSTANCE.create().fromJson(tmpJsonElement.getAsJsonObject().get("list"), - new TypeToken>() { - }.getType()); - } } diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImplTest.java new file mode 100644 index 00000000..ebfdee43 --- /dev/null +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImplTest.java @@ -0,0 +1,51 @@ +package me.chanjar.weixin.mp.api.impl; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +import org.testng.Assert; +import org.testng.annotations.Guice; +import org.testng.annotations.Test; + +import com.google.inject.Inject; + +import me.chanjar.weixin.common.exception.WxErrorException; +import me.chanjar.weixin.mp.api.ApiTestModule; +import me.chanjar.weixin.mp.bean.result.WxMpUserCumulate; +import me.chanjar.weixin.mp.bean.result.WxMpUserSummary; + +/** + * 测试统计分析相关的接口 + * Created by Binary Wang on 2016/8/23. + * @author binarywang (https://github.com/binarywang) + */ +@Guice(modules = ApiTestModule.class) +public class WxMpDataCubeServiceImplTest { + private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); + + @Inject + protected WxMpServiceImpl wxService; + + @Test + public void testGetUserSummary() throws WxErrorException, ParseException { + Date beginDate = simpleDateFormat.parse("2016-08-20"); + Date endDate = simpleDateFormat.parse("2016-08-22"); + List summaries = this.wxService.getDataCubeService() + .getUserSummary(beginDate, endDate); + Assert.assertNotNull(summaries); + System.out.println(summaries); + } + + @Test + public void testGetUserCumulate() throws WxErrorException, ParseException { + Date beginDate = simpleDateFormat.parse("2016-08-21"); + Date endDate = simpleDateFormat.parse("2016-08-22"); + List cumulates = this.wxService.getDataCubeService() + .getUserCumulate(beginDate, endDate); + Assert.assertNotNull(cumulates); + System.out.println(cumulates); + } + +} diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImplTest.java index af5289f0..05ac40c9 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImplTest.java @@ -1,20 +1,15 @@ package me.chanjar.weixin.mp.api.impl; +import org.testng.Assert; +import org.testng.annotations.Guice; +import org.testng.annotations.Test; + import com.google.inject.Inject; + import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.mp.api.ApiTestModule; import me.chanjar.weixin.mp.bean.result.WxMpUser; -import me.chanjar.weixin.mp.bean.result.WxMpUserCumulate; import me.chanjar.weixin.mp.bean.result.WxMpUserList; -import me.chanjar.weixin.mp.bean.result.WxMpUserSummary; -import org.testng.Assert; -import org.testng.annotations.Guice; -import org.testng.annotations.Test; - -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.List; /** * 测试用户相关的接口 @@ -61,24 +56,4 @@ public class WxMpUserServiceImplTest { this.wxService.getGroupService().userUpdateGroup(configStorage.getOpenId(), this.wxService.getGroupService().groupGet().get(3).getId()); } - @Test - public void testGetUserSummary() throws WxErrorException, ParseException { - SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); - Date beginDate = simpleDateFormat.parse("2015-01-01"); - Date endDate = simpleDateFormat.parse("2015-01-02"); - List summaries = this.wxService.getUserService().dataCubeUserSummary(beginDate, endDate); - Assert.assertNotNull(summaries); - System.out.println(summaries); - } - - @Test - public void testGetUserCumulate() throws WxErrorException, ParseException { - SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); - Date beginDate = simpleDateFormat.parse("2015-01-01"); - Date endDate = simpleDateFormat.parse("2015-01-02"); - List cumulates = this.wxService.getUserService().dataCubeUserCumulate(beginDate, endDate); - Assert.assertNotNull(cumulates); - System.out.println(cumulates); - } - } From 8d72adc52e887b84b2e37d165dfb7a445dc9d7f0 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Tue, 23 Aug 2016 23:32:48 +0800 Subject: [PATCH 25/55] fix javadoc error --- .../weixin/cp/api/WxCpJedisConfigStorage.java | 45 +++++++++---------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpJedisConfigStorage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpJedisConfigStorage.java index 2c8e8bb6..8d3b6bbd 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpJedisConfigStorage.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpJedisConfigStorage.java @@ -9,7 +9,7 @@ import redis.clients.jedis.JedisPool; /** * Jedis client implementor for wechat config storage - * + * * @author gaigeshen */ public class WxCpJedisConfigStorage implements WxCpConfigStorage { @@ -41,42 +41,37 @@ public class WxCpJedisConfigStorage implements WxCpConfigStorage { /* Redis clients pool */ private final JedisPool jedisPool; - /** - * - * - * @param jedis - */ public WxCpJedisConfigStorage(String host, int port) { this.jedisPool = new JedisPool(host, port); } - + /** - * + * * This method will be destroy jedis pool */ public void destroy() { this.jedisPool.destroy(); } - + @Override public String getAccessToken() { try (Jedis jedis = this.jedisPool.getResource()) { return jedis.get(ACCESS_TOKEN_KEY); } } - + @Override public boolean isAccessTokenExpired() { try (Jedis jedis = this.jedisPool.getResource()) { String expiresTimeStr = jedis.get(ACCESS_TOKEN_EXPIRES_TIME_KEY); - + if (expiresTimeStr != null) { Long expiresTime = Long.parseLong(expiresTimeStr); return System.currentTimeMillis() > expiresTime; } - + return true; - + } } @@ -96,7 +91,7 @@ public class WxCpJedisConfigStorage implements WxCpConfigStorage { public synchronized void updateAccessToken(String accessToken, int expiresInSeconds) { try (Jedis jedis = this.jedisPool.getResource()) { jedis.set(ACCESS_TOKEN_KEY, accessToken); - + jedis.set(ACCESS_TOKEN_EXPIRES_TIME_KEY, (System.currentTimeMillis() + (expiresInSeconds - 200) * 1000L) + ""); } @@ -111,17 +106,17 @@ public class WxCpJedisConfigStorage implements WxCpConfigStorage { @Override public boolean isJsapiTicketExpired() { - + try (Jedis jedis = this.jedisPool.getResource()) { String expiresTimeStr = jedis.get(JS_API_TICKET_EXPIRES_TIME_KEY); - + if (expiresTimeStr != null) { Long expiresTime = Long.parseLong(expiresTimeStr); return System.currentTimeMillis() > expiresTime; } - + return true; - + } } @@ -134,14 +129,14 @@ public class WxCpJedisConfigStorage implements WxCpConfigStorage { @Override public synchronized void updateJsapiTicket(String jsapiTicket, int expiresInSeconds) { - + try (Jedis jedis = this.jedisPool.getResource()) { jedis.set(JS_API_TICKET_KEY, jsapiTicket); - + jedis.set(JS_API_TICKET_EXPIRES_TIME_KEY, (System.currentTimeMillis() + (expiresInSeconds - 200) * 1000L + "")); } - + } @Override @@ -173,14 +168,14 @@ public class WxCpJedisConfigStorage implements WxCpConfigStorage { public long getExpiresTime() { try (Jedis jedis = this.jedisPool.getResource()) { String expiresTimeStr = jedis.get(ACCESS_TOKEN_EXPIRES_TIME_KEY); - + if (expiresTimeStr != null) { Long expiresTime = Long.parseLong(expiresTimeStr); return expiresTime; } - + return 0L; - + } } @@ -240,7 +235,7 @@ public class WxCpJedisConfigStorage implements WxCpConfigStorage { } // ============================ Setters below - + public void setOauth2redirectUri(String oauth2redirectUri) { this.oauth2redirectUri = oauth2redirectUri; } From d1a66b2ee203624c756b113bf8bc7eb5a464e4bb Mon Sep 17 00:00:00 2001 From: xiaohulu Date: Wed, 24 Aug 2016 09:59:45 +0800 Subject: [PATCH 26/55] ignore bin folder created by eclipse ide. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 66e40382..17639d7f 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ test-output hs_err_pid* target +bin .project .classpath .settings From e8abad8990e16a3c52d658fbe26ee61b9200b611 Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Wed, 24 Aug 2016 15:17:37 +0800 Subject: [PATCH 27/55] update javadoc --- .../weixin/mp/api/WxMpDataCubeService.java | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpDataCubeService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpDataCubeService.java index f42829e7..05470de0 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpDataCubeService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpDataCubeService.java @@ -1,12 +1,12 @@ package me.chanjar.weixin.mp.api; -import java.util.Date; -import java.util.List; - import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.mp.bean.result.WxMpUserCumulate; import me.chanjar.weixin.mp.bean.result.WxMpUserSummary; +import java.util.Date; +import java.util.List; + /** * 统计分析相关接口 * Created by Binary Wang on 2016/8/23. @@ -16,22 +16,24 @@ public interface WxMpDataCubeService { /** *
        * 获取用户增减数据
    -   * http://mp.weixin.qq.com/wiki/3/ecfed6e1a0a03b5f35e5efac98e864b7.html
    +   * 详情请见文档:用户分析数据接口
    +   * 接口url格式:https://api.weixin.qq.com/datacube/getusersummary?access_token=ACCESS_TOKEN
        * 
    * - * @param beginDate 最大时间跨度7天 - * @param endDate endDate不能早于begingDate + * @param beginDate 开始时间 + * @param endDate 最大时间跨度7天,endDate不能早于begingDate */ List getUserSummary(Date beginDate, Date endDate) throws WxErrorException; /** *
        * 获取累计用户数据
    -   * http://mp.weixin.qq.com/wiki/3/ecfed6e1a0a03b5f35e5efac98e864b7.html
    +   * 详情请见文档:用户分析数据接口
    +   * 接口url格式:https://api.weixin.qq.com/datacube/getusercumulate?access_token=ACCESS_TOKEN
        * 
    * - * @param beginDate 最大时间跨度7天 - * @param endDate endDate不能早于begingDate + * @param beginDate 开始时间 + * @param endDate 最大时间跨度7天,endDate不能早于begingDate */ List getUserCumulate(Date beginDate, Date endDate) throws WxErrorException; } From 90b4b5c24fcc1bc62322ebc4584ac5b771ead0f9 Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Thu, 25 Aug 2016 17:53:47 +0800 Subject: [PATCH 28/55] =?UTF-8?q?=E6=9B=B4=E6=94=B9toString=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/mp/bean/result/WxMpUserCumulate.java | 8 ++++---- .../chanjar/weixin/mp/bean/result/WxMpUserSummary.java | 10 ++++------ 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUserCumulate.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUserCumulate.java index 4c295c41..2a487715 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUserCumulate.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUserCumulate.java @@ -1,5 +1,8 @@ package me.chanjar.weixin.mp.bean.result; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + import java.io.Serializable; import java.util.Date; @@ -33,9 +36,6 @@ public class WxMpUserCumulate implements Serializable { @Override public String toString() { - return "WxMpUserCumulate{" + - "refDate=" + refDate + - ", cumulateUser=" + cumulateUser + - '}'; + return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE); } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUserSummary.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUserSummary.java index de61a80b..a908932f 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUserSummary.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUserSummary.java @@ -1,5 +1,8 @@ package me.chanjar.weixin.mp.bean.result; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + import java.io.Serializable; import java.util.Date; @@ -53,11 +56,6 @@ public class WxMpUserSummary implements Serializable { @Override public String toString() { - return "WxMpUserSummary{" + - "refDate=" + refDate + - ", userSource=" + userSource + - ", newUser=" + newUser + - ", cancelUser=" + cancelUser + - '}'; + return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE); } } From f38f31fb1077984e76312baa4c7f3256d3b64b70 Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Thu, 25 Aug 2016 17:56:27 +0800 Subject: [PATCH 29/55] =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E5=8D=95=E5=85=83?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E5=88=B0=E7=B1=BB=E5=90=8C=E5=90=8D=E5=8C=85?= =?UTF-8?q?=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datacube/WxDataCubeArticleResult.java | 8 ++ .../bean/datacube/WxDataCubeArticleTotal.java | 100 ++++++++++++++++++ .../WxDataCubeArticleTotalDetail.java | 8 ++ .../bean/datacube/WxDataCubeBaseResult.java | 24 +++++ .../kefu => kefu/result}/WxMpKfListTest.java | 2 +- .../result}/WxMpKfOnlineListTest.java | 2 +- 6 files changed, 142 insertions(+), 2 deletions(-) create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotal.java create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotalDetail.java create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java rename weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/{result/kefu => kefu/result}/WxMpKfListTest.java (97%) rename weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/{result/kefu => kefu/result}/WxMpKfOnlineListTest.java (96%) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java new file mode 100644 index 00000000..faca1b0e --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java @@ -0,0 +1,8 @@ +package me.chanjar.weixin.mp.bean.datacube; + +/** + * @author binarywang(https://github.com/binarywang) + * Created by Binary Wang on 2016/8/24. + */ +public class WxDataCubeArticleResult { +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotal.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotal.java new file mode 100644 index 00000000..6b5e7473 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotal.java @@ -0,0 +1,100 @@ +package me.chanjar.weixin.mp.bean.datacube; + +import com.google.gson.annotations.SerializedName; + +/** + * 图文分析数据接口返回结果对象 + * @author binarywang(https://github.com/binarywang) + * Created by Binary Wang on 2016/8/24. + */ +public class WxDataCubeArticleTotal extends WxDataCubeResultBase { + + /** + * ref_hour + * 数据的小时,包括从000到2300,分别代表的是[000,100)到[2300,2400),即每日的第1小时和最后1小时 + */ + + /** + * msgid + * 请注意:这里的msgid实际上是由msgid(图文消息id,这也就是群发接口调用后返回的msg_data_id)和index(消息次序索引)组成, 例如12003_3, 其中12003是msgid,即一次群发的消息的id; 3为index,假设该次群发的图文消息共5个文章(因为可能为多图文),3表示5个中的第3个 + */ + @SerializedName("msgid") + private String msgId; + + /** + * title + * 图文消息的标题 + */ + @SerializedName("title") + private String title; + + /** + * int_page_read_user + * 图文页(点击群发图文卡片进入的页面)的阅读人数 + */ + @SerializedName("int_page_read_user") + private Integer intPageReadUser; + + /** + * int_page_read_count + * 图文页的阅读次数 + */ + @SerializedName("int_page_read_count") + private Integer intPageReadCount; + + /** + * ori_page_read_user + * 原文页(点击图文页“阅读原文”进入的页面)的阅读人数,无原文页时此处数据为0 + */ + @SerializedName("ori_page_read_user") + private Integer oriPageReadUser; + + /** + * ori_page_read_count + * 原文页的阅读次数 + */ + @SerializedName("ori_page_read_count") + private Integer oriPageReadCount; + + /** + * share_scene + * 分享的场景 1代表好友转发 2代表朋友圈 3代表腾讯微博 255代表其他 + */ + @SerializedName("share_scene") + private Integer shareScene; + + /** + * share_user + * 分享的人数 + */ + @SerializedName("share_user") + private Integer shareUser; + + /** + * share_count + * 分享的次数 + */ + @SerializedName("share_count") + private Integer shareCount; + + /** + * add_to_fav_user + * 收藏的人数 + */ + @SerializedName("add_to_fav_user") + private Integer addToFavUser; + + /** + * add_to_fav_count + * 收藏的次数 + */ + @SerializedName("add_to_fav_count") + private Integer addToFavCount; + + /** + * user_source + * 在获取图文阅读分时数据时才有该字段,代表用户从哪里进入来阅读该图文。0:会话;1.好友;2.朋友圈;3.腾讯微博;4.历史消息页;5.其他 + */ + @SerializedName("user_source") + private Integer userSource; +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotalDetail.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotalDetail.java new file mode 100644 index 00000000..a090cde0 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotalDetail.java @@ -0,0 +1,8 @@ +package me.chanjar.weixin.mp.bean.datacube; + +/** + * @author binarywang(https://github.com/binarywang) + * Created by Binary Wang on 2016/8/24. + */ +public class WxDataCubeArticleTotalDetail { +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java new file mode 100644 index 00000000..3f59cd35 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java @@ -0,0 +1,24 @@ +package me.chanjar.weixin.mp.bean.datacube; + +import com.google.gson.annotations.SerializedName; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * 统计接口的共用属性类 + * @author binarywang(https://github.com/binarywang) + * Created by Binary Wang on 2016/8/25. + */ +public class WxDataCubeResultBase { + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE); + } + + /** + * ref_date + * 数据的日期,需在begin_date和end_date之间 + */ + @SerializedName("ref_date") + private String refDate; +} diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/result/kefu/WxMpKfListTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfListTest.java similarity index 97% rename from weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/result/kefu/WxMpKfListTest.java rename to weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfListTest.java index cc782250..05aa1692 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/result/kefu/WxMpKfListTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfListTest.java @@ -1,4 +1,4 @@ -package me.chanjar.weixin.mp.bean.result.kefu; +package me.chanjar.weixin.mp.bean.kefu.result; import org.apache.commons.lang3.builder.ToStringBuilder; import org.testng.Assert; diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/result/kefu/WxMpKfOnlineListTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfOnlineListTest.java similarity index 96% rename from weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/result/kefu/WxMpKfOnlineListTest.java rename to weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfOnlineListTest.java index ab04e8e0..fa514aba 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/result/kefu/WxMpKfOnlineListTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfOnlineListTest.java @@ -1,4 +1,4 @@ -package me.chanjar.weixin.mp.bean.result.kefu; +package me.chanjar.weixin.mp.bean.kefu.result; import org.apache.commons.lang3.builder.ToStringBuilder; import org.testng.Assert; From f7454b6958873dba5ba5015bec62aae8f91fb146 Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Thu, 25 Aug 2016 18:04:01 +0800 Subject: [PATCH 30/55] =?UTF-8?q?=E9=87=8D=E6=9E=84=EF=BC=8C=E6=94=B9?= =?UTF-8?q?=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WxDataCubeUserCumulate.java} | 2 +- .../WxDataCubeUserSummary.java} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/{result/WxMpUserCumulate.java => datacube/WxDataCubeUserCumulate.java} (95%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/{result/WxMpUserSummary.java => datacube/WxDataCubeUserSummary.java} (96%) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUserCumulate.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserCumulate.java similarity index 95% rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUserCumulate.java rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserCumulate.java index 2a487715..a1e131b5 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUserCumulate.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserCumulate.java @@ -1,4 +1,4 @@ -package me.chanjar.weixin.mp.bean.result; +package me.chanjar.weixin.mp.bean.datacube; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUserSummary.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserSummary.java similarity index 96% rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUserSummary.java rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserSummary.java index a908932f..bd23843e 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUserSummary.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserSummary.java @@ -1,4 +1,4 @@ -package me.chanjar.weixin.mp.bean.result; +package me.chanjar.weixin.mp.bean.datacube; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; From f0cd7dd63a5b3940851f9af104bc75a12316e8cd Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Thu, 25 Aug 2016 18:04:12 +0800 Subject: [PATCH 31/55] =?UTF-8?q?=E9=87=8D=E6=9E=84=EF=BC=8C=E6=94=B9?= =?UTF-8?q?=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chanjar/weixin/mp/bean/datacube/WxDataCubeUserCumulate.java | 2 +- .../chanjar/weixin/mp/bean/datacube/WxDataCubeUserSummary.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserCumulate.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserCumulate.java index a1e131b5..99206e56 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserCumulate.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserCumulate.java @@ -12,7 +12,7 @@ import java.util.Date; * http://mp.weixin.qq.com/wiki/3/ecfed6e1a0a03b5f35e5efac98e864b7.html *
    */ -public class WxMpUserCumulate implements Serializable { +public class WxDataCubeUserCumulate implements Serializable { private Date refDate; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserSummary.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserSummary.java index bd23843e..0380f203 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserSummary.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserSummary.java @@ -12,7 +12,7 @@ import java.util.Date; * http://mp.weixin.qq.com/wiki/3/ecfed6e1a0a03b5f35e5efac98e864b7.html * */ -public class WxMpUserSummary implements Serializable { +public class WxDataCubeUserSummary implements Serializable { private Date refDate; From 14fb63d6deab2607cb719faedd543884d9a2d016 Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Thu, 25 Aug 2016 18:06:33 +0800 Subject: [PATCH 32/55] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=9B=BE=E6=96=87?= =?UTF-8?q?=E5=88=86=E6=9E=90=E6=95=B0=E6=8D=AE=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/mp/api/WxMpDataCubeService.java | 84 +++++++- .../mp/api/impl/WxMpDataCubeServiceImpl.java | 105 +++++++++- .../datacube/WxDataCubeArticleResult.java | 96 ++++++++- .../bean/datacube/WxDataCubeArticleTotal.java | 80 +------- .../WxDataCubeArticleTotalDetail.java | 186 ++++++++++++++++++ .../bean/datacube/WxDataCubeBaseResult.java | 2 +- .../weixin/mp/util/json/WxMpGsonBuilder.java | 6 +- .../json/WxMpUserCumulateGsonAdapter.java | 10 +- .../util/json/WxMpUserSummaryGsonAdapter.java | 9 +- .../api/impl/WxMpDataCubeServiceImplTest.java | 114 ++++++++--- .../mp/bean/kefu/result/WxMpKfListTest.java | 2 - 11 files changed, 566 insertions(+), 128 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpDataCubeService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpDataCubeService.java index 05470de0..ca7fa180 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpDataCubeService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpDataCubeService.java @@ -1,18 +1,22 @@ package me.chanjar.weixin.mp.api; import me.chanjar.weixin.common.exception.WxErrorException; -import me.chanjar.weixin.mp.bean.result.WxMpUserCumulate; -import me.chanjar.weixin.mp.bean.result.WxMpUserSummary; +import me.chanjar.weixin.mp.bean.datacube.WxDataCubeArticleResult; +import me.chanjar.weixin.mp.bean.datacube.WxDataCubeArticleTotal; +import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserCumulate; +import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserSummary; import java.util.Date; import java.util.List; /** - * 统计分析相关接口 + * 统计分析相关接口 * Created by Binary Wang on 2016/8/23. * @author binarywang (https://github.com/binarywang) */ public interface WxMpDataCubeService { + //*******************用户分析数据接口***********************// + /** *
        * 获取用户增减数据
    @@ -23,7 +27,7 @@ public interface WxMpDataCubeService {
        * @param beginDate 开始时间
        * @param endDate   最大时间跨度7天,endDate不能早于begingDate
        */
    -  List getUserSummary(Date beginDate, Date endDate) throws WxErrorException;
    +  List getUserSummary(Date beginDate, Date endDate) throws WxErrorException;
     
       /**
        * 
    @@ -35,5 +39,75 @@ public interface WxMpDataCubeService {
        * @param beginDate 开始时间
        * @param endDate   最大时间跨度7天,endDate不能早于begingDate
        */
    -  List getUserCumulate(Date beginDate, Date endDate) throws WxErrorException;
    +  List getUserCumulate(Date beginDate, Date endDate) throws WxErrorException;
    +
    +  //*******************图文分析数据接口***********************//
    +
    +  /**
    +   * 
    +   * 获取图文群发每日数据(getarticlesummary)
    +   * 详情请见文档:图文分析数据接口
    +   * 接口url格式:https://api.weixin.qq.com/datacube/getarticlesummary?access_token=ACCESS_TOKEN
    +   * 
    + * + * @param beginDate 开始时间 + * @param endDate 最大时间跨度1天,endDate不能早于begingDate + */ + List getArticleSummary(Date beginDate, Date endDate) throws WxErrorException; + + /** + *
    +   * 获取图文群发总数据(getarticletotal)
    +   * 详情请见文档:图文分析数据接口
    +   * 接口url格式:https://api.weixin.qq.com/datacube/getarticletotal?access_token=ACCESS_TOKEN
    +   *
    +   * @param beginDate 开始时间
    +   * @param endDate   最大时间跨度1天,endDate不能早于begingDate
    +   */
    +  List getArticleTotal(Date beginDate, Date endDate) throws WxErrorException;
    +
    +  /**
    +   * 
    +   * 获取图文统计数据(getuserread)
    +   * 详情请见文档:图文分析数据接口
    +   * 接口url格式:https://api.weixin.qq.com/datacube/getuserread?access_token=ACCESS_TOKEN
    +   *
    +   * @param beginDate 开始时间
    +   * @param endDate   最大时间跨度3天,endDate不能早于begingDate
    +   */
    +  List getUserRead(Date beginDate, Date endDate) throws WxErrorException;
    +
    +  /**
    +   * 
    +   * 获取图文统计分时数据(getuserreadhour)
    +   * 详情请见文档:图文分析数据接口
    +   * 接口url格式:https://api.weixin.qq.com/datacube/getuserreadhour?access_token=ACCESS_TOKEN
    +   *
    +   * @param beginDate 开始时间
    +   * @param endDate   最大时间跨度1天,endDate不能早于begingDate
    +   */
    +  List getUserReadHour(Date beginDate, Date endDate) throws WxErrorException;
    +
    +  /**
    +   * 
    +   * 获取图文分享转发数据(getusershare)
    +   * 详情请见文档:图文分析数据接口
    +   * 接口url格式:https://api.weixin.qq.com/datacube/getusershare?access_token=ACCESS_TOKEN
    +   *
    +   * @param beginDate 开始时间
    +   * @param endDate   最大时间跨度7天,endDate不能早于begingDate
    +   */
    +  List getUserShare(Date beginDate, Date endDate) throws WxErrorException;
    +
    +  /**
    +   * 
    +   * 获取图文分享转发分时数据(getusersharehour)
    +   * 详情请见文档:图文分析数据接口
    +   * 接口url格式:https://api.weixin.qq.com/datacube/getusersharehour?access_token=ACCESS_TOKEN
    +   *
    +   * @param beginDate 开始时间
    +   * @param endDate   最大时间跨度1天,endDate不能早于begingDate
    +   */
    +  List getUserShareHour(Date beginDate, Date endDate) throws WxErrorException;
    +
     }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImpl.java
    index 3b577713..329947d2 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImpl.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImpl.java
    @@ -1,24 +1,29 @@
     package me.chanjar.weixin.mp.api.impl;
     
    -import java.util.Date;
    -import java.util.List;
    -
     import com.google.gson.JsonObject;
     import com.google.gson.JsonParser;
     import com.google.gson.reflect.TypeToken;
    -
     import me.chanjar.weixin.common.exception.WxErrorException;
     import me.chanjar.weixin.mp.api.WxMpDataCubeService;
     import me.chanjar.weixin.mp.api.WxMpService;
    -import me.chanjar.weixin.mp.bean.result.WxMpUserCumulate;
    -import me.chanjar.weixin.mp.bean.result.WxMpUserSummary;
    +import me.chanjar.weixin.mp.bean.datacube.WxDataCubeArticleResult;
    +import me.chanjar.weixin.mp.bean.datacube.WxDataCubeArticleTotal;
    +import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserCumulate;
    +import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserSummary;
     import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
    +import org.slf4j.Logger;
    +import org.slf4j.LoggerFactory;
    +
    +import java.util.Date;
    +import java.util.List;
     
     /**
      *  Created by Binary Wang on 2016/8/23.
      * @author binarywang (https://github.com/binarywang)
      */
     public class WxMpDataCubeServiceImpl implements WxMpDataCubeService {
    +  protected final Logger log = LoggerFactory.getLogger(WxMpServiceImpl.class);
    +
       private static final String API_URL_PREFIX = "https://api.weixin.qq.com/datacube";
       private WxMpService wxMpService;
     
    @@ -27,26 +32,106 @@ public class WxMpDataCubeServiceImpl implements WxMpDataCubeService {
       }
     
       @Override
    -  public List getUserSummary(Date beginDate, Date endDate) throws WxErrorException {
    +  public List getUserSummary(Date beginDate, Date endDate) throws WxErrorException {
         String url = API_URL_PREFIX + "/getusersummary";
         JsonObject param = new JsonObject();
         param.addProperty("begin_date", WxMpService.SIMPLE_DATE_FORMAT.format(beginDate));
         param.addProperty("end_date", WxMpService.SIMPLE_DATE_FORMAT.format(endDate));
         String responseContent = this.wxMpService.post(url, param.toString());
    +    this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent);
         return WxMpGsonBuilder.INSTANCE.create().fromJson(new JsonParser().parse(responseContent).getAsJsonObject().get("list"),
    -            new TypeToken>() {
    +            new TypeToken>() {
                 }.getType());
       }
     
       @Override
    -  public List getUserCumulate(Date beginDate, Date endDate) throws WxErrorException {
    +  public List getUserCumulate(Date beginDate, Date endDate) throws WxErrorException {
         String url = API_URL_PREFIX + "/getusercumulate";
         JsonObject param = new JsonObject();
         param.addProperty("begin_date", WxMpService.SIMPLE_DATE_FORMAT.format(beginDate));
         param.addProperty("end_date", WxMpService.SIMPLE_DATE_FORMAT.format(endDate));
         String responseContent = this.wxMpService.post(url, param.toString());
    +    this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent);
    +    return WxMpGsonBuilder.INSTANCE.create().fromJson(new JsonParser().parse(responseContent).getAsJsonObject().get("list"),
    +            new TypeToken>() {
    +            }.getType());
    +  }
    +
    +  @Override
    +  public List getArticleSummary(Date beginDate, Date endDate) throws WxErrorException {
    +    String url = API_URL_PREFIX + "/getarticlesummary";
    +    JsonObject param = new JsonObject();
    +    param.addProperty("begin_date", WxMpService.SIMPLE_DATE_FORMAT.format(beginDate));
    +    param.addProperty("end_date", WxMpService.SIMPLE_DATE_FORMAT.format(endDate));
    +    String responseContent = this.wxMpService.post(url, param.toString());
    +    this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent);
    +    return WxMpGsonBuilder.INSTANCE.create().fromJson(new JsonParser().parse(responseContent).getAsJsonObject().get("list"),
    +            new TypeToken>() {
    +            }.getType());
    +  }
    +
    +  @Override
    +  public List getArticleTotal(Date beginDate, Date endDate) throws WxErrorException {
    +    String url = API_URL_PREFIX + "/getarticletotal";
    +    JsonObject param = new JsonObject();
    +    param.addProperty("begin_date", WxMpService.SIMPLE_DATE_FORMAT.format(beginDate));
    +    param.addProperty("end_date", WxMpService.SIMPLE_DATE_FORMAT.format(endDate));
    +    String responseContent = this.wxMpService.post(url, param.toString());
    +    this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent);
    +    return WxMpGsonBuilder.INSTANCE.create().fromJson(new JsonParser().parse(responseContent).getAsJsonObject().get("list"),
    +            new TypeToken>() {
    +            }.getType());
    +  }
    +
    +  @Override
    +  public List getUserRead(Date beginDate, Date endDate) throws WxErrorException {
    +    String url = API_URL_PREFIX + "/getuserread";
    +    JsonObject param = new JsonObject();
    +    param.addProperty("begin_date", WxMpService.SIMPLE_DATE_FORMAT.format(beginDate));
    +    param.addProperty("end_date", WxMpService.SIMPLE_DATE_FORMAT.format(endDate));
    +    String responseContent = this.wxMpService.post(url, param.toString());
    +    this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent);
    +    return WxMpGsonBuilder.INSTANCE.create().fromJson(new JsonParser().parse(responseContent).getAsJsonObject().get("list"),
    +            new TypeToken>() {
    +            }.getType());
    +  }
    +
    +  @Override
    +  public List getUserReadHour(Date beginDate, Date endDate) throws WxErrorException {
    +    String url = API_URL_PREFIX + "/getuserreadhour";
    +    JsonObject param = new JsonObject();
    +    param.addProperty("begin_date", WxMpService.SIMPLE_DATE_FORMAT.format(beginDate));
    +    param.addProperty("end_date", WxMpService.SIMPLE_DATE_FORMAT.format(endDate));
    +    String responseContent = this.wxMpService.post(url, param.toString());
    +    this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent);
    +    return WxMpGsonBuilder.INSTANCE.create().fromJson(new JsonParser().parse(responseContent).getAsJsonObject().get("list"),
    +            new TypeToken>() {
    +            }.getType());
    +  }
    +
    +  @Override
    +  public List getUserShare(Date beginDate, Date endDate) throws WxErrorException {
    +    String url = API_URL_PREFIX + "/getusershare";
    +    JsonObject param = new JsonObject();
    +    param.addProperty("begin_date", WxMpService.SIMPLE_DATE_FORMAT.format(beginDate));
    +    param.addProperty("end_date", WxMpService.SIMPLE_DATE_FORMAT.format(endDate));
    +    String responseContent = this.wxMpService.post(url, param.toString());
    +    this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent);
    +    return WxMpGsonBuilder.INSTANCE.create().fromJson(new JsonParser().parse(responseContent).getAsJsonObject().get("list"),
    +            new TypeToken>() {
    +            }.getType());
    +  }
    +
    +  @Override
    +  public List getUserShareHour(Date beginDate, Date endDate) throws WxErrorException {
    +    String url = API_URL_PREFIX + "/getusersharehour";
    +    JsonObject param = new JsonObject();
    +    param.addProperty("begin_date", WxMpService.SIMPLE_DATE_FORMAT.format(beginDate));
    +    param.addProperty("end_date", WxMpService.SIMPLE_DATE_FORMAT.format(endDate));
    +    String responseContent = this.wxMpService.post(url, param.toString());
    +    this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent);
         return WxMpGsonBuilder.INSTANCE.create().fromJson(new JsonParser().parse(responseContent).getAsJsonObject().get("list"),
    -            new TypeToken>() {
    +            new TypeToken>() {
                 }.getType());
       }
     }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java
    index faca1b0e..5be6a3f8 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java
    @@ -1,8 +1,102 @@
     package me.chanjar.weixin.mp.bean.datacube;
     
    +import com.google.gson.annotations.SerializedName;
    +
     /**
    + * 图文分析数据接口返回结果对象
      * @author binarywang(https://github.com/binarywang)
      *         Created by Binary Wang on 2016/8/24.
      */
    -public class WxDataCubeArticleResult {
    +public class WxDataCubeArticleResult extends WxDataCubeBaseResult {
    +
    +  /**
    +   * ref_hour
    +   * 数据的小时,包括从000到2300,分别代表的是[000,100)到[2300,2400),即每日的第1小时和最后1小时
    +   */
    +  @SerializedName("ref_hour")
    +  private Integer refHour;
    +
    +  /**
    +   * msgid
    +   * 请注意:这里的msgid实际上是由msgid(图文消息id,这也就是群发接口调用后返回的msg_data_id)和index(消息次序索引)组成, 例如12003_3, 其中12003是msgid,即一次群发的消息的id; 3为index,假设该次群发的图文消息共5个文章(因为可能为多图文),3表示5个中的第3个
    +   */
    +  @SerializedName("msgid")
    +  private String msgId;
    +
    +  /**
    +   * title
    +   * 图文消息的标题
    +   */
    +  @SerializedName("title")
    +  private String title;
    +
    +  /**
    +   * int_page_read_user
    +   * 图文页(点击群发图文卡片进入的页面)的阅读人数
    +   */
    +  @SerializedName("int_page_read_user")
    +  private Integer intPageReadUser;
    +
    +  /**
    +   * int_page_read_count
    +   * 图文页的阅读次数
    +   */
    +  @SerializedName("int_page_read_count")
    +  private Integer intPageReadCount;
    +
    +  /**
    +   * ori_page_read_user
    +   * 原文页(点击图文页“阅读原文”进入的页面)的阅读人数,无原文页时此处数据为0
    +   */
    +  @SerializedName("ori_page_read_user")
    +  private Integer oriPageReadUser;
    +
    +  /**
    +   * ori_page_read_count
    +   * 原文页的阅读次数
    +   */
    +  @SerializedName("ori_page_read_count")
    +  private Integer oriPageReadCount;
    +
    +  /**
    +   * share_scene
    +   * 分享的场景 1代表好友转发 2代表朋友圈 3代表腾讯微博 255代表其他
    +   */
    +  @SerializedName("share_scene")
    +  private Integer shareScene;
    +
    +  /**
    +   * share_user
    +   * 分享的人数
    +   */
    +  @SerializedName("share_user")
    +  private Integer shareUser;
    +
    +  /**
    +   * share_count
    +   * 分享的次数
    +   */
    +  @SerializedName("share_count")
    +  private Integer shareCount;
    +
    +  /**
    +   * add_to_fav_user
    +   * 收藏的人数
    +   */
    +  @SerializedName("add_to_fav_user")
    +  private Integer addToFavUser;
    +
    +  /**
    +   * add_to_fav_count
    +   * 收藏的次数
    +   */
    +  @SerializedName("add_to_fav_count")
    +  private Integer addToFavCount;
    +
    +  /**
    +   * user_source
    +   * 在获取图文阅读分时数据时才有该字段,代表用户从哪里进入来阅读该图文。0:会话;1.好友;2.朋友圈;3.腾讯微博;4.历史消息页;5.其他
    +   */
    +  @SerializedName("user_source")
    +  private Integer userSource;
     }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotal.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotal.java
    index 6b5e7473..85711d71 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotal.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotal.java
    @@ -2,17 +2,14 @@ package me.chanjar.weixin.mp.bean.datacube;
     
     import com.google.gson.annotations.SerializedName;
     
    +import java.util.List;
    +
     /**
      * 图文分析数据接口返回结果对象
      * @author binarywang(https://github.com/binarywang)
      *         Created by Binary Wang on 2016/8/24.
      */
    -public class WxDataCubeArticleTotal extends WxDataCubeResultBase {
    -
    -  /**
    -   * ref_hour
    -   * 数据的小时,包括从000到2300,分别代表的是[000,100)到[2300,2400),即每日的第1小时和最后1小时
    -   */
    +public class WxDataCubeArticleTotal extends WxDataCubeBaseResult {
     
       /**
        * msgid
    @@ -29,72 +26,9 @@ public class WxDataCubeArticleTotal extends WxDataCubeResultBase {
       private String title;
     
       /**
    -   * int_page_read_user
    -   * 图文页(点击群发图文卡片进入的页面)的阅读人数
    -   */
    -  @SerializedName("int_page_read_user")
    -  private Integer intPageReadUser;
    -
    -  /**
    -   * int_page_read_count
    -   * 图文页的阅读次数
    -   */
    -  @SerializedName("int_page_read_count")
    -  private Integer intPageReadCount;
    -
    -  /**
    -   * ori_page_read_user
    -   * 原文页(点击图文页“阅读原文”进入的页面)的阅读人数,无原文页时此处数据为0
    -   */
    -  @SerializedName("ori_page_read_user")
    -  private Integer oriPageReadUser;
    -
    -  /**
    -   * ori_page_read_count
    -   * 原文页的阅读次数
    -   */
    -  @SerializedName("ori_page_read_count")
    -  private Integer oriPageReadCount;
    -
    -  /**
    -   * share_scene
    -   * 分享的场景 1代表好友转发 2代表朋友圈 3代表腾讯微博 255代表其他
    -   */
    -  @SerializedName("share_scene")
    -  private Integer shareScene;
    -
    -  /**
    -   * share_user
    -   * 分享的人数
    -   */
    -  @SerializedName("share_user")
    -  private Integer shareUser;
    -
    -  /**
    -   * share_count
    -   * 分享的次数
    -   */
    -  @SerializedName("share_count")
    -  private Integer shareCount;
    -
    -  /**
    -   * add_to_fav_user
    -   * 收藏的人数
    -   */
    -  @SerializedName("add_to_fav_user")
    -  private Integer addToFavUser;
    -
    -  /**
    -   * add_to_fav_count
    -   * 收藏的次数
    -   */
    -  @SerializedName("add_to_fav_count")
    -  private Integer addToFavCount;
    -
    -  /**
    -   * user_source
    -   * 在获取图文阅读分时数据时才有该字段,代表用户从哪里进入来阅读该图文。0:会话;1.好友;2.朋友圈;3.腾讯微博;4.历史消息页;5.其他
    +   * details
    +   * 详细信息
        */
    -  @SerializedName("user_source")
    -  private Integer userSource;
    +  @SerializedName("details")
    +  private List details;
     }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotalDetail.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotalDetail.java
    index a090cde0..d5f9a323 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotalDetail.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotalDetail.java
    @@ -1,8 +1,194 @@
     package me.chanjar.weixin.mp.bean.datacube;
     
    +import com.google.gson.annotations.SerializedName;
    +
     /**
    + * 获取图文群发总数据接口(getarticletotal)中的详细字段
      * @author binarywang(https://github.com/binarywang)
      *         Created by Binary Wang on 2016/8/24.
      */
     public class WxDataCubeArticleTotalDetail {
    +
    +  /**
    +   * stat_date
    +   * 统计的日期,在getarticletotal接口中,ref_date指的是文章群发出日期, 而stat_date是数据统计日期
    +   */
    +  @SerializedName("stat_date")
    +  private Integer statDate;
    +
    +  /**
    +   * target_user
    +   * 送达人数,一般约等于总粉丝数(需排除黑名单或其他异常情况下无法收到消息的粉丝)
    +   */
    +  @SerializedName("target_user")
    +  private Integer targetUser;
    +
    +  /**
    +   * int_page_read_user
    +   * 图文页(点击群发图文卡片进入的页面)的阅读人数
    +   */
    +  @SerializedName("int_page_read_user")
    +  private Integer intPageReadUser;
    +
    +  /**
    +   * int_page_read_count
    +   * 图文页的阅读次数
    +   */
    +  @SerializedName("int_page_read_count")
    +  private Integer intPageReadCount;
    +
    +  /**
    +   * ori_page_read_user
    +   * 原文页(点击图文页“阅读原文”进入的页面)的阅读人数,无原文页时此处数据为0
    +   */
    +  @SerializedName("ori_page_read_user")
    +  private Integer oriPageReadUser;
    +
    +  /**
    +   * ori_page_read_count
    +   * 原文页的阅读次数
    +   */
    +  @SerializedName("ori_page_read_count")
    +  private Integer oriPageReadCount;
    +
    +  /**
    +   * share_user
    +   * 分享的人数
    +   */
    +  @SerializedName("share_user")
    +  private Integer shareUser;
    +
    +  /**
    +   * share_count
    +   * 分享的次数
    +   */
    +  @SerializedName("share_count")
    +  private Integer shareCount;
    +
    +  /**
    +   * add_to_fav_user
    +   * 收藏的人数
    +   */
    +  @SerializedName("add_to_fav_user")
    +  private Integer addToFavUser;
    +
    +  /**
    +   * add_to_fav_count
    +   * 收藏的次数
    +   */
    +  @SerializedName("add_to_fav_count")
    +  private Integer addToFavCount;
    +
    +  /**
    +  * int_page_from_session_read_user
    +  * 公众号会话阅读人数
    +  */
    +  @SerializedName("int_page_from_session_read_user")
    +  private Integer intPageFromSessionReadUser;
    +
    +  /**
    +  * int_page_from_session_read_count
    +  * 公众号会话阅读次数
    +  */
    +  @SerializedName("int_page_from_session_read_count")
    +  private Integer intPageFromSessionReadCount;
    +
    +  /**
    +  * int_page_from_hist_msg_read_user
    +  * 历史消息页阅读人数
    +  */
    +  @SerializedName("int_page_from_hist_msg_read_user")
    +  private Integer intPageFromHistMsgReadUser;
    +
    +  /**
    +  * int_page_from_hist_msg_read_count
    +  * 历史消息页阅读次数
    +  */
    +  @SerializedName("int_page_from_hist_msg_read_count")
    +  private Integer intPageFromHistMsgReadCount;
    +
    +  /**
    +  * int_page_from_feed_read_user
    +  * 朋友圈阅读人数
    +  */
    +  @SerializedName("int_page_from_feed_read_user")
    +  private Integer intPageFromFeedReadUser;
    +
    +  /**
    +  * int_page_from_feed_read_count
    +  * 朋友圈阅读次数
    +  */
    +  @SerializedName("int_page_from_feed_read_count")
    +  private Integer intPageFromFeedReadCount;
    +
    +  /**
    +  * int_page_from_friends_read_user
    +  * 好友转发阅读人数
    +  */
    +  @SerializedName("int_page_from_friends_read_user")
    +  private Integer intPageFromFriendsReadUser;
    +
    +  /**
    +  * int_page_from_friends_read_count
    +  * 好友转发阅读次数
    +  */
    +  @SerializedName("int_page_from_friends_read_count")
    +  private Integer intPageFromFriendsReadCount;
    +
    +  /**
    +  * int_page_from_other_read_user
    +  * 其他场景阅读人数
    +  */
    +  @SerializedName("int_page_from_other_read_user")
    +  private Integer intPageFromOtherReadUser;
    +
    +  /**
    +  * int_page_from_other_read_count
    +  * 其他场景阅读次数
    +  */
    +  @SerializedName("int_page_from_other_read_count")
    +  private Integer intPageFromOtherReadCount;
    +
    +  /**
    +  * feed_share_from_session_user
    +  * 公众号会话转发朋友圈人数
    +  */
    +  @SerializedName("feed_share_from_session_user")
    +  private Integer feedShareFromSessionUser;
    +
    +  /**
    +  * feed_share_from_session_cnt
    +  * 公众号会话转发朋友圈次数
    +  */
    +  @SerializedName("feed_share_from_session_cnt")
    +  private Integer feedShareFromSessionCnt;
    +
    +  /**
    +  * feed_share_from_feed_user
    +  * 朋友圈转发朋友圈人数
    +  */
    +  @SerializedName("feed_share_from_feed_user")
    +  private Integer feedShareFromFeedUser;
    +
    +  /**
    +  * feed_share_from_feed_cnt
    +  * 朋友圈转发朋友圈次数
    +  */
    +  @SerializedName("feed_share_from_feed_cnt")
    +  private Integer feedShareFromFeedCnt;
    +
    +  /**
    +  * feed_share_from_other_user
    +  * 其他场景转发朋友圈人数
    +  */
    +  @SerializedName("feed_share_from_other_user")
    +  private Integer feedShareFromOtherUser;
    +
    +  /**
    +  * feed_share_from_other_cnt
    +  * 其他场景转发朋友圈次数
    +  */
    +  @SerializedName("feed_share_from_other_cnt")
    +  private Integer feedShareFromOtherCnt;
    +
     }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java
    index 3f59cd35..429636e2 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java
    @@ -9,7 +9,7 @@ import org.apache.commons.lang3.builder.ToStringStyle;
      * @author binarywang(https://github.com/binarywang)
      *         Created by Binary Wang on 2016/8/25.
      */
    -public class WxDataCubeResultBase {
    +public class WxDataCubeBaseResult {
       @Override
       public String toString() {
         return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java
    index 34570b30..bf920fff 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java
    @@ -3,6 +3,8 @@ package me.chanjar.weixin.mp.util.json;
     import com.google.gson.Gson;
     import com.google.gson.GsonBuilder;
     import me.chanjar.weixin.mp.bean.*;
    +import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserCumulate;
    +import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserSummary;
     import me.chanjar.weixin.mp.bean.result.*;
     
     public class WxMpGsonBuilder {
    @@ -25,8 +27,8 @@ public class WxMpGsonBuilder {
         INSTANCE.registerTypeAdapter(WxMpTemplateMessage.class, new WxMpTemplateMessageGsonAdapter());
         INSTANCE.registerTypeAdapter(WxMpSemanticQueryResult.class, new WxMpSemanticQueryResultAdapter());
         INSTANCE.registerTypeAdapter(WxMpOAuth2AccessToken.class, new WxMpOAuth2AccessTokenAdapter());
    -    INSTANCE.registerTypeAdapter(WxMpUserSummary.class, new WxMpUserSummaryGsonAdapter());
    -    INSTANCE.registerTypeAdapter(WxMpUserCumulate.class, new WxMpUserCumulateGsonAdapter());
    +    INSTANCE.registerTypeAdapter(WxDataCubeUserSummary.class, new WxMpUserSummaryGsonAdapter());
    +    INSTANCE.registerTypeAdapter(WxDataCubeUserCumulate.class, new WxMpUserCumulateGsonAdapter());
         INSTANCE.registerTypeAdapter(WxMpMaterialUploadResult.class, new WxMpMaterialUploadResultAdapter());
         INSTANCE.registerTypeAdapter(WxMpMaterialVideoInfoResult.class, new WxMpMaterialVideoInfoResultAdapter());
         INSTANCE.registerTypeAdapter(WxMpMassNews.WxMpMassNewsArticle.class, new WxMpMassNewsArticleGsonAdapter());
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpUserCumulateGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpUserCumulateGsonAdapter.java
    index ab4449a6..991c2043 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpUserCumulateGsonAdapter.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpUserCumulateGsonAdapter.java
    @@ -10,9 +10,7 @@ package me.chanjar.weixin.mp.util.json;
     
     import com.google.gson.*;
     import me.chanjar.weixin.common.util.json.GsonHelper;
    -import me.chanjar.weixin.mp.bean.result.WxMpMassUploadResult;
    -import me.chanjar.weixin.mp.bean.result.WxMpUserCumulate;
    -import me.chanjar.weixin.mp.bean.result.WxMpUserSummary;
    +import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserCumulate;
     
     import java.lang.reflect.Type;
     import java.text.ParseException;
    @@ -23,12 +21,12 @@ import java.text.SimpleDateFormat;
      * @author Daniel Qian
      *
      */
    -public class WxMpUserCumulateGsonAdapter implements JsonDeserializer {
    +public class WxMpUserCumulateGsonAdapter implements JsonDeserializer {
     
       private static final SimpleDateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
     
    -  public WxMpUserCumulate deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
    -    WxMpUserCumulate cumulate = new WxMpUserCumulate();
    +  public WxDataCubeUserCumulate deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
    +    WxDataCubeUserCumulate cumulate = new WxDataCubeUserCumulate();
         JsonObject summaryJsonObject = json.getAsJsonObject();
     
         try {
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpUserSummaryGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpUserSummaryGsonAdapter.java
    index 9db88884..e869b5c5 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpUserSummaryGsonAdapter.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpUserSummaryGsonAdapter.java
    @@ -10,8 +10,7 @@ package me.chanjar.weixin.mp.util.json;
     
     import com.google.gson.*;
     import me.chanjar.weixin.common.util.json.GsonHelper;
    -import me.chanjar.weixin.mp.bean.result.WxMpMassUploadResult;
    -import me.chanjar.weixin.mp.bean.result.WxMpUserSummary;
    +import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserSummary;
     
     import java.lang.reflect.Type;
     import java.text.ParseException;
    @@ -20,13 +19,13 @@ import java.text.SimpleDateFormat;
     /**
      * @author Daniel Qian
      */
    -public class WxMpUserSummaryGsonAdapter implements JsonDeserializer {
    +public class WxMpUserSummaryGsonAdapter implements JsonDeserializer {
     
       private static final SimpleDateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
     
    -  public WxMpUserSummary deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
    +  public WxDataCubeUserSummary deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
           throws JsonParseException {
    -    WxMpUserSummary summary = new WxMpUserSummary();
    +    WxDataCubeUserSummary summary = new WxDataCubeUserSummary();
         JsonObject summaryJsonObject = json.getAsJsonObject();
     
         try {
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImplTest.java
    index ebfdee43..984dcc28 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImplTest.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImplTest.java
    @@ -1,20 +1,21 @@
     package me.chanjar.weixin.mp.api.impl;
     
    -import java.text.ParseException;
    -import java.text.SimpleDateFormat;
    -import java.util.Date;
    -import java.util.List;
    -
    +import com.google.inject.Inject;
    +import me.chanjar.weixin.common.exception.WxErrorException;
    +import me.chanjar.weixin.mp.api.ApiTestModule;
    +import me.chanjar.weixin.mp.bean.datacube.WxDataCubeArticleResult;
    +import me.chanjar.weixin.mp.bean.datacube.WxDataCubeArticleTotal;
    +import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserCumulate;
    +import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserSummary;
     import org.testng.Assert;
    +import org.testng.annotations.DataProvider;
     import org.testng.annotations.Guice;
     import org.testng.annotations.Test;
     
    -import com.google.inject.Inject;
    -
    -import me.chanjar.weixin.common.exception.WxErrorException;
    -import me.chanjar.weixin.mp.api.ApiTestModule;
    -import me.chanjar.weixin.mp.bean.result.WxMpUserCumulate;
    -import me.chanjar.weixin.mp.bean.result.WxMpUserSummary;
    +import java.text.ParseException;
    +import java.text.SimpleDateFormat;
    +import java.util.Date;
    +import java.util.List;
     
     /**
      * 测试统计分析相关的接口
    @@ -28,24 +29,91 @@ public class WxMpDataCubeServiceImplTest {
       @Inject
       protected WxMpServiceImpl wxService;
     
    -  @Test
    -  public void testGetUserSummary() throws WxErrorException, ParseException {
    -    Date beginDate = simpleDateFormat.parse("2016-08-20");
    -    Date endDate = simpleDateFormat.parse("2016-08-22");
    -    List summaries = this.wxService.getDataCubeService()
    +  @DataProvider
    +  public Object[][] oneDay() throws ParseException {
    +    return new Object[][]{{simpleDateFormat.parse("2016-08-22")}};
    +  }
    +
    +  @DataProvider
    +  public Object[][] threeDays() throws ParseException {
    +    return new Object[][]{{simpleDateFormat.parse("2016-08-20"),
    +            simpleDateFormat.parse("2016-08-22")}};
    +  }
    +
    +  @DataProvider
    +  public Object[][] sevenDays() throws ParseException {
    +    return new Object[][]{{simpleDateFormat.parse("2016-08-16"),
    +            simpleDateFormat.parse("2016-08-22")}};
    +  }
    +
    +  @Test(dataProvider = "sevenDays")
    +  public void testGetUserSummary(Date beginDate, Date endDate)
    +      throws WxErrorException {
    +    List summaries = this.wxService.getDataCubeService()
             .getUserSummary(beginDate, endDate);
         Assert.assertNotNull(summaries);
         System.out.println(summaries);
       }
     
    -  @Test
    -  public void testGetUserCumulate() throws WxErrorException, ParseException {
    -    Date beginDate = simpleDateFormat.parse("2016-08-21");
    -    Date endDate = simpleDateFormat.parse("2016-08-22");
    -    List cumulates = this.wxService.getDataCubeService()
    +  @Test(dataProvider = "sevenDays")
    +  public void testGetUserCumulate(Date beginDate, Date endDate)
    +      throws WxErrorException {
    +    List result = this.wxService.getDataCubeService()
             .getUserCumulate(beginDate, endDate);
    -    Assert.assertNotNull(cumulates);
    -    System.out.println(cumulates);
    +    Assert.assertNotNull(result);
    +    System.out.println(result);
    +  }
    +
    +  @Test(dataProvider = "oneDay")
    +  public void testGetArticleSummary(Date date) throws WxErrorException {
    +    List results = this.wxService.getDataCubeService()
    +            .getArticleSummary(date, date);
    +    Assert.assertNotNull(results);
    +    System.out.println(results);
    +  }
    +
    +  /**
    +   * TODO 该接口,暂时没找到有数据的日期,无法测试验证
    +   */
    +  @Test(dataProvider = "oneDay")
    +  public void testGetArticleTotal(Date date) throws WxErrorException {
    +    List results = this.wxService.getDataCubeService()
    +            .getArticleTotal(date, date);
    +    Assert.assertNotNull(results);
    +    System.out.println(results);
    +  }
    +
    +  @Test(dataProvider = "threeDays")
    +  public void testGetUserRead(Date beginDate, Date endDate)
    +      throws WxErrorException {
    +    List results = this.wxService.getDataCubeService()
    +            .getUserRead(beginDate, endDate);
    +    Assert.assertNotNull(results);
    +    System.out.println(results);
    +  }
    +
    +  @Test(dataProvider = "oneDay")
    +  public void testGetUserReadHour(Date date) throws WxErrorException {
    +    List results = this.wxService.getDataCubeService()
    +            .getUserReadHour(date, date);
    +    Assert.assertNotNull(results);
    +    System.out.println(results);
    +  }
    +
    +  @Test(dataProvider = "sevenDays")
    +  public void testGetUserShare(Date beginDate, Date endDate)
    +      throws WxErrorException {
    +    List results = this.wxService.getDataCubeService()
    +            .getUserShare(beginDate, endDate);
    +    Assert.assertNotNull(results);
    +    System.out.println(results);
       }
     
    +  @Test(dataProvider = "oneDay")
    +  public void testGetUserShareHour(Date date) throws WxErrorException {
    +    List results = this.wxService.getDataCubeService()
    +            .getUserShareHour(date, date);
    +    Assert.assertNotNull(results);
    +    System.out.println(results);
    +  }
     }
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfListTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfListTest.java
    index 05aa1692..0f52ae02 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfListTest.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfListTest.java
    @@ -4,8 +4,6 @@ import org.apache.commons.lang3.builder.ToStringBuilder;
     import org.testng.Assert;
     import org.testng.annotations.Test;
     
    -import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfList;
    -
     @Test
     public class WxMpKfListTest {
     
    
    From b5d9ce94ffc3d359c430a695b43643811006f4ba Mon Sep 17 00:00:00 2001
    From: BinaryWang 
    Date: Fri, 26 Aug 2016 14:08:06 +0800
    Subject: [PATCH 33/55] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=B8=85=E7=90=86http?=
     =?UTF-8?q?=E8=BF=9E=E6=8E=A5=E7=9A=84=E9=A2=91=E7=8E=87=EF=BC=8C=E9=81=BF?=
     =?UTF-8?q?=E5=85=8D=E8=BF=87=E5=BA=A6=E6=97=A5=E5=BF=97=E8=BE=93=E5=87=BA?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../DefaultApacheHttpHttpClientBuilder.java   | 81 +++++++++++--------
     1 file changed, 46 insertions(+), 35 deletions(-)
    
    diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/DefaultApacheHttpHttpClientBuilder.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/DefaultApacheHttpHttpClientBuilder.java
    index d4701fca..74467625 100644
    --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/DefaultApacheHttpHttpClientBuilder.java
    +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/DefaultApacheHttpHttpClientBuilder.java
    @@ -1,6 +1,8 @@
     package me.chanjar.weixin.common.util.http;
     
    -import me.chanjar.weixin.common.util.StringUtils;
    +import java.io.IOException;
    +import java.util.concurrent.TimeUnit;
    +
     import org.apache.http.annotation.NotThreadSafe;
     import org.apache.http.auth.AuthScope;
     import org.apache.http.auth.UsernamePasswordCredentials;
    @@ -21,8 +23,7 @@ import org.apache.http.impl.client.HttpClients;
     import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
     import org.apache.http.protocol.HttpContext;
     
    -import java.io.IOException;
    -import java.util.concurrent.TimeUnit;
    +import me.chanjar.weixin.common.util.StringUtils;
     
     /**
      * httpclient 连接管理器
    @@ -33,7 +34,7 @@ public class DefaultApacheHttpHttpClientBuilder implements ApacheHttpClientBuild
       private int connectionTimeout = 5000;
       private int soTimeout = 5000;
       private int idleConnTimeout = 60000;
    -  private int checkWaitTime = 5000;
    +  private int checkWaitTime = 60000;
       private int maxConnPerHost = 10;
       private int maxTotalConn = 50;
       private String userAgent;
    @@ -74,86 +75,95 @@ public class DefaultApacheHttpHttpClientBuilder implements ApacheHttpClientBuild
         return new DefaultApacheHttpHttpClientBuilder();
       }
     
    +  @Override
       public ApacheHttpClientBuilder httpProxyHost(String httpProxyHost) {
         this.httpProxyHost = httpProxyHost;
         return this;
       }
     
    +  @Override
       public ApacheHttpClientBuilder httpProxyPort(int httpProxyPort) {
         this.httpProxyPort = httpProxyPort;
         return this;
       }
     
    +  @Override
       public ApacheHttpClientBuilder httpProxyUsername(String httpProxyUsername) {
         this.httpProxyUsername = httpProxyUsername;
         return this;
       }
     
    +  @Override
       public ApacheHttpClientBuilder httpProxyPassword(String httpProxyPassword) {
         this.httpProxyPassword = httpProxyPassword;
         return this;
       }
     
    +  @Override
       public ApacheHttpClientBuilder sslConnectionSocketFactory(SSLConnectionSocketFactory sslConnectionSocketFactory) {
         this.sslConnectionSocketFactory = sslConnectionSocketFactory;
         return this;
       }
     
       public IdleConnectionMonitorThread getIdleConnectionMonitorThread() {
    -    return idleConnectionMonitorThread;
    +    return this.idleConnectionMonitorThread;
       }
     
       private void prepare() {
         Registry registry = RegistryBuilder.create()
    -            .register("http", plainConnectionSocketFactory)
    -            .register("https", sslConnectionSocketFactory)
    +        .register("http", this.plainConnectionSocketFactory)
    +        .register("https", this.sslConnectionSocketFactory)
                 .build();
    -    connectionManager = new PoolingHttpClientConnectionManager(registry);
    -    connectionManager.setMaxTotal(maxTotalConn);
    -    connectionManager.setDefaultMaxPerRoute(maxConnPerHost);
    -    connectionManager.setDefaultSocketConfig(
    +    this.connectionManager = new PoolingHttpClientConnectionManager(registry);
    +    this.connectionManager.setMaxTotal(this.maxTotalConn);
    +    this.connectionManager.setDefaultMaxPerRoute(this.maxConnPerHost);
    +    this.connectionManager.setDefaultSocketConfig(
                 SocketConfig.copy(SocketConfig.DEFAULT)
    -                    .setSoTimeout(soTimeout)
    +            .setSoTimeout(this.soTimeout)
                         .build()
         );
     
    -    idleConnectionMonitorThread = new IdleConnectionMonitorThread(connectionManager, idleConnTimeout, checkWaitTime);
    -    idleConnectionMonitorThread.setDaemon(true);
    -    idleConnectionMonitorThread.start();
    +    this.idleConnectionMonitorThread = new IdleConnectionMonitorThread(
    +        this.connectionManager, this.idleConnTimeout, this.checkWaitTime);
    +    this.idleConnectionMonitorThread.setDaemon(true);
    +    this.idleConnectionMonitorThread.start();
     
    -    httpClientBuilder = HttpClients.custom()
    -            .setConnectionManager(connectionManager)
    +    this.httpClientBuilder = HttpClients.custom()
    +        .setConnectionManager(this.connectionManager)
                 .setDefaultRequestConfig(
                         RequestConfig.custom()
    -                            .setSocketTimeout(soTimeout)
    -                            .setConnectTimeout(connectionTimeout)
    -                            .setConnectionRequestTimeout(connectionRequestTimeout)
    +                .setSocketTimeout(this.soTimeout)
    +                .setConnectTimeout(this.connectionTimeout)
    +                .setConnectionRequestTimeout(this.connectionRequestTimeout)
                                 .build()
                 )
    -            .setRetryHandler(httpRequestRetryHandler);
    +        .setRetryHandler(this.httpRequestRetryHandler);
     
    -    if (StringUtils.isNotBlank(httpProxyHost) && StringUtils.isNotBlank(httpProxyUsername)) {
    +    if (StringUtils.isNotBlank(this.httpProxyHost)
    +        && StringUtils.isNotBlank(this.httpProxyUsername)) {
           // 使用代理服务器 需要用户认证的代理服务器
           CredentialsProvider credsProvider = new BasicCredentialsProvider();
           credsProvider.setCredentials(
    -              new AuthScope(httpProxyHost, httpProxyPort),
    -              new UsernamePasswordCredentials(httpProxyUsername, httpProxyPassword));
    -      httpClientBuilder.setDefaultCredentialsProvider(credsProvider);
    +          new AuthScope(this.httpProxyHost, this.httpProxyPort),
    +          new UsernamePasswordCredentials(this.httpProxyUsername,
    +              this.httpProxyPassword));
    +      this.httpClientBuilder.setDefaultCredentialsProvider(credsProvider);
         }
     
    -    if (StringUtils.isNotBlank(userAgent)) {
    -      httpClientBuilder.setUserAgent(userAgent);
    +    if (StringUtils.isNotBlank(this.userAgent)) {
    +      this.httpClientBuilder.setUserAgent(this.userAgent);
         }
     
       }
     
    +  @Override
       public CloseableHttpClient build() {
    -    if (!prepared) {
    +    if (!this.prepared) {
           prepare();
    -      prepared = true;
    +      this.prepared = true;
         }
     
    -    return httpClientBuilder.build();
    +    return this.httpClientBuilder.build();
       }
     
       public static class IdleConnectionMonitorThread extends Thread {
    @@ -172,11 +182,12 @@ public class DefaultApacheHttpHttpClientBuilder implements ApacheHttpClientBuild
         @Override
         public void run() {
           try {
    -        while (!shutdown) {
    +        while (!this.shutdown) {
               synchronized (this) {
    -            wait(checkWaitTime);
    -            connMgr.closeExpiredConnections();
    -            connMgr.closeIdleConnections(idleConnTimeout, TimeUnit.MILLISECONDS);
    +            wait(this.checkWaitTime);
    +            this.connMgr.closeExpiredConnections();
    +            this.connMgr.closeIdleConnections(this.idleConnTimeout,
    +                TimeUnit.MILLISECONDS);
               }
             }
           } catch (InterruptedException ignore) {
    @@ -190,7 +201,7 @@ public class DefaultApacheHttpHttpClientBuilder implements ApacheHttpClientBuild
         }
     
         public void shutdown() {
    -      shutdown = true;
    +      this.shutdown = true;
           synchronized (this) {
             notifyAll();
           }
    
    From 7bd75c92a53296e4b708a9200eb9d357ef9ccb90 Mon Sep 17 00:00:00 2001
    From: BinaryWang 
    Date: Fri, 26 Aug 2016 14:29:29 +0800
    Subject: [PATCH 34/55] =?UTF-8?q?=E9=87=8D=E6=9E=84DefaultApacheHttpClient?=
     =?UTF-8?q?Builder?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     ...va => DefaultApacheHttpClientBuilder.java} | 65 +++++++++----------
     .../weixin/cp/api/WxCpServiceImpl.java        |  2 +-
     .../weixin/mp/api/impl/WxMpServiceImpl.java   |  2 +-
     3 files changed, 31 insertions(+), 38 deletions(-)
     rename weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/{DefaultApacheHttpHttpClientBuilder.java => DefaultApacheHttpClientBuilder.java} (76%)
    
    diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/DefaultApacheHttpHttpClientBuilder.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/DefaultApacheHttpClientBuilder.java
    similarity index 76%
    rename from weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/DefaultApacheHttpHttpClientBuilder.java
    rename to weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/DefaultApacheHttpClientBuilder.java
    index 74467625..4acc7662 100644
    --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/DefaultApacheHttpHttpClientBuilder.java
    +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/DefaultApacheHttpClientBuilder.java
    @@ -1,8 +1,6 @@
     package me.chanjar.weixin.common.util.http;
     
    -import java.io.IOException;
    -import java.util.concurrent.TimeUnit;
    -
    +import me.chanjar.weixin.common.util.StringUtils;
     import org.apache.http.annotation.NotThreadSafe;
     import org.apache.http.auth.AuthScope;
     import org.apache.http.auth.UsernamePasswordCredentials;
    @@ -23,13 +21,14 @@ import org.apache.http.impl.client.HttpClients;
     import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
     import org.apache.http.protocol.HttpContext;
     
    -import me.chanjar.weixin.common.util.StringUtils;
    +import java.io.IOException;
    +import java.util.concurrent.TimeUnit;
     
     /**
      * httpclient 连接管理器
      */
     @NotThreadSafe
    -public class DefaultApacheHttpHttpClientBuilder implements ApacheHttpClientBuilder {
    +public class DefaultApacheHttpClientBuilder implements ApacheHttpClientBuilder {
       private int connectionRequestTimeout = 3000;
       private int connectionTimeout = 5000;
       private int soTimeout = 5000;
    @@ -52,27 +51,20 @@ public class DefaultApacheHttpHttpClientBuilder implements ApacheHttpClientBuild
       private String httpProxyUsername;
       private String httpProxyPassword;
     
    -  /**
    -   * 连接管理器
    -   */
    -  private PoolingHttpClientConnectionManager connectionManager;
       /**
        * 闲置连接监控线程
        */
       private IdleConnectionMonitorThread idleConnectionMonitorThread;
     
    -  /**
    -   * httpClientBuilder
    -   */
       private HttpClientBuilder httpClientBuilder;
     
       private boolean prepared = false;
     
    -  private DefaultApacheHttpHttpClientBuilder() {
    +  private DefaultApacheHttpClientBuilder() {
       }
     
    -  public static DefaultApacheHttpHttpClientBuilder get() {
    -    return new DefaultApacheHttpHttpClientBuilder();
    +  public static DefaultApacheHttpClientBuilder get() {
    +    return new DefaultApacheHttpClientBuilder();
       }
     
       @Override
    @@ -111,43 +103,44 @@ public class DefaultApacheHttpHttpClientBuilder implements ApacheHttpClientBuild
     
       private void prepare() {
         Registry registry = RegistryBuilder.create()
    -        .register("http", this.plainConnectionSocketFactory)
    -        .register("https", this.sslConnectionSocketFactory)
    +            .register("http", this.plainConnectionSocketFactory)
    +            .register("https", this.sslConnectionSocketFactory)
                 .build();
    -    this.connectionManager = new PoolingHttpClientConnectionManager(registry);
    -    this.connectionManager.setMaxTotal(this.maxTotalConn);
    -    this.connectionManager.setDefaultMaxPerRoute(this.maxConnPerHost);
    -    this.connectionManager.setDefaultSocketConfig(
    +
    +    PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry);
    +    connectionManager.setMaxTotal(this.maxTotalConn);
    +    connectionManager.setDefaultMaxPerRoute(this.maxConnPerHost);
    +    connectionManager.setDefaultSocketConfig(
                 SocketConfig.copy(SocketConfig.DEFAULT)
    -            .setSoTimeout(this.soTimeout)
    +                    .setSoTimeout(this.soTimeout)
                         .build()
         );
     
         this.idleConnectionMonitorThread = new IdleConnectionMonitorThread(
    -        this.connectionManager, this.idleConnTimeout, this.checkWaitTime);
    +            connectionManager, this.idleConnTimeout, this.checkWaitTime);
         this.idleConnectionMonitorThread.setDaemon(true);
         this.idleConnectionMonitorThread.start();
     
         this.httpClientBuilder = HttpClients.custom()
    -        .setConnectionManager(this.connectionManager)
    +            .setConnectionManager(connectionManager)
                 .setDefaultRequestConfig(
                         RequestConfig.custom()
    -                .setSocketTimeout(this.soTimeout)
    -                .setConnectTimeout(this.connectionTimeout)
    -                .setConnectionRequestTimeout(this.connectionRequestTimeout)
    +                            .setSocketTimeout(this.soTimeout)
    +                            .setConnectTimeout(this.connectionTimeout)
    +                            .setConnectionRequestTimeout(this.connectionRequestTimeout)
                                 .build()
                 )
    -        .setRetryHandler(this.httpRequestRetryHandler);
    +            .setRetryHandler(this.httpRequestRetryHandler);
     
         if (StringUtils.isNotBlank(this.httpProxyHost)
    -        && StringUtils.isNotBlank(this.httpProxyUsername)) {
    +            && StringUtils.isNotBlank(this.httpProxyUsername)) {
           // 使用代理服务器 需要用户认证的代理服务器
    -      CredentialsProvider credsProvider = new BasicCredentialsProvider();
    -      credsProvider.setCredentials(
    -          new AuthScope(this.httpProxyHost, this.httpProxyPort),
    -          new UsernamePasswordCredentials(this.httpProxyUsername,
    -              this.httpProxyPassword));
    -      this.httpClientBuilder.setDefaultCredentialsProvider(credsProvider);
    +      CredentialsProvider provider = new BasicCredentialsProvider();
    +      provider.setCredentials(
    +              new AuthScope(this.httpProxyHost, this.httpProxyPort),
    +              new UsernamePasswordCredentials(this.httpProxyUsername,
    +                      this.httpProxyPassword));
    +      this.httpClientBuilder.setDefaultCredentialsProvider(provider);
         }
     
         if (StringUtils.isNotBlank(this.userAgent)) {
    @@ -187,7 +180,7 @@ public class DefaultApacheHttpHttpClientBuilder implements ApacheHttpClientBuild
                 wait(this.checkWaitTime);
                 this.connMgr.closeExpiredConnections();
                 this.connMgr.closeIdleConnections(this.idleConnTimeout,
    -                TimeUnit.MILLISECONDS);
    +                    TimeUnit.MILLISECONDS);
               }
             }
           } catch (InterruptedException ignore) {
    diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java
    index 991b9be1..278fe6c8 100644
    --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java
    +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java
    @@ -591,7 +591,7 @@ public class WxCpServiceImpl implements WxCpService {
         this.wxCpConfigStorage = wxConfigProvider;
         ApacheHttpClientBuilder apacheHttpClientBuilder = wxCpConfigStorage.getApacheHttpClientBuilder();
         if (null == apacheHttpClientBuilder) {
    -      apacheHttpClientBuilder = DefaultApacheHttpHttpClientBuilder.get();
    +      apacheHttpClientBuilder = DefaultApacheHttpClientBuilder.get();
         }
         apacheHttpClientBuilder.httpProxyHost(wxCpConfigStorage.getHttp_proxy_host())
                 .httpProxyPort(wxCpConfigStorage.getHttp_proxy_port())
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java
    index f510d01f..43777c16 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java
    @@ -457,7 +457,7 @@ public class WxMpServiceImpl implements WxMpService {
       private void initHttpClient() {
         ApacheHttpClientBuilder apacheHttpClientBuilder = this.wxMpConfigStorage.getApacheHttpClientBuilder();
         if (null == apacheHttpClientBuilder) {
    -      apacheHttpClientBuilder = DefaultApacheHttpHttpClientBuilder.get();
    +      apacheHttpClientBuilder = DefaultApacheHttpClientBuilder.get();
         }
         
         apacheHttpClientBuilder.httpProxyHost(this.wxMpConfigStorage.getHttpProxyHost())
    
    From e016372034d27c2523ee75c8f0759e13bf5f94bf Mon Sep 17 00:00:00 2001
    From: BinaryWang 
    Date: Mon, 29 Aug 2016 19:27:56 +0800
    Subject: [PATCH 35/55] =?UTF-8?q?=E6=B7=BB=E5=8A=A0doctype=EF=BC=8C?=
     =?UTF-8?q?=E6=8A=91=E5=88=B6warning?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     weixin-java-common/src/test/resources/logback-test.xml | 3 ++-
     1 file changed, 2 insertions(+), 1 deletion(-)
    
    diff --git a/weixin-java-common/src/test/resources/logback-test.xml b/weixin-java-common/src/test/resources/logback-test.xml
    index c0d6fc3c..2c421e49 100644
    --- a/weixin-java-common/src/test/resources/logback-test.xml
    +++ b/weixin-java-common/src/test/resources/logback-test.xml
    @@ -1,5 +1,6 @@
    +
    +
     
    -
       
         
    
    From f262c74149c37fd416cc6d9bd80917e07d9453cf Mon Sep 17 00:00:00 2001
    From: BinaryWang 
    Date: Mon, 29 Aug 2016 19:28:20 +0800
    Subject: [PATCH 36/55] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=BE=93=E5=87=BA?=
     =?UTF-8?q?=E6=97=A5=E5=BF=97=E4=BB=A3=E7=A0=81=EF=BC=8C=E6=8A=91=E5=88=B6?=
     =?UTF-8?q?warning?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../weixin/common/util/crypto/WxCryptUtilTest.java | 14 +++++++++++---
     1 file changed, 11 insertions(+), 3 deletions(-)
    
    diff --git a/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/crypto/WxCryptUtilTest.java b/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/crypto/WxCryptUtilTest.java
    index ab6c8db9..a5fa0c41 100755
    --- a/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/crypto/WxCryptUtilTest.java
    +++ b/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/crypto/WxCryptUtilTest.java
    @@ -45,16 +45,24 @@ public class WxCryptUtilTest {
     
         Element root = document.getDocumentElement();
         String cipherText = root.getElementsByTagName("Encrypt").item(0).getTextContent();
    +    System.out.println(cipherText);
    +    
         String msgSignature = root.getElementsByTagName("MsgSignature").item(0).getTextContent();
    +    System.out.println(msgSignature);
    +    
         String timestamp = root.getElementsByTagName("TimeStamp").item(0).getTextContent();
    +    System.out.println(timestamp);
    +    
         String nonce = root.getElementsByTagName("Nonce").item(0).getTextContent();
    -
    +    System.out.println(nonce);
    +    
         String messageText = String.format(xmlFormat, cipherText);
    -
    +    System.out.println(messageText);
    +    
         // 第三方收到企业号平台发送的消息
         String plainMessage = pc.decrypt(cipherText);
    -
         System.out.println(plainMessage);
    +    
         assertEquals(plainMessage, replyMsg);
       }
     
    
    From 9c5b3c374405f8cd8a2d056947d65f41b56be6d5 Mon Sep 17 00:00:00 2001
    From: BinaryWang 
    Date: Mon, 29 Aug 2016 20:13:38 +0800
    Subject: [PATCH 37/55] =?UTF-8?q?=E6=B7=BB=E5=8A=A0getter=E5=92=8Csetter?=
     =?UTF-8?q?=E6=96=B9=E6=B3=95?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../datacube/WxDataCubeArticleResult.java     | 105 +++++++++
     .../bean/datacube/WxDataCubeArticleTotal.java |  25 +++
     .../WxDataCubeArticleTotalDetail.java         | 211 ++++++++++++++++++
     .../bean/datacube/WxDataCubeBaseResult.java   |   9 +
     .../bean/datacube/WxDataCubeUserCumulate.java |   6 +-
     .../bean/datacube/WxDataCubeUserSummary.java  |   9 +-
     6 files changed, 359 insertions(+), 6 deletions(-)
    
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java
    index 5be6a3f8..ce1f4269 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java
    @@ -99,4 +99,109 @@ public class WxDataCubeArticleResult extends WxDataCubeBaseResult {
        */
       @SerializedName("user_source")
       private Integer userSource;
    +
    +  public Integer getRefHour() {
    +    return this.refHour;
    +  }
    +
    +  public void setRefHour(Integer refHour) {
    +    this.refHour = refHour;
    +  }
    +
    +  public String getMsgId() {
    +    return this.msgId;
    +  }
    +
    +  public void setMsgId(String msgId) {
    +    this.msgId = msgId;
    +  }
    +
    +  public String getTitle() {
    +    return this.title;
    +  }
    +
    +  public void setTitle(String title) {
    +    this.title = title;
    +  }
    +
    +  public Integer getIntPageReadUser() {
    +    return this.intPageReadUser;
    +  }
    +
    +  public void setIntPageReadUser(Integer intPageReadUser) {
    +    this.intPageReadUser = intPageReadUser;
    +  }
    +
    +  public Integer getIntPageReadCount() {
    +    return this.intPageReadCount;
    +  }
    +
    +  public void setIntPageReadCount(Integer intPageReadCount) {
    +    this.intPageReadCount = intPageReadCount;
    +  }
    +
    +  public Integer getOriPageReadUser() {
    +    return this.oriPageReadUser;
    +  }
    +
    +  public void setOriPageReadUser(Integer oriPageReadUser) {
    +    this.oriPageReadUser = oriPageReadUser;
    +  }
    +
    +  public Integer getOriPageReadCount() {
    +    return this.oriPageReadCount;
    +  }
    +
    +  public void setOriPageReadCount(Integer oriPageReadCount) {
    +    this.oriPageReadCount = oriPageReadCount;
    +  }
    +
    +  public Integer getShareScene() {
    +    return this.shareScene;
    +  }
    +
    +  public void setShareScene(Integer shareScene) {
    +    this.shareScene = shareScene;
    +  }
    +
    +  public Integer getShareUser() {
    +    return this.shareUser;
    +  }
    +
    +  public void setShareUser(Integer shareUser) {
    +    this.shareUser = shareUser;
    +  }
    +
    +  public Integer getShareCount() {
    +    return this.shareCount;
    +  }
    +
    +  public void setShareCount(Integer shareCount) {
    +    this.shareCount = shareCount;
    +  }
    +
    +  public Integer getAddToFavUser() {
    +    return this.addToFavUser;
    +  }
    +
    +  public void setAddToFavUser(Integer addToFavUser) {
    +    this.addToFavUser = addToFavUser;
    +  }
    +
    +  public Integer getAddToFavCount() {
    +    return this.addToFavCount;
    +  }
    +
    +  public void setAddToFavCount(Integer addToFavCount) {
    +    this.addToFavCount = addToFavCount;
    +  }
    +
    +  public Integer getUserSource() {
    +    return this.userSource;
    +  }
    +
    +  public void setUserSource(Integer userSource) {
    +    this.userSource = userSource;
    +  }
    +  
     }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotal.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotal.java
    index 85711d71..1832f734 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotal.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotal.java
    @@ -31,4 +31,29 @@ public class WxDataCubeArticleTotal extends WxDataCubeBaseResult {
        */
       @SerializedName("details")
       private List details;
    +
    +  public String getMsgId() {
    +    return this.msgId;
    +  }
    +
    +  public void setMsgId(String msgId) {
    +    this.msgId = msgId;
    +  }
    +
    +  public String getTitle() {
    +    return this.title;
    +  }
    +
    +  public void setTitle(String title) {
    +    this.title = title;
    +  }
    +
    +  public List getDetails() {
    +    return this.details;
    +  }
    +
    +  public void setDetails(List details) {
    +    this.details = details;
    +  }
    +  
     }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotalDetail.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotalDetail.java
    index d5f9a323..cbbf148f 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotalDetail.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotalDetail.java
    @@ -191,4 +191,215 @@ public class WxDataCubeArticleTotalDetail {
       @SerializedName("feed_share_from_other_cnt")
       private Integer feedShareFromOtherCnt;
     
    +  public Integer getStatDate() {
    +    return this.statDate;
    +  }
    +
    +  public void setStatDate(Integer statDate) {
    +    this.statDate = statDate;
    +  }
    +
    +  public Integer getTargetUser() {
    +    return this.targetUser;
    +  }
    +
    +  public void setTargetUser(Integer targetUser) {
    +    this.targetUser = targetUser;
    +  }
    +
    +  public Integer getIntPageReadUser() {
    +    return this.intPageReadUser;
    +  }
    +
    +  public void setIntPageReadUser(Integer intPageReadUser) {
    +    this.intPageReadUser = intPageReadUser;
    +  }
    +
    +  public Integer getIntPageReadCount() {
    +    return this.intPageReadCount;
    +  }
    +
    +  public void setIntPageReadCount(Integer intPageReadCount) {
    +    this.intPageReadCount = intPageReadCount;
    +  }
    +
    +  public Integer getOriPageReadUser() {
    +    return this.oriPageReadUser;
    +  }
    +
    +  public void setOriPageReadUser(Integer oriPageReadUser) {
    +    this.oriPageReadUser = oriPageReadUser;
    +  }
    +
    +  public Integer getOriPageReadCount() {
    +    return this.oriPageReadCount;
    +  }
    +
    +  public void setOriPageReadCount(Integer oriPageReadCount) {
    +    this.oriPageReadCount = oriPageReadCount;
    +  }
    +
    +  public Integer getShareUser() {
    +    return this.shareUser;
    +  }
    +
    +  public void setShareUser(Integer shareUser) {
    +    this.shareUser = shareUser;
    +  }
    +
    +  public Integer getShareCount() {
    +    return this.shareCount;
    +  }
    +
    +  public void setShareCount(Integer shareCount) {
    +    this.shareCount = shareCount;
    +  }
    +
    +  public Integer getAddToFavUser() {
    +    return this.addToFavUser;
    +  }
    +
    +  public void setAddToFavUser(Integer addToFavUser) {
    +    this.addToFavUser = addToFavUser;
    +  }
    +
    +  public Integer getAddToFavCount() {
    +    return this.addToFavCount;
    +  }
    +
    +  public void setAddToFavCount(Integer addToFavCount) {
    +    this.addToFavCount = addToFavCount;
    +  }
    +
    +  public Integer getIntPageFromSessionReadUser() {
    +    return this.intPageFromSessionReadUser;
    +  }
    +
    +  public void setIntPageFromSessionReadUser(Integer intPageFromSessionReadUser) {
    +    this.intPageFromSessionReadUser = intPageFromSessionReadUser;
    +  }
    +
    +  public Integer getIntPageFromSessionReadCount() {
    +    return this.intPageFromSessionReadCount;
    +  }
    +
    +  public void setIntPageFromSessionReadCount(
    +      Integer intPageFromSessionReadCount) {
    +    this.intPageFromSessionReadCount = intPageFromSessionReadCount;
    +  }
    +
    +  public Integer getIntPageFromHistMsgReadUser() {
    +    return this.intPageFromHistMsgReadUser;
    +  }
    +
    +  public void setIntPageFromHistMsgReadUser(Integer intPageFromHistMsgReadUser) {
    +    this.intPageFromHistMsgReadUser = intPageFromHistMsgReadUser;
    +  }
    +
    +  public Integer getIntPageFromHistMsgReadCount() {
    +    return this.intPageFromHistMsgReadCount;
    +  }
    +
    +  public void setIntPageFromHistMsgReadCount(
    +      Integer intPageFromHistMsgReadCount) {
    +    this.intPageFromHistMsgReadCount = intPageFromHistMsgReadCount;
    +  }
    +
    +  public Integer getIntPageFromFeedReadUser() {
    +    return this.intPageFromFeedReadUser;
    +  }
    +
    +  public void setIntPageFromFeedReadUser(Integer intPageFromFeedReadUser) {
    +    this.intPageFromFeedReadUser = intPageFromFeedReadUser;
    +  }
    +
    +  public Integer getIntPageFromFeedReadCount() {
    +    return this.intPageFromFeedReadCount;
    +  }
    +
    +  public void setIntPageFromFeedReadCount(Integer intPageFromFeedReadCount) {
    +    this.intPageFromFeedReadCount = intPageFromFeedReadCount;
    +  }
    +
    +  public Integer getIntPageFromFriendsReadUser() {
    +    return this.intPageFromFriendsReadUser;
    +  }
    +
    +  public void setIntPageFromFriendsReadUser(Integer intPageFromFriendsReadUser) {
    +    this.intPageFromFriendsReadUser = intPageFromFriendsReadUser;
    +  }
    +
    +  public Integer getIntPageFromFriendsReadCount() {
    +    return this.intPageFromFriendsReadCount;
    +  }
    +
    +  public void setIntPageFromFriendsReadCount(
    +      Integer intPageFromFriendsReadCount) {
    +    this.intPageFromFriendsReadCount = intPageFromFriendsReadCount;
    +  }
    +
    +  public Integer getIntPageFromOtherReadUser() {
    +    return this.intPageFromOtherReadUser;
    +  }
    +
    +  public void setIntPageFromOtherReadUser(Integer intPageFromOtherReadUser) {
    +    this.intPageFromOtherReadUser = intPageFromOtherReadUser;
    +  }
    +
    +  public Integer getIntPageFromOtherReadCount() {
    +    return this.intPageFromOtherReadCount;
    +  }
    +
    +  public void setIntPageFromOtherReadCount(Integer intPageFromOtherReadCount) {
    +    this.intPageFromOtherReadCount = intPageFromOtherReadCount;
    +  }
    +
    +  public Integer getFeedShareFromSessionUser() {
    +    return this.feedShareFromSessionUser;
    +  }
    +
    +  public void setFeedShareFromSessionUser(Integer feedShareFromSessionUser) {
    +    this.feedShareFromSessionUser = feedShareFromSessionUser;
    +  }
    +
    +  public Integer getFeedShareFromSessionCnt() {
    +    return this.feedShareFromSessionCnt;
    +  }
    +
    +  public void setFeedShareFromSessionCnt(Integer feedShareFromSessionCnt) {
    +    this.feedShareFromSessionCnt = feedShareFromSessionCnt;
    +  }
    +
    +  public Integer getFeedShareFromFeedUser() {
    +    return this.feedShareFromFeedUser;
    +  }
    +
    +  public void setFeedShareFromFeedUser(Integer feedShareFromFeedUser) {
    +    this.feedShareFromFeedUser = feedShareFromFeedUser;
    +  }
    +
    +  public Integer getFeedShareFromFeedCnt() {
    +    return this.feedShareFromFeedCnt;
    +  }
    +
    +  public void setFeedShareFromFeedCnt(Integer feedShareFromFeedCnt) {
    +    this.feedShareFromFeedCnt = feedShareFromFeedCnt;
    +  }
    +
    +  public Integer getFeedShareFromOtherUser() {
    +    return this.feedShareFromOtherUser;
    +  }
    +
    +  public void setFeedShareFromOtherUser(Integer feedShareFromOtherUser) {
    +    this.feedShareFromOtherUser = feedShareFromOtherUser;
    +  }
    +
    +  public Integer getFeedShareFromOtherCnt() {
    +    return this.feedShareFromOtherCnt;
    +  }
    +
    +  public void setFeedShareFromOtherCnt(Integer feedShareFromOtherCnt) {
    +    this.feedShareFromOtherCnt = feedShareFromOtherCnt;
    +  }
    +
     }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java
    index 429636e2..f819ab42 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java
    @@ -21,4 +21,13 @@ public class WxDataCubeBaseResult {
        */
       @SerializedName("ref_date")
       private String refDate;
    +
    +  public String getRefDate() {
    +    return this.refDate;
    +  }
    +
    +  public void setRefDate(String refDate) {
    +    this.refDate = refDate;
    +  }
    +  
     }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserCumulate.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserCumulate.java
    index 99206e56..7192cfb4 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserCumulate.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserCumulate.java
    @@ -14,12 +14,14 @@ import java.util.Date;
      */
     public class WxDataCubeUserCumulate implements Serializable {
     
    +  private static final long serialVersionUID = -3570981300225093657L;
    +
       private Date refDate;
     
       private Integer cumulateUser;
     
       public Date getRefDate() {
    -    return refDate;
    +    return this.refDate;
       }
     
       public void setRefDate(Date refDate) {
    @@ -27,7 +29,7 @@ public class WxDataCubeUserCumulate implements Serializable {
       }
     
       public Integer getCumulateUser() {
    -    return cumulateUser;
    +    return this.cumulateUser;
       }
     
       public void setCumulateUser(Integer cumulateUser) {
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserSummary.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserSummary.java
    index 0380f203..cfb41842 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserSummary.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserSummary.java
    @@ -13,6 +13,7 @@ import java.util.Date;
      * 
    */ public class WxDataCubeUserSummary implements Serializable { + private static final long serialVersionUID = -2336654489906694173L; private Date refDate; @@ -23,7 +24,7 @@ public class WxDataCubeUserSummary implements Serializable { private Integer cancelUser; public Date getRefDate() { - return refDate; + return this.refDate; } public void setRefDate(Date refDate) { @@ -31,7 +32,7 @@ public class WxDataCubeUserSummary implements Serializable { } public Integer getUserSource() { - return userSource; + return this.userSource; } public void setUserSource(Integer userSource) { @@ -39,7 +40,7 @@ public class WxDataCubeUserSummary implements Serializable { } public Integer getNewUser() { - return newUser; + return this.newUser; } public void setNewUser(Integer newUser) { @@ -47,7 +48,7 @@ public class WxDataCubeUserSummary implements Serializable { } public Integer getCancelUser() { - return cancelUser; + return this.cancelUser; } public void setCancelUser(Integer cancelUser) { From 4c98a561ddbea16b6bd6ef994f738a6918a312f6 Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Mon, 29 Aug 2016 20:33:11 +0800 Subject: [PATCH 38/55] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E5=88=86=E6=9E=90=E6=95=B0=E6=8D=AE=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/mp/api/WxMpDataCubeService.java | 79 ++++++++++++ .../mp/api/impl/WxMpDataCubeServiceImpl.java | 101 ++++++++++++++- .../mp/bean/datacube/WxDataCubeMsgResult.java | 117 ++++++++++++++++++ .../api/impl/WxMpDataCubeServiceImplTest.java | 102 +++++++++++++-- 4 files changed, 386 insertions(+), 13 deletions(-) create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeMsgResult.java diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpDataCubeService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpDataCubeService.java index ca7fa180..84dd5978 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpDataCubeService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpDataCubeService.java @@ -3,6 +3,7 @@ package me.chanjar.weixin.mp.api; import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.mp.bean.datacube.WxDataCubeArticleResult; import me.chanjar.weixin.mp.bean.datacube.WxDataCubeArticleTotal; +import me.chanjar.weixin.mp.bean.datacube.WxDataCubeMsgResult; import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserCumulate; import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserSummary; @@ -110,4 +111,82 @@ public interface WxMpDataCubeService { */ List getUserShareHour(Date beginDate, Date endDate) throws WxErrorException; + //*******************消息分析数据接口***********************// + + /** + *
    +   * 获取消息发送概况数据(getupstreammsg)
    +   * 详情请见文档:消息分析数据接口
    +   * 接口url格式:https://api.weixin.qq.com/datacube/getupstreammsg?access_token=ACCESS_TOKEN
    +   *
    +   * @param beginDate 开始时间
    +   * @param endDate   最大时间跨度7天,endDate不能早于begingDate
    +   */
    +  List getUpstreamMsg(Date beginDate, Date endDate) throws WxErrorException;
    +
    +  /**
    +   * 
    +   * 获取消息分送分时数据(getupstreammsghour)
    +   * 详情请见文档:消息分析数据接口
    +   * 接口url格式:https://api.weixin.qq.com/datacube/getupstreammsghour?access_token=ACCESS_TOKEN
    +   *
    +   * @param beginDate 开始时间
    +   * @param endDate   最大时间跨度1天,endDate不能早于begingDate
    +   */
    +  List getUpstreamMsgHour(Date beginDate, Date endDate) throws WxErrorException;
    +
    +  /**
    +   * 
    +   * 获取消息发送周数据(getupstreammsgweek)
    +   * 详情请见文档:消息分析数据接口
    +   * 接口url格式:https://api.weixin.qq.com/datacube/getupstreammsgweek?access_token=ACCESS_TOKEN
    +   *
    +   * @param beginDate 开始时间
    +   * @param endDate   最大时间跨度30天,endDate不能早于begingDate
    +   */
    +  List getUpstreamMsgWeek(Date beginDate, Date endDate) throws WxErrorException;
    +
    +  /**
    +   * 
    +   * 获取消息发送月数据(getupstreammsgmonth)
    +   * 详情请见文档:消息分析数据接口
    +   * 接口url格式:https://api.weixin.qq.com/datacube/getupstreammsgmonth?access_token=ACCESS_TOKEN
    +   *
    +   * @param beginDate 开始时间
    +   * @param endDate   最大时间跨度30天,endDate不能早于begingDate
    +   */
    +  List getUpstreamMsgMonth(Date beginDate, Date endDate) throws WxErrorException;
    +
    +  /**
    +   * 
    +   * 获取消息发送分布数据(getupstreammsgdist)
    +   * 详情请见文档:消息分析数据接口
    +   * 接口url格式:https://api.weixin.qq.com/datacube/getupstreammsgdist?access_token=ACCESS_TOKEN
    +   *
    +   * @param beginDate 开始时间
    +   * @param endDate   最大时间跨度15天,endDate不能早于begingDate
    +   */
    +  List getUpstreamMsgDist(Date beginDate, Date endDate) throws WxErrorException;
    +
    +  /**
    +   * 
    +   * 获取消息发送分布周数据(getupstreammsgdistweek)
    +   * 详情请见文档:消息分析数据接口
    +   * 接口url格式:https://api.weixin.qq.com/datacube/getupstreammsgdistweek?access_token=ACCESS_TOKEN
    +   *
    +   * @param beginDate 开始时间
    +   * @param endDate   最大时间跨度30天,endDate不能早于begingDate
    +   */
    +  List getUpstreamMsgDistWeek(Date beginDate, Date endDate) throws WxErrorException;
    +
    +  /**
    +   * 
    +   * 获取消息发送分布月数据(getupstreammsgdistmonth)
    +   * 详情请见文档:消息分析数据接口
    +   * 接口url格式:https://api.weixin.qq.com/datacube/getupstreammsgdistmonth?access_token=ACCESS_TOKEN
    +   *
    +   * @param beginDate 开始时间
    +   * @param endDate   最大时间跨度30天,endDate不能早于begingDate
    +   */
    +  List getUpstreamMsgDistMonth(Date beginDate, Date endDate) throws WxErrorException;
     }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImpl.java
    index 329947d2..a9e8fa50 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImpl.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImpl.java
    @@ -8,6 +8,7 @@ import me.chanjar.weixin.mp.api.WxMpDataCubeService;
     import me.chanjar.weixin.mp.api.WxMpService;
     import me.chanjar.weixin.mp.bean.datacube.WxDataCubeArticleResult;
     import me.chanjar.weixin.mp.bean.datacube.WxDataCubeArticleTotal;
    +import me.chanjar.weixin.mp.bean.datacube.WxDataCubeMsgResult;
     import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserCumulate;
     import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserSummary;
     import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
    @@ -22,7 +23,7 @@ import java.util.List;
      * @author binarywang (https://github.com/binarywang)
      */
     public class WxMpDataCubeServiceImpl implements WxMpDataCubeService {
    -  protected final Logger log = LoggerFactory.getLogger(WxMpServiceImpl.class);
    +  protected final Logger log = LoggerFactory.getLogger(WxMpDataCubeServiceImpl.class);
     
       private static final String API_URL_PREFIX = "https://api.weixin.qq.com/datacube";
       private WxMpService wxMpService;
    @@ -134,4 +135,102 @@ public class WxMpDataCubeServiceImpl implements WxMpDataCubeService {
                 new TypeToken>() {
                 }.getType());
       }
    +
    +  @Override
    +  public List getUpstreamMsg(Date beginDate, Date endDate)
    +      throws WxErrorException {
    +    String url = API_URL_PREFIX + "/getupstreammsg";
    +    JsonObject param = new JsonObject();
    +    param.addProperty("begin_date", WxMpService.SIMPLE_DATE_FORMAT.format(beginDate));
    +    param.addProperty("end_date", WxMpService.SIMPLE_DATE_FORMAT.format(endDate));
    +    String responseContent = this.wxMpService.post(url, param.toString());
    +    this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent);
    +    return WxMpGsonBuilder.INSTANCE.create().fromJson(new JsonParser().parse(responseContent).getAsJsonObject().get("list"),
    +            new TypeToken>() {
    +            }.getType());
    +  }
    +
    +  @Override
    +  public List getUpstreamMsgHour(Date beginDate,
    +      Date endDate) throws WxErrorException {
    +    String url = API_URL_PREFIX + "/getupstreammsghour";
    +    JsonObject param = new JsonObject();
    +    param.addProperty("begin_date", WxMpService.SIMPLE_DATE_FORMAT.format(beginDate));
    +    param.addProperty("end_date", WxMpService.SIMPLE_DATE_FORMAT.format(endDate));
    +    String responseContent = this.wxMpService.post(url, param.toString());
    +    this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent);
    +    return WxMpGsonBuilder.INSTANCE.create().fromJson(new JsonParser().parse(responseContent).getAsJsonObject().get("list"),
    +            new TypeToken>() {
    +            }.getType());
    +  }
    +
    +  @Override
    +  public List getUpstreamMsgWeek(Date beginDate,
    +      Date endDate) throws WxErrorException {
    +    String url = API_URL_PREFIX + "/getupstreammsgweek";
    +    JsonObject param = new JsonObject();
    +    param.addProperty("begin_date", WxMpService.SIMPLE_DATE_FORMAT.format(beginDate));
    +    param.addProperty("end_date", WxMpService.SIMPLE_DATE_FORMAT.format(endDate));
    +    String responseContent = this.wxMpService.post(url, param.toString());
    +    this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent);
    +    return WxMpGsonBuilder.INSTANCE.create().fromJson(new JsonParser().parse(responseContent).getAsJsonObject().get("list"),
    +            new TypeToken>() {
    +            }.getType());
    +  }
    +
    +  @Override
    +  public List getUpstreamMsgMonth(Date beginDate,
    +      Date endDate) throws WxErrorException {
    +    String url = API_URL_PREFIX + "/getupstreammsgmonth";
    +    JsonObject param = new JsonObject();
    +    param.addProperty("begin_date", WxMpService.SIMPLE_DATE_FORMAT.format(beginDate));
    +    param.addProperty("end_date", WxMpService.SIMPLE_DATE_FORMAT.format(endDate));
    +    String responseContent = this.wxMpService.post(url, param.toString());
    +    this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent);
    +    return WxMpGsonBuilder.INSTANCE.create().fromJson(new JsonParser().parse(responseContent).getAsJsonObject().get("list"),
    +            new TypeToken>() {
    +            }.getType());
    +  }
    +
    +  @Override
    +  public List getUpstreamMsgDist(Date beginDate,
    +      Date endDate) throws WxErrorException {
    +    String url = API_URL_PREFIX + "/getupstreammsgdist";
    +    JsonObject param = new JsonObject();
    +    param.addProperty("begin_date", WxMpService.SIMPLE_DATE_FORMAT.format(beginDate));
    +    param.addProperty("end_date", WxMpService.SIMPLE_DATE_FORMAT.format(endDate));
    +    String responseContent = this.wxMpService.post(url, param.toString());
    +    this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent);
    +    return WxMpGsonBuilder.INSTANCE.create().fromJson(new JsonParser().parse(responseContent).getAsJsonObject().get("list"),
    +            new TypeToken>() {
    +            }.getType());
    +  }
    +
    +  @Override
    +  public List getUpstreamMsgDistWeek(Date beginDate,
    +      Date endDate) throws WxErrorException {
    +    String url = API_URL_PREFIX + "/getupstreammsgdistweek";
    +    JsonObject param = new JsonObject();
    +    param.addProperty("begin_date", WxMpService.SIMPLE_DATE_FORMAT.format(beginDate));
    +    param.addProperty("end_date", WxMpService.SIMPLE_DATE_FORMAT.format(endDate));
    +    String responseContent = this.wxMpService.post(url, param.toString());
    +    this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent);
    +    return WxMpGsonBuilder.INSTANCE.create().fromJson(new JsonParser().parse(responseContent).getAsJsonObject().get("list"),
    +            new TypeToken>() {
    +            }.getType());
    +  }
    +
    +  @Override
    +  public List getUpstreamMsgDistMonth(Date beginDate,
    +      Date endDate) throws WxErrorException {
    +    String url = API_URL_PREFIX + "/getupstreammsgdistmonth";
    +    JsonObject param = new JsonObject();
    +    param.addProperty("begin_date", WxMpService.SIMPLE_DATE_FORMAT.format(beginDate));
    +    param.addProperty("end_date", WxMpService.SIMPLE_DATE_FORMAT.format(endDate));
    +    String responseContent = this.wxMpService.post(url, param.toString());
    +    this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent);
    +    return WxMpGsonBuilder.INSTANCE.create().fromJson(new JsonParser().parse(responseContent).getAsJsonObject().get("list"),
    +            new TypeToken>() {
    +            }.getType());
    +  }
     }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeMsgResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeMsgResult.java
    new file mode 100644
    index 00000000..bbeb3b36
    --- /dev/null
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeMsgResult.java
    @@ -0,0 +1,117 @@
    +package me.chanjar.weixin.mp.bean.datacube;
    +
    +import com.google.gson.annotations.SerializedName;
    +
    +/**
    + * 消息分析数据接口返回结果对象
    + * @author binarywang(https://github.com/binarywang)
    + *         Created by Binary Wang on 2016/8/29.
    + */
    +public class WxDataCubeMsgResult extends WxDataCubeBaseResult {
    +
    +  /**
    +   * ref_hour
    +   * 数据的小时,包括从000到2300,分别代表的是[000,100)到[2300,2400),即每日的第1小时和最后1小时
    +   */
    +  @SerializedName("ref_hour")
    +  private Integer refHour;
    +
    +  /**
    +   * msg_type
    +   * 消息类型,代表含义如下:1代表文字 2代表图片 3代表语音 4代表视频 6代表第三方应用消息(链接消息)
    +   */
    +  @SerializedName("msg_type")
    +  private Integer msgType;
    +
    +  /**
    +   * msg_user
    +   * 上行发送了(向公众号发送了)消息的用户数
    +   */
    +  @SerializedName("msg_user")
    +  private Integer msgUser;
    +
    +  /**
    +   * msg_count
    +   * 上行发送了消息的消息总数
    +   */
    +  @SerializedName("msg_count")
    +  private Integer msgCount;
    +
    +  /**
    +   * count_interval
    +   * 当日发送消息量分布的区间,0代表 “0”,1代表“1-5”,2代表“6-10”,3代表“10次以上”
    +   */
    +  @SerializedName("count_interval")
    +  private Integer countInterval;
    +
    +  /**
    +   * int_page_read_count
    +   * 图文页的阅读次数
    +   */
    +  @SerializedName("int_page_read_count")
    +  private Integer intPageReadCount;
    +
    +  /**
    +   * ori_page_read_user
    +   * 原文页(点击图文页“阅读原文”进入的页面)的阅读人数,无原文页时此处数据为0
    +   */
    +  @SerializedName("ori_page_read_user")
    +  private Integer oriPageReadUser;
    +
    +  public Integer getRefHour() {
    +    return this.refHour;
    +  }
    +
    +  public void setRefHour(Integer refHour) {
    +    this.refHour = refHour;
    +  }
    +
    +  public Integer getMsgType() {
    +    return this.msgType;
    +  }
    +
    +  public void setMsgType(Integer msgType) {
    +    this.msgType = msgType;
    +  }
    +
    +  public Integer getMsgUser() {
    +    return this.msgUser;
    +  }
    +
    +  public void setMsgUser(Integer msgUser) {
    +    this.msgUser = msgUser;
    +  }
    +
    +  public Integer getMsgCount() {
    +    return this.msgCount;
    +  }
    +
    +  public void setMsgCount(Integer msgCount) {
    +    this.msgCount = msgCount;
    +  }
    +
    +  public Integer getCountInterval() {
    +    return this.countInterval;
    +  }
    +
    +  public void setCountInterval(Integer countInterval) {
    +    this.countInterval = countInterval;
    +  }
    +
    +  public Integer getIntPageReadCount() {
    +    return this.intPageReadCount;
    +  }
    +
    +  public void setIntPageReadCount(Integer intPageReadCount) {
    +    this.intPageReadCount = intPageReadCount;
    +  }
    +
    +  public Integer getOriPageReadUser() {
    +    return this.oriPageReadUser;
    +  }
    +
    +  public void setOriPageReadUser(Integer oriPageReadUser) {
    +    this.oriPageReadUser = oriPageReadUser;
    +  }
    +
    +}
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImplTest.java
    index 984dcc28..39221eab 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImplTest.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImplTest.java
    @@ -5,6 +5,7 @@ import me.chanjar.weixin.common.exception.WxErrorException;
     import me.chanjar.weixin.mp.api.ApiTestModule;
     import me.chanjar.weixin.mp.bean.datacube.WxDataCubeArticleResult;
     import me.chanjar.weixin.mp.bean.datacube.WxDataCubeArticleTotal;
    +import me.chanjar.weixin.mp.bean.datacube.WxDataCubeMsgResult;
     import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserCumulate;
     import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserSummary;
     import org.testng.Assert;
    @@ -12,6 +13,8 @@ import org.testng.annotations.DataProvider;
     import org.testng.annotations.Guice;
     import org.testng.annotations.Test;
     
    +import static org.junit.Assert.fail;
    +
     import java.text.ParseException;
     import java.text.SimpleDateFormat;
     import java.util.Date;
    @@ -24,26 +27,39 @@ import java.util.List;
      */
     @Guice(modules = ApiTestModule.class)
     public class WxMpDataCubeServiceImplTest {
    -  private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
    +  private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
    +      "yyyy-MM-dd");
     
       @Inject
       protected WxMpServiceImpl wxService;
     
       @DataProvider
       public Object[][] oneDay() throws ParseException {
    -    return new Object[][]{{simpleDateFormat.parse("2016-08-22")}};
    +    return new Object[][] { { simpleDateFormat.parse("2016-08-22") } };
       }
     
       @DataProvider
       public Object[][] threeDays() throws ParseException {
    -    return new Object[][]{{simpleDateFormat.parse("2016-08-20"),
    -            simpleDateFormat.parse("2016-08-22")}};
    +    return new Object[][] { { simpleDateFormat.parse("2016-08-20"),
    +        simpleDateFormat.parse("2016-08-22") } };
       }
     
       @DataProvider
       public Object[][] sevenDays() throws ParseException {
    -    return new Object[][]{{simpleDateFormat.parse("2016-08-16"),
    -            simpleDateFormat.parse("2016-08-22")}};
    +    return new Object[][] { { simpleDateFormat.parse("2016-08-16"),
    +        simpleDateFormat.parse("2016-08-22") } };
    +  }
    +
    +  @DataProvider
    +  public Object[][] fifteenDays() throws ParseException {
    +    return new Object[][] { { simpleDateFormat.parse("2016-08-14"),
    +        simpleDateFormat.parse("2016-08-27") } };
    +  }
    +
    +  @DataProvider
    +  public Object[][] thirtyDays() throws ParseException {
    +    return new Object[][] { { simpleDateFormat.parse("2016-07-30"),
    +        simpleDateFormat.parse("2016-08-27") } };
       }
     
       @Test(dataProvider = "sevenDays")
    @@ -67,7 +83,7 @@ public class WxMpDataCubeServiceImplTest {
       @Test(dataProvider = "oneDay")
       public void testGetArticleSummary(Date date) throws WxErrorException {
         List results = this.wxService.getDataCubeService()
    -            .getArticleSummary(date, date);
    +        .getArticleSummary(date, date);
         Assert.assertNotNull(results);
         System.out.println(results);
       }
    @@ -78,7 +94,7 @@ public class WxMpDataCubeServiceImplTest {
       @Test(dataProvider = "oneDay")
       public void testGetArticleTotal(Date date) throws WxErrorException {
         List results = this.wxService.getDataCubeService()
    -            .getArticleTotal(date, date);
    +        .getArticleTotal(date, date);
         Assert.assertNotNull(results);
         System.out.println(results);
       }
    @@ -87,7 +103,7 @@ public class WxMpDataCubeServiceImplTest {
       public void testGetUserRead(Date beginDate, Date endDate)
           throws WxErrorException {
         List results = this.wxService.getDataCubeService()
    -            .getUserRead(beginDate, endDate);
    +        .getUserRead(beginDate, endDate);
         Assert.assertNotNull(results);
         System.out.println(results);
       }
    @@ -95,7 +111,7 @@ public class WxMpDataCubeServiceImplTest {
       @Test(dataProvider = "oneDay")
       public void testGetUserReadHour(Date date) throws WxErrorException {
         List results = this.wxService.getDataCubeService()
    -            .getUserReadHour(date, date);
    +        .getUserReadHour(date, date);
         Assert.assertNotNull(results);
         System.out.println(results);
       }
    @@ -104,7 +120,7 @@ public class WxMpDataCubeServiceImplTest {
       public void testGetUserShare(Date beginDate, Date endDate)
           throws WxErrorException {
         List results = this.wxService.getDataCubeService()
    -            .getUserShare(beginDate, endDate);
    +        .getUserShare(beginDate, endDate);
         Assert.assertNotNull(results);
         System.out.println(results);
       }
    @@ -112,7 +128,69 @@ public class WxMpDataCubeServiceImplTest {
       @Test(dataProvider = "oneDay")
       public void testGetUserShareHour(Date date) throws WxErrorException {
         List results = this.wxService.getDataCubeService()
    -            .getUserShareHour(date, date);
    +        .getUserShareHour(date, date);
    +    Assert.assertNotNull(results);
    +    System.out.println(results);
    +  }
    +
    +  @Test(dataProvider = "sevenDays")
    +  public void testGetUpstreamMsg(Date beginDate, Date endDate) throws WxErrorException {
    +    List results = this.wxService.getDataCubeService()
    +        .getUpstreamMsg(beginDate, endDate);
    +    Assert.assertNotNull(results);
    +    System.out.println(results);
    +  }
    +
    +  @Test(dataProvider = "oneDay")
    +  public void testGetUpstreamMsgHour(Date date) throws WxErrorException {
    +    List results = this.wxService.getDataCubeService()
    +        .getUpstreamMsgHour(date, date);
    +    Assert.assertNotNull(results);
    +    System.out.println(results);
    +  }
    +
    +  @Test(dataProvider = "thirtyDays")
    +  public void testGetUpstreamMsgWeek(Date beginDate, Date endDate) throws WxErrorException {
    +    List results = this.wxService.getDataCubeService()
    +        .getUpstreamMsgWeek(beginDate, endDate);
    +    Assert.assertNotNull(results);
    +    System.out.println(results);
    +  }
    +
    +  /**
    +   * TODO 该接口,暂时没找到有数据的日期,无法测试验证
    +   */
    +  @Test(dataProvider = "thirtyDays")
    +  public void testGetUpstreamMsgMonth(Date beginDate, Date endDate) throws WxErrorException {
    +    List results = this.wxService.getDataCubeService()
    +        .getUpstreamMsgMonth(beginDate, endDate);
    +    Assert.assertNotNull(results);
    +    System.out.println(results);
    +  }
    +
    +  @Test(dataProvider = "fifteenDays")
    +  public void testGetUpstreamMsgDist(Date beginDate, Date endDate) throws WxErrorException {
    +    List results = this.wxService.getDataCubeService()
    +        .getUpstreamMsgDist(beginDate, endDate);
    +    Assert.assertNotNull(results);
    +    System.out.println(results);
    +  }
    +
    +  @Test(dataProvider = "thirtyDays")
    +  public void testGetUpstreamMsgDistWeek(Date beginDate, Date endDate) throws WxErrorException {
    +    List results = this.wxService.getDataCubeService()
    +        .getUpstreamMsgDistWeek(beginDate, endDate);
    +    Assert.assertNotNull(results);
    +    System.out.println(results);
    +  }
    +
    +  /**
    +   * TODO 该接口,暂时没找到有数据的日期,无法测试验证
    +   */
    +  @Test(dataProvider = "thirtyDays")
    +  public void testGetUpstreamMsgDistMonth(Date beginDate, Date endDate) throws WxErrorException {
    +    List results = this.wxService.getDataCubeService()
    +        .getUpstreamMsgDistMonth(beginDate, endDate);
         Assert.assertNotNull(results);
         System.out.println(results);
       }
    
    From a294bc42f54280f7a276d5093f765cc1f96e7f7b Mon Sep 17 00:00:00 2001
    From: BinaryWang 
    Date: Mon, 29 Aug 2016 20:38:50 +0800
    Subject: [PATCH 39/55] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=83=A8=E5=88=86?=
     =?UTF-8?q?=E5=8F=AF=E8=83=BD=E9=80=A0=E6=88=90resource=20leak=E7=9A=84?=
     =?UTF-8?q?=E4=BB=A3=E7=A0=81?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../mp/api/impl/WxMpCardServiceImpl.java      | 23 +++++++++----------
     .../mp/api/impl/WxMpGroupServiceImpl.java     | 13 +++++------
     2 files changed, 17 insertions(+), 19 deletions(-)
    
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java
    index 7a39f0f8..b65d1ff4 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java
    @@ -1,12 +1,17 @@
     package me.chanjar.weixin.mp.api.impl;
     
    +import java.security.NoSuchAlgorithmException;
    +import java.util.Arrays;
    +
    +import org.slf4j.Logger;
    +import org.slf4j.LoggerFactory;
    +
     import com.google.gson.JsonElement;
     import com.google.gson.JsonObject;
     import com.google.gson.JsonParser;
     import com.google.gson.JsonPrimitive;
    -import com.google.gson.internal.Streams;
     import com.google.gson.reflect.TypeToken;
    -import com.google.gson.stream.JsonReader;
    +
     import me.chanjar.weixin.common.bean.WxCardApiSignature;
     import me.chanjar.weixin.common.bean.result.WxError;
     import me.chanjar.weixin.common.exception.WxErrorException;
    @@ -17,12 +22,6 @@ import me.chanjar.weixin.mp.api.WxMpCardService;
     import me.chanjar.weixin.mp.api.WxMpService;
     import me.chanjar.weixin.mp.bean.result.WxMpCardResult;
     import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
    -import org.slf4j.Logger;
    -import org.slf4j.LoggerFactory;
    -
    -import java.io.StringReader;
    -import java.security.NoSuchAlgorithmException;
    -import java.util.Arrays;
     
     /**
      * Created by Binary Wang on 2016/7/27.
    @@ -76,7 +75,7 @@ public class WxMpCardServiceImpl implements WxMpCardService {
             if (this.wxMpService.getWxMpConfigStorage().isCardApiTicketExpired()) {
               String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=wx_card";
               String responseContent = this.wxMpService.execute(new SimpleGetRequestExecutor(), url, null);
    -          JsonElement tmpJsonElement = Streams.parse(new JsonReader(new StringReader(responseContent)));
    +          JsonElement tmpJsonElement = new JsonParser().parse(responseContent);
               JsonObject tmpJsonObject = tmpJsonElement.getAsJsonObject();
               String cardApiTicket = tmpJsonObject.get("ticket").getAsString();
               int expiresInSeconds = tmpJsonObject.get("expires_in").getAsInt();
    @@ -136,7 +135,7 @@ public class WxMpCardServiceImpl implements WxMpCardService {
         JsonObject param = new JsonObject();
         param.addProperty("encrypt_code", encryptCode);
         String responseContent = this.wxMpService.post(url, param.toString());
    -    JsonElement tmpJsonElement = Streams.parse(new JsonReader(new StringReader(responseContent)));
    +    JsonElement tmpJsonElement = new JsonParser().parse(responseContent);
         JsonObject tmpJsonObject = tmpJsonElement.getAsJsonObject();
         JsonPrimitive jsonPrimitive = tmpJsonObject.getAsJsonPrimitive("code");
         return jsonPrimitive.getAsString();
    @@ -158,7 +157,7 @@ public class WxMpCardServiceImpl implements WxMpCardService {
         param.addProperty("code", code);
         param.addProperty("check_consume", checkConsume);
         String responseContent = this.wxMpService.post(url, param.toString());
    -    JsonElement tmpJsonElement = Streams.parse(new JsonReader(new StringReader(responseContent)));
    +    JsonElement tmpJsonElement = new JsonParser().parse(responseContent);
         return WxMpGsonBuilder.INSTANCE.create().fromJson(tmpJsonElement,
                 new TypeToken() {
                 }.getType());
    @@ -217,7 +216,7 @@ public class WxMpCardServiceImpl implements WxMpCardService {
         param.addProperty("openid", openId);
         param.addProperty("is_mark", isMark);
         String responseContent = this.wxMpService.post(url, param.toString());
    -    JsonElement tmpJsonElement = Streams.parse(new JsonReader(new StringReader(responseContent)));
    +    JsonElement tmpJsonElement = new JsonParser().parse(responseContent);
         WxMpCardResult cardResult = WxMpGsonBuilder.INSTANCE.create().fromJson(tmpJsonElement,
                 new TypeToken() { }.getType());
         if (!cardResult.getErrorCode().equals("0")) {
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpGroupServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpGroupServiceImpl.java
    index ea388dea..5f97a83a 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpGroupServiceImpl.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpGroupServiceImpl.java
    @@ -1,10 +1,12 @@
     package me.chanjar.weixin.mp.api.impl;
     
    +import java.util.List;
    +
     import com.google.gson.JsonElement;
     import com.google.gson.JsonObject;
    -import com.google.gson.internal.Streams;
    +import com.google.gson.JsonParser;
     import com.google.gson.reflect.TypeToken;
    -import com.google.gson.stream.JsonReader;
    +
     import me.chanjar.weixin.common.exception.WxErrorException;
     import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor;
     import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor;
    @@ -14,9 +16,6 @@ import me.chanjar.weixin.mp.api.WxMpService;
     import me.chanjar.weixin.mp.bean.WxMpGroup;
     import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
     
    -import java.io.StringReader;
    -import java.util.List;
    -
     /**
      * Created by Binary Wang on 2016/7/21.
      */
    @@ -51,7 +50,7 @@ public class WxMpGroupServiceImpl implements WxMpGroupService {
          * 操蛋的微信API,创建时返回的是 { group : { id : ..., name : ...} }
          * 查询时返回的是 { groups : [ { id : ..., name : ..., count : ... }, ... ] }
          */
    -    JsonElement tmpJsonElement = Streams.parse(new JsonReader(new StringReader(responseContent)));
    +    JsonElement tmpJsonElement = new JsonParser().parse(responseContent);
         return WxMpGsonBuilder.INSTANCE.create().fromJson(tmpJsonElement.getAsJsonObject().get("groups"),
                 new TypeToken>() {
                 }.getType());
    @@ -63,7 +62,7 @@ public class WxMpGroupServiceImpl implements WxMpGroupService {
         JsonObject o = new JsonObject();
         o.addProperty("openid", openid);
         String responseContent = this.wxMpService.execute(new SimplePostRequestExecutor(), url, o.toString());
    -    JsonElement tmpJsonElement = Streams.parse(new JsonReader(new StringReader(responseContent)));
    +    JsonElement tmpJsonElement = new JsonParser().parse(responseContent);
         return GsonHelper.getAsLong(tmpJsonElement.getAsJsonObject().get("groupid"));
       }
     
    
    From f70a6a5e46f1f0377d50fa06830027a74203d180 Mon Sep 17 00:00:00 2001
    From: Binary Wang 
    Date: Mon, 29 Aug 2016 23:44:53 +0800
    Subject: [PATCH 40/55] add gradle support
    
    ---
     build.gradle                    | 34 +++++++++++++++++++++++++++++++++
     settings.gradle                 |  8 ++++++++
     weixin-java-common/build.gradle | 12 ++++++++++++
     weixin-java-cp/build.gradle     | 12 ++++++++++++
     weixin-java-mp/build.gradle     | 13 +++++++++++++
     5 files changed, 79 insertions(+)
     create mode 100644 build.gradle
     create mode 100644 settings.gradle
     create mode 100644 weixin-java-common/build.gradle
     create mode 100644 weixin-java-cp/build.gradle
     create mode 100644 weixin-java-mp/build.gradle
    
    diff --git a/build.gradle b/build.gradle
    new file mode 100644
    index 00000000..cb727c46
    --- /dev/null
    +++ b/build.gradle
    @@ -0,0 +1,34 @@
    +allprojects  {
    +  apply plugin: 'maven'
    +
    +  group = 'com.github.binarywang'
    +  version = '2.1.0-SNAPSHOT'
    +}
    +
    +subprojects {
    +  apply plugin: 'java'
    +  sourceCompatibility = 1.7
    +  targetCompatibility = 1.7
    +
    +
    +  repositories {
    +    mavenLocal()
    +
    +    maven { url "http://maven.aliyun.com/nexus/content/groups/public" }
    +  }
    +
    +
    +  dependencies {
    +    compile group: 'org.slf4j', name: 'slf4j-api', version:'1.7.10'
    +    compile group: 'org.apache.httpcomponents', name: 'fluent-hc', version:'4.5'
    +    compile group: 'org.apache.httpcomponents', name: 'httpmime', version:'4.5'
    +    compile group: 'org.jodd', name: 'jodd-http', version:'3.6.7'
    +    compile group: 'com.google.code.gson', name: 'gson', version:'2.7'
    +    compile group: 'commons-codec', name: 'commons-codec', version:'1.10'
    +    compile group: 'commons-io', name: 'commons-io', version:'2.5'
    +    compile group: 'org.apache.commons', name: 'commons-lang3', version:'3.4'
    +    compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version:'2.8.0'
    +    compile group: 'redis.clients', name: 'jedis', version:'2.9.0'
    +    testCompile group: 'ch.qos.logback', name: 'logback-classic', version:'1.1.2'
    +  }
    +}
    diff --git a/settings.gradle b/settings.gradle
    new file mode 100644
    index 00000000..1c0e0214
    --- /dev/null
    +++ b/settings.gradle
    @@ -0,0 +1,8 @@
    +rootProject.name = 'weixin-java-parent'
    +include ':weixin-java-common'
    +include ':weixin-java-cp'
    +include ':weixin-java-mp'
    +
    +project(':weixin-java-common').projectDir = "$rootDir/weixin-java-common" as File
    +project(':weixin-java-cp').projectDir = "$rootDir/weixin-java-cp" as File
    +project(':weixin-java-mp').projectDir = "$rootDir/weixin-java-mp" as File
    \ No newline at end of file
    diff --git a/weixin-java-common/build.gradle b/weixin-java-common/build.gradle
    new file mode 100644
    index 00000000..07b5036a
    --- /dev/null
    +++ b/weixin-java-common/build.gradle
    @@ -0,0 +1,12 @@
    +
    +description = 'WeiXin Java Tools - Common'
    +dependencies {
    +    compile group: 'com.thoughtworks.xstream', name: 'xstream', version:'1.4.7'
    +    testCompile group: 'junit', name: 'junit', version:'4.11'
    +    testCompile group: 'org.testng', name: 'testng', version:'6.8.7'
    +    testCompile group: 'org.mockito', name: 'mockito-all', version:'1.9.5'
    +    testCompile group: 'com.google.inject', name: 'guice', version:'3.0'
    +    testCompile group: 'org.eclipse.jetty', name: 'jetty-server', version:'9.3.0.M0'
    +    testCompile group: 'org.eclipse.jetty', name: 'jetty-servlet', version:'9.3.0.M0'
    +}
    +test.useTestNG()
    diff --git a/weixin-java-cp/build.gradle b/weixin-java-cp/build.gradle
    new file mode 100644
    index 00000000..f58703ca
    --- /dev/null
    +++ b/weixin-java-cp/build.gradle
    @@ -0,0 +1,12 @@
    +
    +description = 'WeiXin Java Tools - CP'
    +dependencies {
    +  compile project(':weixin-java-common')
    +    testCompile group: 'junit', name: 'junit', version:'4.11'
    +    testCompile group: 'org.testng', name: 'testng', version:'6.8.7'
    +    testCompile group: 'org.mockito', name: 'mockito-all', version:'1.9.5'
    +    testCompile group: 'com.google.inject', name: 'guice', version:'3.0'
    +    testCompile group: 'org.eclipse.jetty', name: 'jetty-server', version:'9.3.0.M0'
    +    testCompile group: 'org.eclipse.jetty', name: 'jetty-servlet', version:'9.3.0.M0'
    +}
    +test.useTestNG()
    diff --git a/weixin-java-mp/build.gradle b/weixin-java-mp/build.gradle
    new file mode 100644
    index 00000000..dcc01548
    --- /dev/null
    +++ b/weixin-java-mp/build.gradle
    @@ -0,0 +1,13 @@
    +
    +description = 'WeiXin Java Tools - MP'
    +dependencies {
    +  compile project(':weixin-java-common')
    +    testCompile group: 'junit', name: 'junit', version:'4.11'
    +    testCompile group: 'org.testng', name: 'testng', version:'6.8.7'
    +    testCompile group: 'org.mockito', name: 'mockito-all', version:'1.9.5'
    +    testCompile group: 'com.google.inject', name: 'guice', version:'3.0'
    +    testCompile group: 'org.eclipse.jetty', name: 'jetty-server', version:'9.3.0.M0'
    +    testCompile group: 'org.eclipse.jetty', name: 'jetty-servlet', version:'9.3.0.M0'
    +    testCompile group: 'joda-time', name: 'joda-time', version:'2.9.4'
    +}
    +test.useTestNG()
    
    From 2db53ec9567ef1d98d0184e3989af79010a71cca Mon Sep 17 00:00:00 2001
    From: Binary Wang 
    Date: Mon, 29 Aug 2016 23:45:13 +0800
    Subject: [PATCH 41/55] add gradle support,ignore something
    
    ---
     .gitignore | 4 ++++
     1 file changed, 4 insertions(+)
    
    diff --git a/.gitignore b/.gitignore
    index 17639d7f..dd377af1 100644
    --- a/.gitignore
    +++ b/.gitignore
    @@ -22,3 +22,7 @@ sw-pom.xml
     *.iml
     test-config.xml
     .idea
    +/.gradle/
    +/gradle/
    +*.bat
    +/gradlew
    
    From ee158b6e95d936053c233c5ce992d13597e428e6 Mon Sep 17 00:00:00 2001
    From: BinaryWang 
    Date: Tue, 30 Aug 2016 19:37:10 +0800
    Subject: [PATCH 42/55] =?UTF-8?q?=E6=B7=BB=E5=8A=A0Gradle=E7=9A=84?=
     =?UTF-8?q?=E4=BD=BF=E7=94=A8=E8=AF=B4=E6=98=8E=E9=83=A8=E5=88=86?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     README.md | 14 ++++++++++----
     1 file changed, 10 insertions(+), 4 deletions(-)
    
    diff --git a/README.md b/README.md
    index 57119c7b..119a9ecc 100644
    --- a/README.md
    +++ b/README.md
    @@ -40,10 +40,9 @@
     - [【企业号】](http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22com.github.binarywang%22%20AND%20a%3A%22weixin-java-cp%22)
     
     
    -## Quick Start
    -
    -* 如果要开发公众号(订阅号、服务号)应用,在你的maven项目中添加:
    +## Maven & Gradle
     
    +* 公众号(订阅号、服务号):
     ```xml
     
       com.github.binarywang
    @@ -52,8 +51,11 @@
     
     ```
     
    -* 如果要开发企业号应用,在你的maven项目中添加:
    +```groovy
    +compile 'com.github.binarywang:weixin-java-mp:2.0.0'
    +```
     
    +* 企业号:
     ```xml
     
       com.github.binarywang
    @@ -62,6 +64,10 @@
     
     ```
     
    +```groovy
    +compile 'com.github.binarywang:weixin-java-cp:2.0.0'
    +```
    +
     ## 关于代码贡献
     
     * 非常欢迎和感谢对本项目发起Pull Request的同学,本项目可以采用两种方式接受代码贡献:
    
    From 4a994ea4c30473299916a3a0909f63b930bd6b30 Mon Sep 17 00:00:00 2001
    From: BinaryWang 
    Date: Tue, 30 Aug 2016 19:38:53 +0800
    Subject: [PATCH 43/55] =?UTF-8?q?=E8=B0=83=E6=95=B4=E9=83=A8=E5=88=86?=
     =?UTF-8?q?=E6=AE=B5=E8=90=BD=E4=BD=8D=E7=BD=AE?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     README.md | 30 +++++++++++++++---------------
     1 file changed, 15 insertions(+), 15 deletions(-)
    
    diff --git a/README.md b/README.md
    index 119a9ecc..b40876ec 100644
    --- a/README.md
    +++ b/README.md
    @@ -8,22 +8,7 @@
     #### 由于本次更新涉及接口调整比较大,主要是公众号的调整,企业号无过多调整,主要是为了解决主接口类过于庞大不方便管理的问题,将接口实现代码按模块进行拆分。因此版本号直接从1.X.X直接升级到2.0.0,所以如果习惯于1.X.X版本的同学不想做过多更改的话,请慎重考虑升级到最新版本。
     ---
     
    -#### 本项目主要存放在github上,地址为 :
    -* https://github.com/wechat-group/weixin-java-tools
    -* ===========但同时会在其他几个网站同步更新,地址分别是:
    -* https://bitbucket.org/binarywang/weixin-java-tools
    -* http://git.oschina.net/binary/weixin-java-tools
    -* https://git.coding.net/binarywang/weixin-java-tools.git
    -
     ### 详细开发文档请看 [wiki](https://github.com/chanjarster/weixin-java-tools/wiki)。
    -
    -## 目前可参考的Demo项目:
    -* https://github.com/wechat-group/weixin-java-tools-springmvc
    -* https://github.com/wechat-group/weixin-mp-demo
    -* ===========以下为备份仓库,会保持跟主仓库同步
    -* http://git.oschina.net/binary/weixin-mp-demo
    -* https://bitbucket.org/binarywang/weixin-mp-demo
    -
     ===========
     ## 开发交流工具:
     * QQ群:343954419 [![Join QQ Group](http://pub.idqqimg.com/wpa/images/group.png)](http://shang.qq.com/wpa/qunwpa?idkey=078f7a153d243853e24cf2b542e7a6ccbf2a592bc138080f84d11297f736ec46)
    @@ -68,6 +53,21 @@ compile 'com.github.binarywang:weixin-java-mp:2.0.0'
     compile 'com.github.binarywang:weixin-java-cp:2.0.0'
     ```
     
    +#### 本项目主要存放在github上,地址为 :
    +* https://github.com/wechat-group/weixin-java-tools
    +* ===========但同时会在其他几个网站同步更新,地址分别是:
    +* https://bitbucket.org/binarywang/weixin-java-tools
    +* http://git.oschina.net/binary/weixin-java-tools
    +* https://git.coding.net/binarywang/weixin-java-tools.git
    +
    +
    +## 目前可参考的Demo项目:
    +* https://github.com/wechat-group/weixin-java-tools-springmvc
    +* https://github.com/wechat-group/weixin-mp-demo
    +* ===========以下为备份仓库,会保持跟主仓库同步
    +* http://git.oschina.net/binary/weixin-mp-demo
    +* https://bitbucket.org/binarywang/weixin-mp-demo
    +
     ## 关于代码贡献
     
     * 非常欢迎和感谢对本项目发起Pull Request的同学,本项目可以采用两种方式接受代码贡献:
    
    From af9bfa21567a06e650f7c239fae049a435468cbf Mon Sep 17 00:00:00 2001
    From: BinaryWang 
    Date: Tue, 30 Aug 2016 19:52:03 +0800
    Subject: [PATCH 44/55] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=8E=A5=E5=8F=A3?=
     =?UTF-8?q?=E5=88=86=E6=9E=90=E6=95=B0=E6=8D=AE=E6=8E=A5=E5=8F=A3?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../weixin/mp/api/WxMpDataCubeService.java    | 25 ++++++
     .../mp/api/impl/WxMpDataCubeServiceImpl.java  | 29 +++++++
     .../datacube/WxDataCubeInterfaceResult.java   | 87 +++++++++++++++++++
     .../api/impl/WxMpDataCubeServiceImplTest.java | 39 ++++++---
     4 files changed, 169 insertions(+), 11 deletions(-)
     create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeInterfaceResult.java
    
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpDataCubeService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpDataCubeService.java
    index 84dd5978..32f219d5 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpDataCubeService.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpDataCubeService.java
    @@ -3,6 +3,7 @@ package me.chanjar.weixin.mp.api;
     import me.chanjar.weixin.common.exception.WxErrorException;
     import me.chanjar.weixin.mp.bean.datacube.WxDataCubeArticleResult;
     import me.chanjar.weixin.mp.bean.datacube.WxDataCubeArticleTotal;
    +import me.chanjar.weixin.mp.bean.datacube.WxDataCubeInterfaceResult;
     import me.chanjar.weixin.mp.bean.datacube.WxDataCubeMsgResult;
     import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserCumulate;
     import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserSummary;
    @@ -189,4 +190,28 @@ public interface WxMpDataCubeService {
        * @param endDate   最大时间跨度30天,endDate不能早于begingDate
        */
       List getUpstreamMsgDistMonth(Date beginDate, Date endDate) throws WxErrorException;
    +
    +  //*******************接口分析数据接口***********************//
    +  /**
    +   * 
    +   * 获取接口分析数据(getinterfacesummary)
    +   * 详情请见文档:接口分析数据接口
    +   * 接口url格式:https://api.weixin.qq.com/datacube/getinterfacesummary?access_token=ACCESS_TOKEN
    +   *
    +   * @param beginDate 开始时间
    +   * @param endDate   最大时间跨度30天,endDate不能早于begingDate
    +   */
    +  List getInterfaceSummary(Date beginDate, Date endDate) throws WxErrorException;
    +
    +  /**
    +   * 
    +   * 获取接口分析分时数据(getinterfacesummaryhour)
    +   * 详情请见文档:接口分析数据接口
    +   * 接口url格式:https://api.weixin.qq.com/datacube/getinterfacesummaryhour?access_token=ACCESS_TOKEN
    +   *
    +   * @param beginDate 开始时间
    +   * @param endDate   最大时间跨度1天,endDate不能早于begingDate
    +   */
    +  List getInterfaceSummaryHour(Date beginDate, Date endDate) throws WxErrorException;
    +
     }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImpl.java
    index a9e8fa50..092d6af1 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImpl.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImpl.java
    @@ -8,6 +8,7 @@ import me.chanjar.weixin.mp.api.WxMpDataCubeService;
     import me.chanjar.weixin.mp.api.WxMpService;
     import me.chanjar.weixin.mp.bean.datacube.WxDataCubeArticleResult;
     import me.chanjar.weixin.mp.bean.datacube.WxDataCubeArticleTotal;
    +import me.chanjar.weixin.mp.bean.datacube.WxDataCubeInterfaceResult;
     import me.chanjar.weixin.mp.bean.datacube.WxDataCubeMsgResult;
     import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserCumulate;
     import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserSummary;
    @@ -233,4 +234,32 @@ public class WxMpDataCubeServiceImpl implements WxMpDataCubeService {
                 new TypeToken>() {
                 }.getType());
       }
    +
    +  @Override
    +  public List getInterfaceSummary(Date beginDate,
    +      Date endDate) throws WxErrorException {
    +    String url = API_URL_PREFIX + "/getinterfacesummary";
    +    JsonObject param = new JsonObject();
    +    param.addProperty("begin_date", WxMpService.SIMPLE_DATE_FORMAT.format(beginDate));
    +    param.addProperty("end_date", WxMpService.SIMPLE_DATE_FORMAT.format(endDate));
    +    String responseContent = this.wxMpService.post(url, param.toString());
    +    this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent);
    +    return WxMpGsonBuilder.INSTANCE.create().fromJson(new JsonParser().parse(responseContent).getAsJsonObject().get("list"),
    +            new TypeToken>() {
    +            }.getType());
    +  }
    +
    +  @Override
    +  public List getInterfaceSummaryHour(Date beginDate,
    +      Date endDate) throws WxErrorException {
    +    String url = API_URL_PREFIX + "/getinterfacesummaryhour";
    +    JsonObject param = new JsonObject();
    +    param.addProperty("begin_date", WxMpService.SIMPLE_DATE_FORMAT.format(beginDate));
    +    param.addProperty("end_date", WxMpService.SIMPLE_DATE_FORMAT.format(endDate));
    +    String responseContent = this.wxMpService.post(url, param.toString());
    +    this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent);
    +    return WxMpGsonBuilder.INSTANCE.create().fromJson(new JsonParser().parse(responseContent).getAsJsonObject().get("list"),
    +            new TypeToken>() {
    +            }.getType());
    +  }
     }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeInterfaceResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeInterfaceResult.java
    new file mode 100644
    index 00000000..4abbe277
    --- /dev/null
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeInterfaceResult.java
    @@ -0,0 +1,87 @@
    +package me.chanjar.weixin.mp.bean.datacube;
    +
    +import com.google.gson.annotations.SerializedName;
    +
    +/**
    + * 接口分析数据接口返回结果对象
    + * @author binarywang(https://github.com/binarywang)
    + *         Created by Binary Wang on 2016/8/30.
    + */
    +public class WxDataCubeInterfaceResult extends WxDataCubeBaseResult {
    +
    +  /**
    +   * ref_hour
    +   * 数据的小时,包括从000到2300,分别代表的是[000,100)到[2300,2400),即每日的第1小时和最后1小时
    +   */
    +  @SerializedName("ref_hour")
    +  private Integer refHour;
    +
    +  /**
    +   * callback_count
    +   * 通过服务器配置地址获得消息后,被动回复用户消息的次数
    +   */
    +  @SerializedName("callback_count")
    +  private Integer callbackCount;
    +
    +  /**
    +   * fail_count
    +   * 上述动作的失败次数
    +   */
    +  @SerializedName("fail_count")
    +  private Integer failCount;
    +
    +  /**
    +   * total_time_cost
    +   * 总耗时,除以callback_count即为平均耗时
    +   */
    +  @SerializedName("total_time_cost")
    +  private Integer totalTimeCost;
    +
    +  /**
    +   * max_time_cost
    +   * 最大耗时
    +   */
    +  @SerializedName("max_time_cost")
    +  private Integer maxTimeCost;
    +
    +  public Integer getRefHour() {
    +    return this.refHour;
    +  }
    +
    +  public void setRefHour(Integer refHour) {
    +    this.refHour = refHour;
    +  }
    +
    +  public Integer getCallbackCount() {
    +    return this.callbackCount;
    +  }
    +
    +  public void setCallbackCount(Integer callbackCount) {
    +    this.callbackCount = callbackCount;
    +  }
    +
    +  public Integer getFailCount() {
    +    return this.failCount;
    +  }
    +
    +  public void setFailCount(Integer failCount) {
    +    this.failCount = failCount;
    +  }
    +
    +  public Integer getTotalTimeCost() {
    +    return this.totalTimeCost;
    +  }
    +
    +  public void setTotalTimeCost(Integer totalTimeCost) {
    +    this.totalTimeCost = totalTimeCost;
    +  }
    +
    +  public Integer getMaxTimeCost() {
    +    return this.maxTimeCost;
    +  }
    +
    +  public void setMaxTimeCost(Integer maxTimeCost) {
    +    this.maxTimeCost = maxTimeCost;
    +  }
    + 
    +}
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImplTest.java
    index 39221eab..bfb8cf58 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImplTest.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImplTest.java
    @@ -1,24 +1,25 @@
     package me.chanjar.weixin.mp.api.impl;
     
    +import java.text.ParseException;
    +import java.text.SimpleDateFormat;
    +import java.util.Date;
    +import java.util.List;
    +
    +import org.testng.Assert;
    +import org.testng.annotations.DataProvider;
    +import org.testng.annotations.Guice;
    +import org.testng.annotations.Test;
    +
     import com.google.inject.Inject;
    +
     import me.chanjar.weixin.common.exception.WxErrorException;
     import me.chanjar.weixin.mp.api.ApiTestModule;
     import me.chanjar.weixin.mp.bean.datacube.WxDataCubeArticleResult;
     import me.chanjar.weixin.mp.bean.datacube.WxDataCubeArticleTotal;
    +import me.chanjar.weixin.mp.bean.datacube.WxDataCubeInterfaceResult;
     import me.chanjar.weixin.mp.bean.datacube.WxDataCubeMsgResult;
     import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserCumulate;
     import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserSummary;
    -import org.testng.Assert;
    -import org.testng.annotations.DataProvider;
    -import org.testng.annotations.Guice;
    -import org.testng.annotations.Test;
    -
    -import static org.junit.Assert.fail;
    -
    -import java.text.ParseException;
    -import java.text.SimpleDateFormat;
    -import java.util.Date;
    -import java.util.List;
     
     /**
      * 测试统计分析相关的接口
    @@ -194,4 +195,20 @@ public class WxMpDataCubeServiceImplTest {
         Assert.assertNotNull(results);
         System.out.println(results);
       }
    +
    +  @Test(dataProvider = "thirtyDays")
    +  public void testGetInterfaceSummary(Date beginDate, Date endDate) throws WxErrorException {
    +    List results = this.wxService.getDataCubeService()
    +        .getInterfaceSummary(beginDate, endDate);
    +    Assert.assertNotNull(results);
    +    System.out.println(results);
    +  }
    +
    +  @Test(dataProvider = "oneDay")
    +  public void testGetInterfaceSummaryHour(Date date) throws WxErrorException {
    +    List results = this.wxService.getDataCubeService()
    +        .getInterfaceSummaryHour(date, date);
    +    Assert.assertNotNull(results);
    +    System.out.println(results);
    +  }
     }
    
    From 5525c4fa27d50c2d588e8ecccb94a462e5fe115a Mon Sep 17 00:00:00 2001
    From: aimil 
    Date: Wed, 31 Aug 2016 17:06:33 +0800
    Subject: [PATCH 45/55] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=89=B9=E9=87=8F?=
     =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E7=94=A8=E6=88=B7=E5=9F=BA=E6=9C=AC=E4=BF=A1?=
     =?UTF-8?q?=E6=81=AF=E5=8A=9F=E8=83=BD=EF=BC=8C=E6=B2=A1=E6=9C=89=E6=B5=8B?=
     =?UTF-8?q?=E8=AF=95=EF=BC=8C=E6=B2=A1=E6=9C=89=E6=B7=BB=E5=8A=A0=E8=B6=85?=
     =?UTF-8?q?=E8=BF=87100=E9=AA=8C=E8=AF=81?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../weixin/mp/api/WxMpUserService.java        |  85 +++--
     .../mp/api/impl/WxMpUserServiceImpl.java      |  75 +++--
     .../chanjar/weixin/mp/bean/WxMpUserQuery.java | 194 ++++++++++++
     .../weixin/mp/bean/result/WxMpUser.java       | 294 ++++++++++--------
     4 files changed, 456 insertions(+), 192 deletions(-)
     create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpUserQuery.java
    
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserService.java
    index a071b0a2..2f6abb61 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserService.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserService.java
    @@ -1,6 +1,9 @@
     package me.chanjar.weixin.mp.api;
     
    +import java.util.List;
    +
     import me.chanjar.weixin.common.exception.WxErrorException;
    +import me.chanjar.weixin.mp.bean.WxMpUserQuery;
     import me.chanjar.weixin.mp.bean.result.WxMpUser;
     import me.chanjar.weixin.mp.bean.result.WxMpUserList;
     
    @@ -11,35 +14,55 @@ import me.chanjar.weixin.mp.bean.result.WxMpUserList;
      */
     public interface WxMpUserService {
     
    -  /**
    -   * 
    -   * 设置用户备注名接口
    -   * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=设置用户备注名接口
    -   * 
    - * - * @param openid 用户openid - * @param remark 备注名 - */ - void userUpdateRemark(String openid, String remark) throws WxErrorException; - - /** - *
    -   * 获取用户基本信息
    -   * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=获取用户基本信息
    -   * 
    - * - * @param openid 用户openid - * @param lang 语言,zh_CN 简体(默认),zh_TW 繁体,en 英语 - */ - WxMpUser userInfo(String openid, String lang) throws WxErrorException; - - /** - *
    -   * 获取关注者列表
    -   * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=获取关注者列表
    -   * 
    - * - * @param next_openid 可选,第一个拉取的OPENID,null为从头开始拉取 - */ - WxMpUserList userList(String next_openid) throws WxErrorException; + /** + *
    +	 * 设置用户备注名接口
    +	 * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=设置用户备注名接口
    +	 * 
    + * + * @param openid 用户openid + * @param remark 备注名 + */ + void userUpdateRemark(String openid, String remark) throws WxErrorException; + + /** + *
    +	 * 获取用户基本信息
    +	 * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=获取用户基本信息
    +	 * 
    + * + * @param openid 用户openid + * @param lang 语言,zh_CN 简体(默认),zh_TW 繁体,en 英语 + */ + WxMpUser userInfo(String openid, String lang) throws WxErrorException; + + /** + *
    +	 * 获取用户基本信息列表
    +	 * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=批量获取用户基本信息
    +	 * 
    + * + * @param openid 用户openid, lang 使用默认(zh_CN 简体) + */ + List userInfoList(List openidList) throws WxErrorException; + + /** + *
    +	 * 获取用户基本信息列表
    +	 * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=批量获取用户基本信息
    +	 * 
    + * + * @param userQuery 详细查询参数 + */ + List userInfoList(WxMpUserQuery userQuery) throws WxErrorException; + + /** + *
    +	 * 获取关注者列表
    +	 * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=获取关注者列表
    +	 * 
    + * + * @param nextOpenid 可选,第一个拉取的OPENID,null为从头开始拉取 + */ + WxMpUserList userList(String nextOpenid) throws WxErrorException; } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImpl.java index c05eeb9f..40321208 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImpl.java @@ -1,5 +1,7 @@ package me.chanjar.weixin.mp.api.impl; +import java.util.List; + import com.google.gson.JsonObject; import me.chanjar.weixin.common.exception.WxErrorException; @@ -7,6 +9,7 @@ import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor; import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor; import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.api.WxMpUserService; +import me.chanjar.weixin.mp.bean.WxMpUserQuery; import me.chanjar.weixin.mp.bean.result.WxMpUser; import me.chanjar.weixin.mp.bean.result.WxMpUserList; @@ -14,35 +17,47 @@ import me.chanjar.weixin.mp.bean.result.WxMpUserList; * Created by Binary Wang on 2016/7/21. */ public class WxMpUserServiceImpl implements WxMpUserService { - private static final String API_URL_PREFIX = "https://api.weixin.qq.com/cgi-bin/user"; - private WxMpService wxMpService; - - public WxMpUserServiceImpl(WxMpService wxMpService) { - this.wxMpService = wxMpService; - } - - @Override - public void userUpdateRemark(String openid, String remark) throws WxErrorException { - String url = API_URL_PREFIX + "/info/updateremark"; - JsonObject json = new JsonObject(); - json.addProperty("openid", openid); - json.addProperty("remark", remark); - this.wxMpService.execute(new SimplePostRequestExecutor(), url, json.toString()); - } - - @Override - public WxMpUser userInfo(String openid, String lang) throws WxErrorException { - String url = API_URL_PREFIX + "/info"; - lang = lang == null ? "zh_CN" : lang; - String responseContent = this.wxMpService.execute(new SimpleGetRequestExecutor(), url, "openid=" + openid + "&lang=" + lang); - return WxMpUser.fromJson(responseContent); - } - - @Override - public WxMpUserList userList(String next_openid) throws WxErrorException { - String url = API_URL_PREFIX + "/get"; - String responseContent = this.wxMpService.execute(new SimpleGetRequestExecutor(), url, next_openid == null ? null : "next_openid=" + next_openid); - return WxMpUserList.fromJson(responseContent); - } + private static final String API_URL_PREFIX = "https://api.weixin.qq.com/cgi-bin/user"; + private WxMpService wxMpService; + + public WxMpUserServiceImpl(WxMpService wxMpService) { + this.wxMpService = wxMpService; + } + + @Override + public void userUpdateRemark(String openid, String remark) throws WxErrorException { + String url = API_URL_PREFIX + "/info/updateremark"; + JsonObject json = new JsonObject(); + json.addProperty("openid", openid); + json.addProperty("remark", remark); + this.wxMpService.execute(new SimplePostRequestExecutor(), url, json.toString()); + } + + @Override + public WxMpUser userInfo(String openid, String lang) throws WxErrorException { + String url = API_URL_PREFIX + "/info"; + lang = lang == null ? "zh_CN" : lang; + String responseContent = this.wxMpService.execute(new SimpleGetRequestExecutor(), url, "openid=" + openid + "&lang=" + lang); + return WxMpUser.fromJson(responseContent); + } + + @Override + public WxMpUserList userList(String next_openid) throws WxErrorException { + String url = API_URL_PREFIX + "/get"; + String responseContent = this.wxMpService.execute(new SimpleGetRequestExecutor(), url, next_openid == null ? null : "next_openid=" + next_openid); + return WxMpUserList.fromJson(responseContent); + } + + @Override + public List userInfoList(List openidList) throws WxErrorException { + return userInfoList(new WxMpUserQuery(openidList)); + } + + @Override + public List userInfoList(WxMpUserQuery userQuery) throws WxErrorException { + String url = API_URL_PREFIX + "/info/batchget"; + String responseContent = this.wxMpService.execute(new SimpleGetRequestExecutor(), url, userQuery.toJsonString()); + return WxMpUser.fromJsonList(responseContent); + } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpUserQuery.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpUserQuery.java new file mode 100644 index 00000000..22f63ae8 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpUserQuery.java @@ -0,0 +1,194 @@ +package me.chanjar.weixin.mp.bean; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.google.gson.Gson; + +/** + * 批量查询用户信息查询参数
    + * Created by LiuJunGuang on 2016/8/31. + * + * @author LiuJunGuang + */ +public class WxMpUserQuery { + private List queryParamList = new ArrayList<>(); + + public WxMpUserQuery() { + super(); + } + + /** + * 语言使用默认(zh_CN) + * + * @description + * @param openIdList + */ + public WxMpUserQuery(List openIdList) { + super(); + add(openIdList); + } + + /** + * 添加OpenId列表,语言使用默认(zh_CN) + * + * @param openIdList + * @return {@link WxMpUserQuery} + */ + public WxMpUserQuery add(List openIdList) { + for (String openId : openIdList) { + this.add(openId); + } + return this; + } + + /** + * 添加一个OpenId + * + * @param openId + * @param lang 国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语 + * @return {@link WxMpUserQuery} + */ + public WxMpUserQuery add(String openId, String lang) { + queryParamList.add(new WxMpUserQueryParam(openId, lang)); + return this; + } + + /** + * 添加一个OpenId到列表中,并返回本对象 + * + *
    +	 * 该方法默认lang = zh_CN
    +	 * 
    + * + * @param openId + * @return {@link WxMpUserQuery} + */ + public WxMpUserQuery add(String openId) { + queryParamList.add(new WxMpUserQueryParam(openId)); + return this; + } + + /** + * 删除指定的OpenId,语言使用默认(zh_CN) + * + * @param openId + * @return {@link WxMpUserQuery} + */ + public WxMpUserQuery remove(String openId) { + queryParamList.remove(new WxMpUserQueryParam(openId)); + return this; + } + + /** + * 删除指定的OpenId + * + * @param openId + * @param lang 国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语 + * @return {@link WxMpUserQuery} + */ + public WxMpUserQuery remove(String openId, String lang) { + queryParamList.remove(new WxMpUserQueryParam(openId, lang)); + return this; + } + + /** + * 获取查询参数列表 + * + * @return + */ + public List getQueryParamList() { + return queryParamList; + } + + public String toJsonString() { + Map map = new HashMap<>(); + map.put("user_list", queryParamList); + return new Gson().toJson(map); + } + + // 查询参数封装 + public class WxMpUserQueryParam implements Serializable { + /** + * @fields serialVersionUID + */ + private static final long serialVersionUID = -6863571795702385319L; + private String openid; + private String lang; + + public WxMpUserQueryParam(String openid, String lang) { + super(); + this.openid = openid; + this.lang = lang; + } + + public WxMpUserQueryParam(String openid) { + super(); + this.openid = openid; + this.lang = "zh_CN"; + } + + public WxMpUserQueryParam() { + super(); + } + + public String getOpenid() { + return openid; + } + + public void setOpenid(String openid) { + this.openid = openid; + } + + public String getLang() { + return lang; + } + + public void setLang(String lang) { + this.lang = lang; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + getOuterType().hashCode(); + result = prime * result + ((lang == null) ? 0 : lang.hashCode()); + result = prime * result + ((openid == null) ? 0 : openid.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + WxMpUserQueryParam other = (WxMpUserQueryParam) obj; + if (!getOuterType().equals(other.getOuterType())) + return false; + if (lang == null) { + if (other.lang != null) + return false; + } else if (!lang.equals(other.lang)) + return false; + if (openid == null) { + if (other.openid != null) + return false; + } else if (!openid.equals(other.openid)) + return false; + return true; + } + + private WxMpUserQuery getOuterType() { + return WxMpUserQuery.this; + } + + } + +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUser.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUser.java index 29c6415f..2a139527 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUser.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUser.java @@ -1,143 +1,175 @@ package me.chanjar.weixin.mp.bean.result; -import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; - import java.io.Serializable; +import java.lang.reflect.Type; +import java.util.List; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.reflect.TypeToken; + +import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; /** * 微信用户信息 + * * @author chanjarster * */ public class WxMpUser implements Serializable { - protected Boolean subscribe; - protected String openId; - protected String nickname; - protected String sex; - protected String language; - protected String city; - protected String province; - protected String country; - protected String headImgUrl; - protected Long subscribeTime; - protected String unionId; - protected Integer sexId; - protected String remark; - protected Integer groupId; - - public Boolean getSubscribe() { - return subscribe; - } - public Boolean isSubscribe() { - return subscribe; - } - public void setSubscribe(Boolean subscribe) { - this.subscribe = subscribe; - } - public String getOpenId() { - return openId; - } - public void setOpenId(String openId) { - this.openId = openId; - } - public String getNickname() { - return nickname; - } - public void setNickname(String nickname) { - this.nickname = nickname; - } - public String getSex() { - return sex; - } - public void setSex(String sex) { - this.sex = sex; - } - public String getLanguage() { - return language; - } - public void setLanguage(String language) { - this.language = language; - } - public String getCity() { - return city; - } - public void setCity(String city) { - this.city = city; - } - public String getProvince() { - return province; - } - public void setProvince(String province) { - this.province = province; - } - public String getCountry() { - return country; - } - public void setCountry(String country) { - this.country = country; - } - public String getHeadImgUrl() { - return headImgUrl; - } - public void setHeadImgUrl(String headImgUrl) { - this.headImgUrl = headImgUrl; - } - public Long getSubscribeTime() { - return subscribeTime; - } - public void setSubscribeTime(Long subscribeTime) { - this.subscribeTime = subscribeTime; - } - public String getUnionId() { - return unionId; - } - public void setUnionId(String unionId) { - this.unionId = unionId; - } - - public Integer getSexId() { - - return sexId; - } - - public void setSexId(Integer sexId) { - this.sexId = sexId; - } - - public String getRemark() { - return remark; - } - public void setRemark(String remark) { - this.remark = remark; - } - public Integer getGroupId() { - return groupId; - } - public void setGroupId(Integer groupId) { - this.groupId = groupId; - } - - public static WxMpUser fromJson(String json) { - return WxMpGsonBuilder.INSTANCE.create().fromJson(json, WxMpUser.class); - } - - @Override - public String toString() { - return "WxMpUser{" + - "subscribe=" + subscribe + - ", openId='" + openId + '\'' + - ", nickname='" + nickname + '\'' + - ", sex='" + sex + '\'' + - ", language='" + language + '\'' + - ", city='" + city + '\'' + - ", province='" + province + '\'' + - ", country='" + country + '\'' + - ", headImgUrl='" + headImgUrl + '\'' + - ", subscribeTime=" + subscribeTime + - ", unionId='" + unionId + '\'' + - ", remark='" + remark + '\'' + - ", groupId='" + groupId + '\'' + - '}'; - } + /** + * @fields serialVersionUID + */ + private static final long serialVersionUID = 5788154322646488738L; + protected Boolean subscribe; + protected String openId; + protected String nickname; + protected String sex; + protected String language; + protected String city; + protected String province; + protected String country; + protected String headImgUrl; + protected Long subscribeTime; + protected String unionId; + protected Integer sexId; + protected String remark; + protected Integer groupId; + + public Boolean getSubscribe() { + return subscribe; + } + + public Boolean isSubscribe() { + return subscribe; + } + + public void setSubscribe(Boolean subscribe) { + this.subscribe = subscribe; + } + + public String getOpenId() { + return openId; + } + + public void setOpenId(String openId) { + this.openId = openId; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public String getLanguage() { + return language; + } + + public void setLanguage(String language) { + this.language = language; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public String getCountry() { + return country; + } + + public void setCountry(String country) { + this.country = country; + } + + public String getHeadImgUrl() { + return headImgUrl; + } + + public void setHeadImgUrl(String headImgUrl) { + this.headImgUrl = headImgUrl; + } + + public Long getSubscribeTime() { + return subscribeTime; + } + + public void setSubscribeTime(Long subscribeTime) { + this.subscribeTime = subscribeTime; + } + + public String getUnionId() { + return unionId; + } + + public void setUnionId(String unionId) { + this.unionId = unionId; + } + + public Integer getSexId() { + + return sexId; + } + + public void setSexId(Integer sexId) { + this.sexId = sexId; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Integer getGroupId() { + return groupId; + } + + public void setGroupId(Integer groupId) { + this.groupId = groupId; + } + + public static WxMpUser fromJson(String json) { + return WxMpGsonBuilder.INSTANCE.create().fromJson(json, WxMpUser.class); + } + + public static List fromJsonList(String json) { + Type collectionType = new TypeToken>() { + }.getType(); + Gson gson = WxMpGsonBuilder.INSTANCE.create(); + JsonObject jsonObject = gson.fromJson(json, JsonObject.class); + return gson.fromJson(jsonObject.get("user_info_list"), collectionType); + } + + @Override + public String toString() { + return "WxMpUser{" + "subscribe=" + subscribe + ", openId='" + openId + '\'' + ", nickname='" + nickname + '\'' + ", sex='" + sex + '\'' + ", language='" + language + '\'' + + ", city='" + city + '\'' + ", province='" + province + '\'' + ", country='" + country + '\'' + ", headImgUrl='" + headImgUrl + '\'' + ", subscribeTime=" + subscribeTime + + ", unionId='" + unionId + '\'' + ", remark='" + remark + '\'' + ", groupId='" + groupId + '\'' + '}'; + } } From 4047f6dbd681e1167fd981325bbfa6dd2fb6dcb3 Mon Sep 17 00:00:00 2001 From: aimil Date: Wed, 31 Aug 2016 17:33:09 +0800 Subject: [PATCH 46/55] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E4=BD=BF=E7=94=A8=E4=B8=A4=E4=B8=AA=E7=A9=BA?= =?UTF-8?q?=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/mp/api/WxMpUserService.java | 94 ++--- .../mp/api/impl/WxMpUserServiceImpl.java | 84 ++--- .../chanjar/weixin/mp/bean/WxMpUserQuery.java | 350 +++++++++--------- .../weixin/mp/bean/result/WxMpUser.java | 295 +++++++-------- 4 files changed, 404 insertions(+), 419 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserService.java index 2f6abb61..22629d83 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserService.java @@ -14,55 +14,55 @@ import me.chanjar.weixin.mp.bean.result.WxMpUserList; */ public interface WxMpUserService { - /** - *
    -	 * 设置用户备注名接口
    -	 * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=设置用户备注名接口
    -	 * 
    - * - * @param openid 用户openid - * @param remark 备注名 - */ - void userUpdateRemark(String openid, String remark) throws WxErrorException; + /** + *
    +   * 设置用户备注名接口
    +   * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=设置用户备注名接口
    +   * 
    + * + * @param openid 用户openid + * @param remark 备注名 + */ + void userUpdateRemark(String openid, String remark) throws WxErrorException; - /** - *
    -	 * 获取用户基本信息
    -	 * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=获取用户基本信息
    -	 * 
    - * - * @param openid 用户openid - * @param lang 语言,zh_CN 简体(默认),zh_TW 繁体,en 英语 - */ - WxMpUser userInfo(String openid, String lang) throws WxErrorException; + /** + *
    +   * 获取用户基本信息
    +   * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=获取用户基本信息
    +   * 
    + * + * @param openid 用户openid + * @param lang 语言,zh_CN 简体(默认),zh_TW 繁体,en 英语 + */ + WxMpUser userInfo(String openid, String lang) throws WxErrorException; - /** - *
    -	 * 获取用户基本信息列表
    -	 * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=批量获取用户基本信息
    -	 * 
    - * - * @param openid 用户openid, lang 使用默认(zh_CN 简体) - */ - List userInfoList(List openidList) throws WxErrorException; + /** + *
    +   * 获取用户基本信息列表
    +   * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=批量获取用户基本信息
    +   * 
    + * + * @param openid 用户openid, lang 使用默认(zh_CN 简体) + */ + List userInfoList(List openidList) throws WxErrorException; - /** - *
    -	 * 获取用户基本信息列表
    -	 * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=批量获取用户基本信息
    -	 * 
    - * - * @param userQuery 详细查询参数 - */ - List userInfoList(WxMpUserQuery userQuery) throws WxErrorException; + /** + *
    +   * 获取用户基本信息列表
    +   * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=批量获取用户基本信息
    +   * 
    + * + * @param userQuery 详细查询参数 + */ + List userInfoList(WxMpUserQuery userQuery) throws WxErrorException; - /** - *
    -	 * 获取关注者列表
    -	 * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=获取关注者列表
    -	 * 
    - * - * @param nextOpenid 可选,第一个拉取的OPENID,null为从头开始拉取 - */ - WxMpUserList userList(String nextOpenid) throws WxErrorException; + /** + *
    +   * 获取关注者列表
    +   * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=获取关注者列表
    +   * 
    + * + * @param nextOpenid 可选,第一个拉取的OPENID,null为从头开始拉取 + */ + WxMpUserList userList(String nextOpenid) throws WxErrorException; } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImpl.java index 40321208..995eb58a 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImpl.java @@ -17,47 +17,47 @@ import me.chanjar.weixin.mp.bean.result.WxMpUserList; * Created by Binary Wang on 2016/7/21. */ public class WxMpUserServiceImpl implements WxMpUserService { - private static final String API_URL_PREFIX = "https://api.weixin.qq.com/cgi-bin/user"; - private WxMpService wxMpService; - - public WxMpUserServiceImpl(WxMpService wxMpService) { - this.wxMpService = wxMpService; - } - - @Override - public void userUpdateRemark(String openid, String remark) throws WxErrorException { - String url = API_URL_PREFIX + "/info/updateremark"; - JsonObject json = new JsonObject(); - json.addProperty("openid", openid); - json.addProperty("remark", remark); - this.wxMpService.execute(new SimplePostRequestExecutor(), url, json.toString()); - } - - @Override - public WxMpUser userInfo(String openid, String lang) throws WxErrorException { - String url = API_URL_PREFIX + "/info"; - lang = lang == null ? "zh_CN" : lang; - String responseContent = this.wxMpService.execute(new SimpleGetRequestExecutor(), url, "openid=" + openid + "&lang=" + lang); - return WxMpUser.fromJson(responseContent); - } - - @Override - public WxMpUserList userList(String next_openid) throws WxErrorException { - String url = API_URL_PREFIX + "/get"; - String responseContent = this.wxMpService.execute(new SimpleGetRequestExecutor(), url, next_openid == null ? null : "next_openid=" + next_openid); - return WxMpUserList.fromJson(responseContent); - } - - @Override - public List userInfoList(List openidList) throws WxErrorException { - return userInfoList(new WxMpUserQuery(openidList)); - } - - @Override - public List userInfoList(WxMpUserQuery userQuery) throws WxErrorException { - String url = API_URL_PREFIX + "/info/batchget"; - String responseContent = this.wxMpService.execute(new SimpleGetRequestExecutor(), url, userQuery.toJsonString()); - return WxMpUser.fromJsonList(responseContent); - } + private static final String API_URL_PREFIX = "https://api.weixin.qq.com/cgi-bin/user"; + private WxMpService wxMpService; + + public WxMpUserServiceImpl(WxMpService wxMpService) { + this.wxMpService = wxMpService; + } + + @Override + public void userUpdateRemark(String openid, String remark) throws WxErrorException { + String url = API_URL_PREFIX + "/info/updateremark"; + JsonObject json = new JsonObject(); + json.addProperty("openid", openid); + json.addProperty("remark", remark); + this.wxMpService.execute(new SimplePostRequestExecutor(), url, json.toString()); + } + + @Override + public WxMpUser userInfo(String openid, String lang) throws WxErrorException { + String url = API_URL_PREFIX + "/info"; + lang = lang == null ? "zh_CN" : lang; + String responseContent = this.wxMpService.execute(new SimpleGetRequestExecutor(), url, "openid=" + openid + "&lang=" + lang); + return WxMpUser.fromJson(responseContent); + } + + @Override + public WxMpUserList userList(String next_openid) throws WxErrorException { + String url = API_URL_PREFIX + "/get"; + String responseContent = this.wxMpService.execute(new SimpleGetRequestExecutor(), url, next_openid == null ? null : "next_openid=" + next_openid); + return WxMpUserList.fromJson(responseContent); + } + + @Override + public List userInfoList(List openidList) throws WxErrorException { + return userInfoList(new WxMpUserQuery(openidList)); + } + + @Override + public List userInfoList(WxMpUserQuery userQuery) throws WxErrorException { + String url = API_URL_PREFIX + "/info/batchget"; + String responseContent = this.wxMpService.execute(new SimpleGetRequestExecutor(), url, userQuery.toJsonString()); + return WxMpUser.fromJsonList(responseContent); + } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpUserQuery.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpUserQuery.java index 22f63ae8..c33b9569 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpUserQuery.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpUserQuery.java @@ -15,180 +15,180 @@ import com.google.gson.Gson; * @author LiuJunGuang */ public class WxMpUserQuery { - private List queryParamList = new ArrayList<>(); - - public WxMpUserQuery() { - super(); - } - - /** - * 语言使用默认(zh_CN) - * - * @description - * @param openIdList - */ - public WxMpUserQuery(List openIdList) { - super(); - add(openIdList); - } - - /** - * 添加OpenId列表,语言使用默认(zh_CN) - * - * @param openIdList - * @return {@link WxMpUserQuery} - */ - public WxMpUserQuery add(List openIdList) { - for (String openId : openIdList) { - this.add(openId); - } - return this; - } - - /** - * 添加一个OpenId - * - * @param openId - * @param lang 国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语 - * @return {@link WxMpUserQuery} - */ - public WxMpUserQuery add(String openId, String lang) { - queryParamList.add(new WxMpUserQueryParam(openId, lang)); - return this; - } - - /** - * 添加一个OpenId到列表中,并返回本对象 - * - *
    -	 * 该方法默认lang = zh_CN
    -	 * 
    - * - * @param openId - * @return {@link WxMpUserQuery} - */ - public WxMpUserQuery add(String openId) { - queryParamList.add(new WxMpUserQueryParam(openId)); - return this; - } - - /** - * 删除指定的OpenId,语言使用默认(zh_CN) - * - * @param openId - * @return {@link WxMpUserQuery} - */ - public WxMpUserQuery remove(String openId) { - queryParamList.remove(new WxMpUserQueryParam(openId)); - return this; - } - - /** - * 删除指定的OpenId - * - * @param openId - * @param lang 国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语 - * @return {@link WxMpUserQuery} - */ - public WxMpUserQuery remove(String openId, String lang) { - queryParamList.remove(new WxMpUserQueryParam(openId, lang)); - return this; - } - - /** - * 获取查询参数列表 - * - * @return - */ - public List getQueryParamList() { - return queryParamList; - } - - public String toJsonString() { - Map map = new HashMap<>(); - map.put("user_list", queryParamList); - return new Gson().toJson(map); - } - - // 查询参数封装 - public class WxMpUserQueryParam implements Serializable { - /** - * @fields serialVersionUID - */ - private static final long serialVersionUID = -6863571795702385319L; - private String openid; - private String lang; - - public WxMpUserQueryParam(String openid, String lang) { - super(); - this.openid = openid; - this.lang = lang; - } - - public WxMpUserQueryParam(String openid) { - super(); - this.openid = openid; - this.lang = "zh_CN"; - } - - public WxMpUserQueryParam() { - super(); - } - - public String getOpenid() { - return openid; - } - - public void setOpenid(String openid) { - this.openid = openid; - } - - public String getLang() { - return lang; - } - - public void setLang(String lang) { - this.lang = lang; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + getOuterType().hashCode(); - result = prime * result + ((lang == null) ? 0 : lang.hashCode()); - result = prime * result + ((openid == null) ? 0 : openid.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - WxMpUserQueryParam other = (WxMpUserQueryParam) obj; - if (!getOuterType().equals(other.getOuterType())) - return false; - if (lang == null) { - if (other.lang != null) - return false; - } else if (!lang.equals(other.lang)) - return false; - if (openid == null) { - if (other.openid != null) - return false; - } else if (!openid.equals(other.openid)) - return false; - return true; - } - - private WxMpUserQuery getOuterType() { - return WxMpUserQuery.this; - } - - } + private List queryParamList = new ArrayList<>(); + + public WxMpUserQuery() { + super(); + } + + /** + * 语言使用默认(zh_CN) + * + * @description + * @param openIdList + */ + public WxMpUserQuery(List openIdList) { + super(); + add(openIdList); + } + + /** + * 添加OpenId列表,语言使用默认(zh_CN) + * + * @param openIdList + * @return {@link WxMpUserQuery} + */ + public WxMpUserQuery add(List openIdList) { + for (String openId : openIdList) { + this.add(openId); + } + return this; + } + + /** + * 添加一个OpenId + * + * @param openId + * @param lang 国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语 + * @return {@link WxMpUserQuery} + */ + public WxMpUserQuery add(String openId, String lang) { + queryParamList.add(new WxMpUserQueryParam(openId, lang)); + return this; + } + + /** + * 添加一个OpenId到列表中,并返回本对象 + * + *
    +   * 该方法默认lang = zh_CN
    +   * 
    + * + * @param openId + * @return {@link WxMpUserQuery} + */ + public WxMpUserQuery add(String openId) { + queryParamList.add(new WxMpUserQueryParam(openId)); + return this; + } + + /** + * 删除指定的OpenId,语言使用默认(zh_CN) + * + * @param openId + * @return {@link WxMpUserQuery} + */ + public WxMpUserQuery remove(String openId) { + queryParamList.remove(new WxMpUserQueryParam(openId)); + return this; + } + + /** + * 删除指定的OpenId + * + * @param openId + * @param lang 国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语 + * @return {@link WxMpUserQuery} + */ + public WxMpUserQuery remove(String openId, String lang) { + queryParamList.remove(new WxMpUserQueryParam(openId, lang)); + return this; + } + + /** + * 获取查询参数列表 + * + * @return + */ + public List getQueryParamList() { + return queryParamList; + } + + public String toJsonString() { + Map map = new HashMap<>(); + map.put("user_list", queryParamList); + return new Gson().toJson(map); + } + + // 查询参数封装 + public class WxMpUserQueryParam implements Serializable { + /** + * @fields serialVersionUID + */ + private static final long serialVersionUID = -6863571795702385319L; + private String openid; + private String lang; + + public WxMpUserQueryParam(String openid, String lang) { + super(); + this.openid = openid; + this.lang = lang; + } + + public WxMpUserQueryParam(String openid) { + super(); + this.openid = openid; + this.lang = "zh_CN"; + } + + public WxMpUserQueryParam() { + super(); + } + + public String getOpenid() { + return openid; + } + + public void setOpenid(String openid) { + this.openid = openid; + } + + public String getLang() { + return lang; + } + + public void setLang(String lang) { + this.lang = lang; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + getOuterType().hashCode(); + result = prime * result + ((lang == null) ? 0 : lang.hashCode()); + result = prime * result + ((openid == null) ? 0 : openid.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + WxMpUserQueryParam other = (WxMpUserQueryParam) obj; + if (!getOuterType().equals(other.getOuterType())) + return false; + if (lang == null) { + if (other.lang != null) + return false; + } else if (!lang.equals(other.lang)) + return false; + if (openid == null) { + if (other.openid != null) + return false; + } else if (!openid.equals(other.openid)) + return false; + return true; + } + + private WxMpUserQuery getOuterType() { + return WxMpUserQuery.this; + } + + } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUser.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUser.java index 2a139527..e0e34228 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUser.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUser.java @@ -12,164 +12,149 @@ import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; /** * 微信用户信息 - * * @author chanjarster * */ public class WxMpUser implements Serializable { - /** - * @fields serialVersionUID - */ - private static final long serialVersionUID = 5788154322646488738L; - protected Boolean subscribe; - protected String openId; - protected String nickname; - protected String sex; - protected String language; - protected String city; - protected String province; - protected String country; - protected String headImgUrl; - protected Long subscribeTime; - protected String unionId; - protected Integer sexId; - protected String remark; - protected Integer groupId; - - public Boolean getSubscribe() { - return subscribe; - } - - public Boolean isSubscribe() { - return subscribe; - } - - public void setSubscribe(Boolean subscribe) { - this.subscribe = subscribe; - } - - public String getOpenId() { - return openId; - } - - public void setOpenId(String openId) { - this.openId = openId; - } - - public String getNickname() { - return nickname; - } - - public void setNickname(String nickname) { - this.nickname = nickname; - } - - public String getSex() { - return sex; - } - - public void setSex(String sex) { - this.sex = sex; - } - - public String getLanguage() { - return language; - } - - public void setLanguage(String language) { - this.language = language; - } - - public String getCity() { - return city; - } - - public void setCity(String city) { - this.city = city; - } - - public String getProvince() { - return province; - } - - public void setProvince(String province) { - this.province = province; - } - - public String getCountry() { - return country; - } - - public void setCountry(String country) { - this.country = country; - } - - public String getHeadImgUrl() { - return headImgUrl; - } - - public void setHeadImgUrl(String headImgUrl) { - this.headImgUrl = headImgUrl; - } - - public Long getSubscribeTime() { - return subscribeTime; - } - - public void setSubscribeTime(Long subscribeTime) { - this.subscribeTime = subscribeTime; - } - - public String getUnionId() { - return unionId; - } - - public void setUnionId(String unionId) { - this.unionId = unionId; - } - - public Integer getSexId() { - - return sexId; - } - - public void setSexId(Integer sexId) { - this.sexId = sexId; - } - - public String getRemark() { - return remark; - } - - public void setRemark(String remark) { - this.remark = remark; - } - - public Integer getGroupId() { - return groupId; - } - - public void setGroupId(Integer groupId) { - this.groupId = groupId; - } - - public static WxMpUser fromJson(String json) { - return WxMpGsonBuilder.INSTANCE.create().fromJson(json, WxMpUser.class); - } - - public static List fromJsonList(String json) { - Type collectionType = new TypeToken>() { - }.getType(); - Gson gson = WxMpGsonBuilder.INSTANCE.create(); - JsonObject jsonObject = gson.fromJson(json, JsonObject.class); - return gson.fromJson(jsonObject.get("user_info_list"), collectionType); - } - - @Override - public String toString() { - return "WxMpUser{" + "subscribe=" + subscribe + ", openId='" + openId + '\'' + ", nickname='" + nickname + '\'' + ", sex='" + sex + '\'' + ", language='" + language + '\'' - + ", city='" + city + '\'' + ", province='" + province + '\'' + ", country='" + country + '\'' + ", headImgUrl='" + headImgUrl + '\'' + ", subscribeTime=" + subscribeTime - + ", unionId='" + unionId + '\'' + ", remark='" + remark + '\'' + ", groupId='" + groupId + '\'' + '}'; - } + /** + * @fields serialVersionUID + */ + private static final long serialVersionUID = 5788154322646488738L; + protected Boolean subscribe; + protected String openId; + protected String nickname; + protected String sex; + protected String language; + protected String city; + protected String province; + protected String country; + protected String headImgUrl; + protected Long subscribeTime; + protected String unionId; + protected Integer sexId; + protected String remark; + protected Integer groupId; + + public Boolean getSubscribe() { + return subscribe; + } + public Boolean isSubscribe() { + return subscribe; + } + public void setSubscribe(Boolean subscribe) { + this.subscribe = subscribe; + } + public String getOpenId() { + return openId; + } + public void setOpenId(String openId) { + this.openId = openId; + } + public String getNickname() { + return nickname; + } + public void setNickname(String nickname) { + this.nickname = nickname; + } + public String getSex() { + return sex; + } + public void setSex(String sex) { + this.sex = sex; + } + public String getLanguage() { + return language; + } + public void setLanguage(String language) { + this.language = language; + } + public String getCity() { + return city; + } + public void setCity(String city) { + this.city = city; + } + public String getProvince() { + return province; + } + public void setProvince(String province) { + this.province = province; + } + public String getCountry() { + return country; + } + public void setCountry(String country) { + this.country = country; + } + public String getHeadImgUrl() { + return headImgUrl; + } + public void setHeadImgUrl(String headImgUrl) { + this.headImgUrl = headImgUrl; + } + public Long getSubscribeTime() { + return subscribeTime; + } + public void setSubscribeTime(Long subscribeTime) { + this.subscribeTime = subscribeTime; + } + public String getUnionId() { + return unionId; + } + public void setUnionId(String unionId) { + this.unionId = unionId; + } + + public Integer getSexId() { + + return sexId; + } + + public void setSexId(Integer sexId) { + this.sexId = sexId; + } + + public String getRemark() { + return remark; + } + public void setRemark(String remark) { + this.remark = remark; + } + public Integer getGroupId() { + return groupId; + } + public void setGroupId(Integer groupId) { + this.groupId = groupId; + } + + public static WxMpUser fromJson(String json) { + return WxMpGsonBuilder.INSTANCE.create().fromJson(json, WxMpUser.class); + } + + public static List fromJsonList(String json) { + Type collectionType = new TypeToken>() {}.getType(); + Gson gson = WxMpGsonBuilder.INSTANCE.create(); + JsonObject jsonObject = gson.fromJson(json, JsonObject.class); + return gson.fromJson(jsonObject.get("user_info_list"), collectionType); + } + + @Override + public String toString() { + return "WxMpUser{" + + "subscribe=" + subscribe + + ", openId='" + openId + '\'' + + ", nickname='" + nickname + '\'' + + ", sex='" + sex + '\'' + + ", language='" + language + '\'' + + ", city='" + city + '\'' + + ", province='" + province + '\'' + + ", country='" + country + '\'' + + ", headImgUrl='" + headImgUrl + '\'' + + ", subscribeTime=" + subscribeTime + + ", unionId='" + unionId + '\'' + + ", remark='" + remark + '\'' + + ", groupId='" + groupId + '\'' + + '}'; + } } From 473feaf3b7b85e4f06aeb51565dce563fc9c5d86 Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Wed, 31 Aug 2016 19:03:39 +0800 Subject: [PATCH 47/55] fix javadoc --- .../main/java/me/chanjar/weixin/mp/api/WxMpUserService.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserService.java index 22629d83..deaf85ab 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserService.java @@ -1,12 +1,12 @@ package me.chanjar.weixin.mp.api; -import java.util.List; - import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.mp.bean.WxMpUserQuery; import me.chanjar.weixin.mp.bean.result.WxMpUser; import me.chanjar.weixin.mp.bean.result.WxMpUserList; +import java.util.List; + /** * 用户管理和统计相关操作接口 * @@ -42,7 +42,7 @@ public interface WxMpUserService { * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=批量获取用户基本信息 *
    * - * @param openid 用户openid, lang 使用默认(zh_CN 简体) + * @param openidList 用户openid列表 */ List userInfoList(List openidList) throws WxErrorException; From 76e1da564a57942323c1480d8baa0f3f66f3b010 Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Wed, 31 Aug 2016 19:04:10 +0800 Subject: [PATCH 48/55] add missing @Override annotation --- .../me/chanjar/weixin/mp/api/WxMpInMemoryConfigStorage.java | 4 ++++ .../main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java | 1 + .../me/chanjar/weixin/mp/bean/custombuilder/ImageBuilder.java | 1 + .../me/chanjar/weixin/mp/bean/custombuilder/MusicBuilder.java | 1 + .../me/chanjar/weixin/mp/bean/custombuilder/NewsBuilder.java | 1 + .../me/chanjar/weixin/mp/bean/custombuilder/TextBuilder.java | 1 + .../me/chanjar/weixin/mp/bean/custombuilder/VideoBuilder.java | 1 + .../me/chanjar/weixin/mp/bean/custombuilder/VoiceBuilder.java | 1 + .../me/chanjar/weixin/mp/bean/outxmlbuilder/ImageBuilder.java | 1 + .../me/chanjar/weixin/mp/bean/outxmlbuilder/MusicBuilder.java | 1 + .../me/chanjar/weixin/mp/bean/outxmlbuilder/NewsBuilder.java | 1 + .../me/chanjar/weixin/mp/bean/outxmlbuilder/TextBuilder.java | 1 + .../me/chanjar/weixin/mp/bean/outxmlbuilder/VideoBuilder.java | 1 + .../me/chanjar/weixin/mp/bean/outxmlbuilder/VoiceBuilder.java | 1 + .../weixin/mp/util/http/MaterialDeleteRequestExecutor.java | 1 + .../weixin/mp/util/http/MaterialNewsInfoRequestExecutor.java | 1 + .../weixin/mp/util/http/MaterialVideoInfoRequestExecutor.java | 1 + .../http/MaterialVoiceAndImageDownloadRequestExecutor.java | 1 + .../weixin/mp/util/json/WxMpCustomMessageGsonAdapter.java | 1 + .../me/chanjar/weixin/mp/util/json/WxMpGroupGsonAdapter.java | 2 ++ .../weixin/mp/util/json/WxMpMassGroupMessageGsonAdapter.java | 1 + .../weixin/mp/util/json/WxMpMassNewsArticleGsonAdapter.java | 2 ++ .../chanjar/weixin/mp/util/json/WxMpMassNewsGsonAdapter.java | 2 ++ .../mp/util/json/WxMpMassOpenIdsMessageGsonAdapter.java | 1 + .../weixin/mp/util/json/WxMpMassSendResultAdapter.java | 1 + .../weixin/mp/util/json/WxMpMassUploadResultAdapter.java | 1 + .../me/chanjar/weixin/mp/util/json/WxMpMassVideoAdapter.java | 1 + .../mp/util/json/WxMpMaterialArticleUpdateGsonAdapter.java | 1 + .../weixin/mp/util/json/WxMpMaterialCountResultAdapter.java | 1 + .../mp/util/json/WxMpMaterialFileBatchGetGsonAdapter.java | 1 + .../mp/util/json/WxMpMaterialFileBatchGetGsonItemAdapter.java | 1 + .../mp/util/json/WxMpMaterialNewsArticleGsonAdapter.java | 2 ++ .../mp/util/json/WxMpMaterialNewsBatchGetGsonAdapter.java | 1 + .../mp/util/json/WxMpMaterialNewsBatchGetGsonItemAdapter.java | 1 + .../weixin/mp/util/json/WxMpMaterialNewsGsonAdapter.java | 2 ++ .../weixin/mp/util/json/WxMpMaterialUploadResultAdapter.java | 1 + .../mp/util/json/WxMpMaterialVideoInfoResultAdapter.java | 1 + .../weixin/mp/util/json/WxMpOAuth2AccessTokenAdapter.java | 1 + .../weixin/mp/util/json/WxMpSemanticQueryResultAdapter.java | 1 + .../weixin/mp/util/json/WxMpTemplateMessageGsonAdapter.java | 1 + .../weixin/mp/util/json/WxMpUserCumulateGsonAdapter.java | 1 + .../me/chanjar/weixin/mp/util/json/WxMpUserGsonAdapter.java | 1 + .../weixin/mp/util/json/WxMpUserSummaryGsonAdapter.java | 1 + .../me/chanjar/weixin/mp/util/json/WxQrCodeTicketAdapter.java | 1 + .../me/chanjar/weixin/mp/util/json/WxUserListGsonAdapter.java | 1 + 45 files changed, 53 insertions(+) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpInMemoryConfigStorage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpInMemoryConfigStorage.java index 885077a3..765f6d53 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpInMemoryConfigStorage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpInMemoryConfigStorage.java @@ -191,6 +191,7 @@ public class WxMpInMemoryConfigStorage implements WxMpConfigStorage { this.oauth2redirectUri = oauth2redirectUri; } + @Override public String getHttpProxyHost() { return this.httpProxyHost; } @@ -199,6 +200,7 @@ public class WxMpInMemoryConfigStorage implements WxMpConfigStorage { this.httpProxyHost = httpProxyHost; } + @Override public int getHttpProxyPort() { return this.httpProxyPort; } @@ -207,6 +209,7 @@ public class WxMpInMemoryConfigStorage implements WxMpConfigStorage { this.httpProxyPort = httpProxyPort; } + @Override public String getHttpProxyUsername() { return this.httpProxyUsername; } @@ -215,6 +218,7 @@ public class WxMpInMemoryConfigStorage implements WxMpConfigStorage { this.httpProxyUsername = httpProxyUsername; } + @Override public String getHttpProxyPassword() { return this.httpProxyPassword; } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java index 1de7ba90..834272cc 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java @@ -161,6 +161,7 @@ public class WxMpMessageRouter { if(rule.isAsync()) { futures.add( executorService.submit(new Runnable() { + @Override public void run() { rule.service(wxMessage, wxMpService, sessionManager, exceptionHandler); } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/ImageBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/ImageBuilder.java index 1c37b46e..1fb5363c 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/ImageBuilder.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/ImageBuilder.java @@ -23,6 +23,7 @@ public final class ImageBuilder extends BaseBuilder { return this; } + @Override public WxMpCustomMessage build() { WxMpCustomMessage m = super.build(); m.setMediaId(this.mediaId); diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/MusicBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/MusicBuilder.java index 5c1abe38..e715aff9 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/MusicBuilder.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/MusicBuilder.java @@ -52,6 +52,7 @@ public final class MusicBuilder extends BaseBuilder { return this; } + @Override public WxMpCustomMessage build() { WxMpCustomMessage m = super.build(); m.setMusicUrl(this.musicUrl); diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/NewsBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/NewsBuilder.java index 825e72f8..bc8adcda 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/NewsBuilder.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/NewsBuilder.java @@ -28,6 +28,7 @@ public final class NewsBuilder extends BaseBuilder { return this; } + @Override public WxMpCustomMessage build() { WxMpCustomMessage m = super.build(); m.setArticles(this.articles); diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/TextBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/TextBuilder.java index 11249d6d..7f458457 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/TextBuilder.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/TextBuilder.java @@ -23,6 +23,7 @@ public final class TextBuilder extends BaseBuilder { return this; } + @Override public WxMpCustomMessage build() { WxMpCustomMessage m = super.build(); m.setContent(this.content); diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/VideoBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/VideoBuilder.java index a871d491..a37713cb 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/VideoBuilder.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/VideoBuilder.java @@ -47,6 +47,7 @@ public final class VideoBuilder extends BaseBuilder { return this; } + @Override public WxMpCustomMessage build() { WxMpCustomMessage m = super.build(); m.setMediaId(this.mediaId); diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/VoiceBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/VoiceBuilder.java index 3f81aeb0..867c8aff 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/VoiceBuilder.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/VoiceBuilder.java @@ -23,6 +23,7 @@ public final class VoiceBuilder extends BaseBuilder { return this; } + @Override public WxMpCustomMessage build() { WxMpCustomMessage m = super.build(); m.setMediaId(this.mediaId); diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/outxmlbuilder/ImageBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/outxmlbuilder/ImageBuilder.java index e263e57f..ee265bf3 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/outxmlbuilder/ImageBuilder.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/outxmlbuilder/ImageBuilder.java @@ -15,6 +15,7 @@ public final class ImageBuilder extends BaseBuilder { + @Override public JsonElement serialize(WxMpCustomMessage message, Type typeOfSrc, JsonSerializationContext context) { JsonObject messageJson = new JsonObject(); messageJson.addProperty("touser", message.getToUser()); diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGroupGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGroupGsonAdapter.java index 58e6f98d..a6a48ed7 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGroupGsonAdapter.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGroupGsonAdapter.java @@ -16,6 +16,7 @@ import java.lang.reflect.Type; public class WxMpGroupGsonAdapter implements JsonSerializer, JsonDeserializer { + @Override public JsonElement serialize(WxMpGroup group, Type typeOfSrc, JsonSerializationContext context) { JsonObject json = new JsonObject(); JsonObject groupJson = new JsonObject(); @@ -26,6 +27,7 @@ public class WxMpGroupGsonAdapter implements JsonSerializer, JsonDese return json; } + @Override public WxMpGroup deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { WxMpGroup group = new WxMpGroup(); JsonObject groupJson = json.getAsJsonObject(); diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassGroupMessageGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassGroupMessageGsonAdapter.java index 79a9a0c6..4ad45848 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassGroupMessageGsonAdapter.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassGroupMessageGsonAdapter.java @@ -19,6 +19,7 @@ import java.lang.reflect.Type; public class WxMpMassGroupMessageGsonAdapter implements JsonSerializer { + @Override public JsonElement serialize(WxMpMassGroupMessage message, Type typeOfSrc, JsonSerializationContext context) { JsonObject messageJson = new JsonObject(); diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassNewsArticleGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassNewsArticleGsonAdapter.java index 32bda068..e4d88403 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassNewsArticleGsonAdapter.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassNewsArticleGsonAdapter.java @@ -16,6 +16,7 @@ import java.lang.reflect.Type; public class WxMpMassNewsArticleGsonAdapter implements JsonSerializer, JsonDeserializer { + @Override public JsonElement serialize(WxMpMassNews.WxMpMassNewsArticle article, Type typeOfSrc, JsonSerializationContext context) { JsonObject articleJson = new JsonObject(); @@ -35,6 +36,7 @@ public class WxMpMassNewsArticleGsonAdapter implements JsonSerializer, JsonDeserializer { + @Override public JsonElement serialize(WxMpMassNews message, Type typeOfSrc, JsonSerializationContext context) { JsonObject newsJson = new JsonObject(); @@ -28,6 +29,7 @@ public class WxMpMassNewsGsonAdapter implements JsonSerializer, Js return newsJson; } + @Override public WxMpMassNews deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { WxMpMassNews wxMpMassNews = new WxMpMassNews(); JsonObject json = jsonElement.getAsJsonObject(); diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassOpenIdsMessageGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassOpenIdsMessageGsonAdapter.java index 84063da4..cfb1f374 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassOpenIdsMessageGsonAdapter.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassOpenIdsMessageGsonAdapter.java @@ -16,6 +16,7 @@ import java.lang.reflect.Type; public class WxMpMassOpenIdsMessageGsonAdapter implements JsonSerializer { + @Override public JsonElement serialize(WxMpMassOpenIdsMessage message, Type typeOfSrc, JsonSerializationContext context) { JsonObject messageJson = new JsonObject(); diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassSendResultAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassSendResultAdapter.java index 658ac358..eeea9bc5 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassSendResultAdapter.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassSendResultAdapter.java @@ -21,6 +21,7 @@ import java.lang.reflect.Type; */ public class WxMpMassSendResultAdapter implements JsonDeserializer { + @Override public WxMpMassSendResult deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { WxMpMassSendResult sendResult = new WxMpMassSendResult(); JsonObject sendResultJsonObject = json.getAsJsonObject(); diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassUploadResultAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassUploadResultAdapter.java index 73f03382..75564b63 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassUploadResultAdapter.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassUploadResultAdapter.java @@ -21,6 +21,7 @@ import java.lang.reflect.Type; */ public class WxMpMassUploadResultAdapter implements JsonDeserializer { + @Override public WxMpMassUploadResult deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { WxMpMassUploadResult uploadResult = new WxMpMassUploadResult(); JsonObject uploadResultJsonObject = json.getAsJsonObject(); diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassVideoAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassVideoAdapter.java index d4b37b81..264a57b3 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassVideoAdapter.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassVideoAdapter.java @@ -23,6 +23,7 @@ import java.lang.reflect.Type; */ public class WxMpMassVideoAdapter implements JsonSerializer { + @Override public JsonElement serialize(WxMpMassVideo message, Type typeOfSrc, JsonSerializationContext context) { JsonObject messageJson = new JsonObject(); messageJson.addProperty("media_id", message.getMediaId()); diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMaterialArticleUpdateGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMaterialArticleUpdateGsonAdapter.java index 93391732..d9657083 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMaterialArticleUpdateGsonAdapter.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMaterialArticleUpdateGsonAdapter.java @@ -19,6 +19,7 @@ import java.lang.reflect.Type; public class WxMpMaterialArticleUpdateGsonAdapter implements JsonSerializer { + @Override public JsonElement serialize(WxMpMaterialArticleUpdate wxMpMaterialArticleUpdate, Type typeOfSrc, JsonSerializationContext context) { JsonObject articleUpdateJson = new JsonObject(); articleUpdateJson.addProperty("media_id", wxMpMaterialArticleUpdate.getMediaId()); diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMaterialCountResultAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMaterialCountResultAdapter.java index 0178a368..ab8a22cc 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMaterialCountResultAdapter.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMaterialCountResultAdapter.java @@ -19,6 +19,7 @@ import java.lang.reflect.Type; */ public class WxMpMaterialCountResultAdapter implements JsonDeserializer { + @Override public WxMpMaterialCountResult deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { WxMpMaterialCountResult countResult = new WxMpMaterialCountResult(); JsonObject materialCountResultJsonObject = json.getAsJsonObject(); diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMaterialFileBatchGetGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMaterialFileBatchGetGsonAdapter.java index 74e3edad..a94e8f1d 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMaterialFileBatchGetGsonAdapter.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMaterialFileBatchGetGsonAdapter.java @@ -18,6 +18,7 @@ import java.util.List; public class WxMpMaterialFileBatchGetGsonAdapter implements JsonDeserializer { + @Override public WxMpMaterialFileBatchGetResult deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { WxMpMaterialFileBatchGetResult wxMpMaterialFileBatchGetResult = new WxMpMaterialFileBatchGetResult(); JsonObject json = jsonElement.getAsJsonObject(); diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMaterialFileBatchGetGsonItemAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMaterialFileBatchGetGsonItemAdapter.java index 5be696ad..e5314ed6 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMaterialFileBatchGetGsonItemAdapter.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMaterialFileBatchGetGsonItemAdapter.java @@ -17,6 +17,7 @@ import java.util.Date; public class WxMpMaterialFileBatchGetGsonItemAdapter implements JsonDeserializer { + @Override public WxMpMaterialFileBatchGetResult.WxMaterialFileBatchGetNewsItem deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { WxMpMaterialFileBatchGetResult.WxMaterialFileBatchGetNewsItem wxMaterialFileBatchGetNewsItem = new WxMpMaterialFileBatchGetResult.WxMaterialFileBatchGetNewsItem(); JsonObject json = jsonElement.getAsJsonObject(); diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMaterialNewsArticleGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMaterialNewsArticleGsonAdapter.java index 96cc6aab..71020886 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMaterialNewsArticleGsonAdapter.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMaterialNewsArticleGsonAdapter.java @@ -16,6 +16,7 @@ import java.lang.reflect.Type; public class WxMpMaterialNewsArticleGsonAdapter implements JsonSerializer, JsonDeserializer { + @Override public JsonElement serialize(WxMpMaterialNews.WxMpMaterialNewsArticle article, Type typeOfSrc, JsonSerializationContext context) { JsonObject articleJson = new JsonObject(); @@ -39,6 +40,7 @@ public class WxMpMaterialNewsArticleGsonAdapter implements JsonSerializer { + @Override public WxMpMaterialNewsBatchGetResult deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { WxMpMaterialNewsBatchGetResult wxMpMaterialNewsBatchGetResult = new WxMpMaterialNewsBatchGetResult(); JsonObject json = jsonElement.getAsJsonObject(); diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMaterialNewsBatchGetGsonItemAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMaterialNewsBatchGetGsonItemAdapter.java index 8df7c20d..0fdf0ece 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMaterialNewsBatchGetGsonItemAdapter.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMaterialNewsBatchGetGsonItemAdapter.java @@ -18,6 +18,7 @@ import java.util.Date; public class WxMpMaterialNewsBatchGetGsonItemAdapter implements JsonDeserializer { + @Override public WxMpMaterialNewsBatchGetResult.WxMaterialNewsBatchGetNewsItem deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { WxMpMaterialNewsBatchGetResult.WxMaterialNewsBatchGetNewsItem wxMaterialNewsBatchGetNewsItem = new WxMpMaterialNewsBatchGetResult.WxMaterialNewsBatchGetNewsItem(); JsonObject json = jsonElement.getAsJsonObject(); diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMaterialNewsGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMaterialNewsGsonAdapter.java index 93c002a4..2513597f 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMaterialNewsGsonAdapter.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMaterialNewsGsonAdapter.java @@ -15,6 +15,7 @@ import java.lang.reflect.Type; public class WxMpMaterialNewsGsonAdapter implements JsonSerializer, JsonDeserializer { + @Override public JsonElement serialize(WxMpMaterialNews wxMpMaterialNews, Type typeOfSrc, JsonSerializationContext context) { JsonObject newsJson = new JsonObject(); @@ -28,6 +29,7 @@ public class WxMpMaterialNewsGsonAdapter implements JsonSerializer { + @Override public WxMpMaterialUploadResult deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { WxMpMaterialUploadResult uploadResult = new WxMpMaterialUploadResult(); JsonObject uploadResultJsonObject = json.getAsJsonObject(); diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMaterialVideoInfoResultAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMaterialVideoInfoResultAdapter.java index 6f4ce928..a1c7c0a2 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMaterialVideoInfoResultAdapter.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMaterialVideoInfoResultAdapter.java @@ -11,6 +11,7 @@ import java.lang.reflect.Type; */ public class WxMpMaterialVideoInfoResultAdapter implements JsonDeserializer { + @Override public WxMpMaterialVideoInfoResult deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { WxMpMaterialVideoInfoResult uploadResult = new WxMpMaterialVideoInfoResult(); JsonObject uploadResultJsonObject = json.getAsJsonObject(); diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpOAuth2AccessTokenAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpOAuth2AccessTokenAdapter.java index 753e22d1..d4f8fd55 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpOAuth2AccessTokenAdapter.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpOAuth2AccessTokenAdapter.java @@ -13,6 +13,7 @@ import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken; public class WxMpOAuth2AccessTokenAdapter implements JsonDeserializer { + @Override public WxMpOAuth2AccessToken deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { WxMpOAuth2AccessToken accessToken = new WxMpOAuth2AccessToken(); diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpSemanticQueryResultAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpSemanticQueryResultAdapter.java index 822357df..2e354597 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpSemanticQueryResultAdapter.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpSemanticQueryResultAdapter.java @@ -21,6 +21,7 @@ import java.lang.reflect.Type; */ public class WxMpSemanticQueryResultAdapter implements JsonDeserializer { + @Override public WxMpSemanticQueryResult deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { WxMpSemanticQueryResult result = new WxMpSemanticQueryResult(); JsonObject resultJsonObject = json.getAsJsonObject(); diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpTemplateMessageGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpTemplateMessageGsonAdapter.java index be792df5..4c2d1227 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpTemplateMessageGsonAdapter.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpTemplateMessageGsonAdapter.java @@ -19,6 +19,7 @@ import java.lang.reflect.Type; public class WxMpTemplateMessageGsonAdapter implements JsonSerializer { + @Override public JsonElement serialize(WxMpTemplateMessage message, Type typeOfSrc, JsonSerializationContext context) { JsonObject messageJson = new JsonObject(); messageJson.addProperty("touser", message.getToUser()); diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpUserCumulateGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpUserCumulateGsonAdapter.java index 991c2043..fcf1d403 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpUserCumulateGsonAdapter.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpUserCumulateGsonAdapter.java @@ -25,6 +25,7 @@ public class WxMpUserCumulateGsonAdapter implements JsonDeserializer { + @Override public WxMpUser deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { JsonObject o = json.getAsJsonObject(); WxMpUser wxMpUser = new WxMpUser(); diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpUserSummaryGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpUserSummaryGsonAdapter.java index e869b5c5..848b82ce 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpUserSummaryGsonAdapter.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpUserSummaryGsonAdapter.java @@ -23,6 +23,7 @@ public class WxMpUserSummaryGsonAdapter implements JsonDeserializer { + @Override public WxMpQrCodeTicket deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { WxMpQrCodeTicket ticket = new WxMpQrCodeTicket(); JsonObject ticketJsonObject = json.getAsJsonObject(); diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxUserListGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxUserListGsonAdapter.java index 5e2b9981..1c06d074 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxUserListGsonAdapter.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxUserListGsonAdapter.java @@ -16,6 +16,7 @@ import java.lang.reflect.Type; public class WxUserListGsonAdapter implements JsonDeserializer { + @Override public WxMpUserList deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { JsonObject o = json.getAsJsonObject(); WxMpUserList wxMpUserList = new WxMpUserList(); From b9919297d55f0fbad633ef399ac845eebd3a2449 Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Wed, 31 Aug 2016 19:05:03 +0800 Subject: [PATCH 49/55] fix unqualified access --- .../weixin/mp/api/WxMpMessageRouter.java | 22 ++--- .../me/chanjar/weixin/mp/bean/Industry.java | 6 +- .../me/chanjar/weixin/mp/bean/WxMpCard.java | 20 ++-- .../weixin/mp/bean/WxMpCustomMessage.java | 2 +- .../me/chanjar/weixin/mp/bean/WxMpGroup.java | 8 +- .../chanjar/weixin/mp/bean/WxMpIndustry.java | 4 +- .../weixin/mp/bean/WxMpMassGroupMessage.java | 8 +- .../chanjar/weixin/mp/bean/WxMpMassNews.java | 26 +++--- .../mp/bean/WxMpMassPreviewMessage.java | 8 +- .../chanjar/weixin/mp/bean/WxMpMassVideo.java | 6 +- .../chanjar/weixin/mp/bean/WxMpMaterial.java | 14 +-- .../mp/bean/WxMpMaterialArticleUpdate.java | 8 +- .../weixin/mp/bean/WxMpMaterialNews.java | 30 +++--- .../weixin/mp/bean/WxMpSemanticQuery.java | 16 ++-- .../weixin/mp/bean/WxMpTemplateData.java | 6 +- .../weixin/mp/bean/WxMpTemplateMessage.java | 10 +- .../chanjar/weixin/mp/bean/WxMpUserQuery.java | 28 +++--- .../mp/bean/WxMpXmlOutImageMessage.java | 2 +- .../mp/bean/WxMpXmlOutMusicMessage.java | 30 +++--- .../weixin/mp/bean/WxMpXmlOutNewsMessage.java | 20 ++-- .../weixin/mp/bean/WxMpXmlOutTextMessage.java | 2 +- .../mp/bean/WxMpXmlOutVideoMessage.java | 18 ++-- .../mp/bean/WxMpXmlOutVoiceMessage.java | 2 +- .../mp/bean/custombuilder/MusicBuilder.java | 6 +- .../mp/bean/custombuilder/VideoBuilder.java | 6 +- .../mp/bean/kefu/result/WxMpKfMsgList.java | 6 +- .../mp/bean/kefu/result/WxMpKfMsgRecord.java | 10 +- .../mp/bean/outxmlbuilder/MusicBuilder.java | 10 +- .../mp/bean/outxmlbuilder/NewsBuilder.java | 2 +- .../mp/bean/outxmlbuilder/VideoBuilder.java | 6 +- .../mp/bean/outxmlbuilder/VoiceBuilder.java | 2 +- .../bean/result/WxMediaImgUploadResult.java | 2 +- .../weixin/mp/bean/result/WxMpCardResult.java | 12 +-- .../mp/bean/result/WxMpMassSendResult.java | 10 +- .../mp/bean/result/WxMpMassUploadResult.java | 8 +- .../bean/result/WxMpMaterialCountResult.java | 12 +-- .../WxMpMaterialFileBatchGetResult.java | 18 ++-- .../WxMpMaterialNewsBatchGetResult.java | 16 ++-- .../bean/result/WxMpMaterialUploadResult.java | 6 +- .../result/WxMpMaterialVideoInfoResult.java | 8 +- .../mp/bean/result/WxMpOAuth2AccessToken.java | 24 ++--- .../mp/bean/result/WxMpPayCallback.java | 84 ++++++++--------- .../mp/bean/result/WxMpPayRefundResult.java | 50 +++++----- .../weixin/mp/bean/result/WxMpPayResult.java | 92 +++++++++---------- .../mp/bean/result/WxMpPrepayIdResult.java | 24 ++--- .../mp/bean/result/WxMpQrCodeTicket.java | 6 +- .../bean/result/WxMpSemanticQueryResult.java | 12 +-- .../weixin/mp/bean/result/WxMpUser.java | 56 +++++------ .../weixin/mp/bean/result/WxMpUserList.java | 8 +- .../mp/bean/result/WxRedpackResult.java | 50 +++++----- 50 files changed, 421 insertions(+), 421 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java index 834272cc..31d280a7 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java @@ -141,7 +141,7 @@ public class WxMpMessageRouter { final List matchRules = new ArrayList(); // 收集匹配的规则 - for (final WxMpMessageRouterRule rule : rules) { + for (final WxMpMessageRouterRule rule : this.rules) { if (rule.test(wxMessage)) { matchRules.add(rule); if(!rule.isReEnter()) { @@ -160,35 +160,35 @@ public class WxMpMessageRouter { // 返回最后一个非异步的rule的执行结果 if(rule.isAsync()) { futures.add( - executorService.submit(new Runnable() { + this.executorService.submit(new Runnable() { @Override public void run() { - rule.service(wxMessage, wxMpService, sessionManager, exceptionHandler); + rule.service(wxMessage, WxMpMessageRouter.this.wxMpService, WxMpMessageRouter.this.sessionManager, WxMpMessageRouter.this.exceptionHandler); } }) ); } else { - res = rule.service(wxMessage, wxMpService, sessionManager, exceptionHandler); + res = rule.service(wxMessage, this.wxMpService, this.sessionManager, this.exceptionHandler); // 在同步操作结束,session访问结束 - log.debug("End session access: async=false, sessionId={}", wxMessage.getFromUserName()); + this.log.debug("End session access: async=false, sessionId={}", wxMessage.getFromUserName()); sessionEndAccess(wxMessage); } } if (futures.size() > 0) { - executorService.submit(new Runnable() { + this.executorService.submit(new Runnable() { @Override public void run() { for (Future future : futures) { try { future.get(); - log.debug("End session access: async=true, sessionId={}", wxMessage.getFromUserName()); + WxMpMessageRouter.this.log.debug("End session access: async=true, sessionId={}", wxMessage.getFromUserName()); // 异步操作结束,session访问结束 sessionEndAccess(wxMessage); } catch (InterruptedException e) { - log.error("Error happened when wait task finish", e); + WxMpMessageRouter.this.log.error("Error happened when wait task finish", e); } catch (ExecutionException e) { - log.error("Error happened when wait task finish", e); + WxMpMessageRouter.this.log.error("Error happened when wait task finish", e); } } } @@ -210,7 +210,7 @@ public class WxMpMessageRouter { messageId.append(wxMessage.getMsgId()); } - return messageDuplicateChecker.isDuplicate(messageId.toString()); + return this.messageDuplicateChecker.isDuplicate(messageId.toString()); } @@ -220,7 +220,7 @@ public class WxMpMessageRouter { */ protected void sessionEndAccess(WxMpXmlMessage wxMessage) { - InternalSession session = ((InternalSessionManager)sessionManager).findSession(wxMessage.getFromUserName()); + InternalSession session = ((InternalSessionManager)this.sessionManager).findSession(wxMessage.getFromUserName()); if (session != null) { session.endAccess(); } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/Industry.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/Industry.java index 1270e7f5..da5b5134 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/Industry.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/Industry.java @@ -13,7 +13,7 @@ public class Industry implements Serializable { private String secondClass; public String getId() { - return id; + return this.id; } public void setId(String id) { @@ -21,7 +21,7 @@ public class Industry implements Serializable { } public String getFirstClass() { - return firstClass; + return this.firstClass; } public void setFirstClass(String firstClass) { @@ -29,7 +29,7 @@ public class Industry implements Serializable { } public String getSecondClass() { - return secondClass; + return this.secondClass; } public void setSecondClass(String secondClass) { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpCard.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpCard.java index d530fbe8..7bb4330f 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpCard.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpCard.java @@ -20,7 +20,7 @@ public class WxMpCard { private Boolean canConsume; public String getCardId() { - return cardId; + return this.cardId; } public void setCardId(String cardId) { @@ -28,7 +28,7 @@ public class WxMpCard { } public Long getBeginTime() { - return beginTime; + return this.beginTime; } public void setBeginTime(Long beginTime) { @@ -36,7 +36,7 @@ public class WxMpCard { } public Long getEndTime() { - return endTime; + return this.endTime; } public void setEndTime(Long endTime) { @@ -44,7 +44,7 @@ public class WxMpCard { } public String getUserCardStatus() { - return userCardStatus; + return this.userCardStatus; } public void setUserCardStatus(String userCardStatus) { @@ -52,7 +52,7 @@ public class WxMpCard { } public Boolean getCanConsume() { - return canConsume; + return this.canConsume; } public void setCanConsume(Boolean canConsume) { @@ -62,11 +62,11 @@ public class WxMpCard { @Override public String toString() { return "WxMpCard{" + - "cardId='" + cardId + '\'' + - ", beginTime=" + beginTime + - ", endTime=" + endTime + - ", userCardStatus='" + userCardStatus + '\'' + - ", canConsume=" + canConsume + + "cardId='" + this.cardId + '\'' + + ", beginTime=" + this.beginTime + + ", endTime=" + this.endTime + + ", userCardStatus='" + this.userCardStatus + '\'' + + ", canConsume=" + this.canConsume + '}'; } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpCustomMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpCustomMessage.java index 5fce97a3..04eee332 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpCustomMessage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpCustomMessage.java @@ -182,7 +182,7 @@ public class WxMpCustomMessage implements Serializable { } public String getKfAccount() { - return kfAccount; + return this.kfAccount; } public void setKfAccount(String kfAccount) { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpGroup.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpGroup.java index 9cef8c1b..217a1577 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpGroup.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpGroup.java @@ -15,19 +15,19 @@ public class WxMpGroup implements Serializable { private String name; private long count; public long getId() { - return id; + return this.id; } public void setId(long id) { this.id = id; } public String getName() { - return name; + return this.name; } public void setName(String name) { this.name = name; } public long getCount() { - return count; + return this.count; } public void setCount(long count) { this.count = count; @@ -42,7 +42,7 @@ public class WxMpGroup implements Serializable { } @Override public String toString() { - return "WxMpGroup [id=" + id + ", name=" + name + ", count=" + count + "]"; + return "WxMpGroup [id=" + this.id + ", name=" + this.name + ", count=" + this.count + "]"; } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpIndustry.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpIndustry.java index be62084d..281b9315 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpIndustry.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpIndustry.java @@ -22,7 +22,7 @@ public class WxMpIndustry implements Serializable { } public Industry getPrimaryIndustry() { - return primaryIndustry; + return this.primaryIndustry; } public void setPrimaryIndustry(Industry primaryIndustry) { @@ -30,7 +30,7 @@ public class WxMpIndustry implements Serializable { } public Industry getSecondIndustry() { - return secondIndustry; + return this.secondIndustry; } public void setSecondIndustry(Industry secondIndustry) { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassGroupMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassGroupMessage.java index b5faef72..00d23584 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassGroupMessage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassGroupMessage.java @@ -21,7 +21,7 @@ public class WxMpMassGroupMessage implements Serializable { } public String getMsgtype() { - return msgtype; + return this.msgtype; } /** @@ -41,7 +41,7 @@ public class WxMpMassGroupMessage implements Serializable { } public String getContent() { - return content; + return this.content; } public void setContent(String content) { @@ -49,7 +49,7 @@ public class WxMpMassGroupMessage implements Serializable { } public String getMediaId() { - return mediaId; + return this.mediaId; } public void setMediaId(String mediaId) { @@ -61,7 +61,7 @@ public class WxMpMassGroupMessage implements Serializable { } public Long getGroupId() { - return groupId; + return this.groupId; } /** diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassNews.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassNews.java index 215bff52..62b7cdea 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassNews.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassNews.java @@ -16,7 +16,7 @@ public class WxMpMassNews implements Serializable { private List articles = new ArrayList(); public List getArticles() { - return articles; + return this.articles; } public void addArticle(WxMpMassNewsArticle article) { @@ -28,7 +28,7 @@ public class WxMpMassNews implements Serializable { } public boolean isEmpty() { - return articles == null || articles.isEmpty(); + return this.articles == null || this.articles.isEmpty(); } /** @@ -76,7 +76,7 @@ public class WxMpMassNews implements Serializable { private boolean showCoverPic; public String getThumbMediaId() { - return thumbMediaId; + return this.thumbMediaId; } public void setThumbMediaId(String thumbMediaId) { @@ -84,7 +84,7 @@ public class WxMpMassNews implements Serializable { } public String getAuthor() { - return author; + return this.author; } public void setAuthor(String author) { @@ -92,7 +92,7 @@ public class WxMpMassNews implements Serializable { } public String getTitle() { - return title; + return this.title; } public void setTitle(String title) { @@ -100,7 +100,7 @@ public class WxMpMassNews implements Serializable { } public String getContentSourceUrl() { - return contentSourceUrl; + return this.contentSourceUrl; } public void setContentSourceUrl(String contentSourceUrl) { @@ -108,7 +108,7 @@ public class WxMpMassNews implements Serializable { } public String getContent() { - return content; + return this.content; } public void setContent(String content) { @@ -116,7 +116,7 @@ public class WxMpMassNews implements Serializable { } public String getDigest() { - return digest; + return this.digest; } public void setDigest(String digest) { @@ -124,7 +124,7 @@ public class WxMpMassNews implements Serializable { } public boolean isShowCoverPic() { - return showCoverPic; + return this.showCoverPic; } public void setShowCoverPic(boolean showCoverPic) { @@ -133,14 +133,14 @@ public class WxMpMassNews implements Serializable { @Override public String toString() { - return "WxMpMassNewsArticle [" + "thumbMediaId=" + thumbMediaId + ", author=" + author + ", title=" + title + - ", contentSourceUrl=" + contentSourceUrl + ", content=" + content + ", digest=" + digest + - ", showCoverPic=" + showCoverPic + "]"; + return "WxMpMassNewsArticle [" + "thumbMediaId=" + this.thumbMediaId + ", author=" + this.author + ", title=" + this.title + + ", contentSourceUrl=" + this.contentSourceUrl + ", content=" + this.content + ", digest=" + this.digest + + ", showCoverPic=" + this.showCoverPic + "]"; } } @Override public String toString() { - return "WxMpMassNews [" + "articles=" + articles + "]"; + return "WxMpMassNews [" + "articles=" + this.articles + "]"; } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassPreviewMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassPreviewMessage.java index 154195db..daebde23 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassPreviewMessage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassPreviewMessage.java @@ -18,7 +18,7 @@ public class WxMpMassPreviewMessage implements Serializable { } public String getToWxUsername() { - return toWxUsername; + return this.toWxUsername; } public void setToWxUsername(String toWxUsername) { @@ -26,7 +26,7 @@ public class WxMpMassPreviewMessage implements Serializable { } public String getMsgType() { - return msgType; + return this.msgType; } /** @@ -47,7 +47,7 @@ public class WxMpMassPreviewMessage implements Serializable { } public String getContent() { - return content; + return this.content; } public void setContent(String content) { @@ -55,7 +55,7 @@ public class WxMpMassPreviewMessage implements Serializable { } public String getMediaId() { - return mediaId; + return this.mediaId; } public void setMediaId(String mediaId) { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassVideo.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassVideo.java index c2f04610..faf4f42a 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassVideo.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassVideo.java @@ -16,7 +16,7 @@ public class WxMpMassVideo implements Serializable { private String description; public String getTitle() { - return title; + return this.title; } public void setTitle(String title) { @@ -24,7 +24,7 @@ public class WxMpMassVideo implements Serializable { } public String getDescription() { - return description; + return this.description; } public void setDescription(String description) { @@ -32,7 +32,7 @@ public class WxMpMassVideo implements Serializable { } public String getMediaId() { - return mediaId; + return this.mediaId; } public void setMediaId(String mediaId) { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterial.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterial.java index 582825aa..8a79bed0 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterial.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterial.java @@ -23,13 +23,13 @@ public class WxMpMaterial { public Map getForm() { Map form = new HashMap(); - form.put("title", videoTitle); - form.put("introduction", videoIntroduction); + form.put("title", this.videoTitle); + form.put("introduction", this.videoIntroduction); return form; } public String getVideoTitle() { - return videoTitle; + return this.videoTitle; } public void setVideoTitle(String videoTitle) { @@ -37,7 +37,7 @@ public class WxMpMaterial { } public String getVideoIntroduction() { - return videoIntroduction; + return this.videoIntroduction; } public void setVideoIntroduction(String videoIntroduction) { @@ -45,7 +45,7 @@ public class WxMpMaterial { } public String getName() { - return name; + return this.name; } public void setName(String name) { @@ -53,7 +53,7 @@ public class WxMpMaterial { } public File getFile() { - return file; + return this.file; } public void setFile(File file) { @@ -62,6 +62,6 @@ public class WxMpMaterial { @Override public String toString() { - return "WxMpMaterial [" + "name=" + name + ", file=" + file + ", videoTitle=" + videoTitle + ", videoIntroduction=" + videoIntroduction + "]"; + return "WxMpMaterial [" + "name=" + this.name + ", file=" + this.file + ", videoTitle=" + this.videoTitle + ", videoIntroduction=" + this.videoIntroduction + "]"; } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterialArticleUpdate.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterialArticleUpdate.java index be8e75f8..7443c407 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterialArticleUpdate.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterialArticleUpdate.java @@ -11,7 +11,7 @@ public class WxMpMaterialArticleUpdate implements Serializable { private WxMpMaterialNews.WxMpMaterialNewsArticle articles; public String getMediaId() { - return mediaId; + return this.mediaId; } public void setMediaId(String mediaId) { @@ -19,7 +19,7 @@ public class WxMpMaterialArticleUpdate implements Serializable { } public int getIndex() { - return index; + return this.index; } public void setIndex(int index) { @@ -27,7 +27,7 @@ public class WxMpMaterialArticleUpdate implements Serializable { } public WxMpMaterialNews.WxMpMaterialNewsArticle getArticles() { - return articles; + return this.articles; } public void setArticles(WxMpMaterialNews.WxMpMaterialNewsArticle articles) { @@ -40,6 +40,6 @@ public class WxMpMaterialArticleUpdate implements Serializable { @Override public String toString() { - return "WxMpMaterialArticleUpdate [" + "mediaId=" + mediaId + ", index=" + index + ", articles=" + articles + "]"; + return "WxMpMaterialArticleUpdate [" + "mediaId=" + this.mediaId + ", index=" + this.index + ", articles=" + this.articles + "]"; } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterialNews.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterialNews.java index 75ee479f..c3511071 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterialNews.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterialNews.java @@ -11,7 +11,7 @@ public class WxMpMaterialNews implements Serializable { private List articles = new ArrayList(); public List getArticles() { - return articles; + return this.articles; } public void addArticle(WxMpMaterialNewsArticle article) { @@ -23,7 +23,7 @@ public class WxMpMaterialNews implements Serializable { } public boolean isEmpty() { - return articles == null || articles.isEmpty(); + return this.articles == null || this.articles.isEmpty(); } /** @@ -82,7 +82,7 @@ public class WxMpMaterialNews implements Serializable { private String url; public String getThumbMediaId() { - return thumbMediaId; + return this.thumbMediaId; } public void setThumbMediaId(String thumbMediaId) { @@ -90,7 +90,7 @@ public class WxMpMaterialNews implements Serializable { } public String getAuthor() { - return author; + return this.author; } public void setAuthor(String author) { @@ -98,7 +98,7 @@ public class WxMpMaterialNews implements Serializable { } public String getTitle() { - return title; + return this.title; } public void setTitle(String title) { @@ -106,7 +106,7 @@ public class WxMpMaterialNews implements Serializable { } public String getContentSourceUrl() { - return contentSourceUrl; + return this.contentSourceUrl; } public void setContentSourceUrl(String contentSourceUrl) { @@ -114,7 +114,7 @@ public class WxMpMaterialNews implements Serializable { } public String getContent() { - return content; + return this.content; } public void setContent(String content) { @@ -122,7 +122,7 @@ public class WxMpMaterialNews implements Serializable { } public String getDigest() { - return digest; + return this.digest; } public void setDigest(String digest) { @@ -130,7 +130,7 @@ public class WxMpMaterialNews implements Serializable { } public boolean isShowCoverPic() { - return showCoverPic; + return this.showCoverPic; } public void setShowCoverPic(boolean showCoverPic) { @@ -138,7 +138,7 @@ public class WxMpMaterialNews implements Serializable { } public String getUrl() { - return url; + return this.url; } public void setUrl(String url) { @@ -146,7 +146,7 @@ public class WxMpMaterialNews implements Serializable { } public String getThumbUrl() { - return thumbUrl; + return this.thumbUrl; } public void setThumbUrl(String thumbUrl) { @@ -155,14 +155,14 @@ public class WxMpMaterialNews implements Serializable { @Override public String toString() { - return "WxMpMassNewsArticle [" + "thumbMediaId=" + thumbMediaId + "thumbUrl=" + thumbUrl + ", author=" + author + ", title=" + title + - ", contentSourceUrl=" + contentSourceUrl + ", content=" + content + ", digest=" + digest + - ", showCoverPic=" + showCoverPic +", url=" + url + "]"; + return "WxMpMassNewsArticle [" + "thumbMediaId=" + this.thumbMediaId + "thumbUrl=" + this.thumbUrl + ", author=" + this.author + ", title=" + this.title + + ", contentSourceUrl=" + this.contentSourceUrl + ", content=" + this.content + ", digest=" + this.digest + + ", showCoverPic=" + this.showCoverPic +", url=" + this.url + "]"; } } @Override public String toString() { - return "WxMpMaterialNews [" + "articles=" + articles + "]"; + return "WxMpMaterialNews [" + "articles=" + this.articles + "]"; } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpSemanticQuery.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpSemanticQuery.java index faf0ec77..2149e4a0 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpSemanticQuery.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpSemanticQuery.java @@ -23,7 +23,7 @@ public class WxMpSemanticQuery implements Serializable { private String uid; public String getQuery() { - return query; + return this.query; } public void setQuery(String query) { @@ -31,7 +31,7 @@ public class WxMpSemanticQuery implements Serializable { } public String getCategory() { - return category; + return this.category; } public void setCategory(String category) { @@ -39,7 +39,7 @@ public class WxMpSemanticQuery implements Serializable { } public Float getLatitude() { - return latitude; + return this.latitude; } public void setLatitude(Float latitude) { @@ -47,7 +47,7 @@ public class WxMpSemanticQuery implements Serializable { } public Float getLongitude() { - return longitude; + return this.longitude; } public void setLongitude(Float longitude) { @@ -55,7 +55,7 @@ public class WxMpSemanticQuery implements Serializable { } public String getCity() { - return city; + return this.city; } public void setCity(String city) { @@ -63,7 +63,7 @@ public class WxMpSemanticQuery implements Serializable { } public String getRegion() { - return region; + return this.region; } public void setRegion(String region) { @@ -71,7 +71,7 @@ public class WxMpSemanticQuery implements Serializable { } public String getAppid() { - return appid; + return this.appid; } public void setAppid(String appid) { @@ -79,7 +79,7 @@ public class WxMpSemanticQuery implements Serializable { } public String getUid() { - return uid; + return this.uid; } public void setUid(String uid) { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpTemplateData.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpTemplateData.java index 51d29e28..b1a615f9 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpTemplateData.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpTemplateData.java @@ -26,7 +26,7 @@ public class WxMpTemplateData implements Serializable { } public String getName() { - return name; + return this.name; } public void setName(String name) { @@ -34,7 +34,7 @@ public class WxMpTemplateData implements Serializable { } public String getValue() { - return value; + return this.value; } public void setValue(String value) { @@ -42,7 +42,7 @@ public class WxMpTemplateData implements Serializable { } public String getColor() { - return color; + return this.color; } public void setColor(String color) { this.color = color; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpTemplateMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpTemplateMessage.java index dd822ba5..70bb52e3 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpTemplateMessage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpTemplateMessage.java @@ -15,7 +15,7 @@ public class WxMpTemplateMessage implements Serializable { private List data = new ArrayList(); public String getToUser() { - return toUser; + return this.toUser; } public void setToUser(String toUser) { @@ -23,7 +23,7 @@ public class WxMpTemplateMessage implements Serializable { } public String getTemplateId() { - return templateId; + return this.templateId; } public void setTemplateId(String templateId) { @@ -31,7 +31,7 @@ public class WxMpTemplateMessage implements Serializable { } public String getUrl() { - return url; + return this.url; } public void setUrl(String url) { @@ -39,7 +39,7 @@ public class WxMpTemplateMessage implements Serializable { } public String getTopColor() { - return topColor; + return this.topColor; } public void setTopColor(String topColor) { @@ -47,7 +47,7 @@ public class WxMpTemplateMessage implements Serializable { } public List getData() { - return data; + return this.data; } public void setData(List data) { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpUserQuery.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpUserQuery.java index c33b9569..4d177b69 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpUserQuery.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpUserQuery.java @@ -53,7 +53,7 @@ public class WxMpUserQuery { * @return {@link WxMpUserQuery} */ public WxMpUserQuery add(String openId, String lang) { - queryParamList.add(new WxMpUserQueryParam(openId, lang)); + this.queryParamList.add(new WxMpUserQueryParam(openId, lang)); return this; } @@ -68,7 +68,7 @@ public class WxMpUserQuery { * @return {@link WxMpUserQuery} */ public WxMpUserQuery add(String openId) { - queryParamList.add(new WxMpUserQueryParam(openId)); + this.queryParamList.add(new WxMpUserQueryParam(openId)); return this; } @@ -79,7 +79,7 @@ public class WxMpUserQuery { * @return {@link WxMpUserQuery} */ public WxMpUserQuery remove(String openId) { - queryParamList.remove(new WxMpUserQueryParam(openId)); + this.queryParamList.remove(new WxMpUserQueryParam(openId)); return this; } @@ -91,7 +91,7 @@ public class WxMpUserQuery { * @return {@link WxMpUserQuery} */ public WxMpUserQuery remove(String openId, String lang) { - queryParamList.remove(new WxMpUserQueryParam(openId, lang)); + this.queryParamList.remove(new WxMpUserQueryParam(openId, lang)); return this; } @@ -101,12 +101,12 @@ public class WxMpUserQuery { * @return */ public List getQueryParamList() { - return queryParamList; + return this.queryParamList; } public String toJsonString() { Map map = new HashMap<>(); - map.put("user_list", queryParamList); + map.put("user_list", this.queryParamList); return new Gson().toJson(map); } @@ -136,7 +136,7 @@ public class WxMpUserQuery { } public String getOpenid() { - return openid; + return this.openid; } public void setOpenid(String openid) { @@ -144,7 +144,7 @@ public class WxMpUserQuery { } public String getLang() { - return lang; + return this.lang; } public void setLang(String lang) { @@ -156,8 +156,8 @@ public class WxMpUserQuery { final int prime = 31; int result = 1; result = prime * result + getOuterType().hashCode(); - result = prime * result + ((lang == null) ? 0 : lang.hashCode()); - result = prime * result + ((openid == null) ? 0 : openid.hashCode()); + result = prime * result + ((this.lang == null) ? 0 : this.lang.hashCode()); + result = prime * result + ((this.openid == null) ? 0 : this.openid.hashCode()); return result; } @@ -172,15 +172,15 @@ public class WxMpUserQuery { WxMpUserQueryParam other = (WxMpUserQueryParam) obj; if (!getOuterType().equals(other.getOuterType())) return false; - if (lang == null) { + if (this.lang == null) { if (other.lang != null) return false; - } else if (!lang.equals(other.lang)) + } else if (!this.lang.equals(other.lang)) return false; - if (openid == null) { + if (this.openid == null) { if (other.openid != null) return false; - } else if (!openid.equals(other.openid)) + } else if (!this.openid.equals(other.openid)) return false; return true; } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutImageMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutImageMessage.java index 6f6510c2..5f529865 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutImageMessage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutImageMessage.java @@ -13,7 +13,7 @@ public class WxMpXmlOutImageMessage extends WxMpXmlOutMessage { private String mediaId; public String getMediaId() { - return mediaId; + return this.mediaId; } public void setMediaId(String mediaId) { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutMusicMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutMusicMessage.java index b6fefdac..8a85df85 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutMusicMessage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutMusicMessage.java @@ -16,43 +16,43 @@ public class WxMpXmlOutMusicMessage extends WxMpXmlOutMessage { } public String getTitle() { - return music.getTitle(); + return this.music.getTitle(); } public void setTitle(String title) { - music.setTitle(title); + this.music.setTitle(title); } public String getDescription() { - return music.getDescription(); + return this.music.getDescription(); } public void setDescription(String description) { - music.setDescription(description); + this.music.setDescription(description); } public String getThumbMediaId() { - return music.getThumbMediaId(); + return this.music.getThumbMediaId(); } public void setThumbMediaId(String thumbMediaId) { - music.setThumbMediaId(thumbMediaId); + this.music.setThumbMediaId(thumbMediaId); } public String getMusicUrl() { - return music.getMusicUrl(); + return this.music.getMusicUrl(); } public void setMusicUrl(String musicUrl) { - music.setMusicUrl(musicUrl); + this.music.setMusicUrl(musicUrl); } public String getHqMusicUrl() { - return music.getHqMusicUrl(); + return this.music.getHqMusicUrl(); } public void setHqMusicUrl(String hqMusicUrl) { - music.setHqMusicUrl(hqMusicUrl); + this.music.setHqMusicUrl(hqMusicUrl); } @XStreamAlias("Music") @@ -79,7 +79,7 @@ public class WxMpXmlOutMusicMessage extends WxMpXmlOutMessage { private String hqMusicUrl; public String getTitle() { - return title; + return this.title; } public void setTitle(String title) { @@ -87,7 +87,7 @@ public class WxMpXmlOutMusicMessage extends WxMpXmlOutMessage { } public String getDescription() { - return description; + return this.description; } public void setDescription(String description) { @@ -95,7 +95,7 @@ public class WxMpXmlOutMusicMessage extends WxMpXmlOutMessage { } public String getThumbMediaId() { - return thumbMediaId; + return this.thumbMediaId; } public void setThumbMediaId(String thumbMediaId) { @@ -103,7 +103,7 @@ public class WxMpXmlOutMusicMessage extends WxMpXmlOutMessage { } public String getMusicUrl() { - return musicUrl; + return this.musicUrl; } public void setMusicUrl(String musicUrl) { @@ -111,7 +111,7 @@ public class WxMpXmlOutMusicMessage extends WxMpXmlOutMessage { } public String getHqMusicUrl() { - return hqMusicUrl; + return this.hqMusicUrl; } public void setHqMusicUrl(String hqMusicUrl) { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutNewsMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutNewsMessage.java index 4b76b4f5..d10e8983 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutNewsMessage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutNewsMessage.java @@ -22,7 +22,7 @@ public class WxMpXmlOutNewsMessage extends WxMpXmlOutMessage { } public int getArticleCount() { - return articleCount; + return this.articleCount; } public void addArticle(Item item) { @@ -31,7 +31,7 @@ public class WxMpXmlOutNewsMessage extends WxMpXmlOutMessage { } public List getArticles() { - return articles; + return this.articles; } @@ -55,35 +55,35 @@ public class WxMpXmlOutNewsMessage extends WxMpXmlOutMessage { private String Url; public String getTitle() { - return Title; + return this.Title; } public void setTitle(String title) { - Title = title; + this.Title = title; } public String getDescription() { - return Description; + return this.Description; } public void setDescription(String description) { - Description = description; + this.Description = description; } public String getPicUrl() { - return PicUrl; + return this.PicUrl; } public void setPicUrl(String picUrl) { - PicUrl = picUrl; + this.PicUrl = picUrl; } public String getUrl() { - return Url; + return this.Url; } public void setUrl(String url) { - Url = url; + this.Url = url; } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutTextMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutTextMessage.java index e2458a03..bac5d4f2 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutTextMessage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutTextMessage.java @@ -17,7 +17,7 @@ public class WxMpXmlOutTextMessage extends WxMpXmlOutMessage { } public String getContent() { - return content; + return this.content; } public void setContent(String content) { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutVideoMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutVideoMessage.java index fb0520c1..3dac4eab 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutVideoMessage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutVideoMessage.java @@ -16,27 +16,27 @@ public class WxMpXmlOutVideoMessage extends WxMpXmlOutMessage { } public String getMediaId() { - return video.getMediaId(); + return this.video.getMediaId(); } public void setMediaId(String mediaId) { - video.setMediaId(mediaId); + this.video.setMediaId(mediaId); } public String getTitle() { - return video.getTitle(); + return this.video.getTitle(); } public void setTitle(String title) { - video.setTitle(title); + this.video.setTitle(title); } public String getDescription() { - return video.getDescription(); + return this.video.getDescription(); } public void setDescription(String description) { - video.setDescription(description); + this.video.setDescription(description); } @@ -56,7 +56,7 @@ public class WxMpXmlOutVideoMessage extends WxMpXmlOutMessage { private String description; public String getMediaId() { - return mediaId; + return this.mediaId; } public void setMediaId(String mediaId) { @@ -64,7 +64,7 @@ public class WxMpXmlOutVideoMessage extends WxMpXmlOutMessage { } public String getTitle() { - return title; + return this.title; } public void setTitle(String title) { @@ -72,7 +72,7 @@ public class WxMpXmlOutVideoMessage extends WxMpXmlOutMessage { } public String getDescription() { - return description; + return this.description; } public void setDescription(String description) { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutVoiceMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutVoiceMessage.java index 29c74e90..5ef02749 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutVoiceMessage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutVoiceMessage.java @@ -17,7 +17,7 @@ public class WxMpXmlOutVoiceMessage extends WxMpXmlOutMessage { } public String getMediaId() { - return mediaId; + return this.mediaId; } public void setMediaId(String mediaId) { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/MusicBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/MusicBuilder.java index e715aff9..7a9994ad 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/MusicBuilder.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/MusicBuilder.java @@ -57,9 +57,9 @@ public final class MusicBuilder extends BaseBuilder { WxMpCustomMessage m = super.build(); m.setMusicUrl(this.musicUrl); m.setHqMusicUrl(this.hqMusicUrl); - m.setTitle(title); - m.setDescription(description); - m.setThumbMediaId(thumbMediaId); + m.setTitle(this.title); + m.setDescription(this.description); + m.setThumbMediaId(this.thumbMediaId); return m; } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/VideoBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/VideoBuilder.java index a37713cb..bda6ef7c 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/VideoBuilder.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/VideoBuilder.java @@ -51,9 +51,9 @@ public final class VideoBuilder extends BaseBuilder { public WxMpCustomMessage build() { WxMpCustomMessage m = super.build(); m.setMediaId(this.mediaId); - m.setTitle(title); - m.setDescription(description); - m.setThumbMediaId(thumbMediaId); + m.setTitle(this.title); + m.setDescription(this.description); + m.setThumbMediaId(this.thumbMediaId); return m; } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfMsgList.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfMsgList.java index 5078a2e5..570f2def 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfMsgList.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfMsgList.java @@ -21,7 +21,7 @@ public class WxMpKfMsgList { private Long msgId; public List getRecords() { - return records; + return this.records; } public void setRecords(List records) { @@ -29,7 +29,7 @@ public class WxMpKfMsgList { } public Integer getNumber() { - return number; + return this.number; } public void setNumber(Integer number) { @@ -37,7 +37,7 @@ public class WxMpKfMsgList { } public Long getMsgId() { - return msgId; + return this.msgId; } public void setMsgId(Long msgId) { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfMsgRecord.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfMsgRecord.java index 00b7771e..3fe2002c 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfMsgRecord.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfMsgRecord.java @@ -46,7 +46,7 @@ public class WxMpKfMsgRecord { return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE); } public String getWorker() { - return worker; + return this.worker; } public void setWorker(String worker) { @@ -54,7 +54,7 @@ public class WxMpKfMsgRecord { } public String getOpenid() { - return openid; + return this.openid; } public void setOpenid(String openid) { @@ -62,7 +62,7 @@ public class WxMpKfMsgRecord { } public String getText() { - return text; + return this.text; } public void setText(String text) { @@ -70,7 +70,7 @@ public class WxMpKfMsgRecord { } public Long getTime() { - return time; + return this.time; } public void setTime(Long time) { @@ -78,7 +78,7 @@ public class WxMpKfMsgRecord { } public Integer getOperateCode() { - return operateCode; + return this.operateCode; } public void setOperateCode(Integer operateCode) { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/outxmlbuilder/MusicBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/outxmlbuilder/MusicBuilder.java index 578c9722..6a0ee1bc 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/outxmlbuilder/MusicBuilder.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/outxmlbuilder/MusicBuilder.java @@ -44,11 +44,11 @@ public final class MusicBuilder extends BaseBuilder items; public int getTotalCount() { - return totalCount; + return this.totalCount; } public void setTotalCount(int totalCount) { @@ -19,7 +19,7 @@ public class WxMpMaterialFileBatchGetResult implements Serializable { } public int getItemCount() { - return itemCount; + return this.itemCount; } public void setItemCount(int itemCount) { @@ -27,7 +27,7 @@ public class WxMpMaterialFileBatchGetResult implements Serializable { } public List getItems() { - return items; + return this.items; } public void setItems(List items) { @@ -36,7 +36,7 @@ public class WxMpMaterialFileBatchGetResult implements Serializable { @Override public String toString() { - return "WxMpMaterialFileBatchGetResult [" + "totalCount=" + totalCount + ", itemCount=" + itemCount + ", items=" + items + "]"; + return "WxMpMaterialFileBatchGetResult [" + "totalCount=" + this.totalCount + ", itemCount=" + this.itemCount + ", items=" + this.items + "]"; } public static class WxMaterialFileBatchGetNewsItem { @@ -46,7 +46,7 @@ public class WxMpMaterialFileBatchGetResult implements Serializable { private String url; public String getMediaId() { - return mediaId; + return this.mediaId; } public void setMediaId(String mediaId) { @@ -54,7 +54,7 @@ public class WxMpMaterialFileBatchGetResult implements Serializable { } public Date getUpdateTime() { - return updateTime; + return this.updateTime; } public void setUpdateTime(Date updateTime) { @@ -62,7 +62,7 @@ public class WxMpMaterialFileBatchGetResult implements Serializable { } public String getName() { - return name; + return this.name; } public void setName(String name) { @@ -70,7 +70,7 @@ public class WxMpMaterialFileBatchGetResult implements Serializable { } public String getUrl() { - return url; + return this.url; } public void setUrl(String url) { @@ -79,7 +79,7 @@ public class WxMpMaterialFileBatchGetResult implements Serializable { @Override public String toString() { - return "WxMaterialFileBatchGetNewsItem [" + "mediaId=" + mediaId + ", updateTime=" + updateTime + ", name=" + name + ", url=" + url + "]"; + return "WxMaterialFileBatchGetNewsItem [" + "mediaId=" + this.mediaId + ", updateTime=" + this.updateTime + ", name=" + this.name + ", url=" + this.url + "]"; } } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialNewsBatchGetResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialNewsBatchGetResult.java index 2d78ab8c..b6031f11 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialNewsBatchGetResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialNewsBatchGetResult.java @@ -13,7 +13,7 @@ public class WxMpMaterialNewsBatchGetResult implements Serializable { private List items; public int getTotalCount() { - return totalCount; + return this.totalCount; } public void setTotalCount(int totalCount) { @@ -21,7 +21,7 @@ public class WxMpMaterialNewsBatchGetResult implements Serializable { } public int getItemCount() { - return itemCount; + return this.itemCount; } public void setItemCount(int itemCount) { @@ -29,7 +29,7 @@ public class WxMpMaterialNewsBatchGetResult implements Serializable { } public List getItems() { - return items; + return this.items; } public void setItems(List items) { @@ -38,7 +38,7 @@ public class WxMpMaterialNewsBatchGetResult implements Serializable { @Override public String toString() { - return "WxMpMaterialNewsBatchGetResult [" + "totalCount=" + totalCount + ", itemCount=" + itemCount + ", items=" + items + "]"; + return "WxMpMaterialNewsBatchGetResult [" + "totalCount=" + this.totalCount + ", itemCount=" + this.itemCount + ", items=" + this.items + "]"; } public static class WxMaterialNewsBatchGetNewsItem { @@ -47,7 +47,7 @@ public class WxMpMaterialNewsBatchGetResult implements Serializable { private WxMpMaterialNews content; public String getMediaId() { - return mediaId; + return this.mediaId; } public void setMediaId(String mediaId) { @@ -55,7 +55,7 @@ public class WxMpMaterialNewsBatchGetResult implements Serializable { } public Date getUpdateTime() { - return updateTime; + return this.updateTime; } public void setUpdateTime(Date updateTime) { @@ -63,7 +63,7 @@ public class WxMpMaterialNewsBatchGetResult implements Serializable { } public WxMpMaterialNews getContent() { - return content; + return this.content; } public void setContent(WxMpMaterialNews content) { @@ -72,7 +72,7 @@ public class WxMpMaterialNewsBatchGetResult implements Serializable { @Override public String toString() { - return "WxMaterialNewsBatchGetNewsItem [" + "mediaId=" + mediaId + ", updateTime=" + updateTime + ", content=" + content + "]"; + return "WxMaterialNewsBatchGetNewsItem [" + "mediaId=" + this.mediaId + ", updateTime=" + this.updateTime + ", content=" + this.content + "]"; } } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialUploadResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialUploadResult.java index 2c2bf4d6..b81a8a3e 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialUploadResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialUploadResult.java @@ -10,7 +10,7 @@ public class WxMpMaterialUploadResult implements Serializable { private String url; public String getMediaId() { - return mediaId; + return this.mediaId; } public void setMediaId(String mediaId) { @@ -18,7 +18,7 @@ public class WxMpMaterialUploadResult implements Serializable { } public String getUrl() { - return url; + return this.url; } public void setUrl(String url) { @@ -31,7 +31,7 @@ public class WxMpMaterialUploadResult implements Serializable { @Override public String toString() { - return "WxMpMaterialUploadResult [media_id=" + mediaId + ", url=" + url + "]"; + return "WxMpMaterialUploadResult [media_id=" + this.mediaId + ", url=" + this.url + "]"; } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialVideoInfoResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialVideoInfoResult.java index 1650c760..50671f6d 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialVideoInfoResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialVideoInfoResult.java @@ -11,7 +11,7 @@ public class WxMpMaterialVideoInfoResult implements Serializable { private String downUrl; public String getTitle() { - return title; + return this.title; } public void setTitle(String title) { @@ -19,7 +19,7 @@ public class WxMpMaterialVideoInfoResult implements Serializable { } public String getDescription() { - return description; + return this.description; } public void setDescription(String description) { @@ -27,7 +27,7 @@ public class WxMpMaterialVideoInfoResult implements Serializable { } public String getDownUrl() { - return downUrl; + return this.downUrl; } public void setDownUrl(String downUrl) { @@ -40,7 +40,7 @@ public class WxMpMaterialVideoInfoResult implements Serializable { @Override public String toString() { - return "WxMpMaterialVideoInfoResult [title=" + title + ", description=" + description + ", downUrl=" + downUrl + "]"; + return "WxMpMaterialVideoInfoResult [title=" + this.title + ", description=" + this.description + ", downUrl=" + this.downUrl + "]"; } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpOAuth2AccessToken.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpOAuth2AccessToken.java index 6ac77c83..fccff490 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpOAuth2AccessToken.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpOAuth2AccessToken.java @@ -19,7 +19,7 @@ public class WxMpOAuth2AccessToken implements Serializable { private String unionId; public String getRefreshToken() { - return refreshToken; + return this.refreshToken; } public void setRefreshToken(String refreshToken) { @@ -27,7 +27,7 @@ public class WxMpOAuth2AccessToken implements Serializable { } public String getOpenId() { - return openId; + return this.openId; } public void setOpenId(String openId) { @@ -35,7 +35,7 @@ public class WxMpOAuth2AccessToken implements Serializable { } public String getScope() { - return scope; + return this.scope; } public void setScope(String scope) { @@ -43,7 +43,7 @@ public class WxMpOAuth2AccessToken implements Serializable { } public String getAccessToken() { - return accessToken; + return this.accessToken; } public void setAccessToken(String accessToken) { @@ -51,7 +51,7 @@ public class WxMpOAuth2AccessToken implements Serializable { } public int getExpiresIn() { - return expiresIn; + return this.expiresIn; } public void setExpiresIn(int expiresIn) { @@ -59,7 +59,7 @@ public class WxMpOAuth2AccessToken implements Serializable { } public String getUnionId() { - return unionId; + return this.unionId; } public void setUnionId(String unionId) { @@ -73,12 +73,12 @@ public class WxMpOAuth2AccessToken implements Serializable { @Override public String toString() { return "WxMpOAuth2AccessToken{" + - "accessToken='" + accessToken + '\'' + - ", expiresTime=" + expiresIn + - ", refreshToken='" + refreshToken + '\'' + - ", openId='" + openId + '\'' + - ", scope='" + scope + '\'' + - ", unionId='" + unionId + '\'' + + "accessToken='" + this.accessToken + '\'' + + ", expiresTime=" + this.expiresIn + + ", refreshToken='" + this.refreshToken + '\'' + + ", openId='" + this.openId + '\'' + + ", scope='" + this.scope + '\'' + + ", unionId='" + this.unionId + '\'' + '}'; } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpPayCallback.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpPayCallback.java index 18aeda4d..d2edfe27 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpPayCallback.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpPayCallback.java @@ -42,111 +42,111 @@ public class WxMpPayCallback implements Serializable { private String time_end; public String getReturn_code() { - return return_code; + return this.return_code; } public String getReturn_msg() { - return return_msg; + return this.return_msg; } public String getAppid() { - return appid; + return this.appid; } public String getMch_id() { - return mch_id; + return this.mch_id; } public String getDevice_info() { - return device_info; + return this.device_info; } public String getNonce_str() { - return nonce_str; + return this.nonce_str; } public String getSign() { - return sign; + return this.sign; } public String getResult_code() { - return result_code; + return this.result_code; } public String getErr_code() { - return err_code; + return this.err_code; } public String getErr_code_des() { - return err_code_des; + return this.err_code_des; } public String getOpenid() { - return openid; + return this.openid; } public String getIs_subscribe() { - return is_subscribe; + return this.is_subscribe; } public String getTrade_type() { - return trade_type; + return this.trade_type; } public String getBank_type() { - return bank_type; + return this.bank_type; } public String getTotal_fee() { - return total_fee; + return this.total_fee; } public String getFee_type() { - return fee_type; + return this.fee_type; } public String getCash_fee() { - return cash_fee; + return this.cash_fee; } public String getCash_fee_type() { - return cash_fee_type; + return this.cash_fee_type; } public String getCoupon_fee() { - return coupon_fee; + return this.coupon_fee; } public String getCoupon_count() { - return coupon_count; + return this.coupon_count; } public String getCoupon_batch_id_$n() { - return coupon_batch_id_$n; + return this.coupon_batch_id_$n; } public String getCoupon_id_$n() { - return coupon_id_$n; + return this.coupon_id_$n; } public String getCoupon_fee_$n() { - return coupon_fee_$n; + return this.coupon_fee_$n; } public String getTransaction_id() { - return transaction_id; + return this.transaction_id; } public String getOut_trade_no() { - return out_trade_no; + return this.out_trade_no; } public String getAttach() { - return attach; + return this.attach; } public String getTime_end() { - return time_end; + return this.time_end; } public void setReturn_code(String return_code) { @@ -259,21 +259,21 @@ public class WxMpPayCallback implements Serializable { @Override public String toString() { - return "WxMpPayCallback [return_code=" + return_code + ", return_msg=" - + return_msg + ", appid=" + appid + ", mch_id=" + mch_id - + ", device_info=" + device_info + ", nonce_str=" + nonce_str - + ", sign=" + sign + ", result_code=" + result_code - + ", err_code=" + err_code + ", err_code_des=" + err_code_des - + ", openid=" + openid + ", is_subscribe=" + is_subscribe - + ", trade_type=" + trade_type + ", bank_type=" + bank_type - + ", total_fee=" + total_fee + ", fee_type=" + fee_type - + ", cash_fee=" + cash_fee + ", cash_fee_type=" + cash_fee_type - + ", coupon_fee=" + coupon_fee + ", coupon_count=" - + coupon_count + ", coupon_batch_id_$n=" + coupon_batch_id_$n - + ", coupon_id_$n=" + coupon_id_$n + ", coupon_fee_$n=" - + coupon_fee_$n + ", transaction_id=" + transaction_id - + ", out_trade_no=" + out_trade_no + ", attach=" + attach - + ", time_end=" + time_end + "]"; + return "WxMpPayCallback [return_code=" + this.return_code + ", return_msg=" + + this.return_msg + ", appid=" + this.appid + ", mch_id=" + this.mch_id + + ", device_info=" + this.device_info + ", nonce_str=" + this.nonce_str + + ", sign=" + this.sign + ", result_code=" + this.result_code + + ", err_code=" + this.err_code + ", err_code_des=" + this.err_code_des + + ", openid=" + this.openid + ", is_subscribe=" + this.is_subscribe + + ", trade_type=" + this.trade_type + ", bank_type=" + this.bank_type + + ", total_fee=" + this.total_fee + ", fee_type=" + this.fee_type + + ", cash_fee=" + this.cash_fee + ", cash_fee_type=" + this.cash_fee_type + + ", coupon_fee=" + this.coupon_fee + ", coupon_count=" + + this.coupon_count + ", coupon_batch_id_$n=" + this.coupon_batch_id_$n + + ", coupon_id_$n=" + this.coupon_id_$n + ", coupon_fee_$n=" + + this.coupon_fee_$n + ", transaction_id=" + this.transaction_id + + ", out_trade_no=" + this.out_trade_no + ", attach=" + this.attach + + ", time_end=" + this.time_end + "]"; } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpPayRefundResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpPayRefundResult.java index 1e8327e3..4d51e8f4 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpPayRefundResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpPayRefundResult.java @@ -85,7 +85,7 @@ public class WxMpPayRefundResult implements Serializable { private String couponRefundId; public String getReturnCode() { - return returnCode; + return this.returnCode; } public void setReturnCode(String returnCode) { @@ -93,7 +93,7 @@ public class WxMpPayRefundResult implements Serializable { } public String getReturnMsg() { - return returnMsg; + return this.returnMsg; } public void setReturnMsg(String returnMsg) { @@ -101,7 +101,7 @@ public class WxMpPayRefundResult implements Serializable { } public String getResultCode() { - return resultCode; + return this.resultCode; } public void setResultCode(String resultCode) { @@ -109,7 +109,7 @@ public class WxMpPayRefundResult implements Serializable { } public String getErrCode() { - return errCode; + return this.errCode; } public void setErrCode(String errCode) { @@ -117,7 +117,7 @@ public class WxMpPayRefundResult implements Serializable { } public String getErrCodeDes() { - return errCodeDes; + return this.errCodeDes; } public void setErrCodeDes(String errCodeDes) { @@ -125,7 +125,7 @@ public class WxMpPayRefundResult implements Serializable { } public String getAppid() { - return appid; + return this.appid; } public void setAppid(String appid) { @@ -133,7 +133,7 @@ public class WxMpPayRefundResult implements Serializable { } public String getMchId() { - return mchId; + return this.mchId; } public void setMchId(String mchId) { @@ -141,7 +141,7 @@ public class WxMpPayRefundResult implements Serializable { } public String getDeviceInfo() { - return deviceInfo; + return this.deviceInfo; } public void setDeviceInfo(String deviceInfo) { @@ -149,7 +149,7 @@ public class WxMpPayRefundResult implements Serializable { } public String getNonceStr() { - return nonceStr; + return this.nonceStr; } public void setNonceStr(String nonceStr) { @@ -157,7 +157,7 @@ public class WxMpPayRefundResult implements Serializable { } public String getSign() { - return sign; + return this.sign; } public void setSign(String sign) { @@ -165,7 +165,7 @@ public class WxMpPayRefundResult implements Serializable { } public String getTransactionId() { - return transactionId; + return this.transactionId; } public void setTransactionId(String transactionId) { @@ -173,7 +173,7 @@ public class WxMpPayRefundResult implements Serializable { } public String getOutTradeNo() { - return outTradeNo; + return this.outTradeNo; } public void setOutTradeNo(String outTradeNo) { @@ -181,7 +181,7 @@ public class WxMpPayRefundResult implements Serializable { } public String getOutRefundNo() { - return outRefundNo; + return this.outRefundNo; } public void setOutRefundNo(String outRefundNo) { @@ -189,7 +189,7 @@ public class WxMpPayRefundResult implements Serializable { } public String getRefundId() { - return refundId; + return this.refundId; } public void setRefundId(String refundId) { @@ -197,7 +197,7 @@ public class WxMpPayRefundResult implements Serializable { } public String getRefundChannel() { - return refundChannel; + return this.refundChannel; } public void setRefundChannel(String refundChannel) { @@ -205,7 +205,7 @@ public class WxMpPayRefundResult implements Serializable { } public String getRefundFee() { - return refundFee; + return this.refundFee; } public void setRefundFee(String refundFee) { @@ -213,7 +213,7 @@ public class WxMpPayRefundResult implements Serializable { } public String getTotalFee() { - return totalFee; + return this.totalFee; } public void setTotalFee(String totalFee) { @@ -221,7 +221,7 @@ public class WxMpPayRefundResult implements Serializable { } public String getFeeType() { - return feeType; + return this.feeType; } public void setFeeType(String feeType) { @@ -229,7 +229,7 @@ public class WxMpPayRefundResult implements Serializable { } public String getCashFee() { - return cashFee; + return this.cashFee; } public void setCashFee(String cashFee) { @@ -237,7 +237,7 @@ public class WxMpPayRefundResult implements Serializable { } public String getCashRefundfee() { - return cashRefundfee; + return this.cashRefundfee; } public void setCashRefundfee(String cashRefundfee) { @@ -245,7 +245,7 @@ public class WxMpPayRefundResult implements Serializable { } public String getCouponRefundFee() { - return couponRefundFee; + return this.couponRefundFee; } public void setCouponRefundFee(String couponRefundFee) { @@ -253,7 +253,7 @@ public class WxMpPayRefundResult implements Serializable { } public String getCouponRefundCount() { - return couponRefundCount; + return this.couponRefundCount; } public void setCouponRefundCount(String couponRefundCount) { @@ -261,7 +261,7 @@ public class WxMpPayRefundResult implements Serializable { } public String getCouponRefundId() { - return couponRefundId; + return this.couponRefundId; } public void setCouponRefundId(String couponRefundId) { @@ -271,8 +271,8 @@ public class WxMpPayRefundResult implements Serializable { @Override public String toString() { return "[" + - "return_code:" + returnCode + ";" + - "return_msg" + returnMsg + ";"; + "return_code:" + this.returnCode + ";" + + "return_msg" + this.returnMsg + ";"; } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpPayResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpPayResult.java index 3c788729..1ea8fd65 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpPayResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpPayResult.java @@ -43,91 +43,91 @@ public class WxMpPayResult implements Serializable { private String time_end; public String getReturn_code() { - return return_code; + return this.return_code; } public String getReturn_msg() { - return return_msg; + return this.return_msg; } public String getAppid() { - return appid; + return this.appid; } public String getMch_id() { - return mch_id; + return this.mch_id; } public String getNonce_str() { - return nonce_str; + return this.nonce_str; } public String getSign() { - return sign; + return this.sign; } public String getResult_code() { - return result_code; + return this.result_code; } public String getErr_code() { - return err_code; + return this.err_code; } public String getErr_code_des() { - return err_code_des; + return this.err_code_des; } public String getTrade_state() { - return trade_state; + return this.trade_state; } public String getDevice_info() { - return device_info; + return this.device_info; } public String getOpenid() { - return openid; + return this.openid; } public String getIs_subscribe() { - return is_subscribe; + return this.is_subscribe; } public String getTrade_type() { - return trade_type; + return this.trade_type; } public String getBank_type() { - return bank_type; + return this.bank_type; } public String getTotal_fee() { - return total_fee; + return this.total_fee; } public String getCoupon_fee() { - return coupon_fee; + return this.coupon_fee; } public String getFee_type() { - return fee_type; + return this.fee_type; } public String getTransaction_id() { - return transaction_id; + return this.transaction_id; } public String getOut_trade_no() { - return out_trade_no; + return this.out_trade_no; } public String getAttach() { - return attach; + return this.attach; } public String getTime_end() { - return time_end; + return this.time_end; } public void setReturn_code(String return_code) { @@ -219,7 +219,7 @@ public class WxMpPayResult implements Serializable { } public String getTrade_state_desc() { - return trade_state_desc; + return this.trade_state_desc; } public void setTrade_state_desc(String trade_state_desc) { @@ -229,29 +229,29 @@ public class WxMpPayResult implements Serializable { @Override public String toString() { return "WxMpPayResult{" + - "return_code=" + return_code + - ", return_msg='" + return_msg + '\'' + - ", appid='" + appid + '\'' + - ", mch_id='" + mch_id + '\'' + - ", nonce_str='" + nonce_str + '\'' + - ", sign='" + sign + '\'' + - ", result_code='" + result_code + '\'' + - ", err_code='" + err_code + '\'' + - ", err_code_des='" + err_code_des + '\'' + - ", trade_state=" + trade_state + - ", trade_state_desc=" + trade_state_desc + - ", device_info='" + device_info + '\'' + - ", openid='" + openid + '\'' + - ", is_subscribe='" + is_subscribe + '\'' + - ", trade_type='" + trade_type + '\'' + - ", bank_type='" + bank_type + '\'' + - ", total_fee='" + total_fee + '\'' + - ", coupon_fee='" + coupon_fee + '\'' + - ", fee_type='" + fee_type + '\'' + - ", transaction_id='" + transaction_id + '\'' + - ", out_trade_no='" + out_trade_no + '\'' + - ", attach='" + attach + '\'' + - ", time_end='" + time_end + '\'' + + "return_code=" + this.return_code + + ", return_msg='" + this.return_msg + '\'' + + ", appid='" + this.appid + '\'' + + ", mch_id='" + this.mch_id + '\'' + + ", nonce_str='" + this.nonce_str + '\'' + + ", sign='" + this.sign + '\'' + + ", result_code='" + this.result_code + '\'' + + ", err_code='" + this.err_code + '\'' + + ", err_code_des='" + this.err_code_des + '\'' + + ", trade_state=" + this.trade_state + + ", trade_state_desc=" + this.trade_state_desc + + ", device_info='" + this.device_info + '\'' + + ", openid='" + this.openid + '\'' + + ", is_subscribe='" + this.is_subscribe + '\'' + + ", trade_type='" + this.trade_type + '\'' + + ", bank_type='" + this.bank_type + '\'' + + ", total_fee='" + this.total_fee + '\'' + + ", coupon_fee='" + this.coupon_fee + '\'' + + ", fee_type='" + this.fee_type + '\'' + + ", transaction_id='" + this.transaction_id + '\'' + + ", out_trade_no='" + this.out_trade_no + '\'' + + ", attach='" + this.attach + '\'' + + ", time_end='" + this.time_end + '\'' + '}'; } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpPrepayIdResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpPrepayIdResult.java index b5c09b21..4581f264 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpPrepayIdResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpPrepayIdResult.java @@ -27,7 +27,7 @@ public class WxMpPrepayIdResult implements Serializable { private String code_url; public String getReturn_code() { - return return_code; + return this.return_code; } public void setReturn_code(String return_code) { @@ -35,7 +35,7 @@ public class WxMpPrepayIdResult implements Serializable { } public String getReturn_msg() { - return return_msg; + return this.return_msg; } public void setReturn_msg(String return_msg) { @@ -43,7 +43,7 @@ public class WxMpPrepayIdResult implements Serializable { } public String getAppid() { - return appid; + return this.appid; } public void setAppid(String appid) { @@ -51,7 +51,7 @@ public class WxMpPrepayIdResult implements Serializable { } public String getMch_id() { - return mch_id; + return this.mch_id; } public void setMch_id(String mch_id) { @@ -59,7 +59,7 @@ public class WxMpPrepayIdResult implements Serializable { } public String getNonce_str() { - return nonce_str; + return this.nonce_str; } public void setNonce_str(String nonce_str) { @@ -67,7 +67,7 @@ public class WxMpPrepayIdResult implements Serializable { } public String getSign() { - return sign; + return this.sign; } public void setSign(String sign) { @@ -75,7 +75,7 @@ public class WxMpPrepayIdResult implements Serializable { } public String getResult_code() { - return result_code; + return this.result_code; } public void setResult_code(String result_code) { @@ -83,7 +83,7 @@ public class WxMpPrepayIdResult implements Serializable { } public String getPrepay_id() { - return prepay_id; + return this.prepay_id; } public void setPrepay_id(String prepay_id) { @@ -91,7 +91,7 @@ public class WxMpPrepayIdResult implements Serializable { } public String getTrade_type() { - return trade_type; + return this.trade_type; } public void setTrade_type(String trade_type) { @@ -99,7 +99,7 @@ public class WxMpPrepayIdResult implements Serializable { } public String getErr_code() { - return err_code; + return this.err_code; } public void setErr_code(String err_code) { @@ -107,7 +107,7 @@ public class WxMpPrepayIdResult implements Serializable { } public String getErr_code_des() { - return err_code_des; + return this.err_code_des; } public void setErr_code_des(String err_code_des) { @@ -115,7 +115,7 @@ public class WxMpPrepayIdResult implements Serializable { } public String getCode_url() { - return code_url; + return this.code_url; } public void setCode_url(String code_url) { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpQrCodeTicket.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpQrCodeTicket.java index 537b771c..898906b4 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpQrCodeTicket.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpQrCodeTicket.java @@ -16,7 +16,7 @@ public class WxMpQrCodeTicket implements Serializable { protected String url; public String getTicket() { - return ticket; + return this.ticket; } public void setTicket(String ticket) { @@ -27,7 +27,7 @@ public class WxMpQrCodeTicket implements Serializable { * 如果返回-1说明是永久 */ public int getExpire_seconds() { - return expire_seconds; + return this.expire_seconds; } public void setExpire_seconds(int expire_seconds) { @@ -35,7 +35,7 @@ public class WxMpQrCodeTicket implements Serializable { } public String getUrl() { - return url; + return this.url; } public void setUrl(String url) { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpSemanticQueryResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpSemanticQueryResult.java index 936cfbfe..2485d165 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpSemanticQueryResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpSemanticQueryResult.java @@ -21,7 +21,7 @@ public class WxMpSemanticQueryResult implements Serializable { private String text; public String getQuery() { - return query; + return this.query; } public void setQuery(String query) { @@ -29,7 +29,7 @@ public class WxMpSemanticQueryResult implements Serializable { } public String getType() { - return type; + return this.type; } public void setType(String type) { @@ -37,7 +37,7 @@ public class WxMpSemanticQueryResult implements Serializable { } public String getSemantic() { - return semantic; + return this.semantic; } public void setSemantic(String semantic) { @@ -45,7 +45,7 @@ public class WxMpSemanticQueryResult implements Serializable { } public String getResult() { - return result; + return this.result; } public void setResult(String result) { @@ -53,7 +53,7 @@ public class WxMpSemanticQueryResult implements Serializable { } public String getAnswer() { - return answer; + return this.answer; } public void setAnswer(String answer) { @@ -61,7 +61,7 @@ public class WxMpSemanticQueryResult implements Serializable { } public String getText() { - return text; + return this.text; } public void setText(String text) { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUser.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUser.java index e0e34228..76670f02 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUser.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUser.java @@ -37,70 +37,70 @@ public class WxMpUser implements Serializable { protected Integer groupId; public Boolean getSubscribe() { - return subscribe; + return this.subscribe; } public Boolean isSubscribe() { - return subscribe; + return this.subscribe; } public void setSubscribe(Boolean subscribe) { this.subscribe = subscribe; } public String getOpenId() { - return openId; + return this.openId; } public void setOpenId(String openId) { this.openId = openId; } public String getNickname() { - return nickname; + return this.nickname; } public void setNickname(String nickname) { this.nickname = nickname; } public String getSex() { - return sex; + return this.sex; } public void setSex(String sex) { this.sex = sex; } public String getLanguage() { - return language; + return this.language; } public void setLanguage(String language) { this.language = language; } public String getCity() { - return city; + return this.city; } public void setCity(String city) { this.city = city; } public String getProvince() { - return province; + return this.province; } public void setProvince(String province) { this.province = province; } public String getCountry() { - return country; + return this.country; } public void setCountry(String country) { this.country = country; } public String getHeadImgUrl() { - return headImgUrl; + return this.headImgUrl; } public void setHeadImgUrl(String headImgUrl) { this.headImgUrl = headImgUrl; } public Long getSubscribeTime() { - return subscribeTime; + return this.subscribeTime; } public void setSubscribeTime(Long subscribeTime) { this.subscribeTime = subscribeTime; } public String getUnionId() { - return unionId; + return this.unionId; } public void setUnionId(String unionId) { this.unionId = unionId; @@ -108,7 +108,7 @@ public class WxMpUser implements Serializable { public Integer getSexId() { - return sexId; + return this.sexId; } public void setSexId(Integer sexId) { @@ -116,13 +116,13 @@ public class WxMpUser implements Serializable { } public String getRemark() { - return remark; + return this.remark; } public void setRemark(String remark) { this.remark = remark; } public Integer getGroupId() { - return groupId; + return this.groupId; } public void setGroupId(Integer groupId) { this.groupId = groupId; @@ -142,19 +142,19 @@ public class WxMpUser implements Serializable { @Override public String toString() { return "WxMpUser{" + - "subscribe=" + subscribe + - ", openId='" + openId + '\'' + - ", nickname='" + nickname + '\'' + - ", sex='" + sex + '\'' + - ", language='" + language + '\'' + - ", city='" + city + '\'' + - ", province='" + province + '\'' + - ", country='" + country + '\'' + - ", headImgUrl='" + headImgUrl + '\'' + - ", subscribeTime=" + subscribeTime + - ", unionId='" + unionId + '\'' + - ", remark='" + remark + '\'' + - ", groupId='" + groupId + '\'' + + "subscribe=" + this.subscribe + + ", openId='" + this.openId + '\'' + + ", nickname='" + this.nickname + '\'' + + ", sex='" + this.sex + '\'' + + ", language='" + this.language + '\'' + + ", city='" + this.city + '\'' + + ", province='" + this.province + '\'' + + ", country='" + this.country + '\'' + + ", headImgUrl='" + this.headImgUrl + '\'' + + ", subscribeTime=" + this.subscribeTime + + ", unionId='" + this.unionId + '\'' + + ", remark='" + this.remark + '\'' + + ", groupId='" + this.groupId + '\'' + '}'; } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUserList.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUserList.java index 842f1327..9f69b20d 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUserList.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUserList.java @@ -17,25 +17,25 @@ public class WxMpUserList { protected List openIds = new ArrayList(); protected String nextOpenId; public int getTotal() { - return total; + return this.total; } public void setTotal(int total) { this.total = total; } public int getCount() { - return count; + return this.count; } public void setCount(int count) { this.count = count; } public List getOpenIds() { - return openIds; + return this.openIds; } public void setOpenIds(List openIds) { this.openIds = openIds; } public String getNextOpenId() { - return nextOpenId; + return this.nextOpenId; } public void setNextOpenId(String nextOpenId) { this.nextOpenId = nextOpenId; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxRedpackResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxRedpackResult.java index 37121247..be328668 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxRedpackResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxRedpackResult.java @@ -47,72 +47,72 @@ public class WxRedpackResult implements Serializable { String sendListid; public String getErrCode() { - return errCode; + return this.errCode; } public String getErrCodeDes() { - return errCodeDes; + return this.errCodeDes; } public String getReturnCode() { - return returnCode; + return this.returnCode; } public String getReturnMsg() { - return returnMsg; + return this.returnMsg; } public String getSign() { - return sign; + return this.sign; } public String getResultCode() { - return resultCode; + return this.resultCode; } public String getMchBillno() { - return mchBillno; + return this.mchBillno; } public String getMchId() { - return mchId; + return this.mchId; } public String getWxappid() { - return wxappid; + return this.wxappid; } public String getReOpenid() { - return reOpenid; + return this.reOpenid; } public int getTotalAmount() { - return totalAmount; + return this.totalAmount; } public String getSendTime() { - return sendTime; + return this.sendTime; } public String getSendListid() { - return sendListid; + return this.sendListid; } @Override public String toString() { return "WxRedpackResult{" + - "returnCode=" + returnCode + - ", returnMsg=" + returnMsg + - ", sign=" + sign + - ", errCode=" + errCode + - ", errCodeDes=" + errCodeDes + - ", mchBillno=" + mchBillno + - ", mchId=" + mchId + - ", wxappid=" + wxappid + - ", reOpenid=" + reOpenid + - ", totalAmount=" + totalAmount + - ", sendTime=" + sendTime + - ", sendListid=" + sendListid + + "returnCode=" + this.returnCode + + ", returnMsg=" + this.returnMsg + + ", sign=" + this.sign + + ", errCode=" + this.errCode + + ", errCodeDes=" + this.errCodeDes + + ", mchBillno=" + this.mchBillno + + ", mchId=" + this.mchId + + ", wxappid=" + this.wxappid + + ", reOpenid=" + this.reOpenid + + ", totalAmount=" + this.totalAmount + + ", sendTime=" + this.sendTime + + ", sendListid=" + this.sendListid + '}'; } } From 52b2a378aaa3a1aeae3de8792397a14b30776b44 Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Wed, 31 Aug 2016 19:06:04 +0800 Subject: [PATCH 50/55] add serialVersionUID --- .../src/main/java/me/chanjar/weixin/mp/bean/WxMpGroup.java | 4 ++++ .../java/me/chanjar/weixin/mp/bean/WxMpMassGroupMessage.java | 4 ++++ .../main/java/me/chanjar/weixin/mp/bean/WxMpMassNews.java | 4 ++++ .../me/chanjar/weixin/mp/bean/WxMpMassPreviewMessage.java | 4 ++++ .../main/java/me/chanjar/weixin/mp/bean/WxMpMassVideo.java | 4 ++++ .../me/chanjar/weixin/mp/bean/WxMpMaterialArticleUpdate.java | 4 ++++ .../java/me/chanjar/weixin/mp/bean/WxMpMaterialNews.java | 4 ++++ .../java/me/chanjar/weixin/mp/bean/WxMpSemanticQuery.java | 4 ++++ .../java/me/chanjar/weixin/mp/bean/WxMpTemplateData.java | 4 ++++ .../java/me/chanjar/weixin/mp/bean/WxMpTemplateMessage.java | 4 ++++ .../me/chanjar/weixin/mp/bean/WxMpXmlOutImageMessage.java | 4 ++++ .../me/chanjar/weixin/mp/bean/WxMpXmlOutMusicMessage.java | 4 ++++ .../me/chanjar/weixin/mp/bean/WxMpXmlOutNewsMessage.java | 5 +++++ .../me/chanjar/weixin/mp/bean/WxMpXmlOutTextMessage.java | 4 ++++ .../me/chanjar/weixin/mp/bean/WxMpXmlOutVideoMessage.java | 4 ++++ .../me/chanjar/weixin/mp/bean/WxMpXmlOutVoiceMessage.java | 4 ++++ .../weixin/mp/bean/result/WxMediaImgUploadResult.java | 4 ++++ .../me/chanjar/weixin/mp/bean/result/WxMpCardResult.java | 5 +++++ .../me/chanjar/weixin/mp/bean/result/WxMpMassSendResult.java | 4 ++++ .../chanjar/weixin/mp/bean/result/WxMpMassUploadResult.java | 4 ++++ .../weixin/mp/bean/result/WxMpMaterialCountResult.java | 4 ++++ .../mp/bean/result/WxMpMaterialFileBatchGetResult.java | 4 ++++ .../mp/bean/result/WxMpMaterialNewsBatchGetResult.java | 4 ++++ .../weixin/mp/bean/result/WxMpMaterialUploadResult.java | 4 ++++ .../weixin/mp/bean/result/WxMpMaterialVideoInfoResult.java | 4 ++++ .../chanjar/weixin/mp/bean/result/WxMpOAuth2AccessToken.java | 5 +++++ .../me/chanjar/weixin/mp/bean/result/WxMpPayCallback.java | 4 ++++ .../me/chanjar/weixin/mp/bean/result/WxMpPrepayIdResult.java | 4 ++++ .../me/chanjar/weixin/mp/bean/result/WxMpQrCodeTicket.java | 4 ++++ .../weixin/mp/bean/result/WxMpSemanticQueryResult.java | 4 ++++ 30 files changed, 123 insertions(+) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpGroup.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpGroup.java index 217a1577..7dfd4ccc 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpGroup.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpGroup.java @@ -11,6 +11,10 @@ import java.io.Serializable; */ public class WxMpGroup implements Serializable { + /** + * + */ + private static final long serialVersionUID = 1554709708638735270L; private long id = -1; private String name; private long count; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassGroupMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassGroupMessage.java index 00d23584..d77605a6 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassGroupMessage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassGroupMessage.java @@ -11,6 +11,10 @@ import java.io.Serializable; */ public class WxMpMassGroupMessage implements Serializable { + /** + * + */ + private static final long serialVersionUID = -6625914040986749286L; private Long groupId; private String msgtype; private String content; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassNews.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassNews.java index 62b7cdea..9682bbd7 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassNews.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassNews.java @@ -13,6 +13,10 @@ import java.util.List; */ public class WxMpMassNews implements Serializable { + /** + * + */ + private static final long serialVersionUID = 565937155013581016L; private List articles = new ArrayList(); public List getArticles() { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassPreviewMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassPreviewMessage.java index daebde23..78e699e9 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassPreviewMessage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassPreviewMessage.java @@ -8,6 +8,10 @@ import java.io.Serializable; * @author miller */ public class WxMpMassPreviewMessage implements Serializable { + /** + * + */ + private static final long serialVersionUID = 9095211638358424020L; private String toWxUsername; private String msgType; private String content; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassVideo.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassVideo.java index faf4f42a..ec94092c 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassVideo.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassVideo.java @@ -11,6 +11,10 @@ import java.io.Serializable; */ public class WxMpMassVideo implements Serializable { + /** + * + */ + private static final long serialVersionUID = 9153925016061915637L; private String mediaId; private String title; private String description; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterialArticleUpdate.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterialArticleUpdate.java index 7443c407..f8ee265e 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterialArticleUpdate.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterialArticleUpdate.java @@ -6,6 +6,10 @@ import java.io.Serializable; public class WxMpMaterialArticleUpdate implements Serializable { + /** + * + */ + private static final long serialVersionUID = -7611963949517780270L; private String mediaId; private int index; private WxMpMaterialNews.WxMpMaterialNewsArticle articles; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterialNews.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterialNews.java index c3511071..9cfe3e88 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterialNews.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterialNews.java @@ -8,6 +8,10 @@ import java.util.List; public class WxMpMaterialNews implements Serializable { + /** + * + */ + private static final long serialVersionUID = -3283203652013494976L; private List articles = new ArrayList(); public List getArticles() { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpSemanticQuery.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpSemanticQuery.java index 2149e4a0..c17f38e9 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpSemanticQuery.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpSemanticQuery.java @@ -13,6 +13,10 @@ import java.io.Serializable; */ public class WxMpSemanticQuery implements Serializable { + /** + * + */ + private static final long serialVersionUID = 7685873048199870690L; private String query; private String category; private Float latitude; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpTemplateData.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpTemplateData.java index b1a615f9..ff83baa9 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpTemplateData.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpTemplateData.java @@ -7,6 +7,10 @@ import java.io.Serializable; */ public class WxMpTemplateData implements Serializable { + /** + * + */ + private static final long serialVersionUID = 6301835292940277870L; private String name; private String value; private String color; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpTemplateMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpTemplateMessage.java index 70bb52e3..43452e1b 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpTemplateMessage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpTemplateMessage.java @@ -8,6 +8,10 @@ import java.util.List; public class WxMpTemplateMessage implements Serializable { + /** + * + */ + private static final long serialVersionUID = 5063374783759519418L; private String toUser; private String templateId; private String url; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutImageMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutImageMessage.java index 5f529865..18204a51 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutImageMessage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutImageMessage.java @@ -8,6 +8,10 @@ import me.chanjar.weixin.common.util.xml.XStreamMediaIdConverter; @XStreamAlias("xml") public class WxMpXmlOutImageMessage extends WxMpXmlOutMessage { + /** + * + */ + private static final long serialVersionUID = -2684778597067990723L; @XStreamAlias("Image") @XStreamConverter(value = XStreamMediaIdConverter.class) private String mediaId; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutMusicMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutMusicMessage.java index 8a85df85..ec71167c 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutMusicMessage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutMusicMessage.java @@ -8,6 +8,10 @@ import me.chanjar.weixin.common.util.xml.XStreamCDataConverter; @XStreamAlias("xml") public class WxMpXmlOutMusicMessage extends WxMpXmlOutMessage { + /** + * + */ + private static final long serialVersionUID = -4159937804975448945L; @XStreamAlias("Music") protected final Music music = new Music(); diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutNewsMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutNewsMessage.java index d10e8983..1ab61e92 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutNewsMessage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutNewsMessage.java @@ -11,6 +11,11 @@ import java.util.List; @XStreamAlias("xml") public class WxMpXmlOutNewsMessage extends WxMpXmlOutMessage { + /** + * + */ + private static final long serialVersionUID = -4604402850905714772L; + @XStreamAlias("ArticleCount") protected int articleCount; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutTextMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutTextMessage.java index bac5d4f2..4c439a7c 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutTextMessage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutTextMessage.java @@ -8,6 +8,10 @@ import me.chanjar.weixin.common.util.xml.XStreamCDataConverter; @XStreamAlias("xml") public class WxMpXmlOutTextMessage extends WxMpXmlOutMessage { + /** + * + */ + private static final long serialVersionUID = -3972786455288763361L; @XStreamAlias("Content") @XStreamConverter(value=XStreamCDataConverter.class) private String content; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutVideoMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutVideoMessage.java index 3dac4eab..a8f751cf 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutVideoMessage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutVideoMessage.java @@ -8,6 +8,10 @@ import me.chanjar.weixin.common.util.xml.XStreamCDataConverter; @XStreamAlias("xml") public class WxMpXmlOutVideoMessage extends WxMpXmlOutMessage { + /** + * + */ + private static final long serialVersionUID = 1745902309380113978L; @XStreamAlias("Video") protected final Video video = new Video(); diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutVoiceMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutVoiceMessage.java index 5ef02749..a47766dc 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutVoiceMessage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutVoiceMessage.java @@ -8,6 +8,10 @@ import me.chanjar.weixin.common.util.xml.XStreamMediaIdConverter; @XStreamAlias("xml") public class WxMpXmlOutVoiceMessage extends WxMpXmlOutMessage { + /** + * + */ + private static final long serialVersionUID = 240367390249860551L; @XStreamAlias("Voice") @XStreamConverter(value = XStreamMediaIdConverter.class) private String mediaId; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMediaImgUploadResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMediaImgUploadResult.java index 57cd4484..58ff57a3 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMediaImgUploadResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMediaImgUploadResult.java @@ -8,6 +8,10 @@ import java.io.Serializable; * @author miller */ public class WxMediaImgUploadResult implements Serializable { + /** + * + */ + private static final long serialVersionUID = 1996392453428768829L; private String url; public static WxMediaImgUploadResult fromJson(String json) { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpCardResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpCardResult.java index 1d1152e3..8ce5ca47 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpCardResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpCardResult.java @@ -14,6 +14,11 @@ import java.io.Serializable; */ public class WxMpCardResult implements Serializable { + /** + * + */ + private static final long serialVersionUID = -7950878428289035637L; + private String errorCode; private String errorMsg; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMassSendResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMassSendResult.java index c71870d3..0e9a158d 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMassSendResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMassSendResult.java @@ -17,6 +17,10 @@ import java.io.Serializable; */ public class WxMpMassSendResult implements Serializable { + /** + * + */ + private static final long serialVersionUID = -4816336807575562818L; private String errorCode; private String errorMsg; private String msgId; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMassUploadResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMassUploadResult.java index 8e759fcd..6a4f88d8 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMassUploadResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMassUploadResult.java @@ -14,6 +14,10 @@ import java.io.Serializable; */ public class WxMpMassUploadResult implements Serializable { + /** + * + */ + private static final long serialVersionUID = 6568157943644994029L; private String type; private String mediaId; private long createdAt; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialCountResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialCountResult.java index 3fb33abe..94e20d50 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialCountResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialCountResult.java @@ -4,6 +4,10 @@ import java.io.Serializable; public class WxMpMaterialCountResult implements Serializable { + /** + * + */ + private static final long serialVersionUID = -5568772662085874138L; private int voiceCount; private int videoCount; private int imageCount; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialFileBatchGetResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialFileBatchGetResult.java index 3e9faad6..40eaecc1 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialFileBatchGetResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialFileBatchGetResult.java @@ -6,6 +6,10 @@ import java.util.List; public class WxMpMaterialFileBatchGetResult implements Serializable { + /** + * + */ + private static final long serialVersionUID = -560388368297267884L; private int totalCount; private int itemCount; private List items; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialNewsBatchGetResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialNewsBatchGetResult.java index b6031f11..48563244 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialNewsBatchGetResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialNewsBatchGetResult.java @@ -8,6 +8,10 @@ import java.util.List; public class WxMpMaterialNewsBatchGetResult implements Serializable { + /** + * + */ + private static final long serialVersionUID = -1617952797921001666L; private int totalCount; private int itemCount; private List items; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialUploadResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialUploadResult.java index b81a8a3e..cb9cecd1 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialUploadResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialUploadResult.java @@ -6,6 +6,10 @@ import java.io.Serializable; public class WxMpMaterialUploadResult implements Serializable { + /** + * + */ + private static final long serialVersionUID = -128818731449449537L; private String mediaId; private String url; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialVideoInfoResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialVideoInfoResult.java index 50671f6d..456544d1 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialVideoInfoResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialVideoInfoResult.java @@ -6,6 +6,10 @@ import java.io.Serializable; public class WxMpMaterialVideoInfoResult implements Serializable { + /** + * + */ + private static final long serialVersionUID = 1269131745333792202L; private String title; private String description; private String downUrl; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpOAuth2AccessToken.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpOAuth2AccessToken.java index fccff490..d38317ce 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpOAuth2AccessToken.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpOAuth2AccessToken.java @@ -6,6 +6,11 @@ import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; public class WxMpOAuth2AccessToken implements Serializable { + /** + * + */ + private static final long serialVersionUID = -1345910558078620805L; + private String accessToken; private int expiresIn = -1; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpPayCallback.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpPayCallback.java index d2edfe27..6e96f5e2 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpPayCallback.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpPayCallback.java @@ -12,6 +12,10 @@ import java.io.Serializable; * @author ukid */ public class WxMpPayCallback implements Serializable { + /** + * + */ + private static final long serialVersionUID = -4143804055690843641L; private String return_code; private String return_msg; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpPrepayIdResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpPrepayIdResult.java index 4581f264..e930fc13 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpPrepayIdResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpPrepayIdResult.java @@ -13,6 +13,10 @@ import java.io.Serializable; * @author chanjarster */ public class WxMpPrepayIdResult implements Serializable { + /** + * + */ + private static final long serialVersionUID = -8970574397788396143L; private String return_code; private String return_msg; private String appid; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpQrCodeTicket.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpQrCodeTicket.java index 898906b4..a2917ecc 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpQrCodeTicket.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpQrCodeTicket.java @@ -11,6 +11,10 @@ import java.io.Serializable; */ public class WxMpQrCodeTicket implements Serializable { + /** + * + */ + private static final long serialVersionUID = 5777119669111011584L; protected String ticket; protected int expire_seconds = -1; protected String url; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpSemanticQueryResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpSemanticQueryResult.java index 2485d165..c8a01d3e 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpSemanticQueryResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpSemanticQueryResult.java @@ -13,6 +13,10 @@ import java.io.Serializable; */ public class WxMpSemanticQueryResult implements Serializable { + /** + * + */ + private static final long serialVersionUID = 4811088544804441365L; private String query; private String type; private String semantic; From 05f809cec08a8034501ee0ef4b47966a59185a17 Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Wed, 31 Aug 2016 19:11:01 +0800 Subject: [PATCH 51/55] Remove redundant type arguments --- .../java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java | 6 +++--- .../main/java/me/chanjar/weixin/mp/bean/WxMpMassNews.java | 2 +- .../main/java/me/chanjar/weixin/mp/bean/WxMpMaterial.java | 2 +- .../java/me/chanjar/weixin/mp/bean/WxMpMaterialNews.java | 2 +- .../java/me/chanjar/weixin/mp/bean/WxMpTemplateMessage.java | 2 +- .../me/chanjar/weixin/mp/bean/WxMpXmlOutNewsMessage.java | 2 +- .../chanjar/weixin/mp/bean/custombuilder/NewsBuilder.java | 2 +- .../chanjar/weixin/mp/bean/outxmlbuilder/NewsBuilder.java | 2 +- .../java/me/chanjar/weixin/mp/bean/result/WxMpUserList.java | 2 +- .../me/chanjar/weixin/mp/util/xml/XStreamTransformer.java | 2 +- 10 files changed, 12 insertions(+), 12 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java index 31d280a7..b72cc45a 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java @@ -54,7 +54,7 @@ public class WxMpMessageRouter { private static final int DEFAULT_THREAD_POOL_SIZE = 100; - private final List rules = new ArrayList(); + private final List rules = new ArrayList<>(); private final WxMpService wxMpService; @@ -139,7 +139,7 @@ public class WxMpMessageRouter { return null; } - final List matchRules = new ArrayList(); + final List matchRules = new ArrayList<>(); // 收集匹配的规则 for (final WxMpMessageRouterRule rule : this.rules) { if (rule.test(wxMessage)) { @@ -155,7 +155,7 @@ public class WxMpMessageRouter { } WxMpXmlOutMessage res = null; - final List futures = new ArrayList(); + final List futures = new ArrayList<>(); for (final WxMpMessageRouterRule rule : matchRules) { // 返回最后一个非异步的rule的执行结果 if(rule.isAsync()) { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassNews.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassNews.java index 9682bbd7..4b059ea8 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassNews.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassNews.java @@ -17,7 +17,7 @@ public class WxMpMassNews implements Serializable { * */ private static final long serialVersionUID = 565937155013581016L; - private List articles = new ArrayList(); + private List articles = new ArrayList<>(); public List getArticles() { return this.articles; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterial.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterial.java index 8a79bed0..058d9034 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterial.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterial.java @@ -22,7 +22,7 @@ public class WxMpMaterial { } public Map getForm() { - Map form = new HashMap(); + Map form = new HashMap<>(); form.put("title", this.videoTitle); form.put("introduction", this.videoIntroduction); return form; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterialNews.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterialNews.java index 9cfe3e88..df40f6c3 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterialNews.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterialNews.java @@ -12,7 +12,7 @@ public class WxMpMaterialNews implements Serializable { * */ private static final long serialVersionUID = -3283203652013494976L; - private List articles = new ArrayList(); + private List articles = new ArrayList<>(); public List getArticles() { return this.articles; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpTemplateMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpTemplateMessage.java index 43452e1b..eec25eda 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpTemplateMessage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpTemplateMessage.java @@ -16,7 +16,7 @@ public class WxMpTemplateMessage implements Serializable { private String templateId; private String url; private String topColor; - private List data = new ArrayList(); + private List data = new ArrayList<>(); public String getToUser() { return this.toUser; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutNewsMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutNewsMessage.java index 1ab61e92..170023a3 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutNewsMessage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutNewsMessage.java @@ -20,7 +20,7 @@ public class WxMpXmlOutNewsMessage extends WxMpXmlOutMessage { protected int articleCount; @XStreamAlias("Articles") - protected final List articles = new ArrayList(); + protected final List articles = new ArrayList<>(); public WxMpXmlOutNewsMessage() { this.msgType = WxConsts.XML_MSG_NEWS; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/NewsBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/NewsBuilder.java index bc8adcda..ad0efb23 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/NewsBuilder.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/NewsBuilder.java @@ -17,7 +17,7 @@ import java.util.List; */ public final class NewsBuilder extends BaseBuilder { - private List articles = new ArrayList(); + private List articles = new ArrayList<>(); public NewsBuilder() { this.msgType = WxConsts.CUSTOM_MSG_NEWS; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/outxmlbuilder/NewsBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/outxmlbuilder/NewsBuilder.java index a5b4aee8..1014c452 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/outxmlbuilder/NewsBuilder.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/outxmlbuilder/NewsBuilder.java @@ -11,7 +11,7 @@ import java.util.List; */ public final class NewsBuilder extends BaseBuilder { - protected final List articles = new ArrayList(); + protected final List articles = new ArrayList<>(); public NewsBuilder addArticle(WxMpXmlOutNewsMessage.Item item) { this.articles.add(item); diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUserList.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUserList.java index 9f69b20d..94b51f6c 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUserList.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUserList.java @@ -14,7 +14,7 @@ public class WxMpUserList { protected int total = -1; protected int count = -1; - protected List openIds = new ArrayList(); + protected List openIds = new ArrayList<>(); protected String nextOpenId; public int getTotal() { return this.total; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/xml/XStreamTransformer.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/xml/XStreamTransformer.java index 472bac55..61ecac41 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/xml/XStreamTransformer.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/xml/XStreamTransformer.java @@ -45,7 +45,7 @@ public class XStreamTransformer { } private static Map configXStreamInstance() { - Map map = new HashMap(); + Map map = new HashMap<>(); map.put(WxMpXmlMessage.class, config_WxMpXmlMessage()); map.put(WxMpXmlOutMusicMessage.class, config_WxMpXmlOutMusicMessage()); map.put(WxMpXmlOutNewsMessage.class, config_WxMpXmlOutNewsMessage()); From dafbe0740906f550bbb07c6673d1f795c39f789d Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Wed, 31 Aug 2016 19:11:37 +0800 Subject: [PATCH 52/55] remove unused imports --- .../weixin/mp/util/http/MaterialDeleteRequestExecutor.java | 1 - .../weixin/mp/util/http/MaterialNewsInfoRequestExecutor.java | 1 - .../weixin/mp/util/http/MaterialUploadRequestExecutor.java | 1 - .../weixin/mp/util/http/MaterialVideoInfoRequestExecutor.java | 1 - .../util/http/MaterialVoiceAndImageDownloadRequestExecutor.java | 1 - .../weixin/mp/util/http/MediaImgUploadRequestExecutor.java | 1 - .../me/chanjar/weixin/mp/util/http/QrCodeRequestExecutor.java | 1 - .../me/chanjar/weixin/mp/util/json/WxLongTimeJsonSerializer.java | 1 - 8 files changed, 8 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/MaterialDeleteRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/MaterialDeleteRequestExecutor.java index fb1296b6..9502afe6 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/MaterialDeleteRequestExecutor.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/MaterialDeleteRequestExecutor.java @@ -6,7 +6,6 @@ import me.chanjar.weixin.common.util.http.RequestExecutor; import me.chanjar.weixin.common.util.http.Utf8ResponseHandler; import me.chanjar.weixin.common.util.json.WxGsonBuilder; import org.apache.http.HttpHost; -import org.apache.http.client.ClientProtocolException; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/MaterialNewsInfoRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/MaterialNewsInfoRequestExecutor.java index f386cbc3..7a0719db 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/MaterialNewsInfoRequestExecutor.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/MaterialNewsInfoRequestExecutor.java @@ -8,7 +8,6 @@ import me.chanjar.weixin.common.util.json.WxGsonBuilder; import me.chanjar.weixin.mp.bean.WxMpMaterialNews; import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; import org.apache.http.HttpHost; -import org.apache.http.client.ClientProtocolException; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/MaterialUploadRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/MaterialUploadRequestExecutor.java index 830ef9ac..b7f05506 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/MaterialUploadRequestExecutor.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/MaterialUploadRequestExecutor.java @@ -8,7 +8,6 @@ import me.chanjar.weixin.common.util.json.WxGsonBuilder; import me.chanjar.weixin.mp.bean.WxMpMaterial; import me.chanjar.weixin.mp.bean.result.WxMpMaterialUploadResult; import org.apache.http.HttpHost; -import org.apache.http.client.ClientProtocolException; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/MaterialVideoInfoRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/MaterialVideoInfoRequestExecutor.java index 2f8cf4e1..4f9f6878 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/MaterialVideoInfoRequestExecutor.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/MaterialVideoInfoRequestExecutor.java @@ -7,7 +7,6 @@ import me.chanjar.weixin.common.util.http.Utf8ResponseHandler; import me.chanjar.weixin.common.util.json.WxGsonBuilder; import me.chanjar.weixin.mp.bean.result.WxMpMaterialVideoInfoResult; import org.apache.http.HttpHost; -import org.apache.http.client.ClientProtocolException; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/MaterialVoiceAndImageDownloadRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/MaterialVoiceAndImageDownloadRequestExecutor.java index 6ac84090..81bc2253 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/MaterialVoiceAndImageDownloadRequestExecutor.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/MaterialVoiceAndImageDownloadRequestExecutor.java @@ -7,7 +7,6 @@ import me.chanjar.weixin.common.util.http.RequestExecutor; import me.chanjar.weixin.common.util.json.WxGsonBuilder; import org.apache.commons.io.IOUtils; import org.apache.http.HttpHost; -import org.apache.http.client.ClientProtocolException; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/MediaImgUploadRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/MediaImgUploadRequestExecutor.java index 8e901443..49606031 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/MediaImgUploadRequestExecutor.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/MediaImgUploadRequestExecutor.java @@ -7,7 +7,6 @@ import me.chanjar.weixin.common.util.http.Utf8ResponseHandler; import me.chanjar.weixin.mp.bean.result.WxMediaImgUploadResult; import org.apache.http.HttpEntity; import org.apache.http.HttpHost; -import org.apache.http.client.ClientProtocolException; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/QrCodeRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/QrCodeRequestExecutor.java index 96e444e7..5eaef1ba 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/QrCodeRequestExecutor.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/QrCodeRequestExecutor.java @@ -9,7 +9,6 @@ import me.chanjar.weixin.common.util.http.Utf8ResponseHandler; import me.chanjar.weixin.mp.bean.result.WxMpQrCodeTicket; import org.apache.http.Header; import org.apache.http.HttpHost; -import org.apache.http.client.ClientProtocolException; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxLongTimeJsonSerializer.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxLongTimeJsonSerializer.java index b264f1f5..388139f2 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxLongTimeJsonSerializer.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxLongTimeJsonSerializer.java @@ -4,7 +4,6 @@ import java.io.IOException; import java.text.SimpleDateFormat; import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; From d17f11341dd56a2b4a134dba118e88b127c60629 Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Wed, 31 Aug 2016 19:14:49 +0800 Subject: [PATCH 53/55] fix potential resource leak --- .../chanjar/weixin/mp/util/http/QrCodeRequestExecutor.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/QrCodeRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/QrCodeRequestExecutor.java index 5eaef1ba..2486ca80 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/QrCodeRequestExecutor.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/QrCodeRequestExecutor.java @@ -46,7 +46,8 @@ public class QrCodeRequestExecutor implements RequestExecutor 0) { // 出错 @@ -55,8 +56,6 @@ public class QrCodeRequestExecutor implements RequestExecutor Date: Wed, 31 Aug 2016 19:23:47 +0800 Subject: [PATCH 54/55] fix javadoc --- .../src/main/java/me/chanjar/weixin/mp/bean/WxMpUserQuery.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpUserQuery.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpUserQuery.java index 4d177b69..f16c004c 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpUserQuery.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpUserQuery.java @@ -24,7 +24,6 @@ public class WxMpUserQuery { /** * 语言使用默认(zh_CN) * - * @description * @param openIdList */ public WxMpUserQuery(List openIdList) { @@ -98,7 +97,6 @@ public class WxMpUserQuery { /** * 获取查询参数列表 * - * @return */ public List getQueryParamList() { return this.queryParamList; From 8bca9e753c2f88ad66934807bdf76c8e5b4d67e5 Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Wed, 31 Aug 2016 19:24:03 +0800 Subject: [PATCH 55/55] =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=8F=B7=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E4=B8=BA2.1.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- weixin-java-common/pom.xml | 2 +- weixin-java-cp/pom.xml | 2 +- weixin-java-mp/pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 54370f46..dded0cab 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.github.binarywang weixin-java-parent - 2.1.0-SNAPSHOT + 2.1.0 pom WeiXin Java Tools - Parent 微信公众号、企业号上级POM diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml index 684cae1d..b916ccfa 100644 --- a/weixin-java-common/pom.xml +++ b/weixin-java-common/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang weixin-java-parent - 2.1.0-SNAPSHOT + 2.1.0 weixin-java-common diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml index 0d2c217b..7b996256 100644 --- a/weixin-java-cp/pom.xml +++ b/weixin-java-cp/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang weixin-java-parent - 2.1.0-SNAPSHOT + 2.1.0 weixin-java-cp diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml index 516f058c..2ed00145 100644 --- a/weixin-java-mp/pom.xml +++ b/weixin-java-mp/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang weixin-java-parent - 2.1.0-SNAPSHOT + 2.1.0 weixin-java-mp WeiXin Java Tools - MP