From 766b8da3cb45ac0f7ced0df4ba6b94b08e20f69f Mon Sep 17 00:00:00 2001 From: "jy.hu" Date: Sat, 10 Jan 2015 23:19:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9EJSTICKET=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 + weixin4j-base/README.md | 4 +- .../com/foxinmy/weixin4j/model/Consts.java | 1 + .../foxinmy/weixin4j/model/WeixinAccount.java | 4 +- .../weixin4j/model/WeixinMpAccount.java | 14 +++-- .../weixin4j/model/WeixinQyAccount.java | 12 +++-- .../weixin4j/token/WeixinJSTicketCreator.java | 53 +++++++++++++++++++ .../weixin4j/token/WeixinTokenCreator.java | 26 ++++++--- .../com/foxinmy/weixin4j/mp/WeixinProxy.java | 16 +----- .../com/foxinmy/weixin4j/mp/api/PayApi.java | 3 +- .../foxinmy/weixin4j/mp/api/weixin.properties | 4 +- .../com/foxinmy/weixin4j/qy/WeixinProxy.java | 13 +---- 12 files changed, 108 insertions(+), 44 deletions(-) create mode 100644 weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/WeixinJSTicketCreator.java 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))); } /**