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);
+ }
+
+}