com.foxinmy.weixin4j.mp.api.UserApi Maven / Gradle / Ivy
package com.foxinmy.weixin4j.mp.api;
import java.util.ArrayList;
import java.util.List;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.http.weixin.ApiResult;
import com.foxinmy.weixin4j.http.weixin.WeixinResponse;
import com.foxinmy.weixin4j.model.Token;
import com.foxinmy.weixin4j.mp.model.Following;
import com.foxinmy.weixin4j.mp.model.User;
import com.foxinmy.weixin4j.mp.model.ChangeOpenidResult;
import com.foxinmy.weixin4j.mp.type.Lang;
import com.foxinmy.weixin4j.token.TokenManager;
/**
* 用户相关API
*
* @className UserApi
* @author jinyu([email protected])
* @date 2014年9月25日
* @since JDK 1.6
* @see com.foxinmy.weixin4j.mp.model.User
*/
public class UserApi extends MpApi {
private final TokenManager tokenManager;
public UserApi(TokenManager tokenManager) {
this.tokenManager = tokenManager;
}
/**
* 获取用户信息
*
* @param openId
* 用户对应的ID
* @return 用户对象
* @throws WeixinException
* @see {@link #getUser(String,Lang)}
*/
public User getUser(String openId) throws WeixinException {
return getUser(openId, Lang.zh_CN);
}
/**
* 获取用户信息
*
* 在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的,对于不同公众号,
* 同一用户的openid不同),公众号可通过本接口来根据OpenID获取用户基本信息,包括昵称、头像、性别、所在城市、语言和关注时间
*
*
* @param openId
* 用户对应的ID
* @param lang
* 国家地区语言版本
* @return 用户对象
* @throws WeixinException
* @see
* 获取用户信息
* @see com.foxinmy.weixin4j.mp.type.Lang
* @see com.foxinmy.weixin4j.mp.model.User
*/
public User getUser(String openId, Lang lang) throws WeixinException {
String user_info_uri = getRequestUri("api_user_info_uri");
Token token = tokenManager.getCache();
WeixinResponse response = weixinExecutor
.get(String.format(user_info_uri, token.getAccessToken(), openId, lang.name()));
return response.getAsObject(new TypeReference() {
});
}
/**
* 批量获取用户信息
*
* @param openIds
* 用户ID
* @return 用户列表
* @see
* 获取用户信息
* @see com.foxinmy.weixin4j.mp.model.User
* @throws WeixinException
* @see {@link #getUsers(Lang,String[])}
*/
public List getUsers(String... openIds) throws WeixinException {
return getUsers(Lang.zh_CN, openIds);
}
/**
* 批量获取用户信息
*
* @param lang
* 国家地区语言版本
* @param openIds
* 用户ID 最多100个
* @return 用户列表
* @see
* 获取用户信息
* @see com.foxinmy.weixin4j.mp.type.Lang
* @see com.foxinmy.weixin4j.mp.model.User
* @throws WeixinException
*/
public List getUsers(Lang lang, String... openIds) throws WeixinException {
String api_users_info_uri = getRequestUri("api_users_info_uri");
StringBuilder parameter = new StringBuilder();
parameter.append("{\"user_list\": [");
for (String openId : openIds) {
parameter.append("{\"openid\": \"").append(openId).append("\"");
parameter.append(",\"lang\": \"").append(lang.name()).append("\"").append("},");
}
parameter.delete(parameter.length() - 1, parameter.length());
parameter.append("]}");
Token token = tokenManager.getCache();
WeixinResponse response = weixinExecutor.post(String.format(api_users_info_uri, token.getAccessToken()),
parameter.toString());
return JSON.parseArray(response.getAsJson().getString("user_info_list"), User.class);
}
/**
* 获取公众号一定数量(10000)的关注者列表 请慎重使用
*
* @param nextOpenId
* 下一次拉取数据的openid 不填写则默认从头开始拉取
* @return 关注者信息 包含用户的详细信息
* @throws WeixinException
* @see
* 获取关注者列表
* @see
* 批量获取用户信息
* @see com.foxinmy.weixin4j.mp.model.Following
* @see com.foxinmy.weixin4j.mp.model.User
*/
public Following getFollowing(String nextOpenId) throws WeixinException {
Following following = getFollowingOpenIds(nextOpenId);
if (following.getCount() > 0) {
List users = new ArrayList(following.getCount());
for (int i = 1; i <= (int) Math.ceil(following.getCount() / 100d); i++) {
users.addAll(getUsers(following.getOpenIds()
.subList((i - 1) * 100, Math.min(i * 100, following.getCount())).toArray(new String[] {})));
}
following.setUserList(users);
}
return following;
}
/**
* 获取公众号一定数量(10000)的关注者列表
*
* @param nextOpenId
* 下一次拉取数据的openid 不填写则默认从头开始拉取
* @return 关注者信息 不包含用户的详细信息
* @throws WeixinException
* @see
* 获取关注者列表
* @see com.foxinmy.weixin4j.mp.model.Following
*/
public Following getFollowingOpenIds(String nextOpenId) throws WeixinException {
String following_uri = getRequestUri("following_uri");
Token token = tokenManager.getCache();
WeixinResponse response = weixinExecutor
.get(String.format(following_uri, token.getAccessToken(), nextOpenId == null ? "" : nextOpenId));
JSONObject result = response.getAsJson();
Following following = JSON.toJavaObject(result, Following.class);
if (following.getCount() > 0) {
following.setOpenIds(JSON.parseArray(result.getJSONObject("data").getString("openid"), String.class));
}
return following;
}
/**
* 获取公众号全部的关注者列表 请慎重使用
*
* 当公众号关注者数量超过10000时,可通过填写next_openid的值,从而多次拉取列表的方式来满足需求,
* 将上一次调用得到的返回中的next_openid值,作为下一次调用中的next_openid值
*
*
* @return 用户对象集合
* @throws WeixinException
* @see
* 获取关注者列表
* @see
* 批量获取用户信息
* @see com.foxinmy.weixin4j.mp.model.User
* @see com.foxinmy.weixin4j.mp.model.Following
* @see #getFollowing(String)
*/
public List getAllFollowing() throws WeixinException {
List userList = new ArrayList();
String nextOpenId = null;
Following f = null;
for (;;) {
f = getFollowing(nextOpenId);
if (f.hasContent()) {
userList.addAll(f.getUserList());
nextOpenId = f.getNextOpenId();
continue;
}
break;
}
return userList;
}
/**
* 获取公众号全部的关注者列表 请慎重使用
*
* 当公众号关注者数量超过10000时,可通过填写next_openid的值,从而多次拉取列表的方式来满足需求,
* 将上一次调用得到的返回中的next_openid值,作为下一次调用中的next_openid值
*
*
* @return 用户openid集合
* @throws WeixinException
* @see
* 获取关注者列表
* @see #getFollowingOpenIds(String)
*/
public List getAllFollowingOpenIds() throws WeixinException {
List openIds = new ArrayList();
String nextOpenId = null;
Following f = null;
for (;;) {
f = getFollowingOpenIds(nextOpenId);
if (f.hasContent()) {
openIds.addAll(f.getOpenIds());
nextOpenId = f.getNextOpenId();
continue;
}
break;
}
return openIds;
}
/**
* 设置用户备注名
*
* @param openId
* 用户ID
* @param remark
* 备注名
* @throws WeixinException
* @see
* 设置用户备注名
*/
public ApiResult remarkUserName(String openId, String remark) throws WeixinException {
String username_remark_uri = getRequestUri("username_remark_uri");
Token token = tokenManager.getCache();
JSONObject obj = new JSONObject();
obj.put("openid", openId);
obj.put("remark", remark);
WeixinResponse response = weixinExecutor.post(String.format(username_remark_uri, token.getAccessToken()),
obj.toJSONString());
return response.getAsResult();
}
/**
* 批量转换openid
*
* @param fromAppid 原账号ID
* @param openIds 原账号openid列表,最多不能超过100个
* @return 转换后的openid
* @throws WeixinException
* @see openid转换
* @see com.foxinmy.weixin4j.mp.model.ChangeOpenidResult
*/
public List batchChangeOpenid(String fromAppid, List openIds) throws WeixinException {
String change_openid_uri = getRequestUri("change_openid_uri");
StringBuilder parameter = new StringBuilder();
parameter.append("{\"from_appid\":\"").append(fromAppid).append("\"");
parameter.append(",\"openid_list\": [");
for (String openId : openIds) {
parameter.append("\"").append(openId).append("\",");
}
parameter.delete(parameter.length() - 1, parameter.length());
parameter.append("]}");
Token token = tokenManager.getCache();
WeixinResponse response = weixinExecutor.post(String.format(change_openid_uri, token.getAccessToken()),
parameter.toString());
return JSON.parseArray(response.getAsJson().getString("result_list"), ChangeOpenidResult.class);
}
/**
* 转换所有openid
*
* @param fromAppid 原账号ID
* @return 转换后的openid
* @throws WeixinException
* @see openid转换
* @see com.foxinmy.weixin4j.mp.model.ChangeOpenidResult
*/
public List changeAllOpenid(String fromAppid) throws WeixinException {
List openIds = null;
String nextOpenId = null;
Following following = null;
int batchSize = 100;
List results = new ArrayList();
for (;;) {
following = getFollowingOpenIds(nextOpenId);
if (following.hasContent()) {
openIds = following.getOpenIds();
int split = (int) Math.ceil(1.0 * openIds.size() / batchSize);
for (int i = 0; i < split; i++) {
List batch = openIds.subList((i * batchSize), Math.min(openIds.size(), (i + 1) * batchSize));
results.addAll(batchChangeOpenid(fromAppid,batch));
}
nextOpenId = following.getNextOpenId();
continue;
}
break;
}
return results;
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy