weixin4j-qy:新增企业号联系人筛选配置类(JSSDKContactConfigurator)
This commit is contained in:
parent
04339b6496
commit
110619b3c3
11
CHANGE.md
11
CHANGE.md
@ -571,6 +571,10 @@
|
||||
|
||||
+ weixin4j-base:新增JSSDK的config生成类
|
||||
|
||||
+ weixin4j-base:JSSDKHelper 重命名为 JSSDKConfigurator
|
||||
|
||||
+ weixin4j-base:重构了token类
|
||||
|
||||
+ weixin4j-mp:WeixinProxy新增获取appid(getAppId)方法
|
||||
|
||||
+ weixin4j-mp:WeixinProxy新增获取jsticket(getJSTicketHolder)方法
|
||||
@ -584,3 +588,10 @@
|
||||
+ weixin4j-qy:私有化WeixinProxy(TokenHolder)构造器
|
||||
|
||||
+ weixin4j-qy:SuiteApi新增获取Weixinproxy对象(getWeixinProxy)方法
|
||||
|
||||
+ weixin4j-qy:删除WeixinJSTicketCreator类
|
||||
|
||||
+ weixin4j-qy:新增企业号联系人筛选配置类(JSSDKContactConfigurator)
|
||||
|
||||
+ weixin4j-server:DigestUtil 重命名为 DigestUtils
|
||||
|
||||
@ -16,7 +16,7 @@ import com.foxinmy.weixin4j.util.StringUtil;
|
||||
import com.foxinmy.weixin4j.util.Weixin4jConfigUtil;
|
||||
|
||||
/**
|
||||
* JSSDK帮助类
|
||||
* JSSDK配置类
|
||||
*
|
||||
* @className JSSDKConfigurator
|
||||
* @author jy
|
||||
@ -30,7 +30,7 @@ public class JSSDKConfigurator {
|
||||
private Set<JSSDKAPI> apis;
|
||||
|
||||
/**
|
||||
* ticket保存类 可调用WeixinProxy#getJSTicketHolder获取
|
||||
* ticket保存类 可调用WeixinProxy#getTicketHolder获取
|
||||
*
|
||||
* @param ticketTokenHolder
|
||||
*/
|
||||
@ -93,7 +93,7 @@ public class JSSDKConfigurator {
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成config字符串
|
||||
* 生成config配置JSON串
|
||||
*
|
||||
* @param url
|
||||
* 当前网页的URL,不包含#及其后面部分
|
||||
|
||||
@ -160,7 +160,7 @@ public class WeixinProxy {
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取JSSDK的tokenHolder
|
||||
* 获取JSSDK JSTicket的tokenHolder
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
|
||||
@ -40,9 +40,11 @@ import com.foxinmy.weixin4j.qy.model.Party;
|
||||
import com.foxinmy.weixin4j.qy.model.Tag;
|
||||
import com.foxinmy.weixin4j.qy.model.User;
|
||||
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.type.ChatType;
|
||||
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.token.TokenHolder;
|
||||
import com.foxinmy.weixin4j.token.TokenStorager;
|
||||
@ -162,15 +164,15 @@ public class WeixinProxy {
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取JSSDK的tokenHolder
|
||||
* 获取JSSDK Ticket的tokenHolder
|
||||
*
|
||||
* @param ticketType
|
||||
* 票据类型
|
||||
* @return
|
||||
*/
|
||||
public TokenHolder getJSTicketHolder() {
|
||||
return new TokenHolder(
|
||||
new com.foxinmy.weixin4j.qy.token.WeixinJSTicketCreator(
|
||||
this.corpId, this.tokenHolder),
|
||||
this.tokenHolder.getTokenStorager());
|
||||
public TokenHolder getTicketHolder(TicketType ticketType) {
|
||||
return new TokenHolder(new WeixinTicketCreator(this.corpId, ticketType,
|
||||
this.tokenHolder), this.tokenHolder.getTokenStorager());
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
@ -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() + "]";
|
||||
}
|
||||
}
|
||||
@ -48,7 +48,7 @@ public class NotifyMessage implements Serializable {
|
||||
private IdParameter target;
|
||||
|
||||
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,
|
||||
|
||||
@ -25,19 +25,15 @@ public class IdParameter implements Serializable {
|
||||
private static final char SEPARATOR = '|';
|
||||
|
||||
private List<String> userIds;
|
||||
private List<Integer> partyIds;
|
||||
private List<Integer> departmentIds;
|
||||
private List<Integer> tagIds;
|
||||
|
||||
private IdParameter() {
|
||||
public IdParameter() {
|
||||
this.userIds = new ArrayList<String>();
|
||||
this.partyIds = new ArrayList<Integer>();
|
||||
this.departmentIds = new ArrayList<Integer>();
|
||||
this.tagIds = new ArrayList<Integer>();
|
||||
}
|
||||
|
||||
public static IdParameter get() {
|
||||
return new IdParameter();
|
||||
}
|
||||
|
||||
/**
|
||||
* 增加成员ID列表,最多支持1000个
|
||||
*
|
||||
@ -63,22 +59,22 @@ public class IdParameter implements Serializable {
|
||||
/**
|
||||
* 新增部门ID列表,最多支持100个
|
||||
*
|
||||
* @param partyIds
|
||||
* @param departmentIds
|
||||
* @return
|
||||
*/
|
||||
public IdParameter putPartyIds(Integer... partyIds) {
|
||||
this.partyIds.addAll(Arrays.asList(partyIds));
|
||||
public IdParameter putDepartmentIds(Integer... departmentIds) {
|
||||
this.departmentIds.addAll(Arrays.asList(departmentIds));
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置部门ID列表,最多支持100个
|
||||
*
|
||||
* @param partyIds
|
||||
* @param departmentIds
|
||||
* @return
|
||||
*/
|
||||
public IdParameter setPartyIds(List<Integer> partyIds) {
|
||||
this.partyIds = partyIds;
|
||||
public IdParameter setDepartmentIds(List<Integer> departmentIds) {
|
||||
this.departmentIds = departmentIds;
|
||||
return this;
|
||||
}
|
||||
|
||||
@ -114,12 +110,18 @@ public class IdParameter implements Serializable {
|
||||
if (userIds != null && !userIds.isEmpty()) {
|
||||
parameterMap.put("touser", StringUtil.join(userIds, SEPARATOR));
|
||||
}
|
||||
if (partyIds != null && !partyIds.isEmpty()) {
|
||||
parameterMap.put("toparty", StringUtil.join(partyIds, SEPARATOR));
|
||||
if (departmentIds != null && !departmentIds.isEmpty()) {
|
||||
parameterMap.put("toparty", StringUtil.join(departmentIds, SEPARATOR));
|
||||
}
|
||||
if (tagIds != null && !tagIds.isEmpty()) {
|
||||
parameterMap.put("totag", StringUtil.join(tagIds, SEPARATOR));
|
||||
}
|
||||
return parameterMap;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "IdParameter [userIds=" + userIds + ", departmentIds="
|
||||
+ departmentIds + ", tagIds=" + tagIds + "]";
|
||||
}
|
||||
}
|
||||
|
||||
@ -5,50 +5,60 @@ import com.foxinmy.weixin4j.exception.WeixinException;
|
||||
import com.foxinmy.weixin4j.http.weixin.WeixinRequestExecutor;
|
||||
import com.foxinmy.weixin4j.http.weixin.WeixinResponse;
|
||||
import com.foxinmy.weixin4j.model.Token;
|
||||
import com.foxinmy.weixin4j.qy.type.TicketType;
|
||||
import com.foxinmy.weixin4j.qy.type.URLConsts;
|
||||
import com.foxinmy.weixin4j.token.TokenCreator;
|
||||
import com.foxinmy.weixin4j.token.TokenHolder;
|
||||
|
||||
/**
|
||||
* 微信企业号JSTICKET创建
|
||||
* 微信企业号TICKET创建(包括jsticket、其它JSSDK所需的ticket的创建
|
||||
*
|
||||
* @className WeixinJSTicketCreator
|
||||
* @className WeixinTicketCreator
|
||||
* @author jy
|
||||
* @date 2015年1月10日
|
||||
* @date 2015年12月25日
|
||||
* @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 TicketType ticketType;
|
||||
private final TokenHolder weixinTokenHolder;
|
||||
private final WeixinRequestExecutor weixinExecutor;
|
||||
|
||||
/**
|
||||
*
|
||||
* @param corpid
|
||||
* 企业号ID
|
||||
* @param ticketType
|
||||
* 票据类型
|
||||
* @param weixinTokenHolder
|
||||
* <font color="red">企业号的的access_token</font>
|
||||
*/
|
||||
public WeixinJSTicketCreator(String corpid, TokenHolder weixinTokenHolder) {
|
||||
public WeixinTicketCreator(String corpid, TicketType ticketType,
|
||||
TokenHolder weixinTokenHolder) {
|
||||
this.corpid = corpid;
|
||||
this.ticketType = ticketType;
|
||||
this.weixinTokenHolder = weixinTokenHolder;
|
||||
this.weixinExecutor = new WeixinRequestExecutor();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCacheKey() {
|
||||
return String.format("wx_qy_jsticket_%s", corpid);
|
||||
return String.format("wx_qy_ticket_%s_%s", corpid, ticketType.name());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Token createToken() throws WeixinException {
|
||||
WeixinResponse response = weixinExecutor.get(String.format(
|
||||
WeixinResponse response = null;
|
||||
if (ticketType == TicketType.jsticket) {
|
||||
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();
|
||||
Token token = new Token(result.getString("ticket"));
|
||||
token.setExpiresIn(result.getIntValue("expires_in"));
|
||||
@ -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;
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user