@@ -16,6 +16,7 @@ import chanjarster.weixin.bean.result.WxMassSendResult; | |||||
import chanjarster.weixin.bean.result.WxMassUploadResult; | import chanjarster.weixin.bean.result.WxMassUploadResult; | ||||
import chanjarster.weixin.bean.result.WxMediaUploadResult; | import chanjarster.weixin.bean.result.WxMediaUploadResult; | ||||
import chanjarster.weixin.bean.result.WxUser; | import chanjarster.weixin.bean.result.WxUser; | ||||
import chanjarster.weixin.bean.result.WxUserList; | |||||
import chanjarster.weixin.exception.WxErrorException; | import chanjarster.weixin.exception.WxErrorException; | ||||
/** | /** | ||||
@@ -258,6 +259,17 @@ public interface WxService { | |||||
*/ | */ | ||||
public WxUser userInfo(String openid, String lang) throws WxErrorException; | public WxUser userInfo(String openid, String lang) throws WxErrorException; | ||||
/** | |||||
* <pre> | |||||
* 获取关注者列表 | |||||
* 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=获取关注者列表 | |||||
* </pre> | |||||
* @param next_openid 可选,第一个拉取的OPENID,null为从头开始拉取 | |||||
* @return | |||||
* @throws WxErrorException | |||||
*/ | |||||
public WxUserList userList(String next_openid) throws WxErrorException; | |||||
/** | /** | ||||
* 注入 {@link WxConfigStorage} 的实现 | * 注入 {@link WxConfigStorage} 的实现 | ||||
* @param wxConfigProvider | * @param wxConfigProvider | ||||
@@ -32,6 +32,7 @@ import chanjarster.weixin.bean.result.WxMassSendResult; | |||||
import chanjarster.weixin.bean.result.WxMassUploadResult; | import chanjarster.weixin.bean.result.WxMassUploadResult; | ||||
import chanjarster.weixin.bean.result.WxMediaUploadResult; | import chanjarster.weixin.bean.result.WxMediaUploadResult; | ||||
import chanjarster.weixin.bean.result.WxUser; | import chanjarster.weixin.bean.result.WxUser; | ||||
import chanjarster.weixin.bean.result.WxUserList; | |||||
import chanjarster.weixin.exception.WxErrorException; | import chanjarster.weixin.exception.WxErrorException; | ||||
import chanjarster.weixin.util.fs.FileUtil; | import chanjarster.weixin.util.fs.FileUtil; | ||||
import chanjarster.weixin.util.http.MediaDownloadRequestExecutor; | import chanjarster.weixin.util.http.MediaDownloadRequestExecutor; | ||||
@@ -42,7 +43,6 @@ import chanjarster.weixin.util.http.SimplePostRequestExecutor; | |||||
import chanjarster.weixin.util.json.GsonHelper; | import chanjarster.weixin.util.json.GsonHelper; | ||||
import chanjarster.weixin.util.json.WxGsonBuilder; | import chanjarster.weixin.util.json.WxGsonBuilder; | ||||
import com.google.gson.Gson; | |||||
import com.google.gson.JsonElement; | import com.google.gson.JsonElement; | ||||
import com.google.gson.JsonObject; | import com.google.gson.JsonObject; | ||||
import com.google.gson.internal.Streams; | import com.google.gson.internal.Streams; | ||||
@@ -254,7 +254,13 @@ public class WxServiceImpl implements WxService { | |||||
String url = "https://api.weixin.qq.com/cgi-bin/user/info"; | String url = "https://api.weixin.qq.com/cgi-bin/user/info"; | ||||
lang = lang == null ? "zh_CN" : lang; | lang = lang == null ? "zh_CN" : lang; | ||||
String responseContent = execute(new SimpleGetRequestExecutor(), url, "openid=" + openid + "&lang=" + lang); | String responseContent = execute(new SimpleGetRequestExecutor(), url, "openid=" + openid + "&lang=" + lang); | ||||
;return WxUser.fromJson(responseContent); | |||||
return WxUser.fromJson(responseContent); | |||||
} | |||||
public WxUserList userList(String next_openid) throws WxErrorException { | |||||
String url = "https://api.weixin.qq.com/cgi-bin/user/get"; | |||||
String responseContent = execute(new SimpleGetRequestExecutor(), url, next_openid == null ? null : "next_openid=" + next_openid); | |||||
return WxUserList.fromJson(responseContent); | |||||
} | } | ||||
/** | /** | ||||
@@ -0,0 +1,48 @@ | |||||
package chanjarster.weixin.bean.result; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
import chanjarster.weixin.util.json.WxGsonBuilder; | |||||
/** | |||||
* 关注者列表 | |||||
* @author chanjarster | |||||
* | |||||
*/ | |||||
public class WxUserList { | |||||
protected int total = -1; | |||||
protected int count = -1; | |||||
protected List<String> openids = new ArrayList<String>(); | |||||
protected String next_openid; | |||||
public int getTotal() { | |||||
return total; | |||||
} | |||||
public void setTotal(int total) { | |||||
this.total = total; | |||||
} | |||||
public int getCount() { | |||||
return count; | |||||
} | |||||
public void setCount(int count) { | |||||
this.count = count; | |||||
} | |||||
public List<String> getOpenids() { | |||||
return openids; | |||||
} | |||||
public void setOpenids(List<String> openids) { | |||||
this.openids = openids; | |||||
} | |||||
public String getNext_openid() { | |||||
return next_openid; | |||||
} | |||||
public void setNext_openid(String next_openid) { | |||||
this.next_openid = next_openid; | |||||
} | |||||
public static WxUserList fromJson(String json) { | |||||
return WxGsonBuilder.INSTANCE.create().fromJson(json, WxUserList.class); | |||||
} | |||||
} |
@@ -7,6 +7,7 @@ import chanjarster.weixin.bean.WxMassNews; | |||||
import chanjarster.weixin.bean.WxMassOpenIdsMessage; | import chanjarster.weixin.bean.WxMassOpenIdsMessage; | ||||
import chanjarster.weixin.bean.WxMenu; | import chanjarster.weixin.bean.WxMenu; | ||||
import chanjarster.weixin.bean.result.WxUser; | import chanjarster.weixin.bean.result.WxUser; | ||||
import chanjarster.weixin.bean.result.WxUserList; | |||||
import com.google.gson.Gson; | import com.google.gson.Gson; | ||||
import com.google.gson.GsonBuilder; | import com.google.gson.GsonBuilder; | ||||
@@ -24,6 +25,7 @@ public class WxGsonBuilder { | |||||
INSTANCE.registerTypeAdapter(WxMassOpenIdsMessage.class, new WxMassOpenIdsMessageGsonAdapter()); | INSTANCE.registerTypeAdapter(WxMassOpenIdsMessage.class, new WxMassOpenIdsMessageGsonAdapter()); | ||||
INSTANCE.registerTypeAdapter(WxGroup.class, new WxGroupGsonAdapter()); | INSTANCE.registerTypeAdapter(WxGroup.class, new WxGroupGsonAdapter()); | ||||
INSTANCE.registerTypeAdapter(WxUser.class, new WxUserGsonAdapter()); | INSTANCE.registerTypeAdapter(WxUser.class, new WxUserGsonAdapter()); | ||||
INSTANCE.registerTypeAdapter(WxUserList.class, new WxUserListGsonAdapter()); | |||||
} | } | ||||
public static Gson create() { | public static Gson create() { | ||||
@@ -0,0 +1,42 @@ | |||||
/* | |||||
* 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 chanjarster.weixin.util.json; | |||||
import java.lang.reflect.Type; | |||||
import chanjarster.weixin.bean.result.WxUserList; | |||||
import com.google.gson.JsonArray; | |||||
import com.google.gson.JsonDeserializationContext; | |||||
import com.google.gson.JsonDeserializer; | |||||
import com.google.gson.JsonElement; | |||||
import com.google.gson.JsonObject; | |||||
import com.google.gson.JsonParseException; | |||||
/** | |||||
* | |||||
* @author qianjia | |||||
* | |||||
*/ | |||||
public class WxUserListGsonAdapter implements JsonDeserializer<WxUserList> { | |||||
public WxUserList deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { | |||||
JsonObject o = json.getAsJsonObject(); | |||||
WxUserList wxUserList = new WxUserList(); | |||||
wxUserList.setTotal(GsonHelper.getInteger(o, "total")); | |||||
wxUserList.setCount(GsonHelper.getInteger(o, "count")); | |||||
wxUserList.setNext_openid(GsonHelper.getString(o, "next_openid")); | |||||
JsonArray data = o.get("data").getAsJsonObject().get("openid").getAsJsonArray(); | |||||
for (int i = 0; i < data.size(); i++) { | |||||
wxUserList.getOpenids().add(GsonHelper.getAsString(data.get(i))); | |||||
} | |||||
return wxUserList; | |||||
} | |||||
} |
@@ -6,6 +6,7 @@ import org.testng.annotations.Test; | |||||
import chanjarster.weixin.api.ApiTestModule.WxXmlConfigStorage; | import chanjarster.weixin.api.ApiTestModule.WxXmlConfigStorage; | ||||
import chanjarster.weixin.bean.result.WxUser; | import chanjarster.weixin.bean.result.WxUser; | ||||
import chanjarster.weixin.bean.result.WxUserList; | |||||
import chanjarster.weixin.exception.WxErrorException; | import chanjarster.weixin.exception.WxErrorException; | ||||
import chanjarster.weixin.util.json.WxGsonBuilder; | import chanjarster.weixin.util.json.WxGsonBuilder; | ||||
@@ -35,4 +36,12 @@ public class WxUserAPITest { | |||||
System.out.println(WxGsonBuilder.INSTANCE.create().toJson(user)); | System.out.println(WxGsonBuilder.INSTANCE.create().toJson(user)); | ||||
} | } | ||||
public void testUserList() throws WxErrorException { | |||||
WxUserList wxUserList = wxService.userList(null); | |||||
Assert.assertNotNull(wxUserList); | |||||
Assert.assertFalse(wxUserList.getCount() == -1); | |||||
Assert.assertFalse(wxUserList.getTotal() == -1); | |||||
Assert.assertFalse(wxUserList.getOpenids().size() == -1); | |||||
} | |||||
} | } |