View Javadoc
1   package com.foxinmy.weixin4j.mp.api;
2   
3   import java.util.Calendar;
4   import java.util.Date;
5   import java.util.List;
6   
7   import com.alibaba.fastjson.JSON;
8   import com.alibaba.fastjson.JSONObject;
9   import com.foxinmy.weixin4j.exception.WeixinException;
10  import com.foxinmy.weixin4j.http.weixin.WeixinResponse;
11  import com.foxinmy.weixin4j.model.Token;
12  import com.foxinmy.weixin4j.mp.type.DatacubeType;
13  import com.foxinmy.weixin4j.token.TokenManager;
14  import com.foxinmy.weixin4j.util.DateUtil;
15  
16  /**
17   * 数据分析API
18   * <p>
19   * 1、接口侧的公众号数据的数据库中仅存储了2014年12月1日之后的数据,将查询不到在此之前的日期,即使有查到,也是不可信的脏数据;</br>
20   * 2、请开发者在调用接口获取数据后,将数据保存在自身数据库中,即加快下次用户的访问速度,也降低了微信侧接口调用的不必要损耗。</br>
21   * </p>
22   * 
23   * @className DataApi
24   * @author jinyu(foxinmy@gmail.com)
25   * @date 2015年1月7日
26   * @since JDK 1.6
27   * @see
28   */
29  public class DataApi extends MpApi {
30  	private final TokenManager tokenManager;
31  
32  	public DataApi(TokenManager tokenManager) {
33  		this.tokenManager = tokenManager;
34  	}
35  
36  	/**
37  	 * 数据统计
38  	 * 
39  	 * @param datacubeType
40  	 *            统计类型
41  	 * @param beginDate
42  	 *            开始日期
43  	 * @param offset
44  	 *            增量 表示向前几天 比如 offset=1 则查询 beginDate的后一天之间的数据
45  	 * @see {@link #datacube(DatacubeType, Date,Date)}
46  	 * @throws WeixinException
47  	 */
48  	public List<?> datacube(DatacubeType datacubeType, Date beginDate,
49  			int offset) throws WeixinException {
50  		Calendar ca = Calendar.getInstance();
51  		ca.setTime(beginDate);
52  		ca.add(Calendar.DAY_OF_MONTH, offset);
53  		return datacube(datacubeType, beginDate, ca.getTime());
54  	}
55  
56  	/**
57  	 * 数据统计
58  	 * 
59  	 * @param datacubeType
60  	 *            统计类型
61  	 * @param offset
62  	 *            增量 表示向后几天 比如 offset=1 则查询 beginDate的前一天之间的数据
63  	 * @param endDate
64  	 *            截至日期
65  	 * @see {@link #datacube(DatacubeType, Date,Date)}
66  	 * @throws WeixinException
67  	 */
68  	public List<?> datacube(DatacubeType datacubeType, int offset, Date endDate)
69  			throws WeixinException {
70  		Calendar ca = Calendar.getInstance();
71  		ca.setTime(endDate);
72  		ca.add(Calendar.DAY_OF_MONTH, 0 - offset);
73  		return datacube(datacubeType, ca.getTime(), endDate);
74  	}
75  
76  	/**
77  	 * 查询日期跨度为0的统计数据(当天)
78  	 * 
79  	 * @param datacubeType
80  	 *            统计类型
81  	 * @param date
82  	 *            统计日期
83  	 * @see {@link #datacube(DatacubeType, Date,Date)}
84  	 * @throws WeixinException
85  	 */
86  	public List<?> datacube(DatacubeType datacubeType, Date date)
87  			throws WeixinException {
88  		return datacube(datacubeType, date, date);
89  	}
90  
91  	/**
92  	 * 数据统计
93  	 * 
94  	 * @param datacubeType
95  	 *            数据统计类型
96  	 * @param beginDate
97  	 *            获取数据的起始日期,begin_date和end_date的差值需小于“最大时间跨度”(比如最大时间跨度为1时,
98  	 *            begin_date和end_date的差值只能为0,才能小于1),否则会报错
99  	 * @param endDate
100 	 *            获取数据的结束日期,end_date允许设置的最大值为昨日
101 	 * @see com.foxinmy.weixin4j.mp.datacube.UserSummary
102 	 * @see com.foxinmy.weixin4j.mp.datacube.ArticleSummary
103 	 * @see com.foxinmy.weixin4j.mp.datacube.ArticleTotal
104 	 * @see com.foxinmy.weixin4j.mp.datacube.ArticleDatacubeShare
105 	 * @see com.foxinmy.weixin4j.mp.datacube.UpstreamMsg
106 	 * @see com.foxinmy.weixin4j.mp.datacube.UpstreamMsgDist
107 	 * @see com.foxinmy.weixin4j.mp.datacube.InterfaceSummary
108 	 * @return 统计结果
109 	 * @see <a
110 	 *      href="https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141082&token=&lang=zh_CN">用户分析</a>
111 	 * @see <a
112 	 *      href="https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141084&token=&lang=zh_CN">图文分析</a>
113 	 * @see <a
114 	 *      href="https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141085&token=&lang=zh_CN">消息分析</a>
115 	 * @see <a
116 	 *      href="https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141086&token=&lang=zh_CN">接口分析</a>
117 	 * @throws WeixinException
118 	 */
119 	public List<?> datacube(DatacubeType datacubeType, Date beginDate,
120 			Date endDate) throws WeixinException {
121 		String datacube_uri = getRequestUri("datacube_uri");
122 		Token token = tokenManager.getCache();
123 		JSONObject obj = new JSONObject();
124 		obj.put("begin_date", DateUtil.fortmat2yyyy_MM_dd(beginDate));
125 		obj.put("end_date", DateUtil.fortmat2yyyy_MM_dd(endDate));
126 		WeixinResponse response = weixinExecutor.post(String.format(datacube_uri,
127 				datacubeType.name().toLowerCase(), token.getAccessToken()), obj
128 				.toJSONString());
129 
130 		return JSON.parseArray(response.getAsJson().getString("list"),
131 				datacubeType.getClazz());
132 	}
133 }