From fe51ab78134a5829530f2aad9f87bdaf3943d654 Mon Sep 17 00:00:00 2001 From: jinyu Date: Sat, 27 Feb 2016 09:53:36 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/foxinmy/weixin4j/jssdk/JSSDKAPI.java | 2 +- .../com/foxinmy/weixin4j/qy/WeixinProxy.java | 20 +++--- .../foxinmy/weixin4j/qy/api/NotifyApi.java | 31 ++++++++- .../com/foxinmy/weixin4j/qy/api/TagApi.java | 2 +- .../com/foxinmy/weixin4j/qy/api/UserApi.java | 67 +++++++++++-------- .../weixin4j/qy/model/IdParameter.java | 2 + .../foxinmy/weixin4j/qy/test/NotifyTest.java | 8 +-- 7 files changed, 81 insertions(+), 51 deletions(-) diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/jssdk/JSSDKAPI.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/jssdk/JSSDKAPI.java index bc0e81b9..a63a9b43 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/jssdk/JSSDKAPI.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/jssdk/JSSDKAPI.java @@ -6,7 +6,7 @@ package com.foxinmy.weixin4j.jssdk; * @className JSSDKAPI * @author jy * @date 2015年12月23日 - * @since JDK 1.7 + * @since JDK 1.6 * @see */ public enum JSSDKAPI { diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinProxy.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinProxy.java index c9a82225..401aeae7 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinProxy.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinProxy.java @@ -3,7 +3,6 @@ package com.foxinmy.weixin4j.qy; import java.io.InputStream; import java.util.List; -import com.alibaba.fastjson.JSONObject; import com.foxinmy.weixin4j.exception.WeixinException; import com.foxinmy.weixin4j.http.weixin.JsonResult; import com.foxinmy.weixin4j.model.Button; @@ -199,9 +198,9 @@ public class WeixinProxy { * @see com.foxinmy.weixin4j.tuple.File * @see com.foxinmy.weixin4j.tuple.News * @see com.foxinmy.weixin4j.tuple.MpNews - * @see com.foxinmy.weixin4j.qy.message.NotifyMessage + * @see com.foxinmy.weixin4j.qy.model.IdParameter */ - public JSONObject sendNotifyMessage(NotifyMessage message) + public IdParameter sendNotifyMessage(NotifyMessage message) throws WeixinException { return notifyApi.sendNotifyMessage(message); } @@ -710,22 +709,19 @@ public class WeixinProxy { } /** - * 根据code获取成员信息 + * 根据code获取成员ID信息 * * @param code * 通过员工授权获取到的code,每次员工授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期 - * @return { "UserId":"USERID", "DeviceId":"DEVICEID" } or - * {"OpenId":"OPENID","DeviceId":"DEVICEID"} + * @return 两个元素的数组 第一个元素为userId或者openId + * 第二个元素为deviceId * @see com.foxinmy.weixin4j.qy.api.UserApi * @see - * 企业获取code - * @see - * 根据code获取成员信息 + * "http://qydev.weixin.qq.com/wiki/index.php?title=OAuth%E9%AA%8C%E8%AF%81%E6%8E%A5%E5%8F%A3"> + * oauth授权获取用户信息 * @throws WeixinException */ - public JSONObject getUserIdByCode(String code) throws WeixinException { + public String[] getUserIdByCode(String code) throws WeixinException { return userApi.getUserIdByCode(code); } diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/NotifyApi.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/NotifyApi.java index 95427376..fb5e18b8 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/NotifyApi.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/NotifyApi.java @@ -1,5 +1,8 @@ package com.foxinmy.weixin4j.qy.api; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import java.util.Map; import com.alibaba.fastjson.JSON; @@ -68,8 +71,9 @@ public class NotifyApi extends QyApi { * @see com.foxinmy.weixin4j.tuple.News * @see com.foxinmy.weixin4j.tuple.MpNews * @see com.foxinmy.weixin4j.qy.message.NotifyMessage + * @see com.foxinmy.weixin4j.qy.model.IdParameter */ - public JSONObject sendNotifyMessage(NotifyMessage message) + public IdParameter sendNotifyMessage(NotifyMessage message) throws WeixinException { NotifyTuple tuple = message.getTuple(); Map target = message.getTarget().getParameter(); @@ -87,8 +91,29 @@ public class NotifyApi extends QyApi { WeixinResponse response = weixinExecutor.post( String.format(message_send_uri, token.getAccessToken()), obj.toJSONString()); - - return response.getAsJson(); + obj = response.getAsJson(); + IdParameter idParameter = new IdParameter(); + if (obj.containsKey("invaliduser")) { + idParameter.setUserIds(Arrays.asList(obj.getString("invalidlist") + .split(IdParameter.SEPARATORS))); + } + if (obj.containsKey("invalidparty")) { + List partyIds = new ArrayList(); + for (String id : obj.getString("invalidlist").split( + IdParameter.SEPARATORS)) { + partyIds.add(Integer.parseInt(id)); + } + idParameter.setPartyIds(partyIds); + } + if (obj.containsKey("invalidtag")) { + List tagIds = new ArrayList(); + for (String id : obj.getString("invalidtag").split( + IdParameter.SEPARATORS)) { + tagIds.add(Integer.parseInt(id)); + } + idParameter.setPartyIds(tagIds); + } + return idParameter; } /** diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/TagApi.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/TagApi.java index 76b324c1..5b32e94e 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/TagApi.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/TagApi.java @@ -205,7 +205,7 @@ public class TagApi extends QyApi { IdParameter idParameter = new IdParameter(); if (obj.containsKey("invalidlist")) { idParameter.setUserIds(Arrays.asList(obj.getString("invalidlist") - .split(String.valueOf(IdParameter.SEPARATOR)))); + .split(IdParameter.SEPARATORS))); } if (obj.containsKey("partylist")) { idParameter.setPartyIds(JSON.parseArray(obj.getString("partylist"), diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/UserApi.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/UserApi.java index f5e92d41..fda35be5 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/UserApi.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/UserApi.java @@ -17,6 +17,7 @@ import com.foxinmy.weixin4j.qy.type.InviteType; import com.foxinmy.weixin4j.qy.type.UserStatus; import com.foxinmy.weixin4j.token.TokenHolder; import com.foxinmy.weixin4j.util.NameValue; +import com.foxinmy.weixin4j.util.StringUtil; /** * 成员API @@ -165,7 +166,7 @@ public class UserApi extends QyApi { } /** - * code获取userid(管理员须拥有agent的使用权限;agentid必须和跳转链接时所在的企业应用ID相同。) + * 根据code获取用户信息 * * @param code * 通过员工授权获取到的code,每次员工授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期 @@ -174,15 +175,45 @@ public class UserApi extends QyApi { * @see {@link #getUser(String)} * @see {@link #getUserIdByCode(String,int)} * @see - * 企业获取code - * @see - * 根据code获取成员信息 + * "http://qydev.weixin.qq.com/wiki/index.php?title=OAuth%E9%AA%8C%E8%AF%81%E6%8E%A5%E5%8F%A3"> + * oauth授权获取用户信息 * @throws WeixinException */ public User getUserByCode(String code) throws WeixinException { - return getUser(getUserIdByCode(code).getString("UserId")); + String[] userIds = getUserIdByCode(code); + if (Boolean.parseBoolean(userIds[2])) { + return getUser(openid2userid(userIds[0])); + } else { + return getUser(userIds[0]); + } + } + + /** + * 根据code获取成员ID信息 + * + * @param code + * 通过员工授权获取到的code,每次员工授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期 + * @return 两个元素的数组 第一个元素为userId或者openId + * 第二个元素为deviceId + * @see + * oauth授权获取用户信息 + * @throws WeixinException + */ + public String[] getUserIdByCode(String code) throws WeixinException { + String user_getid_uri = getRequestUri("user_getid_uri"); + Token token = tokenHolder.getToken(); + WeixinResponse response = weixinExecutor.get(String.format( + user_getid_uri, token.getAccessToken(), code)); + JSONObject result = response.getAsJson(); + String userId = result.getString("UserId"); + boolean need2 = false; + if (StringUtil.isBlank(userId)) { + userId = result.getString("OpenId"); + need2 = true; + } + return new String[] { userId, result.getString("DeviceId"), + Boolean.toString(need2) }; } /** @@ -208,28 +239,6 @@ public class UserApi extends QyApi { return JSON.parseObject(response.getAsString(), OUserInfo.class); } - /** - * 根据code获取成员信息 - * - * @param code - * 通过员工授权获取到的code,每次员工授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期 - * @return { "UserId":"USERID", "DeviceId":"DEVICEID" } - * @see - * 企业获取code - * @see - * 根据code获取成员信息 - * @throws WeixinException - */ - public JSONObject getUserIdByCode(String code) throws WeixinException { - String user_getid_uri = getRequestUri("user_getid_uri"); - Token token = tokenHolder.getToken(); - WeixinResponse response = weixinExecutor.get(String.format( - user_getid_uri, token.getAccessToken(), code)); - return response.getAsJson(); - } - /** * 获取部门成员 * diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/IdParameter.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/IdParameter.java index 478f7bbe..1f02dbf2 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/IdParameter.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/IdParameter.java @@ -25,6 +25,8 @@ public class IdParameter implements Serializable { public static final char SEPARATOR = '|'; + public static final String SEPARATORS = String.valueOf(SEPARATOR); + @JSONField(name = "user") private List userIds; @JSONField(name = "party") diff --git a/weixin4j-qy/src/test/java/com/foxinmy/weixin4j/qy/test/NotifyTest.java b/weixin4j-qy/src/test/java/com/foxinmy/weixin4j/qy/test/NotifyTest.java index 9ad80536..cfbec395 100644 --- a/weixin4j-qy/src/test/java/com/foxinmy/weixin4j/qy/test/NotifyTest.java +++ b/weixin4j-qy/src/test/java/com/foxinmy/weixin4j/qy/test/NotifyTest.java @@ -1,14 +1,12 @@ package com.foxinmy.weixin4j.qy.test; -import junit.framework.Assert; - import org.junit.Before; import org.junit.Test; -import com.alibaba.fastjson.JSONObject; import com.foxinmy.weixin4j.exception.WeixinException; import com.foxinmy.weixin4j.qy.api.NotifyApi; import com.foxinmy.weixin4j.qy.message.NotifyMessage; +import com.foxinmy.weixin4j.qy.model.IdParameter; import com.foxinmy.weixin4j.tuple.File; import com.foxinmy.weixin4j.tuple.Image; import com.foxinmy.weixin4j.tuple.MpNews; @@ -88,8 +86,8 @@ public class NotifyTest extends TokenTest { @Test public void send1() throws WeixinException { Text text = new Text("this is a text"); - JSONObject result = notifyApi.sendNotifyMessage(new NotifyMessage(1, + IdParameter result = notifyApi.sendNotifyMessage(new NotifyMessage(1, text)); - Assert.assertEquals(0, result.getIntValue("errcode")); + System.err.println(result); } }