diff --git a/CHANGE.md b/CHANGE.md
index 50266a34..c68ba180 100644
--- a/CHANGE.md
+++ b/CHANGE.md
@@ -533,3 +533,10 @@
+ weixin4j-base:调整Pay3Api退款方法名为 refundApply
+ weixin4j-base:调整Pay3Api#refundApply参数个数
+
+
+* 2015-12-10
+
+ + 添加可选[RedisTokenStorager](weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/RedisTokenStorager.java)
+
+ + 添加缓存token时的前缀`wx`
diff --git a/weixin4j-base/pom.xml b/weixin4j-base/pom.xml
index ab37f6c4..a6d33301 100644
--- a/weixin4j-base/pom.xml
+++ b/weixin4j-base/pom.xml
@@ -35,5 +35,11 @@
4.0.30.Final
true
+
+ redis.clients
+ jedis
+ 2.6.0
+ true
+
\ No newline at end of file
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 2ec69554..901dd211 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
@@ -8,4 +8,4 @@
* FileTokenStorager 是系统默认的token存储策略实现
-* RedisTokenStorager 如果服务器支持redis,推荐使用(需要自己添加jar包和[java类](https://github.com/foxinmy/weixin4j/wiki/%E7%94%A8redis%E4%BF%9D%E5%AD%98token))
+* RedisTokenStorager 如果服务器支持redis,推荐使用(需要自己添加jedis包)
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/RedisTokenStorager.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/RedisTokenStorager.java
new file mode 100644
index 00000000..9790e43d
--- /dev/null
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/RedisTokenStorager.java
@@ -0,0 +1,86 @@
+package com.foxinmy.weixin4j.token;
+
+import redis.clients.jedis.Jedis;
+import redis.clients.jedis.JedisPool;
+import redis.clients.jedis.JedisPoolConfig;
+
+import com.foxinmy.weixin4j.exception.WeixinException;
+import com.foxinmy.weixin4j.model.Token;
+import com.foxinmy.weixin4j.util.StringUtil;
+
+/**
+ * 用REDIS保存TOKEN
+ *
+ * @className RedisTokenStorager
+ * @author jy
+ * @date 2015年1月9日
+ * @since JDK 1.6
+ */
+public class RedisTokenStorager implements TokenStorager {
+
+ private JedisPool jedisPool;
+
+ public final static int MAX_TOTAL = 50;
+ public final static int MAX_IDLE = 5;
+ public final static int MAX_WAIT_MILLIS = 2000;
+ public final static boolean TEST_ON_BORROW = false;
+ public final static boolean TEST_ON_RETURN = true;
+
+ public RedisTokenStorager() {
+ this("localhost", 6379);
+ }
+
+ public RedisTokenStorager(String host, int port) {
+ JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
+ jedisPoolConfig.setMaxTotal(MAX_TOTAL);
+ jedisPoolConfig.setMaxIdle(MAX_IDLE);
+ jedisPoolConfig.setMaxWaitMillis(MAX_WAIT_MILLIS);
+ jedisPoolConfig.setTestOnBorrow(TEST_ON_BORROW);
+ jedisPoolConfig.setTestOnReturn(TEST_ON_RETURN);
+ this.jedisPool = new JedisPool(jedisPoolConfig, host, port);
+ }
+
+ public RedisTokenStorager(String host, int port,
+ JedisPoolConfig jedisPoolConfig) {
+ this(new JedisPool(jedisPoolConfig, host, port));
+ }
+
+ public RedisTokenStorager(JedisPool jedisPool) {
+ this.jedisPool = jedisPool;
+ }
+
+ @Override
+ public Token lookup(String cacheKey) throws WeixinException {
+ Jedis jedis = null;
+ try {
+ jedis = jedisPool.getResource();
+ String accessToken = jedis.get(cacheKey);
+ if (!StringUtil.isBlank(accessToken)) {
+ return new Token(accessToken);
+ }
+ } finally {
+ if (jedis != null) {
+ jedis.close();
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public void caching(String cacheKey, Token token) throws WeixinException {
+ Jedis jedis = null;
+ try {
+ jedis = jedisPool.getResource();
+ if (token.getExpiresIn() > 0) {
+ jedis.setex(cacheKey, (int) token.getExpiresIn(),
+ token.getAccessToken());
+ } else {
+ jedis.set(cacheKey, token.getAccessToken());
+ }
+ } finally {
+ if (jedis != null) {
+ jedis.close();
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/TokenCreator.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/TokenCreator.java
index bfc18dab..2cd263eb 100644
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/TokenCreator.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/TokenCreator.java
@@ -24,7 +24,7 @@ public interface TokenCreator {
* 创建token
*
* @return
- * @throws MeetException
+ * @throws WeixinException
*/
public Token createToken() throws WeixinException;
}
diff --git a/weixin4j-mp/README.md b/weixin4j-mp/README.md
index fddc2460..65d06c02 100644
--- a/weixin4j-mp/README.md
+++ b/weixin4j-mp/README.md
@@ -96,7 +96,7 @@ weixin4j.properties说明
// weixinPayProxy = new WeixinPayProxy(weixinAccount);
weixinPayProxy.orderQuery(idQuery);
-> 针对`token`存储有两种方案,`File存储`/`Redis存储`,当然也可自己实现`TokenStorager`,默认使用文件(xml)的方式保存token,如果环境中支持`redis`,建议使用[RedisTokenStorager](https://github.com/foxinmy/weixin4j/wiki/%E7%94%A8redis%E4%BF%9D%E5%AD%98token).
+> 针对`token`存储有两种方案,`File存储`/`Redis存储`,当然也可自己实现`TokenStorager`,默认使用文件(xml)的方式保存token,如果环境中支持`redis`,建议使用[RedisTokenStorager](../weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/RedisTokenStorager.java).
>
> WeixinProxy weixinProxy = new WeixinProxy(new RedisTokenStorager());
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/token/WeixinJSTicketCreator.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/token/WeixinJSTicketCreator.java
index 950eccdb..de4c5049 100644
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/token/WeixinJSTicketCreator.java
+++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/token/WeixinJSTicketCreator.java
@@ -42,7 +42,7 @@ public class WeixinJSTicketCreator implements TokenCreator {
@Override
public String getCacheKey() {
- return String.format("mp_jsticket_%s", appid);
+ return String.format("wx_mp_jsticket_%s", appid);
}
@Override
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/token/WeixinTokenCreator.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/token/WeixinTokenCreator.java
index 3c336263..7f7d8dc3 100644
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/token/WeixinTokenCreator.java
+++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/token/WeixinTokenCreator.java
@@ -40,7 +40,7 @@ public class WeixinTokenCreator implements TokenCreator {
@Override
public String getCacheKey() {
- return String.format("mp_token_%s", appid);
+ return String.format("wx_mp_token_%s", appid);
}
@Override
diff --git a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/MediaTest.java b/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/MediaTest.java
index 7399eea4..871c8cb6 100644
--- a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/MediaTest.java
+++ b/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/MediaTest.java
@@ -55,7 +55,7 @@ public class MediaTest extends TokenTest {
@Test
public void download1() throws WeixinException, IOException {
MediaDownloadResult content = mediaApi.downloadMedia(
- "V4GvAetzQQjj_ECx1Siqvccgm80a32tk1gRusOBYMk8Uouybl-CwSkGk8w7wKgvI", false);
+ "nD05mhmkW-SHVS8NfWSxdzJi-6VnVF5YSP5hmMWnKJUxLK5czAWtN4NhVmgEfVoe", false);
Assert.assertTrue(content != null);
System.err.println(content);
}
diff --git a/weixin4j-qy/README.md b/weixin4j-qy/README.md
index b4a71ee3..0db7ab31 100644
--- a/weixin4j-qy/README.md
+++ b/weixin4j-qy/README.md
@@ -100,7 +100,7 @@ weixin4j.properties说明
//weixinSuiteProxy = new WeixinSuiteProxy(suiteId,suiteSecret);
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).
+> 针对`token`存储有两种方案,`File存储`/`Redis存储`,当然也可自己实现`TokenStorager`,默认使用文件(xml)的方式保存token,如果环境中支持`redis`,建议使用[RedisTokenStorager](../weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/RedisTokenStorager.java).
> WeixinProxy weixinProxy = new WeixinProxy(new RedisTokenStorager());
diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/suite/WeixinSuitePreCodeCreator.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/suite/WeixinSuitePreCodeCreator.java
index b43ccf18..91433461 100644
--- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/suite/WeixinSuitePreCodeCreator.java
+++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/suite/WeixinSuitePreCodeCreator.java
@@ -42,7 +42,7 @@ public class WeixinSuitePreCodeCreator implements TokenCreator {
@Override
public String getCacheKey() {
- return String.format("qy_suite_precode_%s", suiteId);
+ return String.format("wx_qy_suite_precode_%s", suiteId);
}
@Override
diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/suite/WeixinSuiteTokenCreator.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/suite/WeixinSuiteTokenCreator.java
index 672e5b9b..4bffeabd 100644
--- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/suite/WeixinSuiteTokenCreator.java
+++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/suite/WeixinSuiteTokenCreator.java
@@ -36,7 +36,7 @@ public class WeixinSuiteTokenCreator implements TokenCreator {
@Override
public String getCacheKey() {
- return String.format("qy_suite_token_%s", ticketHolder.getSuiteId());
+ return String.format("wx_qy_suite_token_%s", ticketHolder.getSuiteId());
}
@Override
diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/suite/WeixinTokenSuiteCreator.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/suite/WeixinTokenSuiteCreator.java
index 7ed7f724..3f8a2630 100644
--- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/suite/WeixinTokenSuiteCreator.java
+++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/suite/WeixinTokenSuiteCreator.java
@@ -42,7 +42,7 @@ public class WeixinTokenSuiteCreator implements TokenCreator {
@Override
public String getCacheKey() {
- return String.format("qy_token_suite_%s:%s",
+ return String.format("wx_qy_token_suite_%s:%s",
perCodeHolder.getSuiteId(), perCodeHolder.getAuthCorpId()
);
diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/token/WeixinJSTicketCreator.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/token/WeixinJSTicketCreator.java
index 69b486dd..4148afad 100644
--- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/token/WeixinJSTicketCreator.java
+++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/token/WeixinJSTicketCreator.java
@@ -41,7 +41,7 @@ public class WeixinJSTicketCreator implements TokenCreator {
@Override
public String getCacheKey() {
- return String.format("qy_jsticket_%s", corpid);
+ return String.format("wx_qy_jsticket_%s", corpid);
}
@Override
diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/token/WeixinProviderTokenCreator.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/token/WeixinProviderTokenCreator.java
index cffccb2e..358e7017 100644
--- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/token/WeixinProviderTokenCreator.java
+++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/token/WeixinProviderTokenCreator.java
@@ -40,7 +40,7 @@ public class WeixinProviderTokenCreator implements TokenCreator {
@Override
public String getCacheKey() {
- return String.format("qy_provider_token_%s", corpid);
+ return String.format("wx_qy_provider_token_%s", corpid);
}
@Override
diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/token/WeixinTokenCreator.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/token/WeixinTokenCreator.java
index f6efa611..1a43ea0e 100644
--- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/token/WeixinTokenCreator.java
+++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/token/WeixinTokenCreator.java
@@ -40,7 +40,7 @@ public class WeixinTokenCreator implements TokenCreator {
@Override
public String getCacheKey() {
- return String.format("qy_token_%s", corpid);
+ return String.format("wx_qy_token_%s", corpid);
}
@Override