Skip to content

小程序:增加数据分析相关 API #565

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Apr 29, 2018
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
package cn.binarywang.wx.miniapp.api;

import cn.binarywang.wx.miniapp.bean.analysis.WxMaRetainInfo;
import cn.binarywang.wx.miniapp.bean.analysis.WxMaSummaryTrend;
import cn.binarywang.wx.miniapp.bean.analysis.WxMaUserPortrait;
import cn.binarywang.wx.miniapp.bean.analysis.WxMaVisitDistribution;
import cn.binarywang.wx.miniapp.bean.analysis.WxMaVisitPage;
import cn.binarywang.wx.miniapp.bean.analysis.WxMaVisitTrend;
import me.chanjar.weixin.common.exception.WxErrorException;

import java.util.Date;
import java.util.List;

/**
* 小程序数据分析相关接口
* 文档:https://mp.weixin.qq.com/debug/wxadoc/dev/api/analysis.html
*
* @author <a href="https://github.com/charmingoh">Charming</a>
* @since 2018-04-28
*/
public interface WxMaAnalysisService {
String GET_DAILY_SUMMARY_TREND_URL = "https://api.weixin.qq.com/datacube/getweanalysisappiddailysummarytrend";
String GET_DAILY_VISIT_TREND_URL = "https://api.weixin.qq.com/datacube/getweanalysisappiddailyvisittrend";
String GET_WEEKLY_VISIT_TREND_URL = "https://api.weixin.qq.com/datacube/getweanalysisappidweeklyvisittrend";
String GET_MONTHLY_VISIT_TREND_URL = "https://api.weixin.qq.com/datacube/getweanalysisappidmonthlyvisittrend";
String GET_VISIT_DISTRIBUTION_URL = "https://api.weixin.qq.com/datacube/getweanalysisappidvisitdistribution";
String GET_DAILY_RETAIN_INFO_URL = "https://api.weixin.qq.com/datacube/getweanalysisappiddailyretaininfo";
String GET_WEEKLY_RETAIN_INFO_URL = "https://api.weixin.qq.com/datacube/getweanalysisappidweeklyretaininfo";
String GET_MONTHLY_RETAIN_INFO_URL = "https://api.weixin.qq.com/datacube/getweanalysisappidmonthlyretaininfo";
String GET_VISIT_PAGE_URL = "https://api.weixin.qq.com/datacube/getweanalysisappidvisitpage";
String GET_USER_PORTRAIT_URL = "https://api.weixin.qq.com/datacube/getweanalysisappiduserportrait";

/**
* 查询概况趋势
* 温馨提示:小程序接口目前只能查询一天的数据,即 beginDate 和 endDate 一样
*
* @param beginDate 开始日期
* @param endDate 结束日期,限定查询1天数据,end_date允许设置的最大值为昨日
* @return 概况趋势
* @throws WxErrorException 获取失败时抛出,具体错误码请看文档
*/
List<WxMaSummaryTrend> getDailySummaryTrend(Date beginDate, Date endDate) throws WxErrorException;

/**
* 获取日访问趋势
* 温馨提示:小程序接口目前只能查询一天的数据,即 beginDate 和 endDate 一样
*
* @param beginDate 开始日期
* @param endDate 结束日期,限定查询1天数据,end_date允许设置的最大值为昨日
* @return 日访问趋势
* @throws WxErrorException 获取失败时抛出,具体错误码请看文档
*/
List<WxMaVisitTrend> getDailyVisitTrend(Date beginDate, Date endDate) throws WxErrorException;

/**
* 获取周访问趋势
* 限定查询一个自然周的数据,时间必须按照自然周的方式输入: 如:20170306(周一), 20170312(周日)
*
* @param beginDate 开始日期,为周一日期
* @param endDate 结束日期,为周日日期,限定查询一周数据
* @return 周访问趋势(每项数据都是一个自然周汇总)
* @throws WxErrorException 获取失败时抛出,具体错误码请看文档
*/
List<WxMaVisitTrend> getWeeklyVisitTrend(Date beginDate, Date endDate) throws WxErrorException;

/**
* 获取月访问趋势
* 限定查询一个自然月的数据,时间必须按照自然月的方式输入: 如:20170201(月初), 20170228(月末)
*
* @param beginDate 开始日期,为自然月第一天
* @param endDate 结束日期,为自然月最后一天,限定查询一个月数据
* @return 月访问趋势(每项数据都是一个自然月汇总)
* @throws WxErrorException 获取失败时抛出,具体错误码请看文档
*/
List<WxMaVisitTrend> getMonthlyVisitTrend(Date beginDate, Date endDate) throws WxErrorException;

/**
* 获取访问分布
* (此接口目前只能查询一天的数据,即 beginDate 和 endDate 一样)
*
* @param beginDate 开始日期,为周一日期
* @param endDate 结束日期,限定查询1天数据,end_date允许设置的最大值为昨日
* @return 访问分布
* @throws WxErrorException 获取失败时抛出,具体错误码请看文档
*/
WxMaVisitDistribution getVisitDistribution(Date beginDate, Date endDate) throws WxErrorException;

/**
* 日留存
* (此接口目前只能查询一天的数据,即 beginDate 和 endDate 一样)
*
* @param beginDate 开始日期,为周一日期
* @param endDate 结束日期,限定查询 1 天数据,endDate 允许设置的最大值为昨日
* @return 日留存
* @throws WxErrorException 获取失败时抛出,具体错误码请看文档
*/
WxMaRetainInfo getDailyRetainInfo(Date beginDate, Date endDate) throws WxErrorException;

/**
* 周留存
* 限定查询一个自然周的数据,时间必须按照自然周的方式输入: 如:20170306(周一), 20170312(周日)
*
* @param beginDate 开始日期,为周一日期
* @param endDate 结束日期,为周日日期,限定查询一周数据
* @return 周留存
* @throws WxErrorException 获取失败时抛出,具体错误码请看文档
*/
WxMaRetainInfo getWeeklyRetainInfo(Date beginDate, Date endDate) throws WxErrorException;

/**
* 月留存
* 限定查询一个自然月的数据,时间必须按照自然月的方式输入: 如:20170201(月初), 20170228(月末)
*
* @param beginDate 开始日期,为自然月第一天
* @param endDate 结束日期,为自然月最后一天,限定查询一个月数据
* @return 月留存
* @throws WxErrorException 获取失败时抛出,具体错误码请看文档
*/
WxMaRetainInfo getMonthlyRetainInfo(Date beginDate, Date endDate) throws WxErrorException;

/**
* 获取访问页面数据
* 温馨提示:此接口目前只能查询一天的数据,即 beginDate 和 endDate 一样
*
* @param beginDate 开始日期
* @param endDate 结束日期,限定查询1天数据,end_date允许设置的最大值为昨日
* @return 访问页面数据
* @throws WxErrorException 获取失败时抛出,具体错误码请看文档
*/
List<WxMaVisitPage> getVisitPage(Date beginDate, Date endDate) throws WxErrorException;

/**
* 获取小程序新增或活跃用户的画像分布数据
* 时间范围支持昨天、最近7天、最近30天。
* 其中,新增用户数为时间范围内首次访问小程序的去重用户数,
* 活跃用户数为时间范围内访问过小程序的去重用户数。
* 画像属性包括用户年龄、性别、省份、城市、终端类型、机型。
*
* @param beginDate 开始日期
* @param endDate 结束日期,开始日期与结束日期相差的天数限定为0/6/29,分别表示查询最近1/7/30天数据,end_date允许设置的最大值为昨日
* @return 小程序新增或活跃用户的画像分布数据
* @throws WxErrorException 获取失败时抛出,具体错误码请看文档
*/
WxMaUserPortrait getUserPortrait(Date beginDate, Date endDate) throws WxErrorException;
}
Original file line number Diff line number Diff line change
Expand Up @@ -135,13 +135,27 @@ public interface WxMaService {
*/
WxMaTemplateService getTemplateService();

/**
* 数据分析相关查询服务
*
* @return WxMaAnalysisService
*/
WxMaAnalysisService getAnalysisService();

/**
* 返回代码操作相关的 API
*
* @return WxMaCodeService
*/
WxMaCodeService getCodeService();

/**
* 小程序修改服务器地址、成员管理 API
*
* @return WxMaSettingService
*/
WxMaSettingService getSettingService();

/**
* 初始化http请求对象.
*/
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package cn.binarywang.wx.miniapp.api;

import cn.binarywang.wx.miniapp.bean.WxMaDomainAction;
import me.chanjar.weixin.common.exception.WxErrorException;

/**
* 小程序修改服务器地址、成员管理 API(大部分只能是第三方平台调用)
*
* @author <a href="https://github.com/charmingoh">Charming</a>
* @since 2018-04-27 15:46
*/
public interface WxMaSettingService {
/**
* 修改服务器地址:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1489138143_WPbOO&token=&lang=zh_CN
* access_token 为 authorizer_access_token
*/
String MODIFY_DOMAIN_URL = "https://api.weixin.qq.com/wxa/modify_domain";
String SET_WEB_VIEW_DOMAIN_URL = "https://api.weixin.qq.com/wxa/setwebviewdomain";
/**
* 小程序成员管理:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1489140588_nVUgx&token=&lang=zh_CN
* access_token 为 authorizer_access_token
*/
String BIND_TESTER_URL = "https://api.weixin.qq.com/wxa/bind_tester";
String UNBIND_TESTER_URL = "https://api.weixin.qq.com/wxa/unbind_tester";

/**
* 操作服务器域名
*
* @param domainAction 域名操作参数
* 除了 webViewDomain,都是有效的
* @return 以下字段仅在 get 时返回完整字段
* @throws WxErrorException 操作失败时抛出,具体错误码请看文档
*/
WxMaDomainAction modifyDomain(WxMaDomainAction domainAction) throws WxErrorException;

/**
* 设置小程序业务域名(仅供第三方代小程序调用)
* 授权给第三方的小程序,其业务域名只可以为第三方的服务器,
* 当小程序通过第三方发布代码上线后,小程序原先自己配置的业务域名将被删除,
* 只保留第三方平台的域名,所以第三方平台在代替小程序发布代码之前,需要调用接口为小程序添加业务域名。
* 提示:需要先将域名登记到第三方平台的小程序业务域名中,才可以调用接口进行配置。
*
* @param domainAction 域名操作参数
* 只有 action 和 webViewDomain 是有效的
* @return 以下字段仅在 get 时返回完整字段
* @throws WxErrorException 操作失败时抛出,具体错误码请看文档
*/
WxMaDomainAction setWebViewDomain(WxMaDomainAction domainAction) throws WxErrorException;

/**
* 绑定微信用户为小程序体验者
*
* @param wechatId 微信号
* @throws WxErrorException 失败时抛出,具体错误码请看文档
*/
void bindTester(String wechatId) throws WxErrorException;

/**
* 解除绑定小程序的体验者
*
* @param wechatId 微信号
* @throws WxErrorException 失败时抛出,具体错误码请看文档
*/
void unbindTester(String wechatId) throws WxErrorException;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
package cn.binarywang.wx.miniapp.api.impl;

import cn.binarywang.wx.miniapp.api.WxMaAnalysisService;
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.bean.analysis.WxMaRetainInfo;
import cn.binarywang.wx.miniapp.bean.analysis.WxMaSummaryTrend;
import cn.binarywang.wx.miniapp.bean.analysis.WxMaUserPortrait;
import cn.binarywang.wx.miniapp.bean.analysis.WxMaVisitDistribution;
import cn.binarywang.wx.miniapp.bean.analysis.WxMaVisitPage;
import cn.binarywang.wx.miniapp.bean.analysis.WxMaVisitTrend;
import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;
import me.chanjar.weixin.common.exception.WxErrorException;
import org.apache.commons.lang3.time.DateFormatUtils;

import java.lang.reflect.Type;
import java.util.Date;
import java.util.List;

/**
* @author <a href="https://github.com/charmingoh">Charming</a>
* @since 2018-04-28
*/
public class WxMaAnalysisServiceImpl implements WxMaAnalysisService {
private static final JsonParser JSON_PARSER = new JsonParser();
private WxMaService wxMaService;

public WxMaAnalysisServiceImpl(WxMaService wxMaService) {
this.wxMaService = wxMaService;
}

@Override
public List<WxMaSummaryTrend> getDailySummaryTrend(Date beginDate, Date endDate) throws WxErrorException {
return getAnalysisResultAsList(GET_DAILY_SUMMARY_TREND_URL, beginDate, endDate,
new TypeToken<List<WxMaSummaryTrend>>() {
}.getType());
}

@Override
public List<WxMaVisitTrend> getDailyVisitTrend(Date beginDate, Date endDate) throws WxErrorException {
return getAnalysisResultAsList(GET_DAILY_VISIT_TREND_URL, beginDate, endDate,
new TypeToken<List<WxMaVisitTrend>>() {
}.getType());
}

@Override
public List<WxMaVisitTrend> getWeeklyVisitTrend(Date beginDate, Date endDate) throws WxErrorException {
return getAnalysisResultAsList(GET_WEEKLY_VISIT_TREND_URL, beginDate, endDate,
new TypeToken<List<WxMaVisitTrend>>() {
}.getType());
}

@Override
public List<WxMaVisitTrend> getMonthlyVisitTrend(Date beginDate, Date endDate) throws WxErrorException {
return getAnalysisResultAsList(GET_MONTHLY_VISIT_TREND_URL, beginDate, endDate,
new TypeToken<List<WxMaVisitTrend>>() {
}.getType());
}

@Override
public WxMaVisitDistribution getVisitDistribution(Date beginDate, Date endDate) throws WxErrorException {
String responseContent = this.wxMaService.post(GET_VISIT_DISTRIBUTION_URL, toJson(beginDate, endDate));
return WxMaVisitDistribution.fromJson(responseContent);
}

@Override
public WxMaRetainInfo getDailyRetainInfo(Date beginDate, Date endDate) throws WxErrorException {
return getRetainInfo(beginDate, endDate, GET_DAILY_RETAIN_INFO_URL);
}

@Override
public WxMaRetainInfo getWeeklyRetainInfo(Date beginDate, Date endDate) throws WxErrorException {
return getRetainInfo(beginDate, endDate, GET_WEEKLY_RETAIN_INFO_URL);
}

@Override
public WxMaRetainInfo getMonthlyRetainInfo(Date beginDate, Date endDate) throws WxErrorException {
return getRetainInfo(beginDate, endDate, GET_MONTHLY_RETAIN_INFO_URL);
}

@Override
public List<WxMaVisitPage> getVisitPage(Date beginDate, Date endDate) throws WxErrorException {
return getAnalysisResultAsList(GET_VISIT_PAGE_URL, beginDate, endDate,
new TypeToken<List<WxMaVisitPage>>() {
}.getType());
}

@Override
public WxMaUserPortrait getUserPortrait(Date beginDate, Date endDate) throws WxErrorException {
String responseContent = this.wxMaService.post(GET_USER_PORTRAIT_URL, toJson(beginDate, endDate));
return WxMaUserPortrait.fromJson(responseContent);
}

private WxMaRetainInfo getRetainInfo(Date beginDate, Date endDate, String url) throws WxErrorException {
String responseContent = this.wxMaService.post(url, toJson(beginDate, endDate));
return WxMaRetainInfo.fromJson(responseContent);
}

/**
* 获取数据分析结果并返回 List,returnType 类型
*
* @param url 链接
* @param returnType 返回的类型
* @param <T> 返回的类型
* @return List 类型的数据
*/
private <T> List<T> getAnalysisResultAsList(String url, Date beginDate, Date endDate, Type returnType) throws WxErrorException {
String responseContent = this.wxMaService.post(url, toJson(beginDate, endDate));
JsonObject response = JSON_PARSER.parse(responseContent).getAsJsonObject();
boolean hasList = response.has("list");
if (hasList) {
return WxMaGsonBuilder.create().fromJson(response.getAsJsonArray("list"), returnType);
} else {
return null;
}
}

private static String toJson(Date beginDate, Date endDate) {
JsonObject param = new JsonObject();
param.addProperty("begin_date", DateFormatUtils.format(beginDate, "yyyyMMdd"));
param.addProperty("end_date", DateFormatUtils.format(endDate, "yyyyMMdd"));
return param.toString();
}
}
Loading