@@ -50,7 +50,7 @@ wxService.setWxConfigStorage(config); | |||
// 用户的openid在下面地址获得 | |||
// https://mp.weixin.qq.com/debug/cgi-bin/apiinfo?t=index&type=用户管理&form=获取关注者列表接口%20/user/get | |||
String openId = ...; | |||
WxCustomMessage message = WxCustomMessage.TEXT().toUser(openId).content("Hello World").build(); | |||
String userId = ...; | |||
WxCustomMessage message = WxCustomMessage.TEXT().toUser(userId).content("Hello World").build(); | |||
wxService.customMessageSend(message); | |||
``` |
@@ -1,4 +1,4 @@ | |||
package me.chanjar.weixin.common.bean; | |||
package me.chanjar.weixin.common.bean.result; | |||
import me.chanjar.weixin.enterprise.util.json.WxCpGsonBuilder; | |||
@@ -1,7 +1,4 @@ | |||
package me.chanjar.weixin.enterprise.bean.result; | |||
import java.util.HashMap; | |||
import java.util.Map; | |||
package me.chanjar.weixin.common.bean.result; | |||
import me.chanjar.weixin.enterprise.util.json.WxCpGsonBuilder; | |||
@@ -1,6 +1,6 @@ | |||
package me.chanjar.weixin.enterprise.api; | |||
import me.chanjar.weixin.common.bean.WxAccessToken; | |||
import me.chanjar.weixin.common.bean.result.WxAccessToken; | |||
/** | |||
* 微信客户端配置存储 | |||
@@ -8,7 +8,7 @@ import java.util.List; | |||
import me.chanjar.weixin.enterprise.bean.*; | |||
import me.chanjar.weixin.enterprise.bean.WxCpDepart; | |||
import me.chanjar.weixin.enterprise.bean.result.WxMediaUploadResult; | |||
import me.chanjar.weixin.enterprise.bean.result.WxUser; | |||
import me.chanjar.weixin.enterprise.bean.WxCpUser; | |||
import me.chanjar.weixin.enterprise.exception.WxErrorException; | |||
/** | |||
@@ -175,15 +175,23 @@ public interface WxCpService { | |||
*/ | |||
public void departDelete(Integer departId) throws WxErrorException; | |||
public void userCreate(WxUser user) throws WxErrorException; | |||
public void userCreate(WxCpUser user) throws WxErrorException; | |||
public void userUpdate(WxUser user) throws WxErrorException; | |||
public void userUpdate(WxCpUser user) throws WxErrorException; | |||
public void userDelete(String userid) throws WxErrorException; | |||
public WxUser userGet(String userid) throws WxErrorException; | |||
public WxCpUser userGet(String userid) throws WxErrorException; | |||
public List<WxUser> userGetByDepartment(String departmentId) throws WxErrorException; | |||
/** | |||
* http://qydev.weixin.qq.com/wiki/index.php?title=管理成员#.E8.8E.B7.E5.8F.96.E9.83.A8.E9.97.A8.E6.88.90.E5.91.98 | |||
* @param departId 必填。部门id | |||
* @param fetchChild 非必填。1/0:是否递归获取子部门下面的成员 | |||
* @param status 非必填。0获取全部员工,1获取已关注成员列表,2获取禁用成员列表,4获取未关注成员列表。status可叠加 | |||
* @return | |||
* @throws WxErrorException | |||
*/ | |||
public List<WxCpUser> userGetByDepart(Integer departId, Boolean fetchChild, Integer status) throws WxErrorException; | |||
/** | |||
* 注入 {@link WxCpConfigStorage} 的实现 | |||
@@ -8,7 +8,7 @@ import java.util.List; | |||
import java.util.UUID; | |||
import java.util.concurrent.atomic.AtomicBoolean; | |||
import me.chanjar.weixin.common.bean.WxAccessToken; | |||
import me.chanjar.weixin.common.bean.result.WxAccessToken; | |||
import me.chanjar.weixin.common.util.GsonHelper; | |||
import me.chanjar.weixin.enterprise.bean.*; | |||
import me.chanjar.weixin.enterprise.util.http.SimpleGetRequestExecutor; | |||
@@ -23,9 +23,9 @@ import org.apache.http.impl.client.CloseableHttpClient; | |||
import org.apache.http.impl.client.HttpClients; | |||
import me.chanjar.weixin.enterprise.bean.WxCpDepart; | |||
import me.chanjar.weixin.enterprise.bean.result.WxError; | |||
import me.chanjar.weixin.common.bean.result.WxError; | |||
import me.chanjar.weixin.enterprise.bean.result.WxMediaUploadResult; | |||
import me.chanjar.weixin.enterprise.bean.result.WxUser; | |||
import me.chanjar.weixin.enterprise.bean.WxCpUser; | |||
import me.chanjar.weixin.enterprise.exception.WxErrorException; | |||
import me.chanjar.weixin.common.util.FileUtils; | |||
import me.chanjar.weixin.enterprise.util.http.MediaDownloadRequestExecutor; | |||
@@ -34,7 +34,6 @@ import me.chanjar.weixin.enterprise.util.http.RequestExecutor; | |||
import me.chanjar.weixin.enterprise.util.http.SimplePostRequestExecutor; | |||
import com.google.gson.JsonElement; | |||
import com.google.gson.JsonObject; | |||
import com.google.gson.internal.Streams; | |||
import com.google.gson.reflect.TypeToken; | |||
import com.google.gson.stream.JsonReader; | |||
@@ -165,7 +164,7 @@ public class WxCpServiceImpl implements WxCpService { | |||
public void departDelete(Integer departId) throws WxErrorException { | |||
String url = "https://qyapi.weixin.qq.com/cgi-bin/department/delete?id=" + departId; | |||
String responseContent = execute(new SimpleGetRequestExecutor(), url, null); | |||
execute(new SimpleGetRequestExecutor(), url, null); | |||
} | |||
public List<WxCpDepart> departGet() throws WxErrorException { | |||
@@ -184,28 +183,50 @@ public class WxCpServiceImpl implements WxCpService { | |||
} | |||
@Override | |||
public void userCreate(WxUser user) throws WxErrorException { | |||
// TODO | |||
public void userCreate(WxCpUser user) throws WxErrorException { | |||
String url = "https://qyapi.weixin.qq.com/cgi-bin/user/create"; | |||
execute(new SimplePostRequestExecutor(), url, user.toJson()); | |||
} | |||
@Override | |||
public void userUpdate(WxUser user) throws WxErrorException { | |||
// TODO | |||
public void userUpdate(WxCpUser user) throws WxErrorException { | |||
String url = "https://qyapi.weixin.qq.com/cgi-bin/user/update"; | |||
execute(new SimplePostRequestExecutor(), url, user.toJson()); | |||
} | |||
@Override | |||
public void userDelete(String userid) throws WxErrorException { | |||
// TODO | |||
String url = "https://qyapi.weixin.qq.com/cgi-bin/user/delete?userid=" + userid; | |||
execute(new SimpleGetRequestExecutor(), url, null); | |||
} | |||
@Override | |||
public WxUser userGet(String userid) throws WxErrorException { | |||
return null; | |||
public WxCpUser userGet(String userid) throws WxErrorException { | |||
String url = "https://qyapi.weixin.qq.com/cgi-bin/user/get?userid=" + userid; | |||
String responseContent = execute(new SimpleGetRequestExecutor(), url, null); | |||
return WxCpUser.fromJson(responseContent); | |||
} | |||
@Override | |||
public List<WxUser> userGetByDepartment(String departmentId) throws WxErrorException { | |||
return null; | |||
public List<WxCpUser> userGetByDepart(Integer departId, Boolean fetchChild, Integer status) throws WxErrorException { | |||
String url = "https://qyapi.weixin.qq.com/cgi-bin/user/simplelist?department_id=" + departId; | |||
String params = ""; | |||
if (fetchChild != null) { | |||
params += "&fetch_child=" + (fetchChild ? "1" : "0"); | |||
} | |||
if (status != null) { | |||
params += "&status=" + status; | |||
} else { | |||
params += "&status=0"; | |||
} | |||
String responseContent = execute(new SimpleGetRequestExecutor(), url, params); | |||
JsonElement tmpJsonElement = Streams.parse(new JsonReader(new StringReader(responseContent))); | |||
return WxCpGsonBuilder.INSTANCE.create() | |||
.fromJson( | |||
tmpJsonElement.getAsJsonObject().get("userlist"), | |||
new TypeToken<List<WxCpUser>>() { }.getType() | |||
); | |||
} | |||
/** | |||
@@ -1,6 +1,6 @@ | |||
package me.chanjar.weixin.enterprise.api; | |||
import me.chanjar.weixin.common.bean.WxAccessToken; | |||
import me.chanjar.weixin.common.bean.result.WxAccessToken; | |||
/** | |||
* 基于内存的微信配置provider,在实际生产环境中应该将这些配置持久化 | |||
@@ -0,0 +1,143 @@ | |||
package me.chanjar.weixin.enterprise.bean; | |||
import me.chanjar.weixin.enterprise.util.json.WxCpGsonBuilder; | |||
import java.sql.PseudoColumnUsage; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
/** | |||
* 微信用户信息 | |||
* | |||
* @author Daniel Qian | |||
*/ | |||
public class WxCpUser { | |||
private String userId; | |||
private String name; | |||
private Integer[] departIds; | |||
private String position; | |||
private String mobile; | |||
private String gender; | |||
private String tel; | |||
private String email; | |||
private String weiXinId; | |||
private final List<Attr> extAttrs = new ArrayList<Attr>(); | |||
public String getUserId() { | |||
return userId; | |||
} | |||
public void setUserId(String userId) { | |||
this.userId = userId; | |||
} | |||
public String getName() { | |||
return name; | |||
} | |||
public void setName(String name) { | |||
this.name = name; | |||
} | |||
public Integer[] getDepartIds() { | |||
return departIds; | |||
} | |||
public void setDepartIds(Integer[] departIds) { | |||
this.departIds = departIds; | |||
} | |||
public String getGender() { | |||
return gender; | |||
} | |||
public void setGender(String gender) { | |||
this.gender = gender; | |||
} | |||
public String getPosition() { | |||
return position; | |||
} | |||
public void setPosition(String position) { | |||
this.position = position; | |||
} | |||
public String getMobile() { | |||
return mobile; | |||
} | |||
public void setMobile(String mobile) { | |||
this.mobile = mobile; | |||
} | |||
public String getTel() { | |||
return tel; | |||
} | |||
public void setTel(String tel) { | |||
this.tel = tel; | |||
} | |||
public String getEmail() { | |||
return email; | |||
} | |||
public void setEmail(String email) { | |||
this.email = email; | |||
} | |||
public String getWeiXinId() { | |||
return weiXinId; | |||
} | |||
public void setWeiXinId(String weiXinId) { | |||
this.weiXinId = weiXinId; | |||
} | |||
public String toJson() { | |||
return WxCpGsonBuilder.INSTANCE.create().toJson(this); | |||
} | |||
public static WxCpUser fromJson(String json) { | |||
return WxCpGsonBuilder.INSTANCE.create().fromJson(json, WxCpUser.class); | |||
} | |||
public void addExtAttr(String name, String value) { | |||
this.extAttrs.add(new Attr(name, value)); | |||
} | |||
public List<Attr> getExtAttrs() { | |||
return extAttrs; | |||
} | |||
public static class Attr { | |||
private String name; | |||
private String value; | |||
public Attr(String name, String value) { | |||
this.name = name; | |||
this.value = value; | |||
} | |||
public String getName() { | |||
return name; | |||
} | |||
public void setName(String name) { | |||
this.name = name; | |||
} | |||
public String getValue() { | |||
return value; | |||
} | |||
public void setValue(String value) { | |||
this.value = value; | |||
} | |||
} | |||
} |
@@ -1,55 +0,0 @@ | |||
package me.chanjar.weixin.enterprise.bean.result; | |||
import me.chanjar.weixin.enterprise.util.json.WxCpGsonBuilder; | |||
/** | |||
* <pre> | |||
* 群发消息一发送就返回的结果 | |||
* | |||
* 真正的群发消息是否发送成功要看 | |||
* http://mp.weixin.qq.com/wiki/index.php?title=高级群发接口#.E4.BA.8B.E4.BB.B6.E6.8E.A8.E9.80.81.E7.BE.A4.E5.8F.91.E7.BB.93.E6.9E.9C | |||
* | |||
* </pre> | |||
* @author Daniel Qian | |||
* | |||
*/ | |||
public class WxMassSendResult { | |||
private String errorCode; | |||
private String errorMsg; | |||
private String msgId; | |||
public String getErrorCode() { | |||
return errorCode; | |||
} | |||
public void setErrorCode(String errorCode) { | |||
this.errorCode = errorCode; | |||
} | |||
public String getErrorMsg() { | |||
return errorMsg; | |||
} | |||
public void setErrorMsg(String errorMsg) { | |||
this.errorMsg = errorMsg; | |||
} | |||
public String getMsgId() { | |||
return msgId; | |||
} | |||
public void setMsgId(String msgId) { | |||
this.msgId = msgId; | |||
} | |||
public static WxMassSendResult fromJson(String json) { | |||
return WxCpGsonBuilder.create().fromJson(json, WxMassSendResult.class); | |||
} | |||
@Override | |||
public String toString() { | |||
return "WxMassSendResult [errcode=" + errorCode + ", errmsg=" + errorMsg + ", msg_id=" + msgId + "]"; | |||
} | |||
} |
@@ -1,52 +0,0 @@ | |||
package me.chanjar.weixin.enterprise.bean.result; | |||
import me.chanjar.weixin.enterprise.util.json.WxCpGsonBuilder; | |||
/** | |||
* <pre> | |||
* 上传群发用的素材的结果 | |||
* 视频和图文消息需要在群发前上传素材 | |||
* </pre> | |||
* @author Daniel Qian | |||
* | |||
*/ | |||
public class WxMassUploadResult { | |||
private String type; | |||
private String mediaId; | |||
private long createdAt; | |||
public String getType() { | |||
return type; | |||
} | |||
public void setType(String type) { | |||
this.type = type; | |||
} | |||
public String getMediaId() { | |||
return mediaId; | |||
} | |||
public void setMediaId(String mediaId) { | |||
this.mediaId = mediaId; | |||
} | |||
public long getCreatedAt() { | |||
return createdAt; | |||
} | |||
public void setCreatedAt(long createdAt) { | |||
this.createdAt = createdAt; | |||
} | |||
public static WxMassUploadResult fromJson(String json) { | |||
return WxCpGsonBuilder.create().fromJson(json, WxMassUploadResult.class); | |||
} | |||
@Override | |||
public String toString() { | |||
return "WxUploadResult [type=" + type + ", media_id=" + mediaId + ", created_at=" + createdAt + "]"; | |||
} | |||
} |
@@ -1,95 +0,0 @@ | |||
package me.chanjar.weixin.enterprise.bean.result; | |||
import me.chanjar.weixin.enterprise.util.json.WxCpGsonBuilder; | |||
/** | |||
* 微信用户信息 | |||
* @author Daniel Qian | |||
* | |||
*/ | |||
public class WxUser { | |||
protected boolean subscribe; | |||
protected String openId; | |||
protected String nickname; | |||
protected String sex; | |||
protected String language; | |||
protected String city; | |||
protected String province; | |||
protected String country; | |||
protected String headImgUrl; | |||
protected long subscribeTime; | |||
protected String unionId; | |||
public boolean isSubscribe() { | |||
return subscribe; | |||
} | |||
public void setSubscribe(boolean subscribe) { | |||
this.subscribe = subscribe; | |||
} | |||
public String getOpenId() { | |||
return openId; | |||
} | |||
public void setOpenId(String openId) { | |||
this.openId = openId; | |||
} | |||
public String getNickname() { | |||
return nickname; | |||
} | |||
public void setNickname(String nickname) { | |||
this.nickname = nickname; | |||
} | |||
public String getSex() { | |||
return sex; | |||
} | |||
public void setSex(String sex) { | |||
this.sex = sex; | |||
} | |||
public String getLanguage() { | |||
return language; | |||
} | |||
public void setLanguage(String language) { | |||
this.language = language; | |||
} | |||
public String getCity() { | |||
return city; | |||
} | |||
public void setCity(String city) { | |||
this.city = city; | |||
} | |||
public String getProvince() { | |||
return province; | |||
} | |||
public void setProvince(String province) { | |||
this.province = province; | |||
} | |||
public String getCountry() { | |||
return country; | |||
} | |||
public void setCountry(String country) { | |||
this.country = country; | |||
} | |||
public String getHeadImgUrl() { | |||
return headImgUrl; | |||
} | |||
public void setHeadImgUrl(String headImgUrl) { | |||
this.headImgUrl = headImgUrl; | |||
} | |||
public long getSubscribeTime() { | |||
return subscribeTime; | |||
} | |||
public void setSubscribeTime(long subscribeTime) { | |||
this.subscribeTime = subscribeTime; | |||
} | |||
public String getUnionId() { | |||
return unionId; | |||
} | |||
public void setUnionId(String unionId) { | |||
this.unionId = unionId; | |||
} | |||
public static WxUser fromJson(String json) { | |||
return WxCpGsonBuilder.INSTANCE.create().fromJson(json, WxUser.class); | |||
} | |||
} |
@@ -1,47 +0,0 @@ | |||
package me.chanjar.weixin.enterprise.bean.result; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import me.chanjar.weixin.enterprise.util.json.WxCpGsonBuilder; | |||
/** | |||
* 关注者列表 | |||
* @author Daniel Qian | |||
* | |||
*/ | |||
public class WxUserList { | |||
protected int total = -1; | |||
protected int count = -1; | |||
protected List<String> openIds = new ArrayList<String>(); | |||
protected String nextOpenId; | |||
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 getNextOpenId() { | |||
return nextOpenId; | |||
} | |||
public void setNextOpenId(String nextOpenId) { | |||
this.nextOpenId = nextOpenId; | |||
} | |||
public static WxUserList fromJson(String json) { | |||
return WxCpGsonBuilder.INSTANCE.create().fromJson(json, WxUserList.class); | |||
} | |||
} |
@@ -1,6 +1,6 @@ | |||
package me.chanjar.weixin.enterprise.exception; | |||
import me.chanjar.weixin.enterprise.bean.result.WxError; | |||
import me.chanjar.weixin.common.bean.result.WxError; | |||
public class WxErrorException extends Exception { | |||
@@ -13,7 +13,7 @@ import org.apache.http.client.methods.CloseableHttpResponse; | |||
import org.apache.http.client.methods.HttpGet; | |||
import org.apache.http.entity.ContentType; | |||
import me.chanjar.weixin.enterprise.bean.result.WxError; | |||
import me.chanjar.weixin.common.bean.result.WxError; | |||
import me.chanjar.weixin.enterprise.exception.WxErrorException; | |||
import me.chanjar.weixin.common.util.FileUtils; | |||
@@ -10,7 +10,7 @@ import org.apache.http.client.methods.HttpPost; | |||
import org.apache.http.entity.ContentType; | |||
import org.apache.http.entity.mime.MultipartEntityBuilder; | |||
import me.chanjar.weixin.enterprise.bean.result.WxError; | |||
import me.chanjar.weixin.common.bean.result.WxError; | |||
import me.chanjar.weixin.enterprise.bean.result.WxMediaUploadResult; | |||
import me.chanjar.weixin.enterprise.exception.WxErrorException; | |||
@@ -6,7 +6,7 @@ import org.apache.http.client.ClientProtocolException; | |||
import org.apache.http.client.methods.CloseableHttpResponse; | |||
import org.apache.http.client.methods.HttpGet; | |||
import me.chanjar.weixin.enterprise.bean.result.WxError; | |||
import me.chanjar.weixin.common.bean.result.WxError; | |||
import me.chanjar.weixin.enterprise.exception.WxErrorException; | |||
/** | |||
@@ -2,7 +2,7 @@ package me.chanjar.weixin.enterprise.util.http; | |||
import java.io.IOException; | |||
import me.chanjar.weixin.enterprise.bean.result.WxError; | |||
import me.chanjar.weixin.common.bean.result.WxError; | |||
import me.chanjar.weixin.enterprise.exception.WxErrorException; | |||
import org.apache.http.Consts; | |||
import org.apache.http.client.ClientProtocolException; | |||
@@ -10,7 +10,7 @@ package me.chanjar.weixin.enterprise.util.json; | |||
import com.google.gson.*; | |||
import me.chanjar.weixin.common.util.GsonHelper; | |||
import me.chanjar.weixin.common.bean.WxAccessToken; | |||
import me.chanjar.weixin.common.bean.result.WxAccessToken; | |||
import java.lang.reflect.Type; | |||
@@ -3,7 +3,8 @@ package me.chanjar.weixin.enterprise.util.json; | |||
import com.google.gson.Gson; | |||
import com.google.gson.GsonBuilder; | |||
import me.chanjar.weixin.common.bean.WxAccessToken; | |||
import me.chanjar.weixin.common.bean.result.WxAccessToken; | |||
import me.chanjar.weixin.common.bean.result.WxError; | |||
import me.chanjar.weixin.enterprise.bean.*; | |||
import me.chanjar.weixin.enterprise.bean.result.*; | |||
@@ -16,8 +17,7 @@ public class WxCpGsonBuilder { | |||
INSTANCE.registerTypeAdapter(WxCpMessage.class, new WxCpMessageGsonAdapter()); | |||
INSTANCE.registerTypeAdapter(WxCpMenu.class, new WxCpMenuGsonAdapter()); | |||
INSTANCE.registerTypeAdapter(WxCpDepart.class, new WxCpDepartGsonAdapter()); | |||
INSTANCE.registerTypeAdapter(WxUser.class, new WxCpUserGsonAdapter()); | |||
INSTANCE.registerTypeAdapter(WxUserList.class, new WxCpUserListGsonAdapter()); | |||
INSTANCE.registerTypeAdapter(WxCpUser.class, new WxCpUserGsonAdapter()); | |||
INSTANCE.registerTypeAdapter(WxAccessToken.class, new WxCpAccessTokenAdapter()); | |||
INSTANCE.registerTypeAdapter(WxError.class, new WxErrorAdapter()); | |||
INSTANCE.registerTypeAdapter(WxMediaUploadResult.class, new WxCpMediaUploadResultAdapter()); | |||
@@ -10,44 +10,106 @@ package me.chanjar.weixin.enterprise.util.json; | |||
import java.lang.reflect.Type; | |||
import com.google.gson.*; | |||
import me.chanjar.weixin.common.util.GsonHelper; | |||
import me.chanjar.weixin.enterprise.bean.result.WxUser; | |||
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; | |||
import me.chanjar.weixin.enterprise.bean.WxCpUser; | |||
/** | |||
* | |||
* @author Daniel Qian | |||
* | |||
*/ | |||
public class WxCpUserGsonAdapter implements JsonDeserializer<WxUser> { | |||
public class WxCpUserGsonAdapter implements JsonDeserializer<WxCpUser>, JsonSerializer<WxCpUser> { | |||
public WxUser deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { | |||
public WxCpUser deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) | |||
throws JsonParseException { | |||
JsonObject o = json.getAsJsonObject(); | |||
WxUser wxUser = new WxUser(); | |||
wxUser.setSubscribe(new Integer(0).equals(GsonHelper.getInteger(o, "subscribe")) ? false : true); | |||
wxUser.setCity(GsonHelper.getString(o, "city")); | |||
wxUser.setCountry(GsonHelper.getString(o, "country")); | |||
wxUser.setHeadImgUrl(GsonHelper.getString(o, "headimgurl")); | |||
wxUser.setLanguage(GsonHelper.getString(o, "language")); | |||
wxUser.setNickname(GsonHelper.getString(o, "nickname")); | |||
wxUser.setOpenId(GsonHelper.getString(o, "openid")); | |||
wxUser.setProvince(GsonHelper.getString(o, "province")); | |||
wxUser.setSubscribeTime(GsonHelper.getLong(o, "subscribe_time")); | |||
wxUser.setUnionId(GsonHelper.getString(o, "unionid")); | |||
Integer sex = GsonHelper.getInteger(o, "sex"); | |||
if(new Integer(1).equals(sex)) { | |||
wxUser.setSex("男"); | |||
} else if (new Integer(2).equals(sex)) { | |||
wxUser.setSex("女"); | |||
WxCpUser user = new WxCpUser(); | |||
user.setUserId(GsonHelper.getString(o, "userid")); | |||
user.setName(GsonHelper.getString(o, "name")); | |||
if(o.get("department") != null) { | |||
JsonArray departJsonArray = o.get("department").getAsJsonArray(); | |||
Integer[] departIds = new Integer[departJsonArray.size()]; | |||
int i = 0; | |||
for (JsonElement jsonElement : departJsonArray) { | |||
departIds[i++] = jsonElement.getAsInt(); | |||
} | |||
user.setDepartIds(departIds); | |||
} | |||
user.setPosition(GsonHelper.getString(o, "position")); | |||
user.setMobile(GsonHelper.getString(o, "mobile")); | |||
Integer gender = GsonHelper.getInteger(o, "gender"); | |||
if (new Integer(1).equals(gender)) { | |||
user.setGender("男"); | |||
} else if (new Integer(2).equals(gender)) { | |||
user.setGender("女"); | |||
} else { | |||
wxUser.setSex("未知"); | |||
user.setGender("未知"); | |||
} | |||
user.setTel(GsonHelper.getString(o, "tel")); | |||
user.setEmail(GsonHelper.getString(o, "email")); | |||
user.setWeiXinId(GsonHelper.getString(o, "weixinid")); | |||
if (GsonHelper.isNotNull(o.get("extattr"))) { | |||
JsonArray attrJsonElements = o.get("extattr").getAsJsonObject().get("attrs").getAsJsonArray(); | |||
for (JsonElement attrJsonElement : attrJsonElements) { | |||
WxCpUser.Attr attr = new WxCpUser.Attr( | |||
GsonHelper.getString(attrJsonElement.getAsJsonObject(), "name"), | |||
GsonHelper.getString(attrJsonElement.getAsJsonObject(), "value") | |||
); | |||
user.getExtAttrs().add(attr); | |||
} | |||
} | |||
return user; | |||
} | |||
@Override | |||
public JsonElement serialize(WxCpUser user, Type typeOfSrc, JsonSerializationContext context) { | |||
JsonObject o = new JsonObject(); | |||
if (user.getUserId() != null) { | |||
o.addProperty("userid", user.getUserId()); | |||
} | |||
if (user.getName() != null) { | |||
o.addProperty("name", user.getName()); | |||
} | |||
if (user.getDepartIds() != null) { | |||
JsonArray jsonArray = new JsonArray(); | |||
for (Integer departId : user.getDepartIds()) { | |||
jsonArray.add(new JsonPrimitive(departId)); | |||
} | |||
o.add("department", jsonArray); | |||
} | |||
if (user.getPosition() != null) { | |||
o.addProperty("position", user.getPosition()); | |||
} | |||
if (user.getMobile() != null) { | |||
o.addProperty("mobile", user.getMobile()); | |||
} | |||
if (user.getGender() != null) { | |||
o.addProperty("gender", user.getGender().equals("男") ? 0 : 1); | |||
} | |||
if (user.getTel() != null) { | |||
o.addProperty("tel", user.getTel()); | |||
} | |||
if (user.getEmail() != null) { | |||
o.addProperty("email", user.getEmail()); | |||
} | |||
if (user.getWeiXinId() != null) { | |||
o.addProperty("weixinid", user.getWeiXinId()); | |||
} | |||
if (user.getExtAttrs().size() > 0) { | |||
JsonArray attrsJsonArray = new JsonArray(); | |||
for (WxCpUser.Attr attr : user.getExtAttrs()) { | |||
JsonObject attrJson = new JsonObject(); | |||
attrJson.addProperty("name", attr.getName()); | |||
attrJson.addProperty("value", attr.getValue()); | |||
attrsJsonArray.add(attrJson); | |||
} | |||
JsonObject attrsJson = new JsonObject(); | |||
attrsJson.add("attrs", attrsJsonArray); | |||
o.add("extattr", attrsJson); | |||
} | |||
return wxUser; | |||
return o; | |||
} | |||
} |
@@ -1,43 +0,0 @@ | |||
/* | |||
* 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 me.chanjar.weixin.enterprise.util.json; | |||
import java.lang.reflect.Type; | |||
import me.chanjar.weixin.common.util.GsonHelper; | |||
import me.chanjar.weixin.enterprise.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 Daniel Qian | |||
* | |||
*/ | |||
public class WxCpUserListGsonAdapter 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.setNextOpenId(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; | |||
} | |||
} |
@@ -10,7 +10,7 @@ package me.chanjar.weixin.enterprise.util.json; | |||
import com.google.gson.*; | |||
import me.chanjar.weixin.common.util.GsonHelper; | |||
import me.chanjar.weixin.enterprise.bean.result.WxError; | |||
import me.chanjar.weixin.common.bean.result.WxError; | |||
import java.lang.reflect.Type; | |||
@@ -1,6 +1,6 @@ | |||
package me.chanjar.weixin.common.bean; | |||
import me.chanjar.weixin.common.bean.WxAccessToken; | |||
import me.chanjar.weixin.common.bean.result.WxAccessToken; | |||
import org.testng.Assert; | |||
import org.testng.annotations.Test; | |||
@@ -27,7 +27,7 @@ public class WxCpDepartAPITest { | |||
public void testDepartCreate() throws WxErrorException { | |||
WxCpDepart depart = new WxCpDepart(); | |||
depart.setName("测试部门"); | |||
depart.setName("子部门" + System.currentTimeMillis()); | |||
depart.setParentId(1); | |||
depart.setOrder(1); | |||
Integer departId = wxService.departCreate(depart); | |||
@@ -35,23 +35,28 @@ public class WxCpDepartAPITest { | |||
@Test(dependsOnMethods = "testDepartCreate") | |||
public void testDepartGet() throws WxErrorException { | |||
System.out.println("=================获取部门"); | |||
List<WxCpDepart> departList = wxService.departGet(); | |||
Assert.assertNotNull(departList); | |||
Assert.assertTrue(departList.size() > 0); | |||
for (WxCpDepart g : departList) { | |||
depart = g; | |||
System.out.println(depart.getId() + ":" + depart.getName()); | |||
Assert.assertNotNull(g.getName()); | |||
} | |||
} | |||
@Test(dependsOnMethods = { "testDepartGet", "testDepartCreate" }) | |||
public void testDepartUpdate() throws WxErrorException { | |||
depart.setName("部门改名"); | |||
System.out.println("=================更新部门"); | |||
depart.setName("子部门改名" + System.currentTimeMillis()); | |||
wxService.departUpdate(depart); | |||
} | |||
@Test(dependsOnMethods = "testDepartUpdate") | |||
public void testDepartDelete() throws WxErrorException { | |||
System.out.println("=================删除部门"); | |||
System.out.println(depart.getId() + ":" + depart.getName()); | |||
wxService.departDelete(depart.getId()); | |||
} | |||
@@ -0,0 +1,66 @@ | |||
package me.chanjar.weixin.enterprise.api; | |||
import com.google.inject.Inject; | |||
import me.chanjar.weixin.enterprise.bean.WxCpDepart; | |||
import me.chanjar.weixin.enterprise.bean.WxCpUser; | |||
import me.chanjar.weixin.enterprise.exception.WxErrorException; | |||
import org.testng.Assert; | |||
import org.testng.annotations.Guice; | |||
import org.testng.annotations.Test; | |||
import java.util.List; | |||
/** | |||
* 测试用户接口 | |||
* | |||
* @author Daniel Qian | |||
*/ | |||
@Test(groups = "userAPI", dependsOnGroups = "baseAPI") | |||
@Guice(modules = ApiTestModule.class) | |||
public class WxCpUserAPITest { | |||
@Inject | |||
protected WxCpServiceImpl wxService; | |||
protected WxCpDepart depart; | |||
public void testUserCreate() throws WxErrorException { | |||
WxCpUser user = new WxCpUser(); | |||
user.setUserId("xiaohe.yang"); | |||
user.setName("杨宝"); | |||
user.setDepartIds(new Integer[] { 9, 8 }); | |||
user.setEmail("yangxiaohe@ddd.com"); | |||
user.setGender("女"); | |||
user.setMobile("13564684979"); | |||
user.setPosition("老婆"); | |||
user.setTel("3300393"); | |||
user.addExtAttr("爱好", "老公"); | |||
wxService.userCreate(user); | |||
} | |||
@Test(dependsOnMethods = "testUserCreate") | |||
public void testUserUpdate() throws WxErrorException { | |||
WxCpUser user = new WxCpUser(); | |||
user.setUserId("xiaohe.yang"); | |||
user.setName("杨宝"); | |||
user.addExtAttr("爱好", "老公2"); | |||
wxService.userUpdate(user); | |||
} | |||
@Test(dependsOnMethods = "testUserUpdate") | |||
public void testUserGet() throws WxErrorException { | |||
WxCpUser user = wxService.userGet("xiaohe.yang"); | |||
Assert.assertNotNull(user); | |||
} | |||
@Test(dependsOnMethods = "testUserGet") | |||
public void testUserGetByDepart() throws WxErrorException { | |||
List<WxCpUser> users = wxService.userGetByDepart(1, true, 0); | |||
Assert.assertNotEquals(users.size(), 0); | |||
} | |||
@Test(dependsOnMethods = "testUserGetByDepart") | |||
public void testUserDelete() throws WxErrorException { | |||
wxService.userDelete("xiaohe.yang"); | |||
} | |||
} |
@@ -3,7 +3,7 @@ package me.chanjar.weixin.enterprise.bean; | |||
import org.testng.Assert; | |||
import org.testng.annotations.Test; | |||
import me.chanjar.weixin.enterprise.bean.result.WxError; | |||
import me.chanjar.weixin.common.bean.result.WxError; | |||
@Test | |||
public class WxErrorTest { | |||