From b941a57ccd62b3fd6f7049577259b9a45cb5541a Mon Sep 17 00:00:00 2001 From: miller Date: Tue, 20 Sep 2016 14:39:39 +0800 Subject: [PATCH] add user black list api and impl --- .../me/chanjar/weixin/mp/api/WxMpService.java | 9 ++- .../mp/api/WxMpUserBlackListService.java | 35 ++++++++++++ .../weixin/mp/api/impl/WxMpServiceImpl.java | 42 ++++++++------ .../impl/WxMpUserBlackListServiceImpl.java | 50 ++++++++++++++++ .../result/WxMpUserBlackListGetResult.java | 57 +++++++++++++++++++ .../weixin/mp/util/json/WxMpGsonBuilder.java | 1 + .../WxUserBlackListGetResultGsonAdapter.java | 28 +++++++++ .../WxMpUserBlackListServiceImplTest.java | 48 ++++++++++++++++ 8 files changed, 251 insertions(+), 19 deletions(-) create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserBlackListService.java create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserBlackListServiceImpl.java create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUserBlackListGetResult.java create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxUserBlackListGetResultGsonAdapter.java create mode 100644 weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserBlackListServiceImplTest.java 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 952cf8f5..8816b34d 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 @@ -327,7 +327,7 @@ public interface WxMpService { * * @return WxMpGroupService */ - + WxMpGroupService getGroupService(); /** @@ -364,4 +364,11 @@ public interface WxMpService { * @return WxMpDataCubeService */ WxMpDataCubeService getDataCubeService(); + + /** + * 返回用户黑名单管理相关接口的方法实现类,以方便调用其各种借口 + * + * @return WxMpUserBlackListService + */ + WxMpUserBlackListService getBlackListService(); } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserBlackListService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserBlackListService.java new file mode 100644 index 00000000..17dd5821 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserBlackListService.java @@ -0,0 +1,35 @@ +package me.chanjar.weixin.mp.api; + +import me.chanjar.weixin.common.exception.WxErrorException; +import me.chanjar.weixin.mp.bean.result.WxMpUserBlackListGetResult; + +import java.util.List; + +/** + * @author miller + */ +public interface WxMpUserBlackListService { + /** + *
+   * 获取公众号的黑名单列表
+   * 详情请见http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1471422259_pJMWA&token=&lang=zh_CN
+   * 
+ */ + WxMpUserBlackListGetResult blackList(String nextOpenid) throws WxErrorException; + + /** + *
+   *   拉黑用户
+   *   详情请见http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1471422259_pJMWA&token=&lang=zh_CN
+   * 
+ */ + void pushToBlackList(List openIdList) throws WxErrorException; + + /** + *
+   *   取消拉黑用户
+   *   详情请见http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1471422259_pJMWA&token=&lang=zh_CN
+   * 
+ */ + void pullFromBlackList(List openIdList) throws WxErrorException; +} 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 3f2c9808..96031b6c 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 @@ -1,23 +1,9 @@ package me.chanjar.weixin.mp.api.impl; -import java.io.IOException; - -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; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; 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; @@ -42,6 +28,7 @@ import me.chanjar.weixin.mp.api.WxMpMenuService; import me.chanjar.weixin.mp.api.WxMpPayService; import me.chanjar.weixin.mp.api.WxMpQrcodeService; import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.api.WxMpUserBlackListService; import me.chanjar.weixin.mp.api.WxMpUserService; import me.chanjar.weixin.mp.api.WxMpUserTagService; import me.chanjar.weixin.mp.bean.WxMpIndustry; @@ -57,6 +44,18 @@ import me.chanjar.weixin.mp.bean.result.WxMpMassUploadResult; import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken; import me.chanjar.weixin.mp.bean.result.WxMpSemanticQueryResult; import me.chanjar.weixin.mp.bean.result.WxMpUser; +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; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; public class WxMpServiceImpl implements WxMpService { @@ -75,7 +74,7 @@ public class WxMpServiceImpl implements WxMpService { private final Object globalJsapiTicketRefreshLock = new Object(); private WxMpConfigStorage configStorage; - + private WxMpKefuService kefuService = new WxMpKefuServiceImpl(this); private WxMpMaterialService materialService = new WxMpMaterialServiceImpl(this); @@ -96,6 +95,8 @@ public class WxMpServiceImpl implements WxMpService { private WxMpDataCubeService dataCubeService = new WxMpDataCubeServiceImpl(this); + private WxMpUserBlackListService blackListService = new WxMpUserBlackListServiceImpl(this); + private CloseableHttpClient httpClient; private HttpHost httpProxy; @@ -312,7 +313,7 @@ public class WxMpServiceImpl implements WxMpService { if (state != null) { url.append("&state=").append(state); } - + url.append("#wechat_redirect"); return url.toString(); } @@ -474,7 +475,7 @@ public class WxMpServiceImpl implements WxMpService { throw new RuntimeException(e); } } - + public HttpHost getHttpProxy() { return this.httpProxy; } @@ -495,7 +496,7 @@ public class WxMpServiceImpl implements WxMpService { if (null == apacheHttpClientBuilder) { apacheHttpClientBuilder = DefaultApacheHttpClientBuilder.get(); } - + apacheHttpClientBuilder.httpProxyHost(this.configStorage.getHttpProxyHost()) .httpProxyPort(this.configStorage.getHttpProxyPort()) .httpProxyUsername(this.configStorage.getHttpProxyUsername()) @@ -580,4 +581,9 @@ public class WxMpServiceImpl implements WxMpService { return this.dataCubeService; } + @Override + public WxMpUserBlackListService getBlackListService() { + return this.blackListService; + } + } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserBlackListServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserBlackListServiceImpl.java new file mode 100644 index 00000000..d749ed8c --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserBlackListServiceImpl.java @@ -0,0 +1,50 @@ +package me.chanjar.weixin.mp.api.impl; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import me.chanjar.weixin.common.exception.WxErrorException; +import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.api.WxMpUserBlackListService; +import me.chanjar.weixin.mp.bean.result.WxMpUserBlackListGetResult; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author miller + */ +public class WxMpUserBlackListServiceImpl implements WxMpUserBlackListService { + private static final String API_BLACK_LIST_PREFIX = "https://api.weixin.qq.com/cgi-bin/tags/members"; + private WxMpService wxMpService; + + public WxMpUserBlackListServiceImpl(WxMpService wxMpService) { + this.wxMpService = wxMpService; + } + + @Override + public WxMpUserBlackListGetResult blackList(String nextOpenid) throws WxErrorException { + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("begin_openid", nextOpenid); + String url = API_BLACK_LIST_PREFIX + "/getblacklist"; + String responseContent = this.wxMpService.execute(new SimplePostRequestExecutor(), url, jsonObject.toString()); + return WxMpUserBlackListGetResult.fromJson(responseContent); + } + + @Override + public void pushToBlackList(List openIdList) throws WxErrorException { + Map map = new HashMap<>(); + map.put("openid_list", openIdList); + String url = API_BLACK_LIST_PREFIX + "/batchblacklist"; + this.wxMpService.execute(new SimplePostRequestExecutor(), url, new Gson().toJson(map)); + } + + @Override + public void pullFromBlackList(List openIdList) throws WxErrorException { + Map map = new HashMap<>(); + map.put("openid_list", openIdList); + String url = API_BLACK_LIST_PREFIX + "/batchunblacklist"; + this.wxMpService.execute(new SimplePostRequestExecutor(), url, new Gson().toJson(map)); + } +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUserBlackListGetResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUserBlackListGetResult.java new file mode 100644 index 00000000..12a48e3d --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUserBlackListGetResult.java @@ -0,0 +1,57 @@ +package me.chanjar.weixin.mp.bean.result; + +import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author miller + */ +public class WxMpUserBlackListGetResult { + protected int total = -1; + protected int count = -1; + protected List openIds = new ArrayList<>(); + protected String nextOpenId; + + public static WxMpUserBlackListGetResult fromJson(String json) { + return WxMpGsonBuilder.INSTANCE.create().fromJson(json, WxMpUserBlackListGetResult.class); + } + + public int getTotal() { + return this.total; + } + + public void setTotal(int total) { + this.total = total; + } + + public int getCount() { + return this.count; + } + + public void setCount(int count) { + this.count = count; + } + + public List getOpenIds() { + return this.openIds; + } + + public void setOpenIds(List openIds) { + this.openIds = openIds; + } + + public String getNextOpenId() { + return this.nextOpenId; + } + + public void setNextOpenId(String nextOpenId) { + this.nextOpenId = nextOpenId; + } + + @Override + public String toString() { + return WxMpGsonBuilder.INSTANCE.create().toJson(this); + } +} 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 bf920fff..4152a8da 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 @@ -45,6 +45,7 @@ public class WxMpGsonBuilder { INSTANCE.registerTypeAdapter(WxMpMassPreviewMessage.class, new WxMpMassPreviewMessageGsonAdapter()); INSTANCE.registerTypeAdapter(WxMediaImgUploadResult.class, new WxMediaImgUploadResultGsonAdapter()); INSTANCE.registerTypeAdapter(WxMpIndustry.class, new WxMpIndustryGsonAdapter()); + INSTANCE.registerTypeAdapter(WxMpUserBlackListGetResult.class, new WxUserBlackListGetResultGsonAdapter()); } public static Gson create() { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxUserBlackListGetResultGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxUserBlackListGetResultGsonAdapter.java new file mode 100644 index 00000000..5f68f12a --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxUserBlackListGetResultGsonAdapter.java @@ -0,0 +1,28 @@ +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.WxMpUserBlackListGetResult; + +import java.lang.reflect.Type; + +/** + * @author miller + */ +public class WxUserBlackListGetResultGsonAdapter implements JsonDeserializer { + @Override + public WxMpUserBlackListGetResult deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + JsonObject o = json.getAsJsonObject(); + WxMpUserBlackListGetResult wxMpUserBlackListGetResult = new WxMpUserBlackListGetResult(); + wxMpUserBlackListGetResult.setTotal(GsonHelper.getInteger(o, "total")); + wxMpUserBlackListGetResult.setCount(GsonHelper.getInteger(o, "count")); + wxMpUserBlackListGetResult.setNextOpenId(GsonHelper.getString(o, "next_openid")); + if (o.get("data") != null && !o.get("data").isJsonNull() && !o.get("data").getAsJsonObject().get("openid").isJsonNull()) { + JsonArray data = o.get("data").getAsJsonObject().get("openid").getAsJsonArray(); + for (int i = 0; i < data.size(); i++) { + wxMpUserBlackListGetResult.getOpenIds().add(GsonHelper.getAsString(data.get(i))); + } + } + return wxMpUserBlackListGetResult; + } +} diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserBlackListServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserBlackListServiceImplTest.java new file mode 100644 index 00000000..b511f5e7 --- /dev/null +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserBlackListServiceImplTest.java @@ -0,0 +1,48 @@ +package me.chanjar.weixin.mp.api.impl; + +import me.chanjar.weixin.mp.api.ApiTestModule; +import me.chanjar.weixin.mp.bean.result.WxMpUserBlackListGetResult; +import org.testng.Assert; +import org.testng.annotations.Guice; +import org.testng.annotations.Test; + +import javax.inject.Inject; +import java.util.ArrayList; +import java.util.List; + +/** + * @author miller + */ +@Test(groups = "userAPI") +@Guice(modules = ApiTestModule.class) +public class WxMpUserBlackListServiceImplTest { + //此处openid只是开发的时候测试用 使用者测试的时候请替换自己公众号的openid + private final String TEST_OPENID = "o9VAswOI0KSXFUtFHgk9Kb9Rtkys"; + @Inject + protected WxMpServiceImpl wxService; + + @Test + public void testBlackList() throws Exception { + WxMpUserBlackListGetResult wxMpUserBlackListGetResult = this.wxService.getBlackListService().blackList(TEST_OPENID); + Assert.assertNotNull(wxMpUserBlackListGetResult); + Assert.assertFalse(wxMpUserBlackListGetResult.getCount() == -1); + Assert.assertFalse(wxMpUserBlackListGetResult.getTotal() == -1); + Assert.assertFalse(wxMpUserBlackListGetResult.getOpenIds().size() == -1); + System.out.println(wxMpUserBlackListGetResult); + } + + @Test + public void testPushToBlackList() throws Exception { + List openIdList = new ArrayList<>(); + openIdList.add(TEST_OPENID); + this.wxService.getBlackListService().pushToBlackList(openIdList); + } + + @Test + public void testPullFromBlackList() throws Exception { + List openIdList = new ArrayList<>(); + openIdList.add(TEST_OPENID); + this.wxService.getBlackListService().pullFromBlackList(openIdList); + } + +}