From 357952e70e23fe3e264f48bb81268bab2d8a7ac8 Mon Sep 17 00:00:00 2001 From: jinyu Date: Thu, 30 Jul 2015 16:22:16 +0800 Subject: [PATCH] =?UTF-8?q?weixin4j-qy:=E8=B0=83=E6=95=B4WeixinSuiteProxy?= =?UTF-8?q?=E5=AF=B9=E5=A4=9A=E4=B8=AA=E5=A5=97=E4=BB=B6=E7=9A=84=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGE.md | 6 +- weixin4j-qy/CHANGE.md | 6 +- weixin4j-qy/README.md | 4 +- .../foxinmy/weixin4j/qy/WeixinSuiteProxy.java | 199 ++++-------------- .../com/foxinmy/weixin4j/qy/api/OauthApi.java | 7 +- .../com/foxinmy/weixin4j/qy/api/SuiteApi.java | 2 +- .../weixin4j/qy/model/WeixinQyAccount.java | 36 ++-- .../src/main/resources/weixin4j.properties | 2 +- 8 files changed, 81 insertions(+), 181 deletions(-) diff --git a/CHANGE.md b/CHANGE.md index 63efe3bb..0a1ab617 100644 --- a/CHANGE.md +++ b/CHANGE.md @@ -390,4 +390,8 @@ + **weixin4j-mp**: 新增二维码结果类[QRResult.java](./weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/model/QRResult.java)并将二维码接口[QRApi.java](./weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/QrApi.java)名称变更为createQR和createQRFile + **weixin4j-mp**: [Oauth授权](./weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/OauthApi.java)跳转的uri在配置文件的属性名改为`oauth_redirect_uri` - \ No newline at end of file + +* 2015-07-30 + + + **weixin4j-qy**: 调整[WeixinSuiteProxy](./weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinSuiteProxy.java)对多个套件的支持 + \ No newline at end of file diff --git a/weixin4j-qy/CHANGE.md b/weixin4j-qy/CHANGE.md index 572cb5a1..f62eda38 100644 --- a/weixin4j-qy/CHANGE.md +++ b/weixin4j-qy/CHANGE.md @@ -78,4 +78,8 @@ * 2015-07-22 - + 创建标签时可以指定ID \ No newline at end of file + + 创建标签时可以指定ID + +* 2015-07-30 + + + **weixin4j-qy**: 调整[WeixinSuiteProxy](.src/main/java/com/foxinmy/weixin4j/qy/WeixinSuiteProxy.java)对多个套件的支持 \ No newline at end of file diff --git a/weixin4j-qy/README.md b/weixin4j-qy/README.md index 1865bec2..6a315c80 100644 --- a/weixin4j-qy/README.md +++ b/weixin4j-qy/README.md @@ -58,7 +58,7 @@ weixin4j.properties说明 示例(properties中换行用右斜杆\\) account={"id":"corpid","secret":"corpsecret",\ - "suiteId":"应用套件的id","suiteSecret":"应用套件的secret",\ + "suites":[{"id":"应用套件的id","secret":"应用套件的secret"}],\ "providerSecret:"第三方提供商secret(企业号登陆)",\ "chatSecret":"消息服务secret(企业号聊天)"} @@ -83,7 +83,7 @@ weixin4j.properties说明 // 微信第三方应用API WeixinSuiteProxy weixinSuiteProxy = new WeixinSuiteProxy(); //weixinSuiteProxy = new WeixinSuiteProxy(suiteId,suiteSecret); - weixinSuiteProxy.getOAuthInfo(authCorpid); + weixinSuiteProxy.api().getOAuthInfo(authCorpid); > 针对`token`存储有两种方案,`File存储`/`Redis存储`,当然也可自己实现`TokenStorager`,默认使用文件(xml)的方式保存token,如果环境中支持`redis`,建议使用[RedisTokenStorager](https://github.com/foxinmy/weixin4j/wiki/%E7%94%A8redis%E4%BF%9D%E5%AD%98token). 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 b461b3db..62f535bd 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,15 +1,13 @@ package com.foxinmy.weixin4j.qy; +import java.util.HashMap; +import java.util.Map; + import com.foxinmy.weixin4j.exception.WeixinException; -import com.foxinmy.weixin4j.http.weixin.JsonResult; +import com.foxinmy.weixin4j.model.WeixinAccount; import com.foxinmy.weixin4j.qy.api.QyApi; import com.foxinmy.weixin4j.qy.api.SuiteApi; -import com.foxinmy.weixin4j.qy.model.AgentInfo; -import com.foxinmy.weixin4j.qy.model.AgentSetter; -import com.foxinmy.weixin4j.qy.model.OUserInfo; -import com.foxinmy.weixin4j.qy.suite.SuitePerCodeHolder; import com.foxinmy.weixin4j.qy.suite.SuiteTicketHolder; -import com.foxinmy.weixin4j.token.TokenHolder; import com.foxinmy.weixin4j.token.TokenStorager; /** @@ -24,24 +22,11 @@ import com.foxinmy.weixin4j.token.TokenStorager; * href="http://qydev.weixin.qq.com/wiki/index.php?title=%E7%AC%AC%E4%B8%89%E6%96%B9%E5%BA%94%E7%94%A8%E6%8E%88%E6%9D%83">企业号第三方应用 */ public class WeixinSuiteProxy { - /** - * 第三方应用API - */ - private final SuiteApi suiteApi; - public WeixinSuiteProxy() throws WeixinException { - this(QyApi.DEFAULT_WEIXIN_ACCOUNT.getSuiteId(), - QyApi.DEFAULT_WEIXIN_ACCOUNT.getSuiteSecret()); - } + private final Map suiteMap; - public WeixinSuiteProxy(String suiteId, String suiteSecret) - throws WeixinException { - this(suiteId, suiteSecret, QyApi.DEFAULT_TOKEN_STORAGER); - } - - public WeixinSuiteProxy(TokenStorager tokenStorager) throws WeixinException { - this(QyApi.DEFAULT_WEIXIN_ACCOUNT.getSuiteId(), - QyApi.DEFAULT_WEIXIN_ACCOUNT.getSuiteSecret(), tokenStorager); + public WeixinSuiteProxy() { + this(QyApi.DEFAULT_TOKEN_STORAGER); } /** @@ -50,153 +35,61 @@ public class WeixinSuiteProxy { * 应用ID * @param suiteSecret * 应用secret + * @throws WeixinException + */ + public WeixinSuiteProxy(String suiteId, String suiteSecret) { + this(QyApi.DEFAULT_TOKEN_STORAGER, new WeixinAccount(suiteId, + suiteSecret)); + } + + /** + * * @param tokenStorager - * 应用token存储器 - * @throws WeixinException + * token存储 */ - public WeixinSuiteProxy(String suiteId, String suiteSecret, - TokenStorager tokenStorager) throws WeixinException { - this(new SuiteTicketHolder(suiteId, suiteSecret, tokenStorager)); + public WeixinSuiteProxy(TokenStorager tokenStorager) { + this(tokenStorager, QyApi.DEFAULT_WEIXIN_ACCOUNT.suitesToArray()); } /** * - * @param suiteTicketHolder - * 套件ticket的存取 - * @throws WeixinException + * @param tokenStorager + * token存储 + * @param suites + * 套件信息 */ - public WeixinSuiteProxy(SuiteTicketHolder suiteTicketHolder) - throws WeixinException { - this.suiteApi = new SuiteApi(suiteTicketHolder); + public WeixinSuiteProxy(TokenStorager tokenStorager, + WeixinAccount... suites) { + this.suiteMap = new HashMap(); + for (WeixinAccount suite : suites) { + this.suiteMap.put(suite.getId(), new SuiteApi( + new SuiteTicketHolder(suite.getId(), suite.getSecret(), + tokenStorager))); + } + if (suites.length == 1) { + this.suiteMap.put(null, suiteMap.get(suites[0].getId())); + } } /** - * 应用套件token + * 单一套件获取API * - * @return + * @see com.foxinmy.weixin4j.qy.api.SuiteApi + * @return API实例 */ - public TokenHolder getTokenHolder() { - return suiteApi.getTokenHolder(); + public SuiteApi api() { + return this.suiteMap.get(null); } /** - * 应用套件ticket + * 多个套件获取API * - * @return + * @see com.foxinmy.weixin4j.qy.api.SuiteApi + * @param suiteId + * 套件ID + * @return API实例 */ - public SuiteTicketHolder getTicketHolder() { - return suiteApi.getTicketHolder(); - } - - /** - * 应用套件永久授权码 - * - * @return - */ - public SuitePerCodeHolder getPerCodeHolder() { - return suiteApi.getPerCodeHolder(); - } - - /** - * 应用套件预授权码 - * - * @return - */ - public TokenHolder getPreCodeHolder() { - return suiteApi.getPreCodeHolder(); - } - - /** - * 获取企业号access_token(永久授权码) - * - * @param authCorpid - * 授权方corpid - * @return 企业号token - */ - public TokenHolder createTokenHolder(String authCorpid) { - return suiteApi.createTokenHolder(authCorpid); - } - - /** - * 设置套件授权配置:如果需要对某次授权进行配置,则调用本接口,目前仅可以设置哪些应用可以授权,不调用则默认允许所有应用进行授权。 - * - * @param appids - * 允许进行授权的应用id,如1、2、3 - * @return 处理结果 - * @throws WeixinException - * @see 设置套件授权配置 - */ - public JsonResult setSuiteSession(int... appids) throws WeixinException { - return suiteApi.setSuiteSession(appids); - } - - /** - * 获取企业号的永久授权码 - * - * @param authCode - * 临时授权码会在授权成功时附加在redirect_uri中跳转回应用提供商网站。 - * @return 授权得到的信息 - * @throws WeixinException - * @see com.foxinmy.weixin4j.qy.model.OUserInfo - * @see 获取企业号的永久授权码 - */ - public OUserInfo exchangePermanentCode(String authCode) - throws WeixinException { - return suiteApi.exchangePermanentCode(authCode); - } - - /** - * 获取企业号的授权信息 - * - * @param authCorpid - * 授权方corpid - * @return 授权方信息 - * @throws WeixinException - * @see com.foxinmy.weixin4j.qy.model.OUserInfo - * @see 获取企业号的授权信息 - */ - public OUserInfo getOAuthInfo(String authCorpid) throws WeixinException { - return suiteApi.getOAuthInfo(authCorpid); - } - - /** - * 获取企业号应用 - * - * @param authCorpid - * 授权方corpid - * @param agentid - * 授权方应用id - * @return 应用信息 - * @see com.foxinmy.weixin4j.qy.model.AgentInfo - * @see 获取企业号应用 - * @throws WeixinException - */ - public AgentInfo getAgent(String authCorpid, int agentid) - throws WeixinException { - return suiteApi.getAgent(authCorpid, agentid); - } - - /** - * 设置企业应用的选项设置信息,如:地理位置上报等 - * - * @param authCorpid - * 授权方corpid - * @param agentSet - * 设置信息 - * @see com.foxinmy.weixin4j.qy.model.AgentSetter - * @see 设置企业号信息 - * @return 处理结果 - * @throws WeixinException - */ - public JsonResult setAgent(String authCorpid, AgentSetter agentSet) - throws WeixinException { - return suiteApi.setAgent(authCorpid, agentSet); + public SuiteApi api(String suiteId) { + return this.suiteMap.get(suiteId); } } 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 dfd5a971..57e31b69 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 @@ -125,13 +125,16 @@ public class OauthApi extends QyApi { } /** + * 应用套件授权 + * * @see {@link #getSuiteAuthorizeURL(String,String, String,String)} + * @param suiteId + * 套件ID * @param preAuthCode * 预授权码 * @return */ - public String getSuiteAuthorizeURL(String preAuthCode) { - String suiteId = DEFAULT_WEIXIN_ACCOUNT.getSuiteId(); + public String getSuiteAuthorizeURL(String suiteId, String preAuthCode) { String redirectUri = ConfigUtil.getValue("suite_oauth_redirect_uri"); return getSuiteAuthorizeURL(suiteId, preAuthCode, redirectUri, "state"); } diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/SuiteApi.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/SuiteApi.java index b7cfce1a..ac9d1225 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/SuiteApi.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/SuiteApi.java @@ -54,7 +54,7 @@ public class SuiteApi extends QyApi { * 应用token存储器 * @throws WeixinException */ - public SuiteApi(SuiteTicketHolder suiteTicketHolder) throws WeixinException { + public SuiteApi(SuiteTicketHolder suiteTicketHolder) { this.suiteTicketHolder = suiteTicketHolder; this.suiteTokenHolder = new TokenHolder(new WeixinSuiteTokenCreator( suiteTicketHolder), suiteTicketHolder.getTokenStorager()); diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/WeixinQyAccount.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/WeixinQyAccount.java index 8dd4a16c..28d68b81 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/WeixinQyAccount.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/WeixinQyAccount.java @@ -1,5 +1,7 @@ package com.foxinmy.weixin4j.qy.model; +import java.util.List; + import com.alibaba.fastjson.annotation.JSONCreator; import com.alibaba.fastjson.annotation.JSONField; import com.foxinmy.weixin4j.model.WeixinAccount; @@ -18,15 +20,10 @@ import com.foxinmy.weixin4j.model.WeixinAccount; public class WeixinQyAccount extends WeixinAccount { private static final long serialVersionUID = 3689999353867189585L; - /** - * 应用套件id + * 多个应用套件信息 */ - private String suiteId; - /** - * 应用套件secret - */ - private String suiteSecret; + private List suites; /** * 第三方提供商secret(企业号登陆) */ @@ -54,23 +51,17 @@ public class WeixinQyAccount extends WeixinAccount { @JSONCreator public WeixinQyAccount(@JSONField(name = "id") String corpid, @JSONField(name = "secret") String corpsecret, - @JSONField(name = "suiteId") String suiteId, - @JSONField(name = "suiteSecret") String suiteSecret, + @JSONField(name = "suites") List suites, @JSONField(name = "providerSecret") String providerSecret, @JSONField(name = "chatSecret") String chatSecret) { super(corpid, corpsecret); - this.suiteId = suiteId; - this.suiteSecret = suiteSecret; + this.suites = suites; this.providerSecret = providerSecret; this.chatSecret = chatSecret; } - public String getSuiteId() { - return suiteId; - } - - public String getSuiteSecret() { - return suiteSecret; + public List getSuites() { + return suites; } public String getProviderSecret() { @@ -81,10 +72,15 @@ public class WeixinQyAccount extends WeixinAccount { return chatSecret; } + public WeixinAccount[] suitesToArray() { + return suites != null ? suites + .toArray(new WeixinAccount[suites.size()]) : null; + } + @Override public String toString() { - return "WeixinQyAccount [" + super.toString() + ", suiteId=" + suiteId - + ", suiteSecret=" + suiteSecret + ", providerSecret=" - + providerSecret + ", chatSecret=" + chatSecret + "]"; + return "WeixinQyAccount [" + super.toString() + ", suites=" + suites + + ", providerSecret=" + providerSecret + ", chatSecret=" + + chatSecret + "]"; } } diff --git a/weixin4j-qy/src/main/resources/weixin4j.properties b/weixin4j-qy/src/main/resources/weixin4j.properties index 61224f5c..8c83eba9 100644 --- a/weixin4j-qy/src/main/resources/weixin4j.properties +++ b/weixin4j-qy/src/main/resources/weixin4j.properties @@ -1,7 +1,7 @@ # \u6d4b\u8bd5\u4e4b\u7528 \u6b63\u5f0f\u73af\u5883\u4e0bcopy\u4e00\u4efd\u5230classpath # \u4f01\u4e1a\u53f7\u4fe1\u606f account={"id":"wx6d13cc18002bb2e5","secret":"vcCOTIb-cOzWWhL5r_qKVlfzdpInEEKPRz3K-5ezn-Xt48-tOkxPqEE5XbKLXXFn",\ -"suiteId":"\u5e94\u7528\u5957\u4ef6\u7684id","suiteSecret":"\u5e94\u7528\u5957\u4ef6\u7684secret",\ +"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\u804a\u5929)"}