@@ -50,7 +50,7 @@ wxService.setWxConfigStorage(config); | |||||
// 用户的openid在下面地址获得 | // 用户的openid在下面地址获得 | ||||
// https://mp.weixin.qq.com/debug/cgi-bin/apiinfo?t=index&type=用户管理&form=获取关注者列表接口%20/user/get | // 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); | 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; | 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; | import me.chanjar.weixin.enterprise.util.json.WxCpGsonBuilder; | ||||
@@ -1,6 +1,6 @@ | |||||
package me.chanjar.weixin.enterprise.api; | 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.*; | ||||
import me.chanjar.weixin.enterprise.bean.WxCpDepart; | import me.chanjar.weixin.enterprise.bean.WxCpDepart; | ||||
import me.chanjar.weixin.enterprise.bean.result.WxMediaUploadResult; | 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.enterprise.exception.WxErrorException; | ||||
/** | /** | ||||
@@ -175,15 +175,23 @@ public interface WxCpService { | |||||
*/ | */ | ||||
public void departDelete(Integer departId) throws WxErrorException; | 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 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} 的实现 | * 注入 {@link WxCpConfigStorage} 的实现 | ||||
@@ -8,7 +8,7 @@ import java.util.List; | |||||
import java.util.UUID; | import java.util.UUID; | ||||
import java.util.concurrent.atomic.AtomicBoolean; | 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.common.util.GsonHelper; | ||||
import me.chanjar.weixin.enterprise.bean.*; | import me.chanjar.weixin.enterprise.bean.*; | ||||
import me.chanjar.weixin.enterprise.util.http.SimpleGetRequestExecutor; | 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 org.apache.http.impl.client.HttpClients; | ||||
import me.chanjar.weixin.enterprise.bean.WxCpDepart; | 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.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.enterprise.exception.WxErrorException; | ||||
import me.chanjar.weixin.common.util.FileUtils; | import me.chanjar.weixin.common.util.FileUtils; | ||||
import me.chanjar.weixin.enterprise.util.http.MediaDownloadRequestExecutor; | 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 me.chanjar.weixin.enterprise.util.http.SimplePostRequestExecutor; | ||||
import com.google.gson.JsonElement; | import com.google.gson.JsonElement; | ||||
import com.google.gson.JsonObject; | |||||
import com.google.gson.internal.Streams; | import com.google.gson.internal.Streams; | ||||
import com.google.gson.reflect.TypeToken; | import com.google.gson.reflect.TypeToken; | ||||
import com.google.gson.stream.JsonReader; | import com.google.gson.stream.JsonReader; | ||||
@@ -165,7 +164,7 @@ public class WxCpServiceImpl implements WxCpService { | |||||
public void departDelete(Integer departId) throws WxErrorException { | public void departDelete(Integer departId) throws WxErrorException { | ||||
String url = "https://qyapi.weixin.qq.com/cgi-bin/department/delete?id=" + departId; | 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 { | public List<WxCpDepart> departGet() throws WxErrorException { | ||||
@@ -184,28 +183,50 @@ public class WxCpServiceImpl implements WxCpService { | |||||
} | } | ||||
@Override | @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 | @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 | @Override | ||||
public void userDelete(String userid) throws WxErrorException { | 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 | @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 | @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; | package me.chanjar.weixin.enterprise.api; | ||||
import me.chanjar.weixin.common.bean.WxAccessToken; | |||||
import me.chanjar.weixin.common.bean.result.WxAccessToken; | |||||
/** | /** | ||||
* 基于内存的微信配置provider,在实际生产环境中应该将这些配置持久化 | * 基于内存的微信配置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; | 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 { | 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.client.methods.HttpGet; | ||||
import org.apache.http.entity.ContentType; | 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.enterprise.exception.WxErrorException; | ||||
import me.chanjar.weixin.common.util.FileUtils; | 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.ContentType; | ||||
import org.apache.http.entity.mime.MultipartEntityBuilder; | 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.bean.result.WxMediaUploadResult; | ||||
import me.chanjar.weixin.enterprise.exception.WxErrorException; | 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.CloseableHttpResponse; | ||||
import org.apache.http.client.methods.HttpGet; | 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; | import me.chanjar.weixin.enterprise.exception.WxErrorException; | ||||
/** | /** | ||||
@@ -2,7 +2,7 @@ package me.chanjar.weixin.enterprise.util.http; | |||||
import java.io.IOException; | 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 me.chanjar.weixin.enterprise.exception.WxErrorException; | ||||
import org.apache.http.Consts; | import org.apache.http.Consts; | ||||
import org.apache.http.client.ClientProtocolException; | import org.apache.http.client.ClientProtocolException; | ||||
@@ -10,7 +10,7 @@ package me.chanjar.weixin.enterprise.util.json; | |||||
import com.google.gson.*; | import com.google.gson.*; | ||||
import me.chanjar.weixin.common.util.GsonHelper; | 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; | 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.Gson; | ||||
import com.google.gson.GsonBuilder; | 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.*; | ||||
import me.chanjar.weixin.enterprise.bean.result.*; | import me.chanjar.weixin.enterprise.bean.result.*; | ||||
@@ -16,8 +17,7 @@ public class WxCpGsonBuilder { | |||||
INSTANCE.registerTypeAdapter(WxCpMessage.class, new WxCpMessageGsonAdapter()); | INSTANCE.registerTypeAdapter(WxCpMessage.class, new WxCpMessageGsonAdapter()); | ||||
INSTANCE.registerTypeAdapter(WxCpMenu.class, new WxCpMenuGsonAdapter()); | INSTANCE.registerTypeAdapter(WxCpMenu.class, new WxCpMenuGsonAdapter()); | ||||
INSTANCE.registerTypeAdapter(WxCpDepart.class, new WxCpDepartGsonAdapter()); | 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(WxAccessToken.class, new WxCpAccessTokenAdapter()); | ||||
INSTANCE.registerTypeAdapter(WxError.class, new WxErrorAdapter()); | INSTANCE.registerTypeAdapter(WxError.class, new WxErrorAdapter()); | ||||
INSTANCE.registerTypeAdapter(WxMediaUploadResult.class, new WxCpMediaUploadResultAdapter()); | INSTANCE.registerTypeAdapter(WxMediaUploadResult.class, new WxCpMediaUploadResultAdapter()); | ||||
@@ -10,44 +10,106 @@ package me.chanjar.weixin.enterprise.util.json; | |||||
import java.lang.reflect.Type; | import java.lang.reflect.Type; | ||||
import com.google.gson.*; | |||||
import me.chanjar.weixin.common.util.GsonHelper; | 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 | * @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(); | 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 { | } 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 com.google.gson.*; | ||||
import me.chanjar.weixin.common.util.GsonHelper; | 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; | import java.lang.reflect.Type; | ||||
@@ -1,6 +1,6 @@ | |||||
package me.chanjar.weixin.common.bean; | 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.Assert; | ||||
import org.testng.annotations.Test; | import org.testng.annotations.Test; | ||||
@@ -27,7 +27,7 @@ public class WxCpDepartAPITest { | |||||
public void testDepartCreate() throws WxErrorException { | public void testDepartCreate() throws WxErrorException { | ||||
WxCpDepart depart = new WxCpDepart(); | WxCpDepart depart = new WxCpDepart(); | ||||
depart.setName("测试部门"); | |||||
depart.setName("子部门" + System.currentTimeMillis()); | |||||
depart.setParentId(1); | depart.setParentId(1); | ||||
depart.setOrder(1); | depart.setOrder(1); | ||||
Integer departId = wxService.departCreate(depart); | Integer departId = wxService.departCreate(depart); | ||||
@@ -35,23 +35,28 @@ public class WxCpDepartAPITest { | |||||
@Test(dependsOnMethods = "testDepartCreate") | @Test(dependsOnMethods = "testDepartCreate") | ||||
public void testDepartGet() throws WxErrorException { | public void testDepartGet() throws WxErrorException { | ||||
System.out.println("=================获取部门"); | |||||
List<WxCpDepart> departList = wxService.departGet(); | List<WxCpDepart> departList = wxService.departGet(); | ||||
Assert.assertNotNull(departList); | Assert.assertNotNull(departList); | ||||
Assert.assertTrue(departList.size() > 0); | Assert.assertTrue(departList.size() > 0); | ||||
for (WxCpDepart g : departList) { | for (WxCpDepart g : departList) { | ||||
depart = g; | depart = g; | ||||
System.out.println(depart.getId() + ":" + depart.getName()); | |||||
Assert.assertNotNull(g.getName()); | Assert.assertNotNull(g.getName()); | ||||
} | } | ||||
} | } | ||||
@Test(dependsOnMethods = { "testDepartGet", "testDepartCreate" }) | @Test(dependsOnMethods = { "testDepartGet", "testDepartCreate" }) | ||||
public void testDepartUpdate() throws WxErrorException { | public void testDepartUpdate() throws WxErrorException { | ||||
depart.setName("部门改名"); | |||||
System.out.println("=================更新部门"); | |||||
depart.setName("子部门改名" + System.currentTimeMillis()); | |||||
wxService.departUpdate(depart); | wxService.departUpdate(depart); | ||||
} | } | ||||
@Test(dependsOnMethods = "testDepartUpdate") | @Test(dependsOnMethods = "testDepartUpdate") | ||||
public void testDepartDelete() throws WxErrorException { | public void testDepartDelete() throws WxErrorException { | ||||
System.out.println("=================删除部门"); | |||||
System.out.println(depart.getId() + ":" + depart.getName()); | |||||
wxService.departDelete(depart.getId()); | 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.Assert; | ||||
import org.testng.annotations.Test; | import org.testng.annotations.Test; | ||||
import me.chanjar.weixin.enterprise.bean.result.WxError; | |||||
import me.chanjar.weixin.common.bean.result.WxError; | |||||
@Test | @Test | ||||
public class WxErrorTest { | public class WxErrorTest { | ||||