Skip to content

Commit b941a57

Browse files
committed
add user black list api and impl
1 parent b17041e commit b941a57

File tree

8 files changed

+251
-19
lines changed

8 files changed

+251
-19
lines changed

weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ public interface WxMpService {
327327
*
328328
* @return WxMpGroupService
329329
*/
330-
330+
331331
WxMpGroupService getGroupService();
332332

333333
/**
@@ -364,4 +364,11 @@ public interface WxMpService {
364364
* @return WxMpDataCubeService
365365
*/
366366
WxMpDataCubeService getDataCubeService();
367+
368+
/**
369+
* 返回用户黑名单管理相关接口的方法实现类,以方便调用其各种借口
370+
*
371+
* @return WxMpUserBlackListService
372+
*/
373+
WxMpUserBlackListService getBlackListService();
367374
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package me.chanjar.weixin.mp.api;
2+
3+
import me.chanjar.weixin.common.exception.WxErrorException;
4+
import me.chanjar.weixin.mp.bean.result.WxMpUserBlackListGetResult;
5+
6+
import java.util.List;
7+
8+
/**
9+
* @author miller
10+
*/
11+
public interface WxMpUserBlackListService {
12+
/**
13+
* <pre>
14+
* 获取公众号的黑名单列表
15+
* 详情请见http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1471422259_pJMWA&token=&lang=zh_CN
16+
* </pre>
17+
*/
18+
WxMpUserBlackListGetResult blackList(String nextOpenid) throws WxErrorException;
19+
20+
/**
21+
* <pre>
22+
* 拉黑用户
23+
* 详情请见http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1471422259_pJMWA&token=&lang=zh_CN
24+
* </pre>
25+
*/
26+
void pushToBlackList(List<String> openIdList) throws WxErrorException;
27+
28+
/**
29+
* <pre>
30+
* 取消拉黑用户
31+
* 详情请见http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1471422259_pJMWA&token=&lang=zh_CN
32+
* </pre>
33+
*/
34+
void pullFromBlackList(List<String> openIdList) throws WxErrorException;
35+
}

weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,9 @@
11
package me.chanjar.weixin.mp.api.impl;
22

3-
import java.io.IOException;
4-
5-
import org.apache.http.HttpHost;
6-
import org.apache.http.client.config.RequestConfig;
7-
import org.apache.http.client.methods.CloseableHttpResponse;
8-
import org.apache.http.client.methods.HttpGet;
9-
import org.apache.http.conn.ssl.DefaultHostnameVerifier;
10-
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
11-
import org.apache.http.impl.client.BasicResponseHandler;
12-
import org.apache.http.impl.client.CloseableHttpClient;
13-
import org.slf4j.Logger;
14-
import org.slf4j.LoggerFactory;
15-
163
import com.google.gson.JsonArray;
174
import com.google.gson.JsonElement;
185
import com.google.gson.JsonObject;
196
import com.google.gson.JsonParser;
20-
217
import me.chanjar.weixin.common.bean.WxAccessToken;
228
import me.chanjar.weixin.common.bean.WxJsapiSignature;
239
import me.chanjar.weixin.common.bean.result.WxError;
@@ -42,6 +28,7 @@
4228
import me.chanjar.weixin.mp.api.WxMpPayService;
4329
import me.chanjar.weixin.mp.api.WxMpQrcodeService;
4430
import me.chanjar.weixin.mp.api.WxMpService;
31+
import me.chanjar.weixin.mp.api.WxMpUserBlackListService;
4532
import me.chanjar.weixin.mp.api.WxMpUserService;
4633
import me.chanjar.weixin.mp.api.WxMpUserTagService;
4734
import me.chanjar.weixin.mp.bean.WxMpIndustry;
@@ -57,6 +44,18 @@
5744
import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken;
5845
import me.chanjar.weixin.mp.bean.result.WxMpSemanticQueryResult;
5946
import me.chanjar.weixin.mp.bean.result.WxMpUser;
47+
import org.apache.http.HttpHost;
48+
import org.apache.http.client.config.RequestConfig;
49+
import org.apache.http.client.methods.CloseableHttpResponse;
50+
import org.apache.http.client.methods.HttpGet;
51+
import org.apache.http.conn.ssl.DefaultHostnameVerifier;
52+
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
53+
import org.apache.http.impl.client.BasicResponseHandler;
54+
import org.apache.http.impl.client.CloseableHttpClient;
55+
import org.slf4j.Logger;
56+
import org.slf4j.LoggerFactory;
57+
58+
import java.io.IOException;
6059

6160
public class WxMpServiceImpl implements WxMpService {
6261

@@ -75,7 +74,7 @@ public class WxMpServiceImpl implements WxMpService {
7574
private final Object globalJsapiTicketRefreshLock = new Object();
7675

7776
private WxMpConfigStorage configStorage;
78-
77+
7978
private WxMpKefuService kefuService = new WxMpKefuServiceImpl(this);
8079

8180
private WxMpMaterialService materialService = new WxMpMaterialServiceImpl(this);
@@ -96,6 +95,8 @@ public class WxMpServiceImpl implements WxMpService {
9695

9796
private WxMpDataCubeService dataCubeService = new WxMpDataCubeServiceImpl(this);
9897

98+
private WxMpUserBlackListService blackListService = new WxMpUserBlackListServiceImpl(this);
99+
99100
private CloseableHttpClient httpClient;
100101

101102
private HttpHost httpProxy;
@@ -312,7 +313,7 @@ public String buildQrConnectUrl(String redirectURI, String scope,
312313
if (state != null) {
313314
url.append("&state=").append(state);
314315
}
315-
316+
316317
url.append("#wechat_redirect");
317318
return url.toString();
318319
}
@@ -474,7 +475,7 @@ protected synchronized <T, E> T executeInternal(RequestExecutor<T, E> executor,
474475
throw new RuntimeException(e);
475476
}
476477
}
477-
478+
478479
public HttpHost getHttpProxy() {
479480
return this.httpProxy;
480481
}
@@ -495,7 +496,7 @@ private void initHttpClient() {
495496
if (null == apacheHttpClientBuilder) {
496497
apacheHttpClientBuilder = DefaultApacheHttpClientBuilder.get();
497498
}
498-
499+
499500
apacheHttpClientBuilder.httpProxyHost(this.configStorage.getHttpProxyHost())
500501
.httpProxyPort(this.configStorage.getHttpProxyPort())
501502
.httpProxyUsername(this.configStorage.getHttpProxyUsername())
@@ -580,4 +581,9 @@ public WxMpDataCubeService getDataCubeService() {
580581
return this.dataCubeService;
581582
}
582583

584+
@Override
585+
public WxMpUserBlackListService getBlackListService() {
586+
return this.blackListService;
587+
}
588+
583589
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package me.chanjar.weixin.mp.api.impl;
2+
3+
import com.google.gson.Gson;
4+
import com.google.gson.JsonObject;
5+
import me.chanjar.weixin.common.exception.WxErrorException;
6+
import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor;
7+
import me.chanjar.weixin.mp.api.WxMpService;
8+
import me.chanjar.weixin.mp.api.WxMpUserBlackListService;
9+
import me.chanjar.weixin.mp.bean.result.WxMpUserBlackListGetResult;
10+
11+
import java.util.HashMap;
12+
import java.util.List;
13+
import java.util.Map;
14+
15+
/**
16+
* @author miller
17+
*/
18+
public class WxMpUserBlackListServiceImpl implements WxMpUserBlackListService {
19+
private static final String API_BLACK_LIST_PREFIX = "https://api.weixin.qq.com/cgi-bin/tags/members";
20+
private WxMpService wxMpService;
21+
22+
public WxMpUserBlackListServiceImpl(WxMpService wxMpService) {
23+
this.wxMpService = wxMpService;
24+
}
25+
26+
@Override
27+
public WxMpUserBlackListGetResult blackList(String nextOpenid) throws WxErrorException {
28+
JsonObject jsonObject = new JsonObject();
29+
jsonObject.addProperty("begin_openid", nextOpenid);
30+
String url = API_BLACK_LIST_PREFIX + "/getblacklist";
31+
String responseContent = this.wxMpService.execute(new SimplePostRequestExecutor(), url, jsonObject.toString());
32+
return WxMpUserBlackListGetResult.fromJson(responseContent);
33+
}
34+
35+
@Override
36+
public void pushToBlackList(List<String> openIdList) throws WxErrorException {
37+
Map<String, Object> map = new HashMap<>();
38+
map.put("openid_list", openIdList);
39+
String url = API_BLACK_LIST_PREFIX + "/batchblacklist";
40+
this.wxMpService.execute(new SimplePostRequestExecutor(), url, new Gson().toJson(map));
41+
}
42+
43+
@Override
44+
public void pullFromBlackList(List<String> openIdList) throws WxErrorException {
45+
Map<String, Object> map = new HashMap<>();
46+
map.put("openid_list", openIdList);
47+
String url = API_BLACK_LIST_PREFIX + "/batchunblacklist";
48+
this.wxMpService.execute(new SimplePostRequestExecutor(), url, new Gson().toJson(map));
49+
}
50+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package me.chanjar.weixin.mp.bean.result;
2+
3+
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
4+
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
8+
/**
9+
* @author miller
10+
*/
11+
public class WxMpUserBlackListGetResult {
12+
protected int total = -1;
13+
protected int count = -1;
14+
protected List<String> openIds = new ArrayList<>();
15+
protected String nextOpenId;
16+
17+
public static WxMpUserBlackListGetResult fromJson(String json) {
18+
return WxMpGsonBuilder.INSTANCE.create().fromJson(json, WxMpUserBlackListGetResult.class);
19+
}
20+
21+
public int getTotal() {
22+
return this.total;
23+
}
24+
25+
public void setTotal(int total) {
26+
this.total = total;
27+
}
28+
29+
public int getCount() {
30+
return this.count;
31+
}
32+
33+
public void setCount(int count) {
34+
this.count = count;
35+
}
36+
37+
public List<String> getOpenIds() {
38+
return this.openIds;
39+
}
40+
41+
public void setOpenIds(List<String> openIds) {
42+
this.openIds = openIds;
43+
}
44+
45+
public String getNextOpenId() {
46+
return this.nextOpenId;
47+
}
48+
49+
public void setNextOpenId(String nextOpenId) {
50+
this.nextOpenId = nextOpenId;
51+
}
52+
53+
@Override
54+
public String toString() {
55+
return WxMpGsonBuilder.INSTANCE.create().toJson(this);
56+
}
57+
}

weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ public class WxMpGsonBuilder {
4545
INSTANCE.registerTypeAdapter(WxMpMassPreviewMessage.class, new WxMpMassPreviewMessageGsonAdapter());
4646
INSTANCE.registerTypeAdapter(WxMediaImgUploadResult.class, new WxMediaImgUploadResultGsonAdapter());
4747
INSTANCE.registerTypeAdapter(WxMpIndustry.class, new WxMpIndustryGsonAdapter());
48+
INSTANCE.registerTypeAdapter(WxMpUserBlackListGetResult.class, new WxUserBlackListGetResultGsonAdapter());
4849
}
4950

5051
public static Gson create() {
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package me.chanjar.weixin.mp.util.json;
2+
3+
import com.google.gson.*;
4+
import me.chanjar.weixin.common.util.json.GsonHelper;
5+
import me.chanjar.weixin.mp.bean.result.WxMpUserBlackListGetResult;
6+
7+
import java.lang.reflect.Type;
8+
9+
/**
10+
* @author miller
11+
*/
12+
public class WxUserBlackListGetResultGsonAdapter implements JsonDeserializer<WxMpUserBlackListGetResult> {
13+
@Override
14+
public WxMpUserBlackListGetResult deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
15+
JsonObject o = json.getAsJsonObject();
16+
WxMpUserBlackListGetResult wxMpUserBlackListGetResult = new WxMpUserBlackListGetResult();
17+
wxMpUserBlackListGetResult.setTotal(GsonHelper.getInteger(o, "total"));
18+
wxMpUserBlackListGetResult.setCount(GsonHelper.getInteger(o, "count"));
19+
wxMpUserBlackListGetResult.setNextOpenId(GsonHelper.getString(o, "next_openid"));
20+
if (o.get("data") != null && !o.get("data").isJsonNull() && !o.get("data").getAsJsonObject().get("openid").isJsonNull()) {
21+
JsonArray data = o.get("data").getAsJsonObject().get("openid").getAsJsonArray();
22+
for (int i = 0; i < data.size(); i++) {
23+
wxMpUserBlackListGetResult.getOpenIds().add(GsonHelper.getAsString(data.get(i)));
24+
}
25+
}
26+
return wxMpUserBlackListGetResult;
27+
}
28+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package me.chanjar.weixin.mp.api.impl;
2+
3+
import me.chanjar.weixin.mp.api.ApiTestModule;
4+
import me.chanjar.weixin.mp.bean.result.WxMpUserBlackListGetResult;
5+
import org.testng.Assert;
6+
import org.testng.annotations.Guice;
7+
import org.testng.annotations.Test;
8+
9+
import javax.inject.Inject;
10+
import java.util.ArrayList;
11+
import java.util.List;
12+
13+
/**
14+
* @author miller
15+
*/
16+
@Test(groups = "userAPI")
17+
@Guice(modules = ApiTestModule.class)
18+
public class WxMpUserBlackListServiceImplTest {
19+
//此处openid只是开发的时候测试用 使用者测试的时候请替换自己公众号的openid
20+
private final String TEST_OPENID = "o9VAswOI0KSXFUtFHgk9Kb9Rtkys";
21+
@Inject
22+
protected WxMpServiceImpl wxService;
23+
24+
@Test
25+
public void testBlackList() throws Exception {
26+
WxMpUserBlackListGetResult wxMpUserBlackListGetResult = this.wxService.getBlackListService().blackList(TEST_OPENID);
27+
Assert.assertNotNull(wxMpUserBlackListGetResult);
28+
Assert.assertFalse(wxMpUserBlackListGetResult.getCount() == -1);
29+
Assert.assertFalse(wxMpUserBlackListGetResult.getTotal() == -1);
30+
Assert.assertFalse(wxMpUserBlackListGetResult.getOpenIds().size() == -1);
31+
System.out.println(wxMpUserBlackListGetResult);
32+
}
33+
34+
@Test
35+
public void testPushToBlackList() throws Exception {
36+
List<String> openIdList = new ArrayList<>();
37+
openIdList.add(TEST_OPENID);
38+
this.wxService.getBlackListService().pushToBlackList(openIdList);
39+
}
40+
41+
@Test
42+
public void testPullFromBlackList() throws Exception {
43+
List<String> openIdList = new ArrayList<>();
44+
openIdList.add(TEST_OPENID);
45+
this.wxService.getBlackListService().pullFromBlackList(openIdList);
46+
}
47+
48+
}

0 commit comments

Comments
 (0)