diff --git a/README.md b/README.md
index 09710d29..520181d3 100644
--- a/README.md
+++ b/README.md
@@ -224,6 +224,8 @@ netty的代码没有放到maven中心仓库,也没什么意义,因为最终需
+ **weixin4j-base**: 重构token实现机制
+ + **weixin4j-base**: 新增JSTICKET支持
+
接下来
------
* 公众号数据分析接口
diff --git a/weixin4j-base/README.md b/weixin4j-base/README.md
index b73c984e..ac8d0013 100644
--- a/weixin4j-base/README.md
+++ b/weixin4j-base/README.md
@@ -45,4 +45,6 @@ weixin4j-base
* 2015-01-10
- + 重构token实现机制
\ No newline at end of file
+ + 重构token实现机制
+
+ + 新增JSTICKET支持
\ No newline at end of file
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/Consts.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/Consts.java
index 3e8ddc15..2495e080 100644
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/Consts.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/Consts.java
@@ -27,6 +27,7 @@ public final class Consts {
public static final String OAUTH_AUTHORIZE_URL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=%s&state=%s#wechat_redirect";
public static final String MP_ASSESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s";
public static final String QY_ASSESS_TOKEN_URL = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s";
+ public static final String JS_TICKET_URL = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=%s&type=jsapi";
public static final String UNIFIEDORDER = "https://api.mch.weixin.qq.com/pay/unifiedorder";
public static final String MICROPAYURL = "https://api.mch.weixin.qq.com/pay/micropay";
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/WeixinAccount.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/WeixinAccount.java
index 4060288d..7cb6654a 100644
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/WeixinAccount.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/WeixinAccount.java
@@ -6,6 +6,8 @@ import java.net.URLEncoder;
import org.apache.commons.lang3.StringUtils;
+import com.foxinmy.weixin4j.type.AccountType;
+
/**
* 微信账号信息
*
@@ -26,7 +28,7 @@ public abstract class WeixinAccount implements Serializable {
// 安全模式下的加密密钥
private String encodingAesKey;
- public abstract String getTokenUrl();
+ public abstract AccountType getAccountType();
public WeixinAccount() {
}
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/WeixinMpAccount.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/WeixinMpAccount.java
index 645f85f2..b5fde1a2 100644
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/WeixinMpAccount.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/WeixinMpAccount.java
@@ -2,6 +2,9 @@ package com.foxinmy.weixin4j.model;
import org.apache.commons.lang3.StringUtils;
+import com.alibaba.fastjson.annotation.JSONField;
+import com.foxinmy.weixin4j.type.AccountType;
+
/**
* 微信公众平台信息
*
@@ -31,11 +34,6 @@ public class WeixinMpAccount extends WeixinAccount {
// 微信支付版本号(如果无则按照mchId来做判断)
private int version;
- @Override
- public String getTokenUrl() {
- return String.format(Consts.MP_ASSESS_TOKEN_URL, getId(), getSecret());
- }
-
public String getOpenId() {
return openId;
}
@@ -135,6 +133,12 @@ public class WeixinMpAccount extends WeixinAccount {
this.partnerKey = partnerKey;
}
+ @Override
+ @JSONField(deserialize = false)
+ public AccountType getAccountType() {
+ return AccountType.MP;
+ }
+
@Override
public String toString() {
return "WeixinMpAccount [openId=" + openId + ", paySignKey="
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/WeixinQyAccount.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/WeixinQyAccount.java
index 80916578..9a4d51b1 100644
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/WeixinQyAccount.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/WeixinQyAccount.java
@@ -1,5 +1,8 @@
package com.foxinmy.weixin4j.model;
+import com.alibaba.fastjson.annotation.JSONField;
+import com.foxinmy.weixin4j.type.AccountType;
+
/**
* 微信企业号信息
*
@@ -8,8 +11,8 @@ package com.foxinmy.weixin4j.model;
* @date 2014年11月18日
* @since JDK 1.7
* @see 企业号设置
+ * "https://qy.weixin.qq.com/cgi-bin/home?lang=zh_CN&token=685923034#setting"
+ * >企业号设置
*/
public class WeixinQyAccount extends WeixinAccount {
private static final long serialVersionUID = 3689999353867189585L;
@@ -22,8 +25,9 @@ public class WeixinQyAccount extends WeixinAccount {
}
@Override
- public String getTokenUrl() {
- return String.format(Consts.QY_ASSESS_TOKEN_URL, getId(), getSecret());
+ @JSONField(deserialize = false)
+ public AccountType getAccountType() {
+ return AccountType.QY;
}
@Override
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/WeixinJSTicketCreator.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/WeixinJSTicketCreator.java
new file mode 100644
index 00000000..3a96599f
--- /dev/null
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/WeixinJSTicketCreator.java
@@ -0,0 +1,53 @@
+package com.foxinmy.weixin4j.token;
+
+import com.alibaba.fastjson.JSONObject;
+import com.foxinmy.weixin4j.exception.WeixinException;
+import com.foxinmy.weixin4j.http.HttpRequest;
+import com.foxinmy.weixin4j.http.Response;
+import com.foxinmy.weixin4j.model.Consts;
+import com.foxinmy.weixin4j.model.Token;
+
+/**
+ * 微信JSTICKET创建者
+ *
+ * @className WeixinJSTicketCreator
+ * @author jy
+ * @date 2015年1月10日
+ * @since JDK 1.7
+ * @see JS
+ * TICKET
+ */
+public class WeixinJSTicketCreator implements TokenCreator {
+
+ private final String appid;
+ private final TokenHolder weixinTokenHolder;
+ private final HttpRequest request;
+
+ /**
+ * 公众平台的access_token
+ *
+ * @param weixinTokenHolder
+ */
+ public WeixinJSTicketCreator(String appid, TokenHolder weixinTokenHolder) {
+ this.appid = appid;
+ this.weixinTokenHolder = weixinTokenHolder;
+ this.request = new HttpRequest();
+ }
+
+ @Override
+ public String getCacheKey() {
+ return String.format("%s_jskey", appid);
+ }
+
+ @Override
+ public Token createToken() throws WeixinException {
+ Response response = request.get(String.format(Consts.JS_TICKET_URL,
+ weixinTokenHolder.getToken().getAccessToken()));
+ JSONObject result = response.getAsJson();
+ Token token = new Token(result.getString("ticket"));
+ token.setExpiresIn(result.getIntValue("expires_in"));
+ token.setTime(System.currentTimeMillis());
+ return token;
+ }
+}
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
index 242439ba..ee81f673 100644
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/WeixinTokenCreator.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/WeixinTokenCreator.java
@@ -4,6 +4,7 @@ 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.Consts;
import com.foxinmy.weixin4j.model.Token;
import com.foxinmy.weixin4j.model.WeixinAccount;
import com.foxinmy.weixin4j.type.AccountType;
@@ -25,25 +26,38 @@ import com.foxinmy.weixin4j.util.ConfigUtil;
public class WeixinTokenCreator implements TokenCreator {
private final HttpRequest request;
- private final WeixinAccount weixinAccount;
+ private final String id;
+ private final String secret;
+ private final AccountType accountType;
public WeixinTokenCreator(AccountType accountType) {
- this(ConfigUtil.getWeixinAccount(accountType.getClazz()));
+ WeixinAccount weixinAccount = ConfigUtil.getWeixinAccount(accountType
+ .getClazz());
+ this.id = weixinAccount.getId();
+ this.secret = weixinAccount.getSecret();
+ this.accountType = accountType;
+ this.request = new HttpRequest();
}
- public WeixinTokenCreator(WeixinAccount weixinAccount) {
+ public WeixinTokenCreator(String id, String secret, AccountType accountType) {
+ this.id = id;
+ this.secret = secret;
+ this.accountType = accountType;
this.request = new HttpRequest();
- this.weixinAccount = weixinAccount;
}
@Override
public String getCacheKey() {
- return weixinAccount.getId();
+ return String.format("%s_%s", accountType.name(), id);
}
@Override
public Token createToken() throws WeixinException {
- Response response = request.get(weixinAccount.getTokenUrl());
+ String tokenUrl = String.format(Consts.MP_ASSESS_TOKEN_URL, id, secret);
+ if (accountType == AccountType.QY) {
+ tokenUrl = String.format(Consts.QY_ASSESS_TOKEN_URL, id, secret);
+ }
+ Response response = request.get(tokenUrl);
Token token = response.getAsObject(new TypeReference() {
});
token.setTime(System.currentTimeMillis());
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 98cc2500..b2cb195f 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
@@ -8,7 +8,6 @@ import java.util.List;
import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.http.JsonResult;
import com.foxinmy.weixin4j.model.Button;
-import com.foxinmy.weixin4j.model.WeixinMpAccount;
import com.foxinmy.weixin4j.mp.api.CustomApi;
import com.foxinmy.weixin4j.mp.api.GroupApi;
import com.foxinmy.weixin4j.mp.api.HelperApi;
@@ -71,24 +70,13 @@ public class WeixinProxy {
}
/**
- * appid,appsecret
- * 将无法调用支付相关接口
*
* @param appid
* @param appsecret
*/
public WeixinProxy(String appid, String appsecret) {
- this(new WeixinMpAccount(appid, appsecret));
- }
-
- /**
- * WeixinAccount对象
- *
- * @param weixinAccount
- * 微信账户
- */
- public WeixinProxy(WeixinMpAccount weixinAccount) {
- this(new FileTokenHolder(new WeixinTokenCreator(weixinAccount)));
+ this(new FileTokenHolder(new WeixinTokenCreator(appid, appsecret,
+ AccountType.MP)));
}
/**
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 54623b56..be911367 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
@@ -35,10 +35,11 @@ public abstract class PayApi extends MpApi {
protected final TokenHolder tokenHolder;
protected final WeixinMpAccount weixinAccount;
+
public PayApi(WeixinMpAccount weixinAccount) {
this.weixinAccount = weixinAccount;
this.tokenHolder = new FileTokenHolder(new WeixinTokenCreator(
- weixinAccount));
+ weixinAccount.getAccountType()));
}
/**
diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/weixin.properties b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/weixin.properties
index 068e62a3..04a497a2 100644
--- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/weixin.properties
+++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/weixin.properties
@@ -124,9 +124,11 @@ micropay_uri={mch_base_url}/pay/micropay
# \u63a5\u53e3\u4e0a\u62a5
pay_report_uri={mch_base_url}/payitil/report
-
# \u7edf\u4e00\u8ba2\u5355\u751f\u6210
unifiedorder_uri={mch_base_url}/pay/unifiedorder
# native\u652f\u4ed8\u94fe\u63a5
nativepay_v2_uri=weixin://wxpay/bizpayurl?sign=%s&appid=%s&productid=%s×tamp=%s&noncestr=%s
nativepay_v3_uri=weixin://wxpay/bizpayurl?sign=%s&appid=%s&mch_id=%s&product_id=%s&time_stamp=%s&nonce_str=%s
+
+# \u83b7\u53d6\u7528\u6237\u589e\u51cf\u6570\u636e
+datacube_getusersummary_uri={api_base_url}/datacube/getusersummary?access_token=%s
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 72ccaf81..06181cfd 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
@@ -4,7 +4,6 @@ import java.util.List;
import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.http.JsonResult;
-import com.foxinmy.weixin4j.model.WeixinQyAccount;
import com.foxinmy.weixin4j.qy.api.DepartApi;
import com.foxinmy.weixin4j.qy.api.HelperApi;
import com.foxinmy.weixin4j.qy.api.TagApi;
@@ -47,16 +46,8 @@ public class WeixinProxy {
* @param corpsecret
*/
public WeixinProxy(String corpid, String corpsecret) {
- this(new WeixinQyAccount(corpid, corpsecret));
- }
-
- /**
- * WeixinAccount对象
- *
- * @param weixinAccount
- */
- public WeixinProxy(WeixinQyAccount weixinAccount) {
- this(new FileTokenHolder(new WeixinTokenCreator(weixinAccount)));
+ this(new FileTokenHolder(new WeixinTokenCreator(corpid, corpsecret,
+ AccountType.QY)));
}
/**