From 5b31f1c8f03e4e1a2873300037343ce61e2f1359 Mon Sep 17 00:00:00 2001 From: jinyu Date: Thu, 31 Mar 2016 13:16:12 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BC=81=E4=B8=9A=E5=8F=B7?= =?UTF-8?q?=E7=AC=AC=E4=B8=89=E6=96=B9=E5=A5=97=E4=BB=B6=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../foxinmy/weixin4j/qy/WeixinSuiteProxy.java | 116 ++++++-- .../com/foxinmy/weixin4j/qy/api/OauthApi.java | 271 ++++++++---------- .../foxinmy/weixin4j/qy/api/weixin.properties | 2 - .../qy/token/WeixinTicketCreator.java | 2 +- .../foxinmy/weixin4j/qy/type/URLConsts.java | 105 ++++--- 5 files changed, 252 insertions(+), 244 deletions(-) diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinSuiteProxy.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinSuiteProxy.java index 017e672e..aad3ab85 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinSuiteProxy.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinSuiteProxy.java @@ -1,9 +1,12 @@ package com.foxinmy.weixin4j.qy; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; import java.util.HashMap; import java.util.Map; import com.foxinmy.weixin4j.exception.WeixinException; +import com.foxinmy.weixin4j.model.Consts; import com.foxinmy.weixin4j.model.WeixinAccount; import com.foxinmy.weixin4j.qy.api.ProviderApi; import com.foxinmy.weixin4j.qy.api.SuiteApi; @@ -13,8 +16,10 @@ import com.foxinmy.weixin4j.qy.suite.SuiteTicketHolder; import com.foxinmy.weixin4j.qy.suite.Weixin4jSuiteSettings; 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.token.TokenHolder; import com.foxinmy.weixin4j.util.StringUtil; +import com.foxinmy.weixin4j.util.Weixin4jConfigUtil; /** * 微信第三方应用接口实现 @@ -24,8 +29,9 @@ import com.foxinmy.weixin4j.util.StringUtil; * @date 2015年6月22日 * @since JDK 1.6 * @see com.foxinmy.weixin4j.qy.api.SuiteApi - * @see 企业号第三方应用 + * @see + * 企业号第三方应用 */ public class WeixinSuiteProxy { @@ -55,25 +61,20 @@ public class WeixinSuiteProxy { this.suiteSettings = suiteSettings; if (suiteSettings.getWeixinAccount().getSuiteAccounts() != null) { this.suiteMap = new HashMap(); - for (WeixinAccount suite : suiteSettings.getWeixinAccount() - .getSuiteAccounts()) { + for (WeixinAccount suite : suiteSettings.getWeixinAccount().getSuiteAccounts()) { this.suiteMap.put(suite.getId(), new SuiteApi( - new SuiteTicketHolder(suite.getId(), suite.getSecret(), - suiteSettings.getTokenStorager0()))); - this.suiteMap.put( - null, - suiteMap.get(suiteSettings.getWeixinAccount() - .getSuiteAccounts().get(0).getId())); + new SuiteTicketHolder(suite.getId(), suite.getSecret(), suiteSettings.getTokenStorager0()))); + this.suiteMap.put(null, + suiteMap.get(suiteSettings.getWeixinAccount().getSuiteAccounts().get(0).getId())); } } if (StringUtil.isNotBlank(suiteSettings.getWeixinAccount().getId()) - && StringUtil.isNotBlank(suiteSettings.getWeixinAccount() - .getProviderSecret())) { - this.providerApi = new ProviderApi(new TokenHolder( - new WeixinProviderTokenCreator(suiteSettings - .getWeixinAccount().getId(), suiteSettings - .getWeixinAccount().getProviderSecret()), - suiteSettings.getTokenStorager0()), + && StringUtil.isNotBlank(suiteSettings.getWeixinAccount().getProviderSecret())) { + this.providerApi = new ProviderApi( + new TokenHolder( + new WeixinProviderTokenCreator(suiteSettings.getWeixinAccount().getId(), + suiteSettings.getWeixinAccount().getProviderSecret()), + suiteSettings.getTokenStorager0()), suiteSettings.getTokenStorager0()); } } @@ -88,27 +89,84 @@ public class WeixinSuiteProxy { } /** - * 只关注第一个套件获取API(如果只有一个套件 + * 获取套件接口对象(只关注第一个套件 * * @see com.foxinmy.weixin4j.qy.api.SuiteApi * @return API实例 */ - public SuiteApi api() { + public SuiteApi suite() { return this.suiteMap.get(null); } /** - * 多个套件获取API + * 获取套件接口对象(多个套件 * * @see com.foxinmy.weixin4j.qy.api.SuiteApi * @param suiteId * 套件ID * @return API实例 */ - public SuiteApi api(String suiteId) { + public SuiteApi suite(String suiteId) { return this.suiteMap.get(suiteId); } + /** + * 缓存套件ticket(多个套件 + * + * @param suiteId + * 套件ID + * @param suiteTicket + * 套件ticket内容 + * @see + * 推送suite_ticket协议 + * @throws WeixinException + */ + public void cacheTicket(String suiteId, String suiteTicket) throws WeixinException { + suite(suiteId).getTicketHolder().cachingTicket(suiteTicket); + } + + /** + * 应用套件授权 需先缓存ticket + * + * @see {@link #getSuiteAuthorizeURL(String, String,String)} + * @param suiteId + * 套件ID + * @see {@link #cacheTicket(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"); + } + + /** + * 应用套件授权 需先缓存ticket + * + * @param suiteId + * 套件ID + * @param redirectUri + * 授权后重定向url + * @param state + * 回调后原样返回 + * @see 企业号第三方应用套件授权 + * @see {@link SuiteApi#getPreCodeHolder} + * @return 请求授权的URL + * @throws WeixinException + */ + public String getSuiteAuthorizeURL(String suiteId, String redirectUri, String state) throws WeixinException { + try { + return String.format(URLConsts.SUITE_OAUTH_URL, suiteId, suite(suiteId).getTicketHolder().getTicket(), + URLEncoder.encode(redirectUri, Consts.UTF_8.name()), state); + } catch (UnsupportedEncodingException e) { + ; + } + return ""; + } + /** * 第三方套件获取企业号管理员登录信息 * @@ -116,8 +174,9 @@ public class WeixinSuiteProxy { * oauth2.0授权企业号管理员登录产生的code * @return 登陆信息 * @see com.foxinmy.weixin4j.qy.api.ProviderApi - * @see 授权获取企业号管理员登录信息 + * @see + * 授权获取企业号管理员登录信息 * @see com.foxinmy.weixin4j.qy.model.OUserInfo * @throws WeixinException */ @@ -136,12 +195,12 @@ public class WeixinSuiteProxy { * 授权方应用id 小余1时则不传递 * @return 登陆URL * @see com.foxinmy.weixin4j.qy.api.ProviderApi - * @see 获取登录企业号官网的url + * @see + * 获取登录企业号官网的url * @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); } @@ -156,8 +215,7 @@ public class WeixinSuiteProxy { * @return */ public WeixinProxy getWeixinProxy(String suiteId, String authCorpId) { - return new WeixinProxy(api(suiteId).getPerCodeHolder(authCorpId), api( - suiteId).getSuiteTokenHolder()); + return new WeixinProxy(suite(suiteId).getPerCodeHolder(authCorpId), suite(suiteId).getSuiteTokenHolder()); } public final static String VERSION = "1.6.7"; diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/OauthApi.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/OauthApi.java index b45845cc..f61d460f 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/OauthApi.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/OauthApi.java @@ -1,158 +1,113 @@ -package com.foxinmy.weixin4j.qy.api; - -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; - -import com.foxinmy.weixin4j.model.Consts; -import com.foxinmy.weixin4j.model.WeixinAccount; -import com.foxinmy.weixin4j.util.Weixin4jConfigUtil; - -/** - * 企业号oauth授权 - * - * @className OauthApi - * @author jy - * @date 2015年6月11日 - * @since JDK 1.6 - * @see 企业号用户身份授权说明 - * @see 企业号第三方提供商授权说明 - * @see 企业号第三方套件应用授权说明 - */ -public class OauthApi extends QyApi { - private final WeixinAccount account; - - public OauthApi() { - this(Weixin4jConfigUtil.getWeixinAccount()); - } - - public OauthApi(WeixinAccount account) { - this.account = account; - } - - /** - * 企业号用户身份授权 - * - * @see {@link #getUserAuthorizeURL(String, String,String)} - * - * @return 请求授权的URL - */ - public String getUserAuthorizeURL() { - String corpId = account.getId(); - String redirectUri = Weixin4jConfigUtil - .getValue("user.oauth.redirect.uri"); - return getUserAuthorizeURL(corpId, redirectUri, "state"); - } - - /** - * 企业号用户身份授权 - * - * @param corpId - * 企业号的corpid - * @param redirectUri - * 重定向地址 - * @param state - * 用于保持请求和回调的状态 - * @return 请求授权的URL - * @see 企业号用户身份授权 - */ - public String getUserAuthorizeURL(String corpId, String redirectUri, - String state) { - String oauth_uri = getRequestUri("user_oauth_uri"); - try { - return String.format(oauth_uri, corpId, - URLEncoder.encode(redirectUri, Consts.UTF_8.name()), state); - } catch (UnsupportedEncodingException e) { - ; - } - return ""; - } - - /** - * 企业号第三方提供商授权 - * - * @see {@link #getThirdAuthorizeURL(String, String,String)} - * - * @return 请求授权的URL - */ - public String getThirdAuthorizeURL() { - String corpId = account.getId(); - String redirectUri = Weixin4jConfigUtil - .getValue("third.oauth.redirect.uri"); - return getThirdAuthorizeURL(corpId, redirectUri, "state"); - } - - /** - * 企业号登陆授权 - * - * @param corpId - * 企业号(提供商)的corpid - * @param redirectUri - * 重定向地址 - * @param state - * 用于保持请求和回调的状态,授权请求后原样带回给第三方 - * @return 请求授权的URL - * @see ProviderApi - * @see {@link com.foxinmy.weixin4j.qy.WeixinSuiteProxy#getOUserInfoByCode(String)} - * @see 企业号第三方提供商授权 - */ - public String getThirdAuthorizeURL(String corpId, String redirectUri, - String state) { - String oauth_uri = getRequestUri("provider_oauth_uri"); - try { - return String.format(oauth_uri, corpId, - URLEncoder.encode(redirectUri, Consts.UTF_8.name()), state); - } catch (UnsupportedEncodingException e) { - ; - } - return ""; - } - - /** - * 应用套件授权 - * - * @see {@link #getSuiteAuthorizeURL(String,String, String,String)} - * @param suiteId - * 套件ID - * @param preAuthCode - * 预授权码 - * @return - */ - public String getSuiteAuthorizeURL(String suiteId, String preAuthCode) { - String redirectUri = Weixin4jConfigUtil - .getValue("suite.oauth.redirect.uri"); - return getSuiteAuthorizeURL(suiteId, preAuthCode, redirectUri, "state"); - } - - /** - * 应用套件授权 - * - * @param suiteId - * 套件ID - * @param preAuthCode - * 预授权码 - * @param redirectUri - * 授权后重定向url - * @param state - * 回调后原样返回 - * @see 企业号第三方应用套件授权 - * @return 请求授权的URL - */ - public String getSuiteAuthorizeURL(String suiteId, String preAuthCode, - String redirectUri, String state) { - String suite_oauth_uri = getRequestUri("suite_oauth_uri"); - try { - return String.format(suite_oauth_uri, suiteId, preAuthCode, - URLEncoder.encode(redirectUri, Consts.UTF_8.name()), state); - } catch (UnsupportedEncodingException e) { - ; - } - return ""; - } -} +package com.foxinmy.weixin4j.qy.api; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; + +import com.foxinmy.weixin4j.model.Consts; +import com.foxinmy.weixin4j.model.WeixinAccount; +import com.foxinmy.weixin4j.util.Weixin4jConfigUtil; + +/** + * 企业号oauth授权 + * + * @className OauthApi + * @author jy + * @date 2015年6月11日 + * @since JDK 1.6 + * @see + * 企业号用户身份授权说明 + * @see + * 企业号第三方提供商授权说明 + * @see + * 企业号第三方套件应用授权说明 + */ +public class OauthApi extends QyApi { + private final WeixinAccount account; + + public OauthApi() { + this(Weixin4jConfigUtil.getWeixinAccount()); + } + + public OauthApi(WeixinAccount account) { + this.account = account; + } + + /** + * 企业号用户身份授权 + * + * @see {@link #getUserAuthorizeURL(String, String,String)} + * + * @return 请求授权的URL + */ + public String getUserAuthorizeURL() { + String corpId = account.getId(); + String redirectUri = Weixin4jConfigUtil.getValue("user.oauth.redirect.uri"); + return getUserAuthorizeURL(corpId, redirectUri, "state"); + } + + /** + * 企业号用户身份授权 + * + * @param corpId + * 企业号的corpid + * @param redirectUri + * 重定向地址 + * @param state + * 用于保持请求和回调的状态 + * @return 请求授权的URL + * @see + * 企业号用户身份授权 + */ + public String getUserAuthorizeURL(String corpId, String redirectUri, String state) { + String oauth_uri = getRequestUri("user_oauth_uri"); + try { + return String.format(oauth_uri, corpId, URLEncoder.encode(redirectUri, Consts.UTF_8.name()), state); + } catch (UnsupportedEncodingException e) { + ; + } + return ""; + } + + /** + * 企业号第三方提供商授权 + * + * @see {@link #getThirdAuthorizeURL(String, String,String)} + * + * @return 请求授权的URL + */ + public String getThirdAuthorizeURL() { + String corpId = account.getId(); + String redirectUri = Weixin4jConfigUtil.getValue("third.oauth.redirect.uri"); + return getThirdAuthorizeURL(corpId, redirectUri, "state"); + } + + /** + * 企业号登陆授权 + * + * @param corpId + * 企业号(提供商)的corpid + * @param redirectUri + * 重定向地址 + * @param state + * 用于保持请求和回调的状态,授权请求后原样带回给第三方 + * @return 请求授权的URL + * @see ProviderApi + * @see {@link com.foxinmy.weixin4j.qy.WeixinSuiteProxy#getOUserInfoByCode(String)} + * @see + * 企业号第三方提供商授权 + */ + public String getThirdAuthorizeURL(String corpId, String redirectUri, String state) { + String oauth_uri = getRequestUri("provider_oauth_uri"); + try { + return String.format(oauth_uri, corpId, URLEncoder.encode(redirectUri, Consts.UTF_8.name()), state); + } catch (UnsupportedEncodingException e) { + ; + } + return ""; + } +} diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/weixin.properties b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/weixin.properties index bb2db1c5..605ec7ef 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/weixin.properties +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/weixin.properties @@ -94,8 +94,6 @@ provider_oauth_uri=https://qy.weixin.qq.com/cgi-bin/loginpage?corp_id=%s&redirec oauth_logininfo_uri={api_base_url}/service/get_login_info?provider_access_token=%s # \u767b\u5f55\u4f01\u4e1a\u53f7\u5b98\u7f51\u7684url oauth_loginurl_uri={api_base_url}/service/get_login_url?provider_access_token=%s -# \u5e94\u7528\u5957\u4ef6oauth\u6388\u6743 -suite_oauth_uri=https://qy.weixin.qq.com/cgi-bin/loginpage?suite_id=%s&pre_auth_code=%s&redirect_uri=%s&state=%s # \u5e94\u7528\u5957\u4ef6\u8bbe\u7f6e\u6388\u6743\u914d\u7f6e suite_set_session_uri={api_base_url}/service/set_session_info?suite_access_token=%s # \u83b7\u53d6\u4f01\u4e1a\u53f7\u7684\u6c38\u4e45\u6388\u6743\u7801 diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/token/WeixinTicketCreator.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/token/WeixinTicketCreator.java index 50838a1d..ef3c1c04 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/token/WeixinTicketCreator.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/token/WeixinTicketCreator.java @@ -54,7 +54,7 @@ public class WeixinTicketCreator implements TokenCreator { response = weixinExecutor .get(String.format(URLConsts.JS_TICKET_URL, weixinTokenHolder.getToken().getAccessToken())); } else { - response = weixinExecutor.get(String.format(URLConsts.TICKET_URL, + response = weixinExecutor.get(String.format(URLConsts.SUITE_TICKET_URL, weixinTokenHolder.getToken().getAccessToken(), ticketType.name())); } JSONObject result = response.getAsJson(); diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/type/URLConsts.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/type/URLConsts.java index cb37e67a..65174d0f 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/type/URLConsts.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/type/URLConsts.java @@ -1,54 +1,51 @@ -package com.foxinmy.weixin4j.qy.type; - -/** - * URL常量类 - * - * @className URLConsts - * @author jy - * @date 2014年12月3日 - * @since JDK 1.6 - * @see - */ -public final class URLConsts { - /** - * - */ - public static final String BASE_URL = "https://qyapi.weixin.qq.com/cgi-bin"; - /** - * 企业号获取token的url - */ - public static final String ASSESS_TOKEN_URL = BASE_URL - + "/gettoken?corpid=%s&corpsecret=%s"; - /** - * 企业号提供商获取token的url - */ - public static final String PROVIDER_TOKEN_URL = BASE_URL - + "/service/get_provider_token"; - /** - * 企业号jssdk获取token的url - */ - public static final String JS_TICKET_URL = BASE_URL - + "/get_jsapi_ticket?access_token=%s"; - /** - * 企业号获取ticket的url - */ - public static final String TICKET_URL = BASE_URL - + "/ticket/get?access_token=%s&type=%s"; - /** - * 企业号第三方应用套件获取token的url - */ - public static final String SUITE_TOKEN_URL = BASE_URL - + "/service/get_suite_token"; - - /** - * 企业号第三方应用套件获取预授权码的url - */ - public static final String SUITE_PRE_CODE_URL = BASE_URL - + "/service/get_pre_auth_code?suite_access_token=%s"; - - /** - * 企业号第三方应用套件获取企业号access_token的url - */ - public static final String TOKEN_SUITE_URL = BASE_URL - + "/service/get_corp_token?suite_access_token=%s"; -} +package com.foxinmy.weixin4j.qy.type; + +/** + * URL常量类 + * + * @className URLConsts + * @author jy + * @date 2014年12月3日 + * @since JDK 1.6 + * @see + */ +public final class URLConsts { + /** + * + */ + public static final String BASE_URL = "https://qyapi.weixin.qq.com/cgi-bin"; + /** + * 企业号获取token的url + */ + public static final String ASSESS_TOKEN_URL = BASE_URL + "/gettoken?corpid=%s&corpsecret=%s"; + /** + * 企业号提供商获取token的url + */ + public static final String PROVIDER_TOKEN_URL = BASE_URL + "/service/get_provider_token"; + /** + * 企业号jssdk获取token的url + */ + public static final String JS_TICKET_URL = BASE_URL + "/get_jsapi_ticket?access_token=%s"; + /** + * 应用套件oauth授权 + */ + public static final String SUITE_OAUTH_URL = "https://qy.weixin.qq.com/cgi-bin/loginpage?suite_id=%s&pre_auth_code=%s&redirect_uri=%s&state=%s"; + /** + * 企业号获取ticket的url + */ + public static final String SUITE_TICKET_URL = BASE_URL + "/ticket/get?access_token=%s&type=%s"; + /** + * 企业号第三方应用套件获取token的url + */ + public static final String SUITE_TOKEN_URL = BASE_URL + "/service/get_suite_token"; + + /** + * 企业号第三方应用套件获取预授权码的url + */ + public static final String SUITE_PRE_CODE_URL = BASE_URL + "/service/get_pre_auth_code?suite_access_token=%s"; + + /** + * 企业号第三方应用套件获取企业号access_token的url + */ + public static final String TOKEN_SUITE_URL = BASE_URL + "/service/get_corp_token?suite_access_token=%s"; +}