| @@ -11,13 +11,16 @@ import me.chanjar.weixin.mp.bean.result.*; | |||
| import java.io.File; | |||
| import java.io.IOException; | |||
| import java.io.InputStream; | |||
| import java.text.SimpleDateFormat; | |||
| import java.util.Date; | |||
| import java.util.List; | |||
| /** | |||
| * 微信API的Service | |||
| */ | |||
| public interface WxMpService { | |||
| public static final SimpleDateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); | |||
| /** | |||
| * <pre> | |||
| * 验证推送过来的消息的正确性 | |||
| @@ -431,6 +434,30 @@ public interface WxMpService { | |||
| */ | |||
| String[] getCallbackIP() throws WxErrorException; | |||
| /** | |||
| * <pre> | |||
| * 获取用户增减数据 | |||
| * http://mp.weixin.qq.com/wiki/3/ecfed6e1a0a03b5f35e5efac98e864b7.html | |||
| * </pre> | |||
| * @param beginDate 最大时间跨度7天 | |||
| * @param endDate endDate不能早于begingDate | |||
| * @return | |||
| * @throws WxErrorException | |||
| */ | |||
| List<WxMpUserSummary> getUserSummary(Date beginDate, Date endDate) throws WxErrorException; | |||
| /** | |||
| * <pre> | |||
| * 获取累计用户数据 | |||
| * http://mp.weixin.qq.com/wiki/3/ecfed6e1a0a03b5f35e5efac98e864b7.html | |||
| * </pre> | |||
| * @param beginDate 最大时间跨度7天 | |||
| * @param endDate endDate不能早于begingDate | |||
| * @return | |||
| * @throws WxErrorException | |||
| */ | |||
| List<WxMpUserCumulate> getUserCumulate(Date beginDate, Date endDate) throws WxErrorException; | |||
| /** | |||
| * 当本Service没有实现某个API的时候,可以用这个,针对所有微信API中的GET请求 | |||
| * @param url | |||
| @@ -44,6 +44,7 @@ import java.io.IOException; | |||
| import java.io.InputStream; | |||
| import java.io.StringReader; | |||
| import java.security.NoSuchAlgorithmException; | |||
| import java.util.Date; | |||
| import java.util.List; | |||
| import java.util.UUID; | |||
| @@ -465,6 +466,29 @@ public class WxMpServiceImpl implements WxMpService { | |||
| return ipArray; | |||
| } | |||
| @Override | |||
| public List<WxMpUserSummary> getUserSummary(Date beginDate, Date endDate) throws WxErrorException { | |||
| String url = "https://api.weixin.qq.com/datacube/getusersummary"; | |||
| JsonObject param = new JsonObject(); | |||
| param.addProperty("begin_date", SIMPLE_DATE_FORMAT.format(beginDate)); | |||
| param.addProperty("end_date", SIMPLE_DATE_FORMAT.format(endDate)); | |||
| String responseContent = post(url, param.toString()); | |||
| JsonElement tmpJsonElement = Streams.parse(new JsonReader(new StringReader(responseContent))); | |||
| return WxMpGsonBuilder.INSTANCE.create().fromJson(tmpJsonElement.getAsJsonObject().get("list"), new TypeToken<List<WxMpUserSummary>>(){}.getType()); | |||
| } | |||
| @Override | |||
| public List<WxMpUserCumulate> getUserCumulate(Date beginDate, Date endDate) throws WxErrorException { | |||
| String url = "https://api.weixin.qq.com/datacube/getusercumulate"; | |||
| JsonObject param = new JsonObject(); | |||
| param.addProperty("begin_date", SIMPLE_DATE_FORMAT.format(beginDate)); | |||
| param.addProperty("end_date", SIMPLE_DATE_FORMAT.format(endDate)); | |||
| String responseContent = post(url, param.toString()); | |||
| JsonElement tmpJsonElement = Streams.parse(new JsonReader(new StringReader(responseContent))); | |||
| return WxMpGsonBuilder.INSTANCE.create().fromJson(tmpJsonElement.getAsJsonObject().get("list"), new TypeToken<List<WxMpUserCumulate>>(){}.getType()); | |||
| } | |||
| public String get(String url, String queryParam) throws WxErrorException { | |||
| return execute(new SimpleGetRequestExecutor(), url, queryParam); | |||
| } | |||
| @@ -0,0 +1,41 @@ | |||
| package me.chanjar.weixin.mp.bean.result; | |||
| import java.io.Serializable; | |||
| import java.util.Date; | |||
| /** | |||
| * <pre> | |||
| * 累计用户数据接口的返回JSON数据包 | |||
| * http://mp.weixin.qq.com/wiki/3/ecfed6e1a0a03b5f35e5efac98e864b7.html | |||
| * </pre> | |||
| */ | |||
| public class WxMpUserCumulate implements Serializable { | |||
| private Date refDate; | |||
| private Integer cumulateUser; | |||
| public Date getRefDate() { | |||
| return refDate; | |||
| } | |||
| public void setRefDate(Date refDate) { | |||
| this.refDate = refDate; | |||
| } | |||
| public Integer getCumulateUser() { | |||
| return cumulateUser; | |||
| } | |||
| public void setCumulateUser(Integer cumulateUser) { | |||
| this.cumulateUser = cumulateUser; | |||
| } | |||
| @Override | |||
| public String toString() { | |||
| return "WxMpUserCumulate{" + | |||
| "refDate=" + refDate + | |||
| ", cumulateUser=" + cumulateUser + | |||
| '}'; | |||
| } | |||
| } | |||
| @@ -0,0 +1,63 @@ | |||
| package me.chanjar.weixin.mp.bean.result; | |||
| import java.io.Serializable; | |||
| import java.util.Date; | |||
| /** | |||
| * <pre> | |||
| * 用户增减数据接口的返回JSON数据包 | |||
| * http://mp.weixin.qq.com/wiki/3/ecfed6e1a0a03b5f35e5efac98e864b7.html | |||
| * </pre> | |||
| */ | |||
| public class WxMpUserSummary implements Serializable { | |||
| private Date refDate; | |||
| private Integer userSource; | |||
| private Integer newUser; | |||
| private Integer cancelUser; | |||
| public Date getRefDate() { | |||
| return refDate; | |||
| } | |||
| public void setRefDate(Date refDate) { | |||
| this.refDate = refDate; | |||
| } | |||
| public Integer getUserSource() { | |||
| return userSource; | |||
| } | |||
| public void setUserSource(Integer userSource) { | |||
| this.userSource = userSource; | |||
| } | |||
| public Integer getNewUser() { | |||
| return newUser; | |||
| } | |||
| public void setNewUser(Integer newUser) { | |||
| this.newUser = newUser; | |||
| } | |||
| public Integer getCancelUser() { | |||
| return cancelUser; | |||
| } | |||
| public void setCancelUser(Integer cancelUser) { | |||
| this.cancelUser = cancelUser; | |||
| } | |||
| @Override | |||
| public String toString() { | |||
| return "WxMpUserSummary{" + | |||
| "refDate=" + refDate + | |||
| ", userSource=" + userSource + | |||
| ", newUser=" + newUser + | |||
| ", cancelUser=" + cancelUser + | |||
| '}'; | |||
| } | |||
| } | |||
| @@ -25,6 +25,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()); | |||
| } | |||
| public static Gson create() { | |||
| @@ -0,0 +1,47 @@ | |||
| /* | |||
| * KINGSTAR MEDIA SOLUTIONS Co.,LTD. Copyright c 2005-2013. All rights reserved. | |||
| * | |||
| * This source code is the property of KINGSTAR MEDIA SOLUTIONS LTD. It is intended | |||
| * only for the use of KINGSTAR MEDIA application development. Reengineering, reproduction | |||
| * arose from modification of the original source, or other redistribution of this source | |||
| * is not permitted without written permission of the KINGSTAR MEDIA SOLUTIONS LTD. | |||
| */ | |||
| 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 java.lang.reflect.Type; | |||
| import java.text.ParseException; | |||
| import java.text.SimpleDateFormat; | |||
| /** | |||
| * | |||
| * @author Daniel Qian | |||
| * | |||
| */ | |||
| public class WxMpUserCumulateGsonAdapter implements JsonDeserializer<WxMpUserCumulate> { | |||
| 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(); | |||
| JsonObject summaryJsonObject = json.getAsJsonObject(); | |||
| try { | |||
| String refDate = GsonHelper.getString(summaryJsonObject, "ref_date"); | |||
| if (refDate != null) { | |||
| cumulate.setRefDate(SIMPLE_DATE_FORMAT.parse(refDate)); | |||
| } | |||
| cumulate.setCumulateUser(GsonHelper.getInteger(summaryJsonObject, "cumulate_user")); | |||
| } catch (ParseException e) { | |||
| throw new JsonParseException(e); | |||
| } | |||
| return cumulate; | |||
| } | |||
| } | |||
| @@ -0,0 +1,47 @@ | |||
| /* | |||
| * KINGSTAR MEDIA SOLUTIONS Co.,LTD. Copyright c 2005-2013. All rights reserved. | |||
| * | |||
| * This source code is the property of KINGSTAR MEDIA SOLUTIONS LTD. It is intended | |||
| * only for the use of KINGSTAR MEDIA application development. Reengineering, reproduction | |||
| * arose from modification of the original source, or other redistribution of this source | |||
| * is not permitted without written permission of the KINGSTAR MEDIA SOLUTIONS LTD. | |||
| */ | |||
| 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 java.lang.reflect.Type; | |||
| import java.text.ParseException; | |||
| import java.text.SimpleDateFormat; | |||
| /** | |||
| * @author Daniel Qian | |||
| */ | |||
| public class WxMpUserSummaryGsonAdapter implements JsonDeserializer<WxMpUserSummary> { | |||
| private static final SimpleDateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); | |||
| public WxMpUserSummary deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) | |||
| throws JsonParseException { | |||
| WxMpUserSummary summary = new WxMpUserSummary(); | |||
| JsonObject summaryJsonObject = json.getAsJsonObject(); | |||
| try { | |||
| String refDate = GsonHelper.getString(summaryJsonObject, "ref_date"); | |||
| if (refDate != null) { | |||
| summary.setRefDate(SIMPLE_DATE_FORMAT.parse(refDate)); | |||
| } | |||
| summary.setUserSource(GsonHelper.getInteger(summaryJsonObject, "user_source")); | |||
| summary.setNewUser(GsonHelper.getInteger(summaryJsonObject, "new_user")); | |||
| summary.setCancelUser(GsonHelper.getInteger(summaryJsonObject, "cancel_user")); | |||
| } catch (ParseException e) { | |||
| throw new JsonParseException(e); | |||
| } | |||
| return summary; | |||
| } | |||
| } | |||
| @@ -4,12 +4,15 @@ import com.google.inject.Inject; | |||
| import me.chanjar.weixin.common.api.WxConsts; | |||
| import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; | |||
| import me.chanjar.weixin.common.exception.WxErrorException; | |||
| import me.chanjar.weixin.common.session.WxSession; | |||
| import me.chanjar.weixin.mp.bean.WxMpMassGroupMessage; | |||
| import me.chanjar.weixin.mp.bean.WxMpMassNews; | |||
| import me.chanjar.weixin.mp.bean.WxMpMassOpenIdsMessage; | |||
| import me.chanjar.weixin.mp.bean.WxMpMassVideo; | |||
| import me.chanjar.weixin.mp.bean.result.WxMpMassSendResult; | |||
| 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 org.testng.Assert; | |||
| import org.testng.annotations.DataProvider; | |||
| import org.testng.annotations.Guice; | |||
| @@ -17,7 +20,11 @@ import org.testng.annotations.Test; | |||
| import java.io.IOException; | |||
| import java.io.InputStream; | |||
| import java.text.ParseException; | |||
| import java.text.SimpleDateFormat; | |||
| import java.util.Arrays; | |||
| import java.util.Date; | |||
| import java.util.List; | |||
| /** | |||
| * | |||
| @@ -32,11 +39,31 @@ public class WxMpMiscAPITest { | |||
| protected WxMpServiceImpl wxService; | |||
| @Test | |||
| public void getCallbackIP() throws WxErrorException { | |||
| public void testGetCallbackIP() throws WxErrorException { | |||
| String[] ipArray = wxService.getCallbackIP(); | |||
| System.out.println(Arrays.toString(ipArray)); | |||
| Assert.assertNotNull(ipArray); | |||
| Assert.assertNotEquals(ipArray.length, 0); | |||
| } | |||
| @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<WxMpUserSummary> summaries = wxService.getUserSummary(beginDate, endDate); | |||
| System.out.println(summaries); | |||
| Assert.assertNotNull(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<WxMpUserCumulate> cumulates = wxService.getUserCumulate(beginDate, endDate); | |||
| System.out.println(cumulates); | |||
| Assert.assertNotNull(cumulates); | |||
| } | |||
| } | |||