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 {