From ef5fb006f0dfaa206d1c271c15ff1c2a2f79b8c1 Mon Sep 17 00:00:00 2001 From: jinyu Date: Thu, 10 Dec 2015 14:27:30 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8F=AF=E9=80=89[RedisToken?= =?UTF-8?q?Storager&=E6=B7=BB=E5=8A=A0=E7=BC=93=E5=AD=98token=E6=97=B6?= =?UTF-8?q?=E7=9A=84=E5=89=8D=E7=BC=80wx?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGE.md | 7 ++ weixin4j-base/pom.xml | 6 ++ .../java/com/foxinmy/weixin4j/token/README.md | 2 +- .../weixin4j/token/RedisTokenStorager.java | 86 +++++++++++++++++++ .../foxinmy/weixin4j/token/TokenCreator.java | 2 +- weixin4j-mp/README.md | 2 +- .../mp/token/WeixinJSTicketCreator.java | 2 +- .../weixin4j/mp/token/WeixinTokenCreator.java | 2 +- .../foxinmy/weixin4j/mp/test/MediaTest.java | 2 +- weixin4j-qy/README.md | 2 +- .../qy/suite/WeixinSuitePreCodeCreator.java | 2 +- .../qy/suite/WeixinSuiteTokenCreator.java | 2 +- .../qy/suite/WeixinTokenSuiteCreator.java | 2 +- .../qy/token/WeixinJSTicketCreator.java | 2 +- .../qy/token/WeixinProviderTokenCreator.java | 2 +- .../weixin4j/qy/token/WeixinTokenCreator.java | 2 +- 16 files changed, 112 insertions(+), 13 deletions(-) create mode 100644 weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/RedisTokenStorager.java 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