| @@ -327,7 +327,7 @@ public interface WxMpService { | |||||
| * | * | ||||
| * @return WxMpGroupService | * @return WxMpGroupService | ||||
| */ | */ | ||||
| WxMpGroupService getGroupService(); | WxMpGroupService getGroupService(); | ||||
| /** | /** | ||||
| @@ -364,4 +364,11 @@ public interface WxMpService { | |||||
| * @return WxMpDataCubeService | * @return WxMpDataCubeService | ||||
| */ | */ | ||||
| WxMpDataCubeService getDataCubeService(); | WxMpDataCubeService getDataCubeService(); | ||||
| /** | |||||
| * 返回用户黑名单管理相关接口的方法实现类,以方便调用其各种借口 | |||||
| * | |||||
| * @return WxMpUserBlackListService | |||||
| */ | |||||
| WxMpUserBlackListService getBlackListService(); | |||||
| } | } | ||||
| @@ -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 { | |||||
| /** | |||||
| * <pre> | |||||
| * 获取公众号的黑名单列表 | |||||
| * 详情请见http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1471422259_pJMWA&token=&lang=zh_CN | |||||
| * </pre> | |||||
| */ | |||||
| WxMpUserBlackListGetResult blackList(String nextOpenid) throws WxErrorException; | |||||
| /** | |||||
| * <pre> | |||||
| * 拉黑用户 | |||||
| * 详情请见http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1471422259_pJMWA&token=&lang=zh_CN | |||||
| * </pre> | |||||
| */ | |||||
| void pushToBlackList(List<String> openIdList) throws WxErrorException; | |||||
| /** | |||||
| * <pre> | |||||
| * 取消拉黑用户 | |||||
| * 详情请见http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1471422259_pJMWA&token=&lang=zh_CN | |||||
| * </pre> | |||||
| */ | |||||
| void pullFromBlackList(List<String> openIdList) throws WxErrorException; | |||||
| } | |||||
| @@ -1,23 +1,9 @@ | |||||
| package me.chanjar.weixin.mp.api.impl; | 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.JsonArray; | ||||
| import com.google.gson.JsonElement; | import com.google.gson.JsonElement; | ||||
| import com.google.gson.JsonObject; | import com.google.gson.JsonObject; | ||||
| import com.google.gson.JsonParser; | import com.google.gson.JsonParser; | ||||
| import me.chanjar.weixin.common.bean.WxAccessToken; | import me.chanjar.weixin.common.bean.WxAccessToken; | ||||
| import me.chanjar.weixin.common.bean.WxJsapiSignature; | import me.chanjar.weixin.common.bean.WxJsapiSignature; | ||||
| import me.chanjar.weixin.common.bean.result.WxError; | 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.WxMpPayService; | ||||
| import me.chanjar.weixin.mp.api.WxMpQrcodeService; | import me.chanjar.weixin.mp.api.WxMpQrcodeService; | ||||
| import me.chanjar.weixin.mp.api.WxMpService; | 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.WxMpUserService; | ||||
| import me.chanjar.weixin.mp.api.WxMpUserTagService; | import me.chanjar.weixin.mp.api.WxMpUserTagService; | ||||
| import me.chanjar.weixin.mp.bean.WxMpIndustry; | 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.WxMpOAuth2AccessToken; | ||||
| import me.chanjar.weixin.mp.bean.result.WxMpSemanticQueryResult; | import me.chanjar.weixin.mp.bean.result.WxMpSemanticQueryResult; | ||||
| import me.chanjar.weixin.mp.bean.result.WxMpUser; | 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 { | public class WxMpServiceImpl implements WxMpService { | ||||
| @@ -75,7 +74,7 @@ public class WxMpServiceImpl implements WxMpService { | |||||
| private final Object globalJsapiTicketRefreshLock = new Object(); | private final Object globalJsapiTicketRefreshLock = new Object(); | ||||
| private WxMpConfigStorage configStorage; | private WxMpConfigStorage configStorage; | ||||
| private WxMpKefuService kefuService = new WxMpKefuServiceImpl(this); | private WxMpKefuService kefuService = new WxMpKefuServiceImpl(this); | ||||
| private WxMpMaterialService materialService = new WxMpMaterialServiceImpl(this); | private WxMpMaterialService materialService = new WxMpMaterialServiceImpl(this); | ||||
| @@ -96,6 +95,8 @@ public class WxMpServiceImpl implements WxMpService { | |||||
| private WxMpDataCubeService dataCubeService = new WxMpDataCubeServiceImpl(this); | private WxMpDataCubeService dataCubeService = new WxMpDataCubeServiceImpl(this); | ||||
| private WxMpUserBlackListService blackListService = new WxMpUserBlackListServiceImpl(this); | |||||
| private CloseableHttpClient httpClient; | private CloseableHttpClient httpClient; | ||||
| private HttpHost httpProxy; | private HttpHost httpProxy; | ||||
| @@ -312,7 +313,7 @@ public class WxMpServiceImpl implements WxMpService { | |||||
| if (state != null) { | if (state != null) { | ||||
| url.append("&state=").append(state); | url.append("&state=").append(state); | ||||
| } | } | ||||
| url.append("#wechat_redirect"); | url.append("#wechat_redirect"); | ||||
| return url.toString(); | return url.toString(); | ||||
| } | } | ||||
| @@ -474,7 +475,7 @@ public class WxMpServiceImpl implements WxMpService { | |||||
| throw new RuntimeException(e); | throw new RuntimeException(e); | ||||
| } | } | ||||
| } | } | ||||
| public HttpHost getHttpProxy() { | public HttpHost getHttpProxy() { | ||||
| return this.httpProxy; | return this.httpProxy; | ||||
| } | } | ||||
| @@ -495,7 +496,7 @@ public class WxMpServiceImpl implements WxMpService { | |||||
| if (null == apacheHttpClientBuilder) { | if (null == apacheHttpClientBuilder) { | ||||
| apacheHttpClientBuilder = DefaultApacheHttpClientBuilder.get(); | apacheHttpClientBuilder = DefaultApacheHttpClientBuilder.get(); | ||||
| } | } | ||||
| apacheHttpClientBuilder.httpProxyHost(this.configStorage.getHttpProxyHost()) | apacheHttpClientBuilder.httpProxyHost(this.configStorage.getHttpProxyHost()) | ||||
| .httpProxyPort(this.configStorage.getHttpProxyPort()) | .httpProxyPort(this.configStorage.getHttpProxyPort()) | ||||
| .httpProxyUsername(this.configStorage.getHttpProxyUsername()) | .httpProxyUsername(this.configStorage.getHttpProxyUsername()) | ||||
| @@ -580,4 +581,9 @@ public class WxMpServiceImpl implements WxMpService { | |||||
| return this.dataCubeService; | return this.dataCubeService; | ||||
| } | } | ||||
| @Override | |||||
| public WxMpUserBlackListService getBlackListService() { | |||||
| return this.blackListService; | |||||
| } | |||||
| } | } | ||||
| @@ -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<String> openIdList) throws WxErrorException { | |||||
| Map<String, Object> 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<String> openIdList) throws WxErrorException { | |||||
| Map<String, Object> 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)); | |||||
| } | |||||
| } | |||||
| @@ -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<String> 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<String> getOpenIds() { | |||||
| return this.openIds; | |||||
| } | |||||
| public void setOpenIds(List<String> 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); | |||||
| } | |||||
| } | |||||
| @@ -45,6 +45,7 @@ public class WxMpGsonBuilder { | |||||
| INSTANCE.registerTypeAdapter(WxMpMassPreviewMessage.class, new WxMpMassPreviewMessageGsonAdapter()); | INSTANCE.registerTypeAdapter(WxMpMassPreviewMessage.class, new WxMpMassPreviewMessageGsonAdapter()); | ||||
| INSTANCE.registerTypeAdapter(WxMediaImgUploadResult.class, new WxMediaImgUploadResultGsonAdapter()); | INSTANCE.registerTypeAdapter(WxMediaImgUploadResult.class, new WxMediaImgUploadResultGsonAdapter()); | ||||
| INSTANCE.registerTypeAdapter(WxMpIndustry.class, new WxMpIndustryGsonAdapter()); | INSTANCE.registerTypeAdapter(WxMpIndustry.class, new WxMpIndustryGsonAdapter()); | ||||
| INSTANCE.registerTypeAdapter(WxMpUserBlackListGetResult.class, new WxUserBlackListGetResultGsonAdapter()); | |||||
| } | } | ||||
| public static Gson create() { | public static Gson create() { | ||||
| @@ -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<WxMpUserBlackListGetResult> { | |||||
| @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; | |||||
| } | |||||
| } | |||||
| @@ -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<String> openIdList = new ArrayList<>(); | |||||
| openIdList.add(TEST_OPENID); | |||||
| this.wxService.getBlackListService().pushToBlackList(openIdList); | |||||
| } | |||||
| @Test | |||||
| public void testPullFromBlackList() throws Exception { | |||||
| List<String> openIdList = new ArrayList<>(); | |||||
| openIdList.add(TEST_OPENID); | |||||
| this.wxService.getBlackListService().pullFromBlackList(openIdList); | |||||
| } | |||||
| } | |||||