diff --git a/README.md b/README.md
index f17c8713..09710d29 100644
--- a/README.md
+++ b/README.md
@@ -220,8 +220,16 @@ netty的代码没有放到maven中心仓库,也没什么意义,因为最终需
+ **weixin4j-qy**: 新增批量删除员工接口
+* 2015-01-10
+
+ + **weixin4j-base**: 重构token实现机制
+
接下来
------
+* 公众号数据分析接口
+
+* 公众号服务应用
+
* 企业号第三方应用
* 微信小店
diff --git a/weixin4j-base/README.md b/weixin4j-base/README.md
index 6eae5023..b73c984e 100644
--- a/weixin4j-base/README.md
+++ b/weixin4j-base/README.md
@@ -41,4 +41,8 @@ weixin4j-base
* 2015-01-04
- + ConfigUtil类新增获取classpath目录下的资源路径的方法
\ No newline at end of file
+ + ConfigUtil类新增获取classpath目录下的资源路径的方法
+
+* 2015-01-10
+
+ + 重构token实现机制
\ No newline at end of file
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/HttpRequest.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/HttpRequest.java
index 4195c36c..f68f1d20 100644
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/HttpRequest.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/HttpRequest.java
@@ -100,11 +100,16 @@ public class HttpRequest {
StringBuilder sb = new StringBuilder(url);
if (parameters != null && parameters.length > 0) {
if (url.indexOf("?") < 0) {
- sb.append(String.format("?%s=%s", parameters[0].getName(),
- parameters[0].getValue()));
+ sb.append("?");
+ } else {
+ sb.append("&");
}
- for (int i = 0; i < parameters.length; i++) {
- sb.append(parameters[i].toGetPara());
+ sb.append(String.format("%s=%s", parameters[0].getName(),
+ parameters[0].getValue()));
+ if (parameters.length > 1) {
+ for (int i = 1; i < parameters.length; i++) {
+ sb.append(parameters[i].toGetPara());
+ }
}
}
return doRequest(new HttpGet(sb.toString()));
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/Token.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/Token.java
index 826cea92..29530f30 100644
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/Token.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/Token.java
@@ -3,7 +3,6 @@ package com.foxinmy.weixin4j.model;
import java.io.Serializable;
import com.alibaba.fastjson.annotation.JSONField;
-import com.thoughtworks.xstream.annotations.XStreamAlias;
/**
* access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token,正常情况下access_token有效期为7200秒,
@@ -15,19 +14,27 @@ import com.thoughtworks.xstream.annotations.XStreamAlias;
* @since JDK 1.7
* @see 微信公众平台获取token
- * @see 微信企业号的主动模式
+ * @see 微信企业号的主动模式
*/
-@XStreamAlias("app-token")
public class Token implements Serializable {
-
+
private static final long serialVersionUID = -7564855472419104084L;
-
+
@JSONField(name = "access_token")
private String accessToken;
@JSONField(name = "expires_in")
private int expiresIn;
private long time;
+ public Token() {
+
+ }
+
+ public Token(String accessToken) {
+ this.accessToken = accessToken;
+ }
+
public String getAccessToken() {
return accessToken;
}
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/AbstractTokenHolder.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/AbstractTokenHolder.java
deleted file mode 100644
index 14d889f0..00000000
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/AbstractTokenHolder.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.foxinmy.weixin4j.token;
-
-import com.foxinmy.weixin4j.http.HttpRequest;
-import com.foxinmy.weixin4j.model.WeixinAccount;
-import com.foxinmy.weixin4j.type.AccountType;
-import com.foxinmy.weixin4j.util.ConfigUtil;
-
-/**
- * 获取weixin.properties中的id&secret信息
- *
- * @className AbstractTokenHolder
- * @author jy
- * @date 2014年10月6日
- * @since JDK 1.7
- * @see
- */
-public abstract class AbstractTokenHolder implements TokenHolder {
-
- protected final HttpRequest request = new HttpRequest();
- protected final WeixinAccount weixinAccount;
-
- public AbstractTokenHolder(AccountType accountType) {
- this.weixinAccount = ConfigUtil
- .getWeixinAccount(accountType.getClazz());
- }
-
- public AbstractTokenHolder(WeixinAccount weixinAccount) {
- this.weixinAccount = weixinAccount;
- }
-
- public WeixinAccount getAccount() {
- return weixinAccount;
- }
-}
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
index ae1ed794..d0a01ed4 100644
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/FileTokenHolder.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/FileTokenHolder.java
@@ -1,87 +1,67 @@
-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 org.apache.commons.lang3.StringUtils;
-
-import com.alibaba.fastjson.TypeReference;
-import com.foxinmy.weixin4j.exception.WeixinException;
-import com.foxinmy.weixin4j.http.Response;
-import com.foxinmy.weixin4j.model.Token;
-import com.foxinmy.weixin4j.model.WeixinAccount;
-import com.foxinmy.weixin4j.type.AccountType;
-import com.foxinmy.weixin4j.util.ConfigUtil;
-import com.foxinmy.weixin4j.xml.XmlStream;
-
-/**
- * 基于文件保存的Token获取类
- *
- * @className FileTokenHolder
- * @author jy.hu
- * @date 2014年9月27日
- * @since JDK 1.7
- * @see 微信公众平台获取token说明
- * @see 微信企业号获取token说明
- * @see com.foxinmy.weixin4j.model.Token
- */
-public class FileTokenHolder extends AbstractTokenHolder {
-
- public FileTokenHolder(AccountType accountType) {
- super(accountType);
- }
-
- public FileTokenHolder(WeixinAccount weixinAccount) {
- super(weixinAccount);
- }
-
- /**
- * 获取token
- *
- * 正常情况下返回{"access_token":"ACCESS_TOKEN","expires_in":7200},否则抛出异常.
- *
- *
- * @return token对象
- * @throws WeixinException
- * @see 获取token说明
- * @see com.foxinmy.weixin4j.model.Token
- */
- @Override
- public Token getToken() throws WeixinException {
- String id = weixinAccount.getId();
- if (StringUtils.isBlank(id)
- || StringUtils.isBlank(weixinAccount.getSecret())) {
- throw new IllegalArgumentException("id or secret not be null!");
- }
- File token_file = new File(String.format("%s/token_%s.xml",
- ConfigUtil.getValue("token_path"), id));
- Token token = null;
- Calendar ca = Calendar.getInstance();
- long now_time = ca.getTimeInMillis();
- try {
- if (token_file.exists()) {
- token = XmlStream.get(new FileInputStream(token_file),
- Token.class);
- long expire_time = token.getTime()
- + (token.getExpiresIn() * 1000) - 2;
- if (expire_time > now_time) {
- return token;
- }
- }
- Response response = request.get(weixinAccount.getTokenUrl());
- token = response.getAsObject(new TypeReference() {
- });
- token.setTime(now_time);
- XmlStream.to(token, new FileOutputStream(token_file));
- } catch (IOException e) {
- throw new WeixinException(e.getMessage());
- }
- return token;
- }
-}
+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.thoughtworks.xstream.XStream;
+
+/**
+ * 用FILE保存TOKEN
+ *
+ * @className FileTokenHolder
+ * @author jy
+ * @date 2015年1月9日
+ * @since JDK 1.7
+ * @see com.foxinmy.weixin4j.token.TokenCreator
+ * @see com.foxinmy.weixin4j.token.WeixinTokenCreator
+ */
+public class FileTokenHolder implements TokenHolder {
+ private final XStream xstream;
+ private final String tokenPath;
+ private final TokenCreator tokenCretor;
+
+ public FileTokenHolder(TokenCreator tokenCretor) {
+ this(ConfigUtil.getValue("token_path"), tokenCretor);
+ }
+
+ public FileTokenHolder(String tokenPath, TokenCreator tokenCretor) {
+ this.tokenPath = tokenPath;
+ this.tokenCretor = tokenCretor;
+ xstream = new XStream();
+ xstream.ignoreUnknownElements();
+ xstream.autodetectAnnotations(true);
+ xstream.alias("xml", Token.class);
+ xstream.processAnnotations(Token.class);
+ }
+
+ @Override
+ public Token getToken() throws WeixinException {
+ File token_file = new File(String.format("%s/%s.xml", tokenPath,
+ tokenCretor.getCacheKey()));
+ Token token = null;
+ Calendar ca = Calendar.getInstance();
+ long now_time = ca.getTimeInMillis();
+ try {
+ if (token_file.exists()) {
+ token = (Token) xstream
+ .fromXML(new FileInputStream(token_file));
+ long expire_time = token.getTime()
+ + (token.getExpiresIn() * 1000) - 2;
+ if (expire_time > now_time) {
+ return token;
+ }
+ }
+ token = tokenCretor.createToken();
+ xstream.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/RedisTokenHolder.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/RedisTokenHolder.java
index ca26c599..0260abd5 100644
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/RedisTokenHolder.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/RedisTokenHolder.java
@@ -1,96 +1,81 @@
-package com.foxinmy.weixin4j.token;
-
-import java.util.Calendar;
-
-import org.apache.commons.lang3.StringUtils;
-
-import redis.clients.jedis.Jedis;
-import redis.clients.jedis.JedisPool;
-import redis.clients.jedis.JedisPoolConfig;
-import redis.clients.jedis.exceptions.JedisException;
-
-import com.alibaba.fastjson.TypeReference;
-import com.foxinmy.weixin4j.exception.WeixinException;
-import com.foxinmy.weixin4j.model.Token;
-import com.foxinmy.weixin4j.model.WeixinAccount;
-import com.foxinmy.weixin4j.type.AccountType;
-
-/**
- * 基于redis保存的Token获取类
- *
- * @className RedisTokenHolder
- * @author jy.hu
- * @date 2014年9月27日
- * @since JDK 1.7
- * @see 微信公众平台获取token说明
- * @see 微信企业号获取token说明
- * @see com.foxinmy.weixin4j.model.Token
- */
-public class RedisTokenHolder extends AbstractTokenHolder {
-
- private JedisPool jedisPool;
-
- private void createPool(String host, int port) {
- JedisPoolConfig poolConfig = new JedisPoolConfig();
- poolConfig.setMaxTotal(50);
- poolConfig.setMaxIdle(5);
- poolConfig.setMaxWaitMillis(2000);
- poolConfig.setTestOnBorrow(false);
- poolConfig.setTestOnReturn(true);
- this.jedisPool = new JedisPool(poolConfig, host, port);
- }
-
- public RedisTokenHolder(String host, int port, AccountType accountType) {
- super(accountType);
- createPool(host, port);
- }
-
- public RedisTokenHolder(AccountType accountType) {
- this("localhost", 6379, accountType);
- }
-
- public RedisTokenHolder(WeixinAccount weixinAccount) {
- this("localhost", 6379, weixinAccount);
- }
-
- public RedisTokenHolder(String host, int port, WeixinAccount weixinAccount) {
- super(weixinAccount);
- createPool(host, port);
- }
-
- @Override
- public Token getToken() throws WeixinException {
- String id = weixinAccount.getId();
- if (StringUtils.isBlank(id)
- || StringUtils.isBlank(weixinAccount.getSecret())) {
- throw new IllegalArgumentException("id or secret not be null!");
- }
- Token token = null;
- Jedis jedis = null;
- try {
- jedis = jedisPool.getResource();
- Calendar now = Calendar.getInstance();
- String key = String.format("token:%s", id);
- String accessToken = jedis.get(key);
- if (StringUtils.isBlank(accessToken)) {
- token = request.get(weixinAccount.getTokenUrl()).getAsObject(
- new TypeReference() {
- });
- jedis.setex(key, token.getExpiresIn(),
- token.getAccessToken());
- token.setTime(now.getTimeInMillis());
- } else {
- token = new Token();
- token.setAccessToken(accessToken);
- }
- } catch (JedisException e) {
- jedisPool.returnBrokenResource(jedis);
- } finally {
- jedisPool.returnResource(jedis);
- }
- return token;
- }
-}
\ No newline at end of file
+package com.foxinmy.weixin4j.token;
+
+import org.apache.commons.lang3.StringUtils;
+
+import redis.clients.jedis.Jedis;
+import redis.clients.jedis.JedisPool;
+import redis.clients.jedis.JedisPoolConfig;
+import redis.clients.jedis.exceptions.JedisException;
+
+import com.foxinmy.weixin4j.exception.WeixinException;
+import com.foxinmy.weixin4j.model.Token;
+
+/**
+ * 用REDIS保存TOKEN
+ *
+ * @className RedisTokenHolder
+ * @author jy
+ * @date 2015年1月9日
+ * @since JDK 1.7
+ * @see com.foxinmy.weixin4j.token.TokenCreator
+ * @see com.foxinmy.weixin4j.token.WeixinTokenCreator
+ */
+public class RedisTokenHolder implements TokenHolder {
+
+ private JedisPool jedisPool;
+ private final TokenCreator tokenCretor;
+
+ 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 RedisTokenHolder(TokenCreator tokenCretor) {
+ this("localhost", 6379, tokenCretor);
+ }
+
+ public RedisTokenHolder(String host, int port, TokenCreator tokenCretor) {
+ 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);
+ this.tokenCretor = tokenCretor;
+ }
+
+ public RedisTokenHolder(String host, int port,
+ JedisPoolConfig jedisPoolConfig, TokenCreator tokenCretor) {
+ this(new JedisPool(jedisPoolConfig, host, port), tokenCretor);
+ }
+
+ public RedisTokenHolder(JedisPool jedisPool, TokenCreator tokenCretor) {
+ this.jedisPool = jedisPool;
+ this.tokenCretor = tokenCretor;
+ }
+
+ @Override
+ public Token getToken() throws WeixinException {
+ Token token = null;
+ Jedis jedis = null;
+ try {
+ jedis = jedisPool.getResource();
+ String cacheKey = tokenCretor.getCacheKey();
+ String accessToken = jedis.get(cacheKey);
+ if (StringUtils.isBlank(accessToken)) {
+ token = tokenCretor.createToken();
+ jedis.setex(cacheKey, (int) token.getExpiresIn(),
+ token.getAccessToken());
+ } else {
+ token = new Token(accessToken);
+ }
+ } catch (JedisException e) {
+ jedisPool.returnBrokenResource(jedis);
+ } finally {
+ jedisPool.returnResource(jedis);
+ }
+ return token;
+ }
+}
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
new file mode 100644
index 00000000..721c55b8
--- /dev/null
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/TokenCreator.java
@@ -0,0 +1,30 @@
+package com.foxinmy.weixin4j.token;
+
+import com.foxinmy.weixin4j.exception.WeixinException;
+import com.foxinmy.weixin4j.model.Token;
+
+/**
+ * TOKEN创建者
+ *
+ * @className TokenCreator
+ * @author jy
+ * @date 2015年1月10日
+ * @since JDK 1.7
+ * @see
+ */
+public interface TokenCreator {
+ /**
+ * 返回缓存KEY的名称
+ *
+ * @return
+ */
+ public String getCacheKey();
+
+ /**
+ * 创建token
+ *
+ * @return
+ * @throws MeetException
+ */
+ public Token createToken() throws WeixinException;
+}
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 094a5242..5fda84b5 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
@@ -2,21 +2,18 @@ package com.foxinmy.weixin4j.token;
import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.model.Token;
-import com.foxinmy.weixin4j.model.WeixinAccount;
/**
- * 获取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.AbstractTokenHolder
* @see com.foxinmy.weixin4j.token.FileTokenHolder
* @see com.foxinmy.weixin4j.token.RedisTokenHolder
*/
public interface TokenHolder {
- public WeixinAccount getAccount();
public Token getToken() throws WeixinException;
}
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/WeixinTokenCreator.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/WeixinTokenCreator.java
new file mode 100644
index 00000000..242439ba
--- /dev/null
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/WeixinTokenCreator.java
@@ -0,0 +1,52 @@
+package com.foxinmy.weixin4j.token;
+
+import com.alibaba.fastjson.TypeReference;
+import com.foxinmy.weixin4j.exception.WeixinException;
+import com.foxinmy.weixin4j.http.HttpRequest;
+import com.foxinmy.weixin4j.http.Response;
+import com.foxinmy.weixin4j.model.Token;
+import com.foxinmy.weixin4j.model.WeixinAccount;
+import com.foxinmy.weixin4j.type.AccountType;
+import com.foxinmy.weixin4j.util.ConfigUtil;
+
+/**
+ * 微信TOKEN创建者
+ *
+ * @className WeixinTokenCreator
+ * @author jy
+ * @date 2015年1月10日
+ * @since JDK 1.7
+ * @see 微信公众平台获取token说明
+ * @see 微信企业号获取token说明
+ * @see com.foxinmy.weixin4j.model.Token
+ */
+public class WeixinTokenCreator implements TokenCreator {
+
+ private final HttpRequest request;
+ private final WeixinAccount weixinAccount;
+
+ public WeixinTokenCreator(AccountType accountType) {
+ this(ConfigUtil.getWeixinAccount(accountType.getClazz()));
+ }
+
+ public WeixinTokenCreator(WeixinAccount weixinAccount) {
+ this.request = new HttpRequest();
+ this.weixinAccount = weixinAccount;
+ }
+
+ @Override
+ public String getCacheKey() {
+ return weixinAccount.getId();
+ }
+
+ @Override
+ public Token createToken() throws WeixinException {
+ Response response = request.get(weixinAccount.getTokenUrl());
+ Token token = response.getAsObject(new TypeReference() {
+ });
+ token.setTime(System.currentTimeMillis());
+ return token;
+ }
+}
diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/WeixinPayProxy.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/WeixinPayProxy.java
index 5bde1cc4..97357524 100644
--- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/WeixinPayProxy.java
+++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/WeixinPayProxy.java
@@ -15,9 +15,6 @@ import com.foxinmy.weixin4j.mp.type.BillType;
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.TokenHolder;
-import com.foxinmy.weixin4j.type.AccountType;
import com.foxinmy.weixin4j.util.ConfigUtil;
/**
@@ -35,11 +32,8 @@ public class WeixinPayProxy {
private final Pay2Api pay2Api;
private final Pay3Api pay3Api;
- /**
- * 默认采用文件存放Token信息
- */
public WeixinPayProxy() {
- this(new FileTokenHolder(AccountType.MP));
+ this(ConfigUtil.getWeixinMpAccount());
}
/**
@@ -49,18 +43,9 @@ public class WeixinPayProxy {
* 微信账户
*/
public WeixinPayProxy(WeixinMpAccount weixinAccount) {
- this(new FileTokenHolder(weixinAccount));
- }
-
- /**
- * TokenHolder对象
- *
- * @param tokenHolder
- */
- public WeixinPayProxy(TokenHolder tokenHolder) {
- this.pay2Api = new Pay2Api(tokenHolder);
- this.pay3Api = new Pay3Api(tokenHolder);
- int version = ((WeixinMpAccount) tokenHolder.getAccount()).getVersion();
+ this.pay2Api = new Pay2Api(weixinAccount);
+ this.pay3Api = new Pay3Api(weixinAccount);
+ int version = weixinAccount.getVersion();
if (version == 2) {
this.payApi = this.pay2Api;
} else if (version == 3) {
diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/WeixinProxy.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/WeixinProxy.java
index eb3412b3..98cc2500 100644
--- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/WeixinProxy.java
+++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/WeixinProxy.java
@@ -37,6 +37,7 @@ import com.foxinmy.weixin4j.msg.model.MpArticle;
import com.foxinmy.weixin4j.msg.model.Video;
import com.foxinmy.weixin4j.token.FileTokenHolder;
import com.foxinmy.weixin4j.token.TokenHolder;
+import com.foxinmy.weixin4j.token.WeixinTokenCreator;
import com.foxinmy.weixin4j.type.AccountType;
import com.foxinmy.weixin4j.type.MediaType;
@@ -66,7 +67,7 @@ public class WeixinProxy {
* 默认采用文件存放Token信息
*/
public WeixinProxy() {
- this(new FileTokenHolder(AccountType.MP));
+ this(new FileTokenHolder(new WeixinTokenCreator(AccountType.MP)));
}
/**
@@ -87,7 +88,7 @@ public class WeixinProxy {
* 微信账户
*/
public WeixinProxy(WeixinMpAccount weixinAccount) {
- this(new FileTokenHolder(weixinAccount));
+ this(new FileTokenHolder(new WeixinTokenCreator(weixinAccount)));
}
/**
@@ -544,8 +545,9 @@ public class WeixinProxy {
* @see com.foxinmy.weixin4j.mp.model.OauthToken
* @see com.foxinmy.weixin4j.mp.api.UserApi
*/
- public OauthToken getOauthToken(String code) throws WeixinException {
- return userApi.getOauthToken(code);
+ public OauthToken getOauthToken(String code, String appid, String appsecret)
+ throws WeixinException {
+ return userApi.getOauthToken(code, appid, appsecret);
}
/**
diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/HelperApi.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/HelperApi.java
index ea64a49c..2b9d1b4a 100644
--- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/HelperApi.java
+++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/HelperApi.java
@@ -8,7 +8,6 @@ import com.alibaba.fastjson.TypeReference;
import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.http.Response;
import com.foxinmy.weixin4j.model.Token;
-import com.foxinmy.weixin4j.model.WeixinMpAccount;
import com.foxinmy.weixin4j.mp.model.SemQuery;
import com.foxinmy.weixin4j.mp.model.SemResult;
import com.foxinmy.weixin4j.token.TokenHolder;
@@ -33,7 +32,8 @@ public class HelperApi extends MpApi {
/**
* 长链接转短链接
*
- * @param url 待转换的链接
+ * @param url
+ * 待转换的链接
* @return 短链接
* @throws WeixinException
* @see () {
});
}
diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/Pay3Api.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/Pay3Api.java
index fea847ab..d1bc2227 100644
--- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/Pay3Api.java
+++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/Pay3Api.java
@@ -28,6 +28,7 @@ import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.http.Response;
import com.foxinmy.weixin4j.http.SSLHttpRequest;
import com.foxinmy.weixin4j.http.XmlResult;
+import com.foxinmy.weixin4j.model.WeixinMpAccount;
import com.foxinmy.weixin4j.mp.payment.PayUtil;
import com.foxinmy.weixin4j.mp.payment.RefundConverter;
import com.foxinmy.weixin4j.mp.payment.v3.ApiResult;
@@ -38,7 +39,6 @@ import com.foxinmy.weixin4j.mp.type.BillType;
import com.foxinmy.weixin4j.mp.type.IdQuery;
import com.foxinmy.weixin4j.mp.type.IdType;
import com.foxinmy.weixin4j.mp.util.ExcelUtil;
-import com.foxinmy.weixin4j.token.TokenHolder;
import com.foxinmy.weixin4j.util.ConfigUtil;
import com.foxinmy.weixin4j.util.DateUtil;
import com.foxinmy.weixin4j.util.RandomUtil;
@@ -54,8 +54,8 @@ import com.foxinmy.weixin4j.util.RandomUtil;
*/
public class Pay3Api extends PayApi {
- public Pay3Api(TokenHolder tokenHolder) {
- super(tokenHolder);
+ public Pay3Api(WeixinMpAccount weixinAccount) {
+ super(weixinAccount);
}
/**
diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/PayApi.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/PayApi.java
index de207017..54623b56 100644
--- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/PayApi.java
+++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/PayApi.java
@@ -16,7 +16,9 @@ import com.foxinmy.weixin4j.mp.payment.v3.ApiResult;
import com.foxinmy.weixin4j.mp.type.BillType;
import com.foxinmy.weixin4j.mp.type.IdQuery;
import com.foxinmy.weixin4j.mp.type.SignType;
+import com.foxinmy.weixin4j.token.FileTokenHolder;
import com.foxinmy.weixin4j.token.TokenHolder;
+import com.foxinmy.weixin4j.token.WeixinTokenCreator;
import com.foxinmy.weixin4j.util.DateUtil;
/**
@@ -30,12 +32,13 @@ import com.foxinmy.weixin4j.util.DateUtil;
* @see com.foxinmy.weixin4j.mp.api.Pay3Api
*/
public abstract class PayApi extends MpApi {
+
protected final TokenHolder tokenHolder;
protected final WeixinMpAccount weixinAccount;
-
- public PayApi(TokenHolder tokenHolder) {
- this.tokenHolder = tokenHolder;
- this.weixinAccount = (WeixinMpAccount) tokenHolder.getAccount();
+ public PayApi(WeixinMpAccount weixinAccount) {
+ this.weixinAccount = weixinAccount;
+ this.tokenHolder = new FileTokenHolder(new WeixinTokenCreator(
+ weixinAccount));
}
/**
diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/UserApi.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/UserApi.java
index 57ae327b..47de3342 100644
--- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/UserApi.java
+++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/UserApi.java
@@ -10,7 +10,6 @@ import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.http.JsonResult;
import com.foxinmy.weixin4j.http.Response;
import com.foxinmy.weixin4j.model.Token;
-import com.foxinmy.weixin4j.model.WeixinAccount;
import com.foxinmy.weixin4j.mp.model.Following;
import com.foxinmy.weixin4j.mp.model.OauthToken;
import com.foxinmy.weixin4j.mp.model.User;
@@ -39,17 +38,19 @@ public class UserApi extends MpApi {
*
* @param code
* 用户授权后返回的code
+ * @param appid
+ * @param appsecret
* @return token对象
* @throws WeixinException
* @see 获取用户token
* @see com.foxinmy.weixin4j.mp.model.OauthToken
*/
- public OauthToken getOauthToken(String code) throws WeixinException {
- WeixinAccount weixinAccount = tokenHolder.getAccount();
+ public OauthToken getOauthToken(String code, String appid, String appsecret)
+ throws WeixinException {
String user_token_uri = getRequestUri("sns_user_token_uri");
- Response response = request.get(String.format(user_token_uri,
- weixinAccount.getId(), weixinAccount.getSecret(), code));
+ Response response = request.get(String.format(user_token_uri, appid,
+ appsecret, code));
return response.getAsObject(new TypeReference() {
});
diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/resources/weixin.properties b/weixin4j-mp/weixin4j-mp-api/src/main/resources/weixin.properties
index e4de9fe9..e0f29edb 100644
--- a/weixin4j-mp/weixin4j-mp-api/src/main/resources/weixin.properties
+++ b/weixin4j-mp/weixin4j-mp-api/src/main/resources/weixin.properties
@@ -20,4 +20,4 @@ bill_path=/tmp/weixin/bill
# ca\u8bc1\u4e66\u5b58\u653e\u7684\u5b8c\u6574\u8def\u5f84 (V2\u7248\u672c\u540e\u7f00\u4e3a*.pfx,V3\u7248\u672c\u540e\u7f00\u4e3a*.p12)
ca_file=/tmp/weixin/xxxxx.p12
# classpath\u8def\u5f84\u4e0b\u53ef\u4ee5\u8fd9\u4e48\u5199
-ca_file=classpath:xxxxx.pfx
\ No newline at end of file
+# ca_file=classpath:xxxxx.pfx
\ No newline at end of file
diff --git a/weixin4j-mp/weixin4j-mp-api/src/test/java/com/foxinmy/weixin4j/mp/test/TokenTest.java b/weixin4j-mp/weixin4j-mp-api/src/test/java/com/foxinmy/weixin4j/mp/test/TokenTest.java
index 3de54ff7..f239b160 100644
--- a/weixin4j-mp/weixin4j-mp-api/src/test/java/com/foxinmy/weixin4j/mp/test/TokenTest.java
+++ b/weixin4j-mp/weixin4j-mp-api/src/test/java/com/foxinmy/weixin4j/mp/test/TokenTest.java
@@ -7,6 +7,7 @@ import org.junit.Test;
import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.token.FileTokenHolder;
import com.foxinmy.weixin4j.token.TokenHolder;
+import com.foxinmy.weixin4j.token.WeixinTokenCreator;
import com.foxinmy.weixin4j.type.AccountType;
/**
@@ -23,7 +24,7 @@ public class TokenTest {
@Before
public void setUp() {
- tokenHolder = new FileTokenHolder(AccountType.MP);
+ tokenHolder = new FileTokenHolder(new WeixinTokenCreator(AccountType.MP));
}
@Test
diff --git a/weixin4j-mp/weixin4j-mp-server/src/main/resources/weixin.properties b/weixin4j-mp/weixin4j-mp-server/src/main/resources/weixin.properties
index 6bdf07b9..45c2a87a 100644
--- a/weixin4j-mp/weixin4j-mp-server/src/main/resources/weixin.properties
+++ b/weixin4j-mp/weixin4j-mp-server/src/main/resources/weixin.properties
@@ -16,5 +16,7 @@ qr_path=/tmp/weixin/qr
media_path=/tmp/weixin/media
# \u5bf9\u8d26\u5355\u4fdd\u5b58\u8def\u5f84
bill_path=/tmp/weixin/bill
-# ca\u8bc1\u4e66\u5b58\u653e\u7684\u5b8c\u6574\u8def\u5f84
-ca_file=/tmp/weixin/xxxxx.p12 | xxxxx.pfx
\ No newline at end of file
+# ca\u8bc1\u4e66\u5b58\u653e\u7684\u5b8c\u6574\u8def\u5f84 (V2\u7248\u672c\u540e\u7f00\u4e3a*.pfx,V3\u7248\u672c\u540e\u7f00\u4e3a*.p12)
+ca_file=/tmp/weixin/xxxxx.p12
+# classpath\u8def\u5f84\u4e0b\u53ef\u4ee5\u8fd9\u4e48\u5199
+# ca_file=classpath:xxxxx.pfx
\ No newline at end of file
diff --git a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/WeixinProxy.java b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/WeixinProxy.java
index 674029e6..72ccaf81 100644
--- a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/WeixinProxy.java
+++ b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/WeixinProxy.java
@@ -15,6 +15,7 @@ import com.foxinmy.weixin4j.qy.model.User;
import com.foxinmy.weixin4j.qy.type.UserStatus;
import com.foxinmy.weixin4j.token.FileTokenHolder;
import com.foxinmy.weixin4j.token.TokenHolder;
+import com.foxinmy.weixin4j.token.WeixinTokenCreator;
import com.foxinmy.weixin4j.type.AccountType;
/**
@@ -36,7 +37,7 @@ public class WeixinProxy {
* 默认采用文件存放Token信息
*/
public WeixinProxy() {
- this(new FileTokenHolder(AccountType.QY));
+ this(new FileTokenHolder(new WeixinTokenCreator(AccountType.QY)));
}
/**
@@ -55,7 +56,7 @@ public class WeixinProxy {
* @param weixinAccount
*/
public WeixinProxy(WeixinQyAccount weixinAccount) {
- this(new FileTokenHolder(weixinAccount));
+ this(new FileTokenHolder(new WeixinTokenCreator(weixinAccount)));
}
/**
diff --git a/weixin4j-qy/weixin4j-qy-api/src/test/java/com/foxinmy/weixin4j/qy/test/TokenTest.java b/weixin4j-qy/weixin4j-qy-api/src/test/java/com/foxinmy/weixin4j/qy/test/TokenTest.java
index 354058d9..f747f231 100644
--- a/weixin4j-qy/weixin4j-qy-api/src/test/java/com/foxinmy/weixin4j/qy/test/TokenTest.java
+++ b/weixin4j-qy/weixin4j-qy-api/src/test/java/com/foxinmy/weixin4j/qy/test/TokenTest.java
@@ -7,6 +7,7 @@ import org.junit.Test;
import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.token.FileTokenHolder;
import com.foxinmy.weixin4j.token.TokenHolder;
+import com.foxinmy.weixin4j.token.WeixinTokenCreator;
import com.foxinmy.weixin4j.type.AccountType;
/**
@@ -23,7 +24,8 @@ public class TokenTest {
@Before
public void setUp() {
- tokenHolder = new FileTokenHolder(AccountType.QY);
+ tokenHolder = new FileTokenHolder(
+ new WeixinTokenCreator(AccountType.QY));
}
@Test