@@ -3,9 +3,12 @@ package com.foxinmy.weixin4j.qy;
|
||||
import java.io.InputStream;
|
||||
import java.util.List;
|
||||
|
||||
import com.foxinmy.weixin4j.cache.CacheStorager;
|
||||
import com.foxinmy.weixin4j.cache.FileCacheStorager;
|
||||
import com.foxinmy.weixin4j.exception.WeixinException;
|
||||
import com.foxinmy.weixin4j.http.weixin.ApiResult;
|
||||
import com.foxinmy.weixin4j.model.Button;
|
||||
import com.foxinmy.weixin4j.model.Token;
|
||||
import com.foxinmy.weixin4j.model.WeixinAccount;
|
||||
import com.foxinmy.weixin4j.model.media.MediaCounter;
|
||||
import com.foxinmy.weixin4j.model.media.MediaDownloadResult;
|
||||
@@ -20,6 +23,7 @@ import com.foxinmy.weixin4j.qy.api.HelperApi;
|
||||
import com.foxinmy.weixin4j.qy.api.MediaApi;
|
||||
import com.foxinmy.weixin4j.qy.api.MenuApi;
|
||||
import com.foxinmy.weixin4j.qy.api.NotifyApi;
|
||||
import com.foxinmy.weixin4j.qy.api.OauthApi;
|
||||
import com.foxinmy.weixin4j.qy.api.PartyApi;
|
||||
import com.foxinmy.weixin4j.qy.api.TagApi;
|
||||
import com.foxinmy.weixin4j.qy.api.UserApi;
|
||||
@@ -45,8 +49,8 @@ import com.foxinmy.weixin4j.qy.type.ChatType;
|
||||
import com.foxinmy.weixin4j.qy.type.InviteType;
|
||||
import com.foxinmy.weixin4j.qy.type.KfType;
|
||||
import com.foxinmy.weixin4j.qy.type.UserStatus;
|
||||
import com.foxinmy.weixin4j.setting.Weixin4jSettings;
|
||||
import com.foxinmy.weixin4j.token.PerTicketManager;
|
||||
import com.foxinmy.weixin4j.token.TokenCreator;
|
||||
import com.foxinmy.weixin4j.token.TokenManager;
|
||||
import com.foxinmy.weixin4j.tuple.MpArticle;
|
||||
import com.foxinmy.weixin4j.type.MediaType;
|
||||
@@ -63,7 +67,10 @@ import com.foxinmy.weixin4j.util.Weixin4jConfigUtil;
|
||||
* @see <a href="http://qydev.weixin.qq.com/wiki/index.php">api文档</a>
|
||||
*/
|
||||
public class WeixinProxy {
|
||||
|
||||
/**
|
||||
* 授权API
|
||||
*/
|
||||
private final OauthApi oauthApi;
|
||||
/**
|
||||
* 媒体素材API
|
||||
*/
|
||||
@@ -105,33 +112,48 @@ public class WeixinProxy {
|
||||
*/
|
||||
private final ChatApi chatApi;
|
||||
/**
|
||||
* token实现
|
||||
* token管理
|
||||
*/
|
||||
private final TokenManager tokenManager;
|
||||
/**
|
||||
* 配置信息
|
||||
* 账号信息
|
||||
*/
|
||||
private Weixin4jSettings<WeixinAccount> settings;
|
||||
private final WeixinAccount weixinAccount;
|
||||
/**
|
||||
* token存储
|
||||
*/
|
||||
private final CacheStorager<Token> cacheStorager;
|
||||
|
||||
/**
|
||||
* 默认使用文件方式保存token、使用weixin4j.properties配置的账号信息
|
||||
* 微信接口实现(使用weixin4j.properties配置的account账号信息,
|
||||
* 使用FileCacheStorager文件方式缓存TOKEN)
|
||||
*/
|
||||
public WeixinProxy() {
|
||||
this(new Weixin4jSettings<WeixinAccount>(
|
||||
Weixin4jConfigUtil.getWeixinAccount()));
|
||||
this(new FileCacheStorager<Token>());
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param settings
|
||||
* 微信配置信息
|
||||
* @see com.foxinmy.weixin4j.setting.Weixin4jSettings
|
||||
* 微信接口实现(使用weixin4j.properties配置的account账号信息)
|
||||
*
|
||||
* @param cacheStorager
|
||||
* token管理
|
||||
*/
|
||||
public WeixinProxy(Weixin4jSettings<WeixinAccount> settings) {
|
||||
this(new TokenManager(new WeixinTokenCreator(settings.getAccount()
|
||||
.getId(), settings.getAccount().getSecret()),
|
||||
settings.getCacheStorager0()));
|
||||
this.settings = settings;
|
||||
public WeixinProxy(CacheStorager<Token> cacheStorager) {
|
||||
this(Weixin4jConfigUtil.getWeixinAccount(), cacheStorager);
|
||||
}
|
||||
|
||||
/**
|
||||
* 微信接口实现
|
||||
*
|
||||
* @param weixinAccount
|
||||
* 账号信息
|
||||
* @param cacheStorager
|
||||
* token管理
|
||||
*/
|
||||
public WeixinProxy(WeixinAccount weixinAccount,
|
||||
CacheStorager<Token> cacheStorager) {
|
||||
this(weixinAccount, new WeixinTokenCreator(weixinAccount.getId(),
|
||||
weixinAccount.getSecret()), cacheStorager);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -148,21 +170,37 @@ public class WeixinProxy {
|
||||
*/
|
||||
public WeixinProxy(PerTicketManager perTicketManager,
|
||||
TokenManager suiteTokenManager) {
|
||||
this(new TokenManager(new WeixinTokenSuiteCreator(perTicketManager,
|
||||
suiteTokenManager), perTicketManager.getCacheStorager()));
|
||||
this.settings = new Weixin4jSettings<WeixinAccount>(new WeixinAccount(
|
||||
perTicketManager.getAuthAppId(), null));
|
||||
this(
|
||||
new WeixinAccount(perTicketManager.getThirdId(),
|
||||
perTicketManager.getThirdSecret()),
|
||||
new WeixinTokenSuiteCreator(perTicketManager, suiteTokenManager),
|
||||
perTicketManager.getCacheStorager());
|
||||
}
|
||||
|
||||
/**
|
||||
* 注意:TokenCreator 需为 <font
|
||||
* color="red">WeixinTokenCreator或WeixinTokenSuiteCreator</font>
|
||||
*
|
||||
* @see com.foxinmy.weixin4j.qy.token.WeixinTokenCreator
|
||||
* 微信接口实现
|
||||
*
|
||||
* @param settings
|
||||
* 配置信息
|
||||
* @param tokenManager
|
||||
* token管理
|
||||
*/
|
||||
private WeixinProxy(TokenManager tokenManager) {
|
||||
this.tokenManager = tokenManager;
|
||||
private WeixinProxy(WeixinAccount weixinAccount, TokenCreator tokenCreator,
|
||||
CacheStorager<Token> cacheStorager) {
|
||||
if (weixinAccount == null) {
|
||||
throw new IllegalArgumentException("settings must not be empty");
|
||||
}
|
||||
if (tokenCreator == null) {
|
||||
throw new IllegalArgumentException("tokenCreator must not be empty");
|
||||
}
|
||||
if (cacheStorager == null) {
|
||||
throw new IllegalArgumentException(
|
||||
"cacheStorager must not be empty");
|
||||
}
|
||||
this.tokenManager = new TokenManager(tokenCreator, cacheStorager);
|
||||
this.weixinAccount = weixinAccount;
|
||||
this.cacheStorager = cacheStorager;
|
||||
this.oauthApi = new OauthApi(weixinAccount);
|
||||
this.partyApi = new PartyApi(tokenManager);
|
||||
this.userApi = new UserApi(tokenManager);
|
||||
this.tagApi = new TagApi(tokenManager);
|
||||
@@ -184,13 +222,23 @@ public class WeixinProxy {
|
||||
return this.tokenManager;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取oauth授权API
|
||||
*
|
||||
* @see com.foxinmy.weixin4j.qy.api.OauthApi
|
||||
* @return
|
||||
*/
|
||||
public OauthApi getOauthApi() {
|
||||
return oauthApi;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取微信账号信息
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public WeixinAccount getWeixinAccount() {
|
||||
return this.settings.getAccount();
|
||||
return weixinAccount;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -201,9 +249,8 @@ public class WeixinProxy {
|
||||
* @return
|
||||
*/
|
||||
public TokenManager getTicketManager(TicketType ticketType) {
|
||||
return new TokenManager(new WeixinTicketCreator(getWeixinAccount()
|
||||
.getId(), ticketType, this.tokenManager),
|
||||
this.settings.getCacheStorager0());
|
||||
return new TokenManager(new WeixinTicketCreator(weixinAccount.getId(),
|
||||
ticketType, this.tokenManager), cacheStorager);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -769,11 +816,11 @@ public class WeixinProxy {
|
||||
* 获取部门成员
|
||||
*
|
||||
* @param partyId
|
||||
* 部门ID 必须
|
||||
* 部门ID
|
||||
* @param fetchChild
|
||||
* 是否递归获取子部门下面的成员 非必须
|
||||
* 是否递归获取子部门下面的成员
|
||||
* @param userStatus
|
||||
* 成员状态 status可叠加 非必须 未填写则默认为未关注(4)
|
||||
* 成员状态 status可叠加 未填写则默认为未关注(4)
|
||||
* @param findDetail
|
||||
* 是否获取详细信息
|
||||
* @see com.foxinmy.weixin4j.qy.model.User
|
||||
@@ -789,6 +836,21 @@ public class WeixinProxy {
|
||||
return userApi.listUser(partyId, fetchChild, userStatus, findDetail);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取权限范围内的所有成员列表
|
||||
*
|
||||
* @param userStatus
|
||||
* 成员状态 未填写则默认为全部状态下的成员
|
||||
* @return 成员列表
|
||||
* @see com.foxinmy.weixin4j.qy.api.UserApi
|
||||
* @see {@link #listUser(int, boolean, UserStatus,boolean)}
|
||||
* @see {@link PartyApi#listParty(int)}
|
||||
* @throws WeixinException
|
||||
*/
|
||||
public List<User> listAllUser(UserStatus userStatus) throws WeixinException {
|
||||
return userApi.listAllUser(userStatus);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取部门下所有状态成员(不进行递归)
|
||||
*
|
||||
|
||||
@@ -7,6 +7,8 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.foxinmy.weixin4j.cache.CacheStorager;
|
||||
import com.foxinmy.weixin4j.cache.FileCacheStorager;
|
||||
import com.foxinmy.weixin4j.exception.WeixinException;
|
||||
import com.foxinmy.weixin4j.model.Token;
|
||||
import com.foxinmy.weixin4j.model.WeixinAccount;
|
||||
@@ -17,7 +19,6 @@ import com.foxinmy.weixin4j.qy.model.WeixinQyAccount;
|
||||
import com.foxinmy.weixin4j.qy.token.WeixinProviderTokenCreator;
|
||||
import com.foxinmy.weixin4j.qy.type.LoginTargetType;
|
||||
import com.foxinmy.weixin4j.qy.type.URLConsts;
|
||||
import com.foxinmy.weixin4j.setting.Weixin4jSettings;
|
||||
import com.foxinmy.weixin4j.token.TicketManager;
|
||||
import com.foxinmy.weixin4j.token.TokenManager;
|
||||
import com.foxinmy.weixin4j.util.Consts;
|
||||
@@ -47,40 +48,65 @@ public class WeixinSuiteProxy {
|
||||
*/
|
||||
private ProviderApi providerApi;
|
||||
/**
|
||||
* 配置相关
|
||||
* 企业号账号信息
|
||||
*/
|
||||
private final Weixin4jSettings<WeixinQyAccount> settings;
|
||||
private final WeixinQyAccount weixinQyAccount;
|
||||
|
||||
/**
|
||||
* 默认使用文件方式保存token、使用weixin4j.properties配置的账号信息
|
||||
* 微信第三方套件接口实现(使用weixin4j.properties配置的account账号信息,
|
||||
* 使用FileCacheStorager文件方式缓存TOKEN)
|
||||
*/
|
||||
public WeixinSuiteProxy() {
|
||||
this(new Weixin4jSettings<WeixinQyAccount>(
|
||||
JSON.parseObject(Weixin4jConfigUtil.getValue("account"), WeixinQyAccount.class)));
|
||||
this(new FileCacheStorager<Token>());
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param settings
|
||||
* 配置信息
|
||||
* 微信第三方套件接口实现(使用weixin4j.properties配置的account账号信息)
|
||||
*
|
||||
* @param cacheStorager
|
||||
* token管理
|
||||
*/
|
||||
public WeixinSuiteProxy(Weixin4jSettings<WeixinQyAccount> settings) {
|
||||
this.settings = settings;
|
||||
List<WeixinAccount> suites = settings.getAccount().getSuites();
|
||||
public WeixinSuiteProxy(CacheStorager<Token> cacheStorager) {
|
||||
this(JSON.parseObject(Weixin4jConfigUtil.getValue("account"),
|
||||
WeixinQyAccount.class), cacheStorager);
|
||||
}
|
||||
|
||||
/**
|
||||
* 微信第三方套件接口实现
|
||||
*
|
||||
* @param weixinQyAccount
|
||||
* 账号信息
|
||||
* @param cacheStorager
|
||||
* token管理
|
||||
*/
|
||||
public WeixinSuiteProxy(WeixinQyAccount weixinQyAccount,
|
||||
CacheStorager<Token> cacheStorager) {
|
||||
if (weixinQyAccount == null) {
|
||||
throw new IllegalArgumentException(
|
||||
"weixinQyAccount must not be empty");
|
||||
}
|
||||
if (cacheStorager == null) {
|
||||
throw new IllegalArgumentException(
|
||||
"cacheStorager must not be empty");
|
||||
}
|
||||
this.weixinQyAccount = weixinQyAccount;
|
||||
List<WeixinAccount> suites = weixinQyAccount.getSuites();
|
||||
if (suites != null && !suites.isEmpty()) {
|
||||
this.suiteMap = new HashMap<String, SuiteApi>(suites.size());
|
||||
for (WeixinAccount suite : suites) {
|
||||
this.suiteMap.put(suite.getId(), new SuiteApi(
|
||||
new TicketManager(suite.getId(), suite.getSecret(), settings.getCacheStorager0())));
|
||||
new TicketManager(suite.getId(), suite.getSecret(),
|
||||
cacheStorager)));
|
||||
}
|
||||
this.suiteMap.put(null, suiteMap.get(suites.get(0).getId()));
|
||||
}
|
||||
if (StringUtil.isNotBlank(settings.getAccount().getId())
|
||||
&& StringUtil.isNotBlank(settings.getAccount().getProviderSecret())) {
|
||||
if (StringUtil.isNotBlank(weixinQyAccount.getId())
|
||||
&& StringUtil.isNotBlank(weixinQyAccount.getProviderSecret())) {
|
||||
this.providerApi = new ProviderApi(
|
||||
new TokenManager(new WeixinProviderTokenCreator(settings.getAccount().getId(),
|
||||
settings.getAccount().getProviderSecret()), settings.getCacheStorager0()),
|
||||
settings.getCacheStorager0());
|
||||
new TokenManager(new WeixinProviderTokenCreator(
|
||||
weixinQyAccount.getId(), weixinQyAccount
|
||||
.getProviderSecret()), cacheStorager),
|
||||
cacheStorager);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -89,8 +115,8 @@ public class WeixinSuiteProxy {
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public WeixinQyAccount getWeixinAccount() {
|
||||
return this.settings.getAccount();
|
||||
public WeixinQyAccount getWeixinQyAccount() {
|
||||
return weixinQyAccount;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -121,17 +147,19 @@ public class WeixinSuiteProxy {
|
||||
* @param suiteId
|
||||
* 套件ID
|
||||
* @return 预授权码
|
||||
* @see #cacheSuiteTicket(String, String)
|
||||
* @see com.foxinmy.weixin4j.qy.api.SuiteApi
|
||||
* @see com.foxinmy.weixin4j.qy.api.SuiteApi#getTicketManager()
|
||||
* @see com.foxinmy.weixin4j.qy.api.SuiteApi#getPreCodeManager()
|
||||
* @throws WeixinException
|
||||
*/
|
||||
public String getPreSuiteTicket(String suiteId) throws WeixinException {
|
||||
Token token = suite(suiteId).getTicketManager().getTicket();
|
||||
SuiteApi suite = suite(suiteId);
|
||||
Token token = suite.getTicketManager().getTicket();
|
||||
if (token == null || StringUtil.isBlank(token.getAccessToken())) {
|
||||
throw new WeixinException("maybe oauth first?");
|
||||
}
|
||||
return token.getAccessToken();
|
||||
return suite.getPreCodeManager().getAccessToken();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -146,27 +174,33 @@ public class WeixinSuiteProxy {
|
||||
* 推送suite_ticket协议</a>
|
||||
* @throws WeixinException
|
||||
*/
|
||||
public void cacheSuiteTicket(String suiteId, String suiteTicket) throws WeixinException {
|
||||
public void cacheSuiteTicket(String suiteId, String suiteTicket)
|
||||
throws WeixinException {
|
||||
suite(suiteId).getTicketManager().cachingTicket(suiteTicket);
|
||||
}
|
||||
|
||||
/**
|
||||
* 应用套件授权 <font color="red">需先缓存ticket</font>
|
||||
*
|
||||
* @see {@link #getSuiteAuthorizeURL(String, String,String)}
|
||||
* 应用套件授权 <font color="red">需先缓存ticket</font> <li>
|
||||
* redirectUri默认填写weixin4j.properties#suite.oauth.redirect.uri <li>
|
||||
* state默认填写state
|
||||
*
|
||||
* @param suiteId
|
||||
* 套件ID
|
||||
* @see {@link #cacheSuiteTicket(String, String)}
|
||||
* @see {@link #getSuiteAuthorizationURL(String, String,String)}
|
||||
* @return 请求授权的URL
|
||||
* @throws WeixinException
|
||||
*/
|
||||
public String getSuiteAuthorizeURL(String suiteId) throws WeixinException {
|
||||
String redirectUri = Weixin4jConfigUtil.getValue("suite.oauth.redirect.uri");
|
||||
return getSuiteAuthorizeURL(suiteId, redirectUri, "state");
|
||||
public String getSuiteAuthorizationURL(String suiteId)
|
||||
throws WeixinException {
|
||||
String redirectUri = Weixin4jConfigUtil
|
||||
.getValue("suite.oauth.redirect.uri");
|
||||
return getSuiteAuthorizationURL(suiteId, redirectUri, "state");
|
||||
}
|
||||
|
||||
/**
|
||||
* 应用套件授权 <font color="red">需先缓存ticket</font>
|
||||
* 应用套件授权 <font
|
||||
* color="red">需先缓存ticket,在授权完成之后需要调用SuiteApi#exchangeAuthInfo方法
|
||||
* ,否则无法缓存token相关导致后续的组件接口调用失败</font>
|
||||
*
|
||||
* @param suiteId
|
||||
* 套件ID
|
||||
@@ -174,16 +208,22 @@ public class WeixinSuiteProxy {
|
||||
* 授权后重定向url
|
||||
* @param state
|
||||
* 回调后原样返回
|
||||
* @see #cacheSuiteTicket(String, String)
|
||||
* @see com.foxinmy.weixin4j.qy.api.SuiteApi
|
||||
* @see com.foxinmy.weixin4j.qy.api.SuiteApi#getTicketManager()
|
||||
* @see com.foxinmy.weixin4j.qy.api.SuiteApi#getPreCodeManager()
|
||||
* @see com.foxinmy.weixin4j.qy.api.SuiteApi#exchangeAuthInfo(String)
|
||||
* @see <a href="http://qydev.weixin.qq.com/wiki/index.php?title
|
||||
* =%E4%BC%81%E4%B8%9A%E5%8F%B7%E7%AE%A1%E7%90%86%E5%91%98%E6%
|
||||
* 8E%88%E6%9D%83%E5%BA%94%E7%94%A8">企业号第三方应用套件授权</a>
|
||||
* @see {@link SuiteApi#getPreCodeManager}
|
||||
* @return 请求授权的URL
|
||||
* @throws WeixinException
|
||||
*/
|
||||
public String getSuiteAuthorizeURL(String suiteId, String redirectUri, String state) throws WeixinException {
|
||||
public String getSuiteAuthorizationURL(String suiteId, String redirectUri,
|
||||
String state) throws WeixinException {
|
||||
try {
|
||||
return String.format(URLConsts.SUITE_OAUTH_URL, suiteId, getPreSuiteTicket(suiteId),
|
||||
return String.format(URLConsts.SUITE_OAUTH_URL, suiteId,
|
||||
getPreSuiteTicket(suiteId),
|
||||
URLEncoder.encode(redirectUri, Consts.UTF_8.name()), state);
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
;
|
||||
@@ -225,7 +265,8 @@ public class WeixinSuiteProxy {
|
||||
* 获取登录企业号官网的url</a>
|
||||
* @throws WeixinException
|
||||
*/
|
||||
public String getLoginUrl(String corpId, LoginTargetType targetType, int agentId) throws WeixinException {
|
||||
public String getLoginUrl(String corpId, LoginTargetType targetType,
|
||||
int agentId) throws WeixinException {
|
||||
return providerApi.getLoginUrl(corpId, targetType, agentId);
|
||||
}
|
||||
|
||||
@@ -240,7 +281,8 @@ public class WeixinSuiteProxy {
|
||||
* @return
|
||||
*/
|
||||
public WeixinProxy getWeixinProxy(String suiteId, String authCorpId) {
|
||||
return new WeixinProxy(suite(suiteId).getPerTicketManager(authCorpId), suite(suiteId).getTokenManager());
|
||||
return new WeixinProxy(suite(suiteId).getPerTicketManager(authCorpId),
|
||||
suite(suiteId).getTokenManager());
|
||||
}
|
||||
|
||||
public final static String VERSION = "1.7.1";
|
||||
|
||||
@@ -44,33 +44,34 @@ public class OauthApi extends QyApi {
|
||||
}
|
||||
|
||||
/**
|
||||
* 企业号用户身份授权:重定向URL使用weixin4j.properties#user.oauth.redirect.uri
|
||||
*
|
||||
* @see {@link #getUserAuthorizeURL(String,String)}
|
||||
* 企业号成员身份授权<li>
|
||||
* redirectUri默认填写weixin4j.properties#user.oauth.redirect.uri <li>
|
||||
* state默认填写state
|
||||
*
|
||||
* @see {@link #getUserAuthorizationURL(String,String)}
|
||||
*
|
||||
* @return 请求授权的URL
|
||||
*/
|
||||
public String getUserAuthorizeURL() {
|
||||
public String getUserAuthorizationURL() {
|
||||
String redirectUri = Weixin4jConfigUtil
|
||||
.getValue("user.oauth.redirect.uri");
|
||||
return getUserAuthorizeURL(redirectUri, "state");
|
||||
return getUserAuthorizationURL(redirectUri, "state");
|
||||
}
|
||||
|
||||
/**
|
||||
* 企业号用户身份授权
|
||||
* 企业号成员身份授权
|
||||
*
|
||||
* @param redirectUri
|
||||
* 重定向地址
|
||||
* @param state
|
||||
* 用于保持请求和回调的状态
|
||||
* @return 请求授权的URL
|
||||
* @see UserApi
|
||||
* @see {@link com.foxinmy.weixin4j.qy.WeixinProxy#getUserByCode(String)}
|
||||
* @see UserApi#getOUserInfoByCode(String, String)
|
||||
* @see <a href=
|
||||
* "http://qydev.weixin.qq.com/wiki/index.php?title=%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81">
|
||||
* 企业号用户身份授权</a>
|
||||
*/
|
||||
public String getUserAuthorizeURL(String redirectUri, String state) {
|
||||
public String getUserAuthorizationURL(String redirectUri, String state) {
|
||||
String oauth_uri = getRequestUri("user_oauth_uri");
|
||||
try {
|
||||
return String.format(oauth_uri, account.getId(),
|
||||
@@ -82,20 +83,22 @@ public class OauthApi extends QyApi {
|
||||
}
|
||||
|
||||
/**
|
||||
* 企业号第三方提供商授权:重定向URL使用weixin4j.properties#third.oauth.redirect.uri
|
||||
* 企业号第三方提供商登陆授权<li>
|
||||
* redirectUri默认填写weixin4j.properties#third.oauth.redirect.uri <li>
|
||||
* state默认填写state
|
||||
*
|
||||
* @see {@link #getThirdAuthorizeURL(String,String)}
|
||||
* @see {@link #getThirdAuthorizationURL(String,String)}
|
||||
*
|
||||
* @return 请求授权的URL
|
||||
*/
|
||||
public String getThirdAuthorizeURL() {
|
||||
public String getThirdAuthorizationURL() {
|
||||
String redirectUri = Weixin4jConfigUtil
|
||||
.getValue("third.oauth.redirect.uri");
|
||||
return getThirdAuthorizeURL(redirectUri, "state");
|
||||
return getThirdAuthorizationURL(redirectUri, "state");
|
||||
}
|
||||
|
||||
/**
|
||||
* 企业号登陆授权
|
||||
* 企业号第三方提供商登陆授权
|
||||
*
|
||||
* @param corpId
|
||||
* 企业号(提供商)的corpid
|
||||
@@ -104,13 +107,12 @@ public class OauthApi extends QyApi {
|
||||
* @param state
|
||||
* 用于保持请求和回调的状态,授权请求后原样带回给第三方
|
||||
* @return 请求授权的URL
|
||||
* @see ProviderApi
|
||||
* @see {@link com.foxinmy.weixin4j.qy.WeixinSuiteProxy#getOUserInfoByCode(String)}
|
||||
* @see ProviderApi#getOUserInfoByCode(String)
|
||||
* @see <a href=
|
||||
* "http://qydev.weixin.qq.com/wiki/index.php?title=%E6%88%90%E5%91%98%E7%99%BB%E5%BD%95%E6%8E%88%E6%9D%83">
|
||||
* 企业号第三方提供商授权</a>
|
||||
*/
|
||||
public String getThirdAuthorizeURL(String redirectUri, String state) {
|
||||
public String getThirdAuthorizationURL(String redirectUri, String state) {
|
||||
String oauth_uri = getRequestUri("provider_oauth_uri");
|
||||
try {
|
||||
return String.format(oauth_uri, account.getId(),
|
||||
|
||||
@@ -12,6 +12,7 @@ import com.foxinmy.weixin4j.http.weixin.ApiResult;
|
||||
import com.foxinmy.weixin4j.http.weixin.WeixinResponse;
|
||||
import com.foxinmy.weixin4j.model.Token;
|
||||
import com.foxinmy.weixin4j.qy.model.OUserInfo;
|
||||
import com.foxinmy.weixin4j.qy.model.Party;
|
||||
import com.foxinmy.weixin4j.qy.model.User;
|
||||
import com.foxinmy.weixin4j.qy.type.InviteType;
|
||||
import com.foxinmy.weixin4j.qy.type.UserStatus;
|
||||
@@ -33,11 +34,13 @@ import com.foxinmy.weixin4j.util.StringUtil;
|
||||
*/
|
||||
public class UserApi extends QyApi {
|
||||
private final MediaApi mediaApi;
|
||||
private final PartyApi partyApi;
|
||||
private final TokenManager tokenManager;
|
||||
|
||||
public UserApi(TokenManager tokenManager) {
|
||||
this.tokenManager = tokenManager;
|
||||
this.mediaApi = new MediaApi(tokenManager);
|
||||
this.partyApi = new PartyApi(tokenManager);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -243,11 +246,11 @@ public class UserApi extends QyApi {
|
||||
* 获取部门成员
|
||||
*
|
||||
* @param partyId
|
||||
* 部门ID 必须
|
||||
* 部门ID
|
||||
* @param fetchChild
|
||||
* 是否递归获取子部门下面的成员 非必须
|
||||
* 是否递归获取子部门下面的成员
|
||||
* @param userStatus
|
||||
* 成员状态 status可叠加 非必须 未填写则默认为未关注(4)
|
||||
* 成员状态 status可叠加 未填写则默认为未关注(4)
|
||||
* @param findDetail
|
||||
* 是否获取详细信息
|
||||
* @see com.foxinmy.weixin4j.qy.model.User
|
||||
@@ -303,6 +306,31 @@ public class UserApi extends QyApi {
|
||||
return listUser(partyId, false, UserStatus.BOTH, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取权限范围内的所有成员列表
|
||||
*
|
||||
* @param userStatus
|
||||
* 成员状态 未填写则默认为全部状态下的成员
|
||||
* @return 成员列表
|
||||
* @see {@link #listUser(int, boolean, UserStatus,boolean)}
|
||||
* @see {@link PartyApi#listParty(int)}
|
||||
* @throws WeixinException
|
||||
*/
|
||||
public List<User> listAllUser(UserStatus userStatus) throws WeixinException {
|
||||
List<User> users = null;
|
||||
List<Party> parties = partyApi.listParty(0);
|
||||
if (!parties.isEmpty()) {
|
||||
if (userStatus == null) {
|
||||
userStatus = UserStatus.BOTH;
|
||||
}
|
||||
users = new ArrayList<User>();
|
||||
for (Party party : parties) {
|
||||
users.addAll(listUser(party.getId(), true, userStatus, true));
|
||||
}
|
||||
}
|
||||
return users;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除成员
|
||||
*
|
||||
|
||||
@@ -230,6 +230,31 @@ public class User implements Serializable {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
result = prime * result + ((userId == null) ? 0 : userId.hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj)
|
||||
return true;
|
||||
if (obj == null)
|
||||
return false;
|
||||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
User other = (User) obj;
|
||||
if (userId == null) {
|
||||
if (other.userId != null)
|
||||
return false;
|
||||
} else if (!userId.equals(other.userId))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "User [userId=" + userId + ", name=" + name + ", partyIds="
|
||||
|
||||
@@ -60,6 +60,7 @@ public class WeixinTicketCreator extends TokenCreator {
|
||||
}
|
||||
JSONObject result = response.getAsJson();
|
||||
return new Token(result.getString("ticket"),
|
||||
result.getLong("expires_in") * 1000l);
|
||||
result.getLong("expires_in") * 1000l).pushExtra("group_id",
|
||||
result.getString("group_id"));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,29 +1,23 @@
|
||||
# weixin4j\u7684\u914d\u7f6e\u6587\u4ef6:\u5982\u679c\u6ca1\u6709\u8bf7\u6784\u9020\u76f8\u5e94\u53c2\u6570\u4f20\u5165 \u5982\u679c\u6709\u8bf7\u4fdd\u8bc1\u5728classpath\u7684\u6839\u76ee\u5f55\u4e0b
|
||||
|
||||
# \u4f01\u4e1a\u53f7\u4fe1\u606f \u8bf7\u6309\u9700\u586b\u5199
|
||||
weixin4j.account={"id":"wx5132afc5da26d661","secret":"GsnKLVDI1pWArdB60Ze4iP2cwFvcW5KCAs2vLJldipilmSYxtbkcAiBcGSHHvu_I",\
|
||||
weixin4j.account={"id":"wxb4a36f8a248475e9","secret":"iZ4Bk1gQN5S9lNoECH57krBwXgcN0fQk6wuPN2cE1talXQmjRT5UcKBpz-YHPRnI",\
|
||||
"suites":[{"id":"\u5e94\u7528\u5957\u4ef6\u7684id","secret":"\u5e94\u7528\u5957\u4ef6\u7684secret"}],\
|
||||
"providerSecret":"\u7b2c\u4e09\u65b9\u63d0\u4f9b\u5546secret(\u4f01\u4e1a\u53f7\u767b\u9646)",\
|
||||
"chatSecret":"\u6d88\u606f\u670d\u52a1secret(\u4f01\u4e1a\u53f7\u6d88\u606f\u670d\u52a1,\u6682\u65f6\u6ca1\u7528\u5230)",\
|
||||
"mchId":"\u5fae\u4fe1\u5546\u6237\u53f7 \u5fae\u4fe1\u652f\u4ed8\u65f6\u9700\u8981\u586b\u5165",\
|
||||
"certificateKey":"\u52a0\u8f7d\u652f\u4ed8\u8bc1\u4e66\u6587\u4ef6\u7684\u5bc6\u7801 \u5982\u679c\u4e0d\u586b\u5199\u5219\u9ed8\u8ba4\u83b7\u53d6mchId\u4f5c\u4e3a\u5bc6\u7801",\
|
||||
"certificateFile":"\u5fae\u4fe1\u652f\u4ed8\u67d0\u4e9b\u63a5\u53e3(\u9000\u6b3e\u7b49)\u9700\u8981\u7684ca\u8bc1\u4e66\u5b58\u653e\u7684\u8def\u5f84,classpath\u8def\u5f84\u4e0b\u53ef\u4ee5\u8fd9\u4e48\u5199classpath:xxxxx.p12,\u4e3a\u7a7a\u65f6\u5219\u83b7\u53d6classpath\u6839\u76ee\u5f55\u4e0b\u7684ca.p12\u6587\u4ef6",\
|
||||
"paySignKey":"\u5fae\u4fe1\u652f\u4ed8\u4e2d\u8c03\u7528API\u7684\u5bc6\u94a5 \u5fae\u4fe1\u652f\u4ed8\u65f6\u9700\u8981\u586b\u5165"}
|
||||
|
||||
# weixin4j\u7684\u4e34\u65f6\u76ee\u5f55
|
||||
# \u53ef\u80fd\u5b58\u653etoken\u6587\u4ef6\u3001\u4e8c\u7ef4\u7801\u6587\u4ef6\u3001\u5a92\u4f53\u6587\u4ef6\u3001\u5bf9\u8d26\u5355\u6587\u4ef6\u7b49
|
||||
# \u4e3a\u7a7a\u65f6\u5219\u83b7\u53d6java.io.tmpdir\u4e34\u65f6\u76ee\u5f55
|
||||
weixin4j.tmpdir=
|
||||
# \u5fae\u4fe1\u652f\u4ed8\u67d0\u4e9b\u63a5\u53e3\u9700\u8981\u7684ca\u8bc1\u4e66\u5b58\u653e\u7684\u5b8c\u6574\u8def\u5f84
|
||||
# classpath\u8def\u5f84\u4e0b\u53ef\u4ee5\u8fd9\u4e48\u5199
|
||||
# weixin4j.certificate.file=classpath:xxxxx.p12
|
||||
# \u4e3a\u7a7a\u65f6\u5219\u83b7\u53d6classpath\u6839\u76ee\u5f55\u4e0b\u7684ca.p12\u6587\u4ef6
|
||||
weixin4j.certificate.file=/tmp/weixin4j/xxxxx.p12
|
||||
|
||||
# \u4f01\u4e1a\u53f7\u7528\u6237\u8eab\u4efd\u6388\u6743\u540e\u91cd\u5b9a\u5411\u7684url(\u5728\u4f7f\u7528OauthApi\u65f6\u586b\u5199)
|
||||
# \u4f01\u4e1a\u53f7\u6210\u5458\u8eab\u4efd\u6388\u6743\u91cd\u5b9a\u5411\u7684url(\u5728\u4f7f\u7528OauthApi\u65f6\u586b\u5199,\u4e5f\u53ef\u81ea\u5b9a\u4e49\u4f20\u5165)
|
||||
# \u8be6\u89c1\uff1ahttp://qydev.weixin.qq.com/wiki/index.php?title=%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81
|
||||
weixin4j.user.oauth.redirect.uri=
|
||||
|
||||
# \u4f01\u4e1a\u53f7\u7b2c\u4e09\u65b9\u63d0\u4f9b\u5546\u6388\u6743\u540e\u91cd\u5b9a\u5411\u7684url(\u5728\u4f7f\u7528OauthApi\u65f6\u586b\u5199)
|
||||
# \u4f01\u4e1a\u53f7\u7b2c\u4e09\u65b9\u63d0\u4f9b\u5546\u6388\u6743\u91cd\u5b9a\u5411\u7684url(\u5728\u4f7f\u7528OauthApi\u65f6\u586b\u5199,\u4e5f\u53ef\u81ea\u5b9a\u4e49\u4f20\u5165)
|
||||
# \u8be6\u89c1\uff1ahttp://qydev.weixin.qq.com/wiki/index.php?title=%E6%88%90%E5%91%98%E7%99%BB%E5%BD%95%E6%8E%88%E6%9D%83
|
||||
weixin4j.third.oauth.redirect.uri=
|
||||
|
||||
# \u4f01\u4e1a\u53f7\u7b2c\u4e09\u65b9\u5e94\u7528\u5957\u4ef6\u6388\u6743\u540e\u91cd\u5b9a\u5411\u7684url(\u5728\u4f7f\u7528SuiteApi\u65f6\u586b\u5199)
|
||||
# \u4f01\u4e1a\u53f7\u7b2c\u4e09\u65b9\u5e94\u7528\u5957\u4ef6\u6388\u6743\u91cd\u5b9a\u5411\u7684url(\u5728\u4f7f\u7528SuiteApi\u65f6\u586b\u5199,\u4e5f\u53ef\u81ea\u5b9a\u4e49\u4f20\u5165)
|
||||
# \u8be6\u89c1\uff1ahttp://qydev.weixin.qq.com/wiki/index.php?title=%E4%BC%81%E4%B8%9A%E5%8F%B7%E7%AE%A1%E7%90%86%E5%91%98%E6%8E%88%E6%9D%83%E5%BA%94%E7%94%A8
|
||||
weixin4j.suite.oauth.redirect.uri=
|
||||
@@ -4,10 +4,11 @@ import org.junit.Assert;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.foxinmy.weixin4j.cache.FileCacheStorager;
|
||||
import com.foxinmy.weixin4j.exception.WeixinException;
|
||||
import com.foxinmy.weixin4j.model.Token;
|
||||
import com.foxinmy.weixin4j.model.WeixinAccount;
|
||||
import com.foxinmy.weixin4j.qy.token.WeixinTokenCreator;
|
||||
import com.foxinmy.weixin4j.setting.Weixin4jSettings;
|
||||
import com.foxinmy.weixin4j.token.TokenManager;
|
||||
import com.foxinmy.weixin4j.util.Weixin4jConfigUtil;
|
||||
|
||||
@@ -22,15 +23,14 @@ import com.foxinmy.weixin4j.util.Weixin4jConfigUtil;
|
||||
public class TokenTest {
|
||||
|
||||
protected TokenManager tokenManager;
|
||||
protected Weixin4jSettings<WeixinAccount> settings;
|
||||
protected WeixinAccount weixinAccount;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
this.settings = new Weixin4jSettings<WeixinAccount>(
|
||||
Weixin4jConfigUtil.getWeixinAccount());
|
||||
tokenManager = new TokenManager(new WeixinTokenCreator(settings
|
||||
.getAccount().getId(), settings.getAccount().getSecret()),
|
||||
settings.getCacheStorager0());
|
||||
weixinAccount = Weixin4jConfigUtil.getWeixinAccount();
|
||||
tokenManager = new TokenManager(new WeixinTokenCreator(
|
||||
weixinAccount.getId(), weixinAccount.getSecret()),
|
||||
new FileCacheStorager<Token>());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
Reference in New Issue
Block a user