weixin4j-qy:新增企业号联系人筛选配置类(JSSDKContactConfigurator)

This commit is contained in:
jinyu 2015-12-25 16:52:34 +08:00
parent 04339b6496
commit 110619b3c3
10 changed files with 400 additions and 39 deletions

View File

@ -571,6 +571,10 @@
+ weixin4j-base:新增JSSDK的config生成类 + weixin4j-base:新增JSSDK的config生成类
+ weixin4j-base:JSSDKHelper 重命名为 JSSDKConfigurator
+ weixin4j-base:重构了token类
+ weixin4j-mp:WeixinProxy新增获取appid(getAppId)方法 + weixin4j-mp:WeixinProxy新增获取appid(getAppId)方法
+ weixin4j-mp:WeixinProxy新增获取jsticket(getJSTicketHolder)方法 + weixin4j-mp:WeixinProxy新增获取jsticket(getJSTicketHolder)方法
@ -584,3 +588,10 @@
+ weixin4j-qy:私有化WeixinProxy(TokenHolder)构造器 + weixin4j-qy:私有化WeixinProxy(TokenHolder)构造器
+ weixin4j-qy:SuiteApi新增获取Weixinproxy对象(getWeixinProxy)方法 + weixin4j-qy:SuiteApi新增获取Weixinproxy对象(getWeixinProxy)方法
+ weixin4j-qy:删除WeixinJSTicketCreator类
+ weixin4j-qy:新增企业号联系人筛选配置类(JSSDKContactConfigurator)
+ weixin4j-server:DigestUtil 重命名为 DigestUtils

View File

@ -16,7 +16,7 @@ import com.foxinmy.weixin4j.util.StringUtil;
import com.foxinmy.weixin4j.util.Weixin4jConfigUtil; import com.foxinmy.weixin4j.util.Weixin4jConfigUtil;
/** /**
* JSSDK帮助 * JSSDK配置
* *
* @className JSSDKConfigurator * @className JSSDKConfigurator
* @author jy * @author jy
@ -30,7 +30,7 @@ public class JSSDKConfigurator {
private Set<JSSDKAPI> apis; private Set<JSSDKAPI> apis;
/** /**
* ticket保存类 可调用WeixinProxy#getJSTicketHolder获取 * ticket保存类 可调用WeixinProxy#getTicketHolder获取
* *
* @param ticketTokenHolder * @param ticketTokenHolder
*/ */
@ -93,7 +93,7 @@ public class JSSDKConfigurator {
} }
/** /**
* 生成config字符 * 生成config配置JSON
* *
* @param url * @param url
* 当前网页的URL不包含#及其后面部分 * 当前网页的URL不包含#及其后面部分

View File

@ -160,7 +160,7 @@ public class WeixinProxy {
} }
/** /**
* 获取JSSDK的tokenHolder * 获取JSSDK JSTicket的tokenHolder
* *
* @return * @return
*/ */

View File

@ -40,9 +40,11 @@ import com.foxinmy.weixin4j.qy.model.Party;
import com.foxinmy.weixin4j.qy.model.Tag; import com.foxinmy.weixin4j.qy.model.Tag;
import com.foxinmy.weixin4j.qy.model.User; import com.foxinmy.weixin4j.qy.model.User;
import com.foxinmy.weixin4j.qy.suite.WeixinTokenSuiteCreator; import com.foxinmy.weixin4j.qy.suite.WeixinTokenSuiteCreator;
import com.foxinmy.weixin4j.qy.token.WeixinTicketCreator;
import com.foxinmy.weixin4j.qy.token.WeixinTokenCreator; import com.foxinmy.weixin4j.qy.token.WeixinTokenCreator;
import com.foxinmy.weixin4j.qy.type.ChatType; import com.foxinmy.weixin4j.qy.type.ChatType;
import com.foxinmy.weixin4j.qy.type.InviteType; import com.foxinmy.weixin4j.qy.type.InviteType;
import com.foxinmy.weixin4j.qy.type.TicketType;
import com.foxinmy.weixin4j.qy.type.UserStatus; import com.foxinmy.weixin4j.qy.type.UserStatus;
import com.foxinmy.weixin4j.token.TokenHolder; import com.foxinmy.weixin4j.token.TokenHolder;
import com.foxinmy.weixin4j.token.TokenStorager; import com.foxinmy.weixin4j.token.TokenStorager;
@ -162,15 +164,15 @@ public class WeixinProxy {
} }
/** /**
* 获取JSSDK的tokenHolder * 获取JSSDK Ticket的tokenHolder
* *
* @param ticketType
* 票据类型
* @return * @return
*/ */
public TokenHolder getJSTicketHolder() { public TokenHolder getTicketHolder(TicketType ticketType) {
return new TokenHolder( return new TokenHolder(new WeixinTicketCreator(this.corpId, ticketType,
new com.foxinmy.weixin4j.qy.token.WeixinJSTicketCreator( this.tokenHolder), this.tokenHolder.getTokenStorager());
this.corpId, this.tokenHolder),
this.tokenHolder.getTokenStorager());
} }
/** /**

View File

@ -0,0 +1,199 @@
package com.foxinmy.weixin4j.qy.jssdk;
import java.util.HashMap;
import java.util.Map;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.model.Token;
import com.foxinmy.weixin4j.token.TokenHolder;
import com.foxinmy.weixin4j.util.DateUtil;
import com.foxinmy.weixin4j.util.DigestUtil;
import com.foxinmy.weixin4j.util.MapUtil;
import com.foxinmy.weixin4j.util.RandomUtil;
/**
* JSSDK联系人筛选配置
*
* @className JSSDKContactConfigurator
* @author jy
* @date 2015年12月25日
* @since JDK 1.7
* @see
*/
public class JSSDKContactConfigurator {
private final TokenHolder ticketTokenHolder;
private JSSDKContactParameter contactParameter;
/**
* ticket保存类 可调用WeixinProxy#getTicketHolder获取
*
* @param ticketTokenHolder
*/
public JSSDKContactConfigurator(TokenHolder ticketTokenHolder) {
this.ticketTokenHolder = ticketTokenHolder;
this.contactParameter = new JSSDKContactParameter();
}
/**
* 可选范围部门ID列表(如果departmentIds为0则表示显示管理组下所有部门)
*
* @param departmentIds
* @return
*/
public JSSDKContactConfigurator departmentIds(Integer... departmentIds) {
contactParameter.putDepartmentIds(departmentIds);
return this;
}
/**
* 可选范围标签ID列表(如果tagIds为0则表示显示所有标签)
*
* @param tagIds
* @return
*/
public JSSDKContactConfigurator tagIds(Integer... tagIds) {
contactParameter.putTagIds(tagIds);
return this;
}
/**
* 可选范围用户ID列表
*
* @param userIds
* @return
*/
public JSSDKContactConfigurator userIds(String... userIds) {
contactParameter.putUserIds(userIds);
return this;
}
/**
* 单选模式
*
* @return
*/
public JSSDKContactConfigurator singleMode() {
contactParameter.setMode("single");
return this;
}
/**
* 多选模式
*
* @return
*/
public JSSDKContactConfigurator multiMode() {
contactParameter.setMode("multi");
return this;
}
/**
* 限制部门
*
* @return
*/
public JSSDKContactConfigurator limitDepartment() {
contactParameter.putLimitType("department");
return this;
}
/**
* 限制标签
*
* @return
*/
public JSSDKContactConfigurator limitTag() {
contactParameter.putLimitType("tag");
return this;
}
/**
* 限制用户
*
* @return
*/
public JSSDKContactConfigurator limitUser() {
contactParameter.putLimitType("user");
return this;
}
/**
* 已选部门ID
*
* @param selectedDepartmentIds
* @return
*/
public JSSDKContactConfigurator selectedDepartmentIds(
Integer... selectedDepartmentIds) {
contactParameter.putSelectedDepartmentIds(selectedDepartmentIds);
return this;
}
/**
* 已选标签ID
*
* @param selectedTagIds
* @return
*/
public JSSDKContactConfigurator selectedTagIds(Integer... selectedTagIds) {
contactParameter.putSelectedTagIds(selectedTagIds);
return this;
}
/**
* 已选用户ID
*
* @param selectedUserIds
* @return
*/
public JSSDKContactConfigurator selectedUserIds(String... selectedUserIds) {
contactParameter.putSelectedUserIds(selectedUserIds);
return this;
}
/**
* 生成config配置JSON串
*
* @param url
* 当前网页的URL不包含#及其后面部分
* @return
* @throws WeixinException
*/
public String toJSONConfig(String url) throws WeixinException {
return toJSONConfig(url, contactParameter);
}
/**
* 生成config配置JSON串
*
* @param url
* 当前网页的URL不包含#及其后面部分
* @param parameter
* 自定义传入参数对象
* @return
* @throws WeixinException
*/
public String toJSONConfig(String url, JSSDKContactParameter parameter)
throws WeixinException {
Map<String, String> signMap = new HashMap<String, String>();
String timestamp = DateUtil.timestamp2string();
String noncestr = RandomUtil.generateString(24);
Token token = this.ticketTokenHolder.getToken();
signMap.put("timestamp", timestamp);
signMap.put("nonceStr", noncestr);
signMap.put("group_ticket", token.getAccessToken());
signMap.put("url", url);
String sign = DigestUtil.SHA1(MapUtil
.toJoinString(signMap, false, true));
JSONObject config = new JSONObject();
config.put("signature", sign);
config.put("groupId", JSON.parseObject(token.getOriginalResult())
.getString("group_id"));
config.put("timestamp", timestamp);
config.put("noncestr", noncestr);
config.put("params", parameter);
return config.toJSONString();
}
}

View File

@ -0,0 +1,116 @@
package com.foxinmy.weixin4j.qy.jssdk;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import com.alibaba.fastjson.annotation.JSONField;
import com.foxinmy.weixin4j.qy.model.IdParameter;
/**
* JSSDK联系人筛选参数
*
* @className JSSDKContactParameter
* @author jy
* @date 2015年12月25日
* @since JDK 1.6
* @see
*/
public class JSSDKContactParameter extends IdParameter {
private static final long serialVersionUID = 1863797419140279996L;
/**
* 选择模式 single/multi
*/
private String mode;
/**
* 选择限制类型 department/tag/user
*/
@JSONField(name = "type")
private List<String> limitTypes;
/**
* 已选用户ID
*/
private List<String> selectedUserIds;
/**
* 已选部门ID
*/
private List<Integer> selectedDepartmentIds;
/**
* 已选标签ID
*/
private List<Integer> selectedTagIds;
public JSSDKContactParameter() {
super();
this.selectedUserIds = new ArrayList<String>();
this.selectedTagIds = new ArrayList<Integer>();
this.selectedDepartmentIds = new ArrayList<Integer>();
this.limitTypes = new ArrayList<String>();
}
public String getMode() {
return mode;
}
public void setMode(String mode) {
this.mode = mode;
}
public List<String> getLimitTypes() {
return limitTypes;
}
public void setLimitTypes(List<String> limitTypes) {
this.limitTypes = limitTypes;
}
public void putLimitType(String type) {
this.limitTypes.add(type);
}
public List<String> getSelectedUserIds() {
return selectedUserIds;
}
public void setSelectedUserIds(List<String> selectedUserIds) {
this.selectedUserIds = selectedUserIds;
}
public void putSelectedUserIds(String... selectedUserIds) {
this.selectedUserIds.addAll(Arrays.asList(selectedUserIds));
}
public List<Integer> getSelectedDepartmentIds() {
return selectedDepartmentIds;
}
public void setSelectedDepartmentIds(List<Integer> selectedDepartmentIds) {
this.selectedDepartmentIds = selectedDepartmentIds;
}
public void putSelectedDepartmentIds(Integer... selectedDepartmentIds) {
this.selectedDepartmentIds.addAll(Arrays.asList(selectedDepartmentIds));
}
public List<Integer> getSelectedTagIds() {
return selectedTagIds;
}
public void setSelectedTagIds(List<Integer> selectedTagIds) {
this.selectedTagIds = selectedTagIds;
}
public void putSelectedTagIds(Integer... selectedTagIds) {
this.selectedTagIds.addAll(Arrays.asList(selectedTagIds));
}
@Override
public String toString() {
return "JSSDKContactParameter [mode=" + mode + ", limitTypes="
+ limitTypes + ", selectedUserIds=" + selectedUserIds
+ ", selectedDepartmentIds=" + selectedDepartmentIds
+ ", selectedTagIds=" + selectedTagIds + ", "
+ super.toString() + "]";
}
}

View File

@ -48,7 +48,7 @@ public class NotifyMessage implements Serializable {
private IdParameter target; private IdParameter target;
public NotifyMessage(int agentid, NotifyTuple tuple) { public NotifyMessage(int agentid, NotifyTuple tuple) {
this(agentid, tuple, IdParameter.get(), false); this(agentid, tuple, new IdParameter(), false);
} }
public NotifyMessage(int agentId, NotifyTuple tuple, IdParameter target, public NotifyMessage(int agentId, NotifyTuple tuple, IdParameter target,

View File

@ -25,19 +25,15 @@ public class IdParameter implements Serializable {
private static final char SEPARATOR = '|'; private static final char SEPARATOR = '|';
private List<String> userIds; private List<String> userIds;
private List<Integer> partyIds; private List<Integer> departmentIds;
private List<Integer> tagIds; private List<Integer> tagIds;
private IdParameter() { public IdParameter() {
this.userIds = new ArrayList<String>(); this.userIds = new ArrayList<String>();
this.partyIds = new ArrayList<Integer>(); this.departmentIds = new ArrayList<Integer>();
this.tagIds = new ArrayList<Integer>(); this.tagIds = new ArrayList<Integer>();
} }
public static IdParameter get() {
return new IdParameter();
}
/** /**
* 增加成员ID列表最多支持1000个 * 增加成员ID列表最多支持1000个
* *
@ -63,22 +59,22 @@ public class IdParameter implements Serializable {
/** /**
* 新增部门ID列表最多支持100个 * 新增部门ID列表最多支持100个
* *
* @param partyIds * @param departmentIds
* @return * @return
*/ */
public IdParameter putPartyIds(Integer... partyIds) { public IdParameter putDepartmentIds(Integer... departmentIds) {
this.partyIds.addAll(Arrays.asList(partyIds)); this.departmentIds.addAll(Arrays.asList(departmentIds));
return this; return this;
} }
/** /**
* 设置部门ID列表最多支持100个 * 设置部门ID列表最多支持100个
* *
* @param partyIds * @param departmentIds
* @return * @return
*/ */
public IdParameter setPartyIds(List<Integer> partyIds) { public IdParameter setDepartmentIds(List<Integer> departmentIds) {
this.partyIds = partyIds; this.departmentIds = departmentIds;
return this; return this;
} }
@ -114,12 +110,18 @@ public class IdParameter implements Serializable {
if (userIds != null && !userIds.isEmpty()) { if (userIds != null && !userIds.isEmpty()) {
parameterMap.put("touser", StringUtil.join(userIds, SEPARATOR)); parameterMap.put("touser", StringUtil.join(userIds, SEPARATOR));
} }
if (partyIds != null && !partyIds.isEmpty()) { if (departmentIds != null && !departmentIds.isEmpty()) {
parameterMap.put("toparty", StringUtil.join(partyIds, SEPARATOR)); parameterMap.put("toparty", StringUtil.join(departmentIds, SEPARATOR));
} }
if (tagIds != null && !tagIds.isEmpty()) { if (tagIds != null && !tagIds.isEmpty()) {
parameterMap.put("totag", StringUtil.join(tagIds, SEPARATOR)); parameterMap.put("totag", StringUtil.join(tagIds, SEPARATOR));
} }
return parameterMap; return parameterMap;
} }
@Override
public String toString() {
return "IdParameter [userIds=" + userIds + ", departmentIds="
+ departmentIds + ", tagIds=" + tagIds + "]";
}
} }

View File

@ -5,50 +5,60 @@ import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.http.weixin.WeixinRequestExecutor; import com.foxinmy.weixin4j.http.weixin.WeixinRequestExecutor;
import com.foxinmy.weixin4j.http.weixin.WeixinResponse; import com.foxinmy.weixin4j.http.weixin.WeixinResponse;
import com.foxinmy.weixin4j.model.Token; import com.foxinmy.weixin4j.model.Token;
import com.foxinmy.weixin4j.qy.type.TicketType;
import com.foxinmy.weixin4j.qy.type.URLConsts; import com.foxinmy.weixin4j.qy.type.URLConsts;
import com.foxinmy.weixin4j.token.TokenCreator; import com.foxinmy.weixin4j.token.TokenCreator;
import com.foxinmy.weixin4j.token.TokenHolder; import com.foxinmy.weixin4j.token.TokenHolder;
/** /**
* 微信企业号JSTICKET创建 * 微信企业号TICKET创建(包括jsticket其它JSSDK所需的ticket的创建
* *
* @className WeixinJSTicketCreator * @className WeixinTicketCreator
* @author jy * @author jy
* @date 2015年1月10 * @date 2015年12月25
* @since JDK 1.6 * @since JDK 1.6
* @see <a *
* href="http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html#.E9.99.84.E5.BD.951-JS-SDK.E4.BD.BF.E7.94.A8.E6.9D.83.E9.99.90.E7.AD.BE.E5.90.8D.E7.AE.97.E6.B3.95">JS
* TICKET</a>
*/ */
public class WeixinJSTicketCreator implements TokenCreator { public class WeixinTicketCreator implements TokenCreator {
private final String corpid; private final String corpid;
private final TicketType ticketType;
private final TokenHolder weixinTokenHolder; private final TokenHolder weixinTokenHolder;
private final WeixinRequestExecutor weixinExecutor; private final WeixinRequestExecutor weixinExecutor;
/** /**
*
* @param corpid * @param corpid
* 企业号ID * 企业号ID
* @param ticketType
* 票据类型
* @param weixinTokenHolder * @param weixinTokenHolder
* <font color="red">企业号的的access_token</font> * <font color="red">企业号的的access_token</font>
*/ */
public WeixinJSTicketCreator(String corpid, TokenHolder weixinTokenHolder) { public WeixinTicketCreator(String corpid, TicketType ticketType,
TokenHolder weixinTokenHolder) {
this.corpid = corpid; this.corpid = corpid;
this.ticketType = ticketType;
this.weixinTokenHolder = weixinTokenHolder; this.weixinTokenHolder = weixinTokenHolder;
this.weixinExecutor = new WeixinRequestExecutor(); this.weixinExecutor = new WeixinRequestExecutor();
} }
@Override @Override
public String getCacheKey() { public String getCacheKey() {
return String.format("wx_qy_jsticket_%s", corpid); return String.format("wx_qy_ticket_%s_%s", corpid, ticketType.name());
} }
@Override @Override
public Token createToken() throws WeixinException { public Token createToken() throws WeixinException {
WeixinResponse response = weixinExecutor.get(String.format( WeixinResponse response = null;
URLConsts.JS_TICKET_URL, weixinTokenHolder.getToken() if (ticketType == TicketType.jsticket) {
.getAccessToken())); response = weixinExecutor.get(String.format(
URLConsts.JS_TICKET_URL, weixinTokenHolder.getToken()
.getAccessToken()));
} else {
response = weixinExecutor.get(String.format(URLConsts.TICKET_URL,
weixinTokenHolder.getToken().getAccessToken(),
ticketType.name()));
}
JSONObject result = response.getAsJson(); JSONObject result = response.getAsJson();
Token token = new Token(result.getString("ticket")); Token token = new Token(result.getString("ticket"));
token.setExpiresIn(result.getIntValue("expires_in")); token.setExpiresIn(result.getIntValue("expires_in"));

View File

@ -0,0 +1,21 @@
package com.foxinmy.weixin4j.qy.type;
/**
* 票据类型
*
* @className TicketType
* @author jy
* @date 2015年12月25日
* @since JDK 1.7
* @see
*/
public enum TicketType {
/**
* jsticket
*/
jsticket,
/**
* 选取联系人
*/
contact;
}