diff --git a/CHANGE.md b/CHANGE.md
index 7091b71b..6398cfbc 100644
--- a/CHANGE.md
+++ b/CHANGE.md
@@ -325,4 +325,8 @@
+ weixin.properties重命名为weixin4j.properties
- + released 1.5.0!
\ No newline at end of file
+ + released 1.5.0!
+
+* 2015-06-12
+
+ + 修缮token实现机制
\ No newline at end of file
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/FileTokenHolder.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/FileTokenHolder.java
deleted file mode 100644
index a9a304bb..00000000
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/FileTokenHolder.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package com.foxinmy.weixin4j.token;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.Calendar;
-
-import com.foxinmy.weixin4j.exception.WeixinException;
-import com.foxinmy.weixin4j.model.Token;
-import com.foxinmy.weixin4j.util.ConfigUtil;
-import com.foxinmy.weixin4j.xml.XmlStream;
-
-/**
- * 用FILE保存TOKEN
- *
- * @className FileTokenHolder
- * @author jy
- * @date 2015年1月9日
- * @since JDK 1.7
- * @see com.foxinmy.weixin4j.token.TokenCreator
- */
-public class FileTokenHolder implements TokenHolder {
- private final String tokenPath;
- private final TokenCreator tokenCreator;
-
- public FileTokenHolder(TokenCreator tokenCreator) {
- this(ConfigUtil.getValue("token_path"), tokenCreator);
- }
-
- public FileTokenHolder(String tokenPath, TokenCreator tokenCreator) {
- this.tokenPath = tokenPath;
- this.tokenCreator = tokenCreator;
- }
-
- @Override
- public Token getToken() throws WeixinException {
- File token_file = new File(String.format("%s/%s.xml", tokenPath,
- tokenCreator.getCacheKey()));
- Token token = null;
- Calendar ca = Calendar.getInstance();
- long now_time = ca.getTimeInMillis();
- try {
- if (token_file.exists()) {
- token = XmlStream.fromXML(new FileInputStream(token_file),
- Token.class);
- long expire_time = token.getTime()
- + (token.getExpiresIn() * 1000) - 2;
- if (expire_time > now_time) {
- return token;
- }
- }
- token = tokenCreator.createToken();
- XmlStream.toXML(token, new FileOutputStream(token_file));
- } catch (IOException e) {
- throw new WeixinException(e.getMessage());
- }
- return token;
- }
-}
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/FileTokenStorager.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/FileTokenStorager.java
new file mode 100644
index 00000000..a39f236f
--- /dev/null
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/FileTokenStorager.java
@@ -0,0 +1,65 @@
+package com.foxinmy.weixin4j.token;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+import com.foxinmy.weixin4j.exception.WeixinException;
+import com.foxinmy.weixin4j.model.Token;
+import com.foxinmy.weixin4j.util.ConfigUtil;
+import com.foxinmy.weixin4j.xml.XmlStream;
+
+/**
+ * 用FILE保存TOKEN
+ *
+ * @className FileTokenStorager
+ * @author jy
+ * @date 2015年1月9日
+ * @since JDK 1.7
+ */
+public class FileTokenStorager implements TokenStorager {
+
+ private final String tokenPath;
+
+ public FileTokenStorager() {
+ this(ConfigUtil.getValue("token_path"));
+ }
+
+ public FileTokenStorager(String tokenPath) {
+ this.tokenPath = tokenPath;
+ }
+
+ @Override
+ public Token lookupToken(String cacheKey) throws WeixinException {
+ File token_file = new File(String.format("%s/%s.xml", tokenPath,
+ cacheKey));
+ try {
+ if (token_file.exists()) {
+ Token token = XmlStream.fromXML(
+ new FileInputStream(token_file), Token.class);
+ long expire_time = token.getTime()
+ + (token.getExpiresIn() * 1000) - 2;
+ if (expire_time > System.currentTimeMillis()) {
+ return token;
+ }
+ }
+ return null;
+ } catch (IOException e) {
+ throw new WeixinException(e.getMessage());
+ }
+ }
+
+ @Override
+ public void cachingToken(Token token, String cacheKey)
+ throws WeixinException {
+ try {
+ XmlStream.toXML(
+ token,
+ new FileOutputStream(new File(String.format("%s/%s.xml",
+ tokenPath, cacheKey))));
+ } catch (IOException e) {
+ throw new WeixinException(e.getMessage());
+ }
+ }
+}
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/README.md b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/README.md
index 6bd33863..9fc0f45c 100644
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/README.md
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/README.md
@@ -1,6 +1,11 @@
### TOKEN的实现
-TokenHolder.java token持有者接口
-FileTokenHolder.java 基于文件保存的TokenHolder实现
-RedisTokenHolder.java 基于redis保存的TokenHolder实现(推荐)
-TokenCreator.java token创建者接口
+* TokenCreator 负责创建新的token
+
+* TokenStorager 负责查找已缓存的token或者缓存新的token
+
+* TokenHolder 负责获取token(屏蔽了获取方式)
+
+* FileTokenStorager 是系统默认的token存储策略实现
+
+* RedisTokenStorager 如果服务器支持redis,推荐使用(需要自己添加jar包和[java类](https://github.com/foxinmy/weixin4j/wiki/%E7%94%A8redis%E4%BF%9D%E5%AD%98token))
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/TokenHolder.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/TokenHolder.java
index 5fda84b5..73edb3c0 100644
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/TokenHolder.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/TokenHolder.java
@@ -1,19 +1,35 @@
-package com.foxinmy.weixin4j.token;
-
-import com.foxinmy.weixin4j.exception.WeixinException;
-import com.foxinmy.weixin4j.model.Token;
-
-/**
- * token持有者
- *
- * @className TokenHolder
- * @author jy.hu
- * @date 2014年9月27日
- * @since JDK 1.7
- * @see com.foxinmy.weixin4j.model.Token
- * @see com.foxinmy.weixin4j.token.FileTokenHolder
- * @see com.foxinmy.weixin4j.token.RedisTokenHolder
- */
-public interface TokenHolder {
- public Token getToken() throws WeixinException;
-}
+package com.foxinmy.weixin4j.token;
+
+import com.foxinmy.weixin4j.exception.WeixinException;
+import com.foxinmy.weixin4j.model.Token;
+
+/**
+ * 对token的缓存获取
+ *
+ * @className TokenHolder
+ * @author jy
+ * @date 2015年6月12日
+ * @since JDK 1.7
+ * @see TokenCreator
+ * @see TokenStorager
+ */
+public final class TokenHolder {
+
+ private final TokenCreator tokenCreator;
+ private final TokenStorager tokenStorager;
+
+ public TokenHolder(TokenCreator tokenCreator, TokenStorager tokenStorager) {
+ this.tokenCreator = tokenCreator;
+ this.tokenStorager = tokenStorager;
+ }
+
+ public Token getToken() throws WeixinException {
+ String cacheKey = tokenCreator.getCacheKey();
+ Token token = tokenStorager.lookupToken(cacheKey);
+ if (token == null) {
+ token = tokenCreator.createToken();
+ tokenStorager.cachingToken(token, cacheKey);
+ }
+ return token;
+ }
+}
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/TokenStorager.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/TokenStorager.java
new file mode 100644
index 00000000..fa7e77c9
--- /dev/null
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/TokenStorager.java
@@ -0,0 +1,39 @@
+package com.foxinmy.weixin4j.token;
+
+import com.foxinmy.weixin4j.exception.WeixinException;
+import com.foxinmy.weixin4j.model.Token;
+
+/**
+ * token的存储
+ *
+ * @className TokenStorager
+ * @author jy.hu
+ * @date 2014年9月27日
+ * @since JDK 1.7
+ * @see com.foxinmy.weixin4j.model.Token
+ * @see com.foxinmy.weixin4j.token.FileTokenStorager
+ * @see com.foxinmy.weixin4j.token.RedisTokenStorager
+ */
+public interface TokenStorager {
+ /**
+ * 查找缓存的token
+ *
+ * @param cacheKey
+ * 缓存的名称
+ * @return 查找结果
+ * @throws WeixinException
+ */
+ public Token lookupToken(String cacheKey) throws WeixinException;
+
+ /**
+ * 缓存新的token
+ *
+ * @param token
+ * 新产生的token
+ * @param cacheKey
+ * 缓存的名称
+ * @throws WeixinException
+ */
+ public void cachingToken(Token token, String cacheKey)
+ throws WeixinException;
+}
diff --git a/weixin4j-mp/README.md b/weixin4j-mp/README.md
index bb1f3581..c6342008 100644
--- a/weixin4j-mp/README.md
+++ b/weixin4j-mp/README.md
@@ -55,7 +55,7 @@ weixin4j.properties说明
| 属性名 | 说明 |
| :---------- | :-------------- |
| account | 微信公众号信息 `json格式` |
-| token_path | 使用FileTokenHolder时token保存的物理路径 |
+| token_path | 使用FileTokenStorager时token保存的物理路径 |
| qr_path | 调用二维码接口时保存二维码图片的物理路径 |
| media_path | 调用媒体接口时保存媒体文件的物理路径 |
| bill_path | 调用下载对账单接口保存excel文件的物理路径 |
@@ -81,7 +81,7 @@ weixin4j.properties说明
ca_file=/tmp/weixin4j/xxxxx.p12
#classpath路径下:ca_file=classpath:xxxxx.p12
- #微信登陆授权的重定向路径(使用OauthApi时需要填写)
+ #公众号登陆授权的重定向路径(使用OauthApi时需要填写)
redirect_uri=http://xxx
2.实例化一个`WeixinProxy`对象,调用API,需要强调的是如果只传入appid,appsecret两个参数将无法调用支付相关接口
@@ -91,11 +91,11 @@ weixin4j.properties说明
// weixinProxy = new WeixinProxy(weixinAccount);
weixinProxy.getUser(openId);
-> 针对`token`存储有两种方案,`File存储`/`Redis存储`,当然也可自己实现`TokenHolder`,默认使用文件(xml)的方式保存token,如果环境中支持`redis`,建议使用[RedisTokenHolder](https://github.com/foxinmy/weixin4j/wiki/%E7%94%A8redis%E4%BF%9D%E5%AD%98token).
+> 针对`token`存储有两种方案,`File存储`/`Redis存储`,当然也可自己实现`TokenStorager`,默认使用文件(xml)的方式保存token,如果环境中支持`redis`,建议使用[RedisTokenStorager](https://github.com/foxinmy/weixin4j/wiki/%E7%94%A8redis%E4%BF%9D%E5%AD%98token).
>
-> WeixinProxy weixinProxy = new WeixinProxy(new RedisTokenHolder());
+> WeixinProxy weixinProxy = new WeixinProxy(new RedisTokenStorager());
-> // weixinProxy = new WeixinProxy(new RedisTokenHolder(weixinAccount));
+> // weixinProxy = new WeixinProxy(new RedisTokenStorager(weixinAccount));
[更新LOG](./CHANGE.md)
----------------------
\ No newline at end of file
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/WeixinPayProxy.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/WeixinPayProxy.java
index 7387c7d7..80c5f4ef 100644
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/WeixinPayProxy.java
+++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/WeixinPayProxy.java
@@ -28,8 +28,9 @@ import com.foxinmy.weixin4j.mp.type.CurrencyType;
import com.foxinmy.weixin4j.mp.type.IdQuery;
import com.foxinmy.weixin4j.mp.type.IdType;
import com.foxinmy.weixin4j.mp.type.RefundType;
-import com.foxinmy.weixin4j.token.FileTokenHolder;
+import com.foxinmy.weixin4j.token.FileTokenStorager;
import com.foxinmy.weixin4j.token.TokenHolder;
+import com.foxinmy.weixin4j.token.TokenStorager;
import com.foxinmy.weixin4j.util.ConfigUtil;
/**
@@ -51,19 +52,32 @@ public class WeixinPayProxy {
private final CouponApi couponApi;
private final CashApi cashApi;
+ /**
+ * 默认使用文件保存token、使用weixin4j.properties配置的账号信息
+ */
public WeixinPayProxy() {
- this(JSON.parseObject(ConfigUtil.getValue("account"),
- WeixinMpAccount.class), new FileTokenHolder(
- new WeixinTokenCreator()));
+ this(new FileTokenStorager());
}
/**
- * WeixinAccount对象
- *
- * @param weixinAccount
- * 微信账户
+ * 使用weixin4j.properties配置的账号信息
*/
- public WeixinPayProxy(WeixinMpAccount weixinAccount, TokenHolder tokenHolder) {
+ public WeixinPayProxy(TokenStorager tokenStorager) {
+ this(tokenStorager, JSON.parseObject(ConfigUtil.getValue("account"),
+ WeixinMpAccount.class));
+ }
+
+ /**
+ *
+ * @param tokenStorager
+ * token的存储策略
+ * @param weixinAccount
+ * 公众号账号信息
+ */
+ public WeixinPayProxy(TokenStorager tokenStorager,
+ WeixinMpAccount weixinAccount) {
+ TokenHolder tokenHolder = new TokenHolder(new WeixinTokenCreator(
+ weixinAccount), tokenStorager);
this.pay2Api = new Pay2Api(weixinAccount, tokenHolder);
this.pay3Api = new Pay3Api(weixinAccount, tokenHolder);
int version = weixinAccount.getVersion();
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/WeixinProxy.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/WeixinProxy.java
index 616066ac..f6ca10ee 100644
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/WeixinProxy.java
+++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/WeixinProxy.java
@@ -8,6 +8,7 @@ import java.util.List;
import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.http.weixin.JsonResult;
import com.foxinmy.weixin4j.model.Button;
+import com.foxinmy.weixin4j.model.WeixinAccount;
import com.foxinmy.weixin4j.mp.api.CustomApi;
import com.foxinmy.weixin4j.mp.api.DataApi;
import com.foxinmy.weixin4j.mp.api.GroupApi;
@@ -39,13 +40,15 @@ import com.foxinmy.weixin4j.mp.token.WeixinTokenCreator;
import com.foxinmy.weixin4j.mp.type.DatacubeType;
import com.foxinmy.weixin4j.mp.type.IndustryType;
import com.foxinmy.weixin4j.mp.type.Lang;
-import com.foxinmy.weixin4j.token.FileTokenHolder;
+import com.foxinmy.weixin4j.token.FileTokenStorager;
import com.foxinmy.weixin4j.token.TokenHolder;
+import com.foxinmy.weixin4j.token.TokenStorager;
import com.foxinmy.weixin4j.tuple.MassTuple;
import com.foxinmy.weixin4j.tuple.MpArticle;
import com.foxinmy.weixin4j.tuple.Tuple;
import com.foxinmy.weixin4j.tuple.Video;
import com.foxinmy.weixin4j.type.MediaType;
+import com.foxinmy.weixin4j.util.ConfigUtil;
/**
* 微信公众平台接口实现
@@ -71,10 +74,18 @@ public class WeixinProxy {
private final DataApi dataApi;
/**
- * 默认采用文件存放Token信息
+ * 默认使用文件方式保存token、使用weixin4j.properties配置的账号信息
*/
public WeixinProxy() {
- this(new FileTokenHolder(new WeixinTokenCreator()));
+ this(new FileTokenStorager());
+ }
+
+ /**
+ * 默认使用weixin4j.properties配置的账号信息
+ * @param tokenStorager
+ */
+ public WeixinProxy(TokenStorager tokenStorager) {
+ this(tokenStorager, ConfigUtil.getWeixinAccount());
}
/**
@@ -83,16 +94,19 @@ public class WeixinProxy {
* @param appsecret
*/
public WeixinProxy(String appid, String appsecret) {
- this(new FileTokenHolder(new WeixinTokenCreator(appid, appsecret)));
+ this(new FileTokenStorager(), new WeixinAccount(appid, appsecret));
}
/**
- * TokenHolder对象
*
- * @see com.foxinmy.weixin4j.token.TokenHolder
- * @param tokenHolder
+ * @param tokenStorager
+ * token存储策略
+ * @param weixinAccount
+ * 公众号账号信息
*/
- public WeixinProxy(TokenHolder tokenHolder) {
+ public WeixinProxy(TokenStorager tokenStorager, WeixinAccount weixinAccount) {
+ TokenHolder tokenHolder = new TokenHolder(new WeixinTokenCreator(
+ weixinAccount), tokenStorager);
this.mediaApi = new MediaApi(tokenHolder);
this.notifyApi = new NotifyApi(tokenHolder);
this.customApi = new CustomApi(tokenHolder);
diff --git a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/CouponTest.java b/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/CouponTest.java
index 576ccb94..540f2305 100644
--- a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/CouponTest.java
+++ b/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/CouponTest.java
@@ -13,8 +13,7 @@ import com.foxinmy.weixin4j.mp.model.WeixinMpAccount;
import com.foxinmy.weixin4j.mp.payment.coupon.CouponDetail;
import com.foxinmy.weixin4j.mp.payment.coupon.CouponResult;
import com.foxinmy.weixin4j.mp.payment.coupon.CouponStock;
-import com.foxinmy.weixin4j.mp.token.WeixinTokenCreator;
-import com.foxinmy.weixin4j.token.FileTokenHolder;
+import com.foxinmy.weixin4j.token.FileTokenStorager;
import com.foxinmy.weixin4j.util.DateUtil;
/**
@@ -33,8 +32,7 @@ public class CouponTest {
ACCOUNT = new WeixinMpAccount("appid",
"appsecret",
"paysign", "mchid");
- WEIXINPAY = new WeixinPayProxy(ACCOUNT, new FileTokenHolder(
- new WeixinTokenCreator(ACCOUNT.getId(), ACCOUNT.getSecret())));
+ WEIXINPAY = new WeixinPayProxy(new FileTokenStorager(), ACCOUNT);
}
protected final File caFile = new File("证书文件路径(*.p12)");
diff --git a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/PayTest.java b/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/PayTest.java
index 9c8262bf..f9d5d7d7 100644
--- a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/PayTest.java
+++ b/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/PayTest.java
@@ -17,11 +17,10 @@ import com.foxinmy.weixin4j.mp.payment.v3.ApiResult;
import com.foxinmy.weixin4j.mp.payment.v3.Order;
import com.foxinmy.weixin4j.mp.payment.v3.PayPackageV3;
import com.foxinmy.weixin4j.mp.payment.v3.PrePay;
-import com.foxinmy.weixin4j.mp.token.WeixinTokenCreator;
import com.foxinmy.weixin4j.mp.type.IdQuery;
import com.foxinmy.weixin4j.mp.type.IdType;
import com.foxinmy.weixin4j.mp.type.TradeType;
-import com.foxinmy.weixin4j.token.FileTokenHolder;
+import com.foxinmy.weixin4j.token.FileTokenStorager;
public class PayTest {
private final static WeixinPayProxy PAY2;
@@ -31,12 +30,10 @@ public class PayTest {
static {
ACCOUNT2 = new WeixinMpAccount("请填入v2版本的appid", "请填入v2版本的appSecret",
"请填入v3版本的paysignkey", "请填入v2版本的partnerId", "请填入v2版本的partnerKey");
- PAY2 = new WeixinPayProxy(ACCOUNT2, new FileTokenHolder(
- new WeixinTokenCreator(ACCOUNT2.getId(), ACCOUNT2.getSecret())));
+ PAY2 = new WeixinPayProxy(new FileTokenStorager(), ACCOUNT2);
ACCOUNT3 = new WeixinMpAccount("请填入v3版本的appid", "请填入v3版本的appSecret",
"请填入v3版本的paysignkey", "请填入v3版本的mchid");
- PAY3 = new WeixinPayProxy(ACCOUNT3, new FileTokenHolder(
- new WeixinTokenCreator(ACCOUNT3.getId(), ACCOUNT3.getSecret())));
+ PAY3 = new WeixinPayProxy(new FileTokenStorager(), ACCOUNT3);
}
@Test
diff --git a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/TokenTest.java b/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/TokenTest.java
index ebe58b79..6cbfcb32 100644
--- a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/TokenTest.java
+++ b/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/TokenTest.java
@@ -6,7 +6,7 @@ import org.junit.Test;
import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.mp.token.WeixinTokenCreator;
-import com.foxinmy.weixin4j.token.FileTokenHolder;
+import com.foxinmy.weixin4j.token.FileTokenStorager;
import com.foxinmy.weixin4j.token.TokenHolder;
/**
@@ -23,7 +23,8 @@ public class TokenTest {
@Before
public void setUp() {
- tokenHolder = new FileTokenHolder(new WeixinTokenCreator());
+ tokenHolder = new TokenHolder(new WeixinTokenCreator(),
+ new FileTokenStorager());
}
@Test
diff --git a/weixin4j-qy/README.md b/weixin4j-qy/README.md
index 6c30818d..fe31bd0a 100644
--- a/weixin4j-qy/README.md
+++ b/weixin4j-qy/README.md
@@ -39,7 +39,7 @@ weixin4j.properties说明
| 属性名 | 说明 |
| :---------- | :-------------- |
| account | 微信企业号信息 `json格式` |
-| token_path | 使用FileTokenHolder时token保存的物理路径 |
+| token_path | 使用FileTokenStorager时token保存的物理路径 |
| media_path | 调用媒体接口时保存媒体文件的物理路径 |
| redirect_uri | 调用OauthApi接口时需要填写的重定向路径 |
@@ -53,7 +53,7 @@ weixin4j.properties说明
token_path=/tmp/weixin4j/token
media_path=/tmp/weixin4j/media
- #微信登陆授权的重定向路径(使用OauthApi时需要填写)
+ #企业号登陆授权的重定向路径(使用OauthApi时需要填写)
redirect_uri=http://xxx
2.实例化一个`WeixinProxy`对象,调用API
@@ -63,11 +63,11 @@ weixin4j.properties说明
// weixinProxy = new WeixinProxy(weixinAccount);
weixinProxy.getUser(userid);
-> 针对`token`存储有两种方案,`File存储`/`Redis存储`,当然也可自己实现`TokenHolder`,默认使用文件(xml)的方式保存token,如果环境中支持`redis`,建议使用[RedisTokenHolder](https://github.com/foxinmy/weixin4j/wiki/%E7%94%A8redis%E4%BF%9D%E5%AD%98token).
+> 针对`token`存储有两种方案,`File存储`/`Redis存储`,当然也可自己实现`TokenStorager`,默认使用文件(xml)的方式保存token,如果环境中支持`redis`,建议使用[RedisTokenStorager](https://github.com/foxinmy/weixin4j/wiki/%E7%94%A8redis%E4%BF%9D%E5%AD%98token).
-> WeixinProxy weixinProxy = new WeixinProxy(new RedisTokenHolder());
+> WeixinProxy weixinProxy = new WeixinProxy(new RedisTokenStorager());
-> // weixinProxy = new WeixinProxy(new RedisTokenHolder(weixinAccount));
+> // weixinProxy = new WeixinProxy(new RedisTokenStorager(weixinAccount));
[更新LOG](./CHANGE.md)
----------------------
\ No newline at end of file
diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinProxy.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinProxy.java
index b06b9763..01224eba 100644
--- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinProxy.java
+++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinProxy.java
@@ -8,6 +8,7 @@ import com.alibaba.fastjson.JSONObject;
import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.http.weixin.JsonResult;
import com.foxinmy.weixin4j.model.Button;
+import com.foxinmy.weixin4j.model.WeixinAccount;
import com.foxinmy.weixin4j.qy.api.AgentApi;
import com.foxinmy.weixin4j.qy.api.BatchApi;
import com.foxinmy.weixin4j.qy.api.HelperApi;
@@ -30,9 +31,11 @@ import com.foxinmy.weixin4j.qy.model.User;
import com.foxinmy.weixin4j.qy.token.WeixinTokenCreator;
import com.foxinmy.weixin4j.qy.type.InviteType;
import com.foxinmy.weixin4j.qy.type.UserStatus;
-import com.foxinmy.weixin4j.token.FileTokenHolder;
+import com.foxinmy.weixin4j.token.FileTokenStorager;
import com.foxinmy.weixin4j.token.TokenHolder;
+import com.foxinmy.weixin4j.token.TokenStorager;
import com.foxinmy.weixin4j.type.MediaType;
+import com.foxinmy.weixin4j.util.ConfigUtil;
/**
* 微信企业号接口实现
@@ -55,10 +58,19 @@ public class WeixinProxy {
private final BatchApi batchApi;
/**
- * 默认采用文件存放Token信息
+ * 默认使用文件方式保存token、使用weixin4j.properties配置的账号信息
*/
public WeixinProxy() {
- this(new FileTokenHolder(new WeixinTokenCreator()));
+ this(new FileTokenStorager());
+ }
+
+ /**
+ * 默认使用weixin4j.properties配置的账号信息
+ *
+ * @param tokenStorager
+ */
+ public WeixinProxy(TokenStorager tokenStorager) {
+ this(tokenStorager, ConfigUtil.getWeixinAccount());
}
/**
@@ -68,16 +80,19 @@ public class WeixinProxy {
* @param corpsecret
*/
public WeixinProxy(String corpid, String corpsecret) {
- this(new FileTokenHolder(new WeixinTokenCreator(corpid, corpsecret)));
+ this(new FileTokenStorager(), new WeixinAccount(corpid, corpsecret));
}
/**
- * TokenHolder对象
*
- * @see com.foxinmy.weixin4j.token.TokenHolder
- * @param tokenHolder
+ * @param tokenStorager
+ * token存储策略
+ * @param weixinAccount
+ * 企业号账号信息
*/
- public WeixinProxy(TokenHolder tokenHolder) {
+ public WeixinProxy(TokenStorager tokenStorager, WeixinAccount weixinAccount) {
+ TokenHolder tokenHolder = new TokenHolder(new WeixinTokenCreator(
+ weixinAccount), tokenStorager);
this.partyApi = new PartyApi(tokenHolder);
this.userApi = new UserApi(tokenHolder);
this.tagApi = new TagApi(tokenHolder);
diff --git a/weixin4j-qy/src/test/java/com/foxinmy/weixin4j/qy/test/TokenTest.java b/weixin4j-qy/src/test/java/com/foxinmy/weixin4j/qy/test/TokenTest.java
index 2353c3c1..9b86f857 100644
--- a/weixin4j-qy/src/test/java/com/foxinmy/weixin4j/qy/test/TokenTest.java
+++ b/weixin4j-qy/src/test/java/com/foxinmy/weixin4j/qy/test/TokenTest.java
@@ -6,7 +6,7 @@ import org.junit.Test;
import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.qy.token.WeixinTokenCreator;
-import com.foxinmy.weixin4j.token.FileTokenHolder;
+import com.foxinmy.weixin4j.token.FileTokenStorager;
import com.foxinmy.weixin4j.token.TokenHolder;
/**
@@ -23,8 +23,8 @@ public class TokenTest {
@Before
public void setUp() {
- tokenHolder = new FileTokenHolder(
- new WeixinTokenCreator());
+ tokenHolder = new TokenHolder(new WeixinTokenCreator(),
+ new FileTokenStorager());
}
@Test