();
+ String timestamp = DateUtil.timestamp2string();
+ String noncestr = RandomUtil.generateString(24);
+ signMap.put("timestamp", timestamp);
+ signMap.put("noncestr", noncestr);
+ signMap.put("jsapi_ticket", this.ticketTokenHolder.getAccessToken());
+ signMap.put("url", url);
+ String sign = DigestUtil.SHA1(MapUtil
+ .toJoinString(signMap, false, true));
+ if (StringUtil.isBlank(config.getString("appId"))) {
+ config.put("appId", Weixin4jConfigUtil.getWeixinAccount().getId());
+ }
+ if (StringUtil.isBlank(config.getString("debug"))) {
+ config.put("debug", false);
+ }
+ if (apis.isEmpty()) {
+ throw new WeixinException("jsapilist not be empty");
+ }
+ config.put("timestamp", timestamp);
+ config.put("noncestr", noncestr);
+ config.put("signature", sign);
+ config.put("jsApiList", apis.toArray());
+ return config.toJSONString();
+ }
+}
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/WeixinProxy.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/WeixinProxy.java
index d8be9897..59487827 100644
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/WeixinProxy.java
+++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/WeixinProxy.java
@@ -42,6 +42,7 @@ import com.foxinmy.weixin4j.mp.model.QRResult;
import com.foxinmy.weixin4j.mp.model.SemQuery;
import com.foxinmy.weixin4j.mp.model.SemResult;
import com.foxinmy.weixin4j.mp.model.User;
+import com.foxinmy.weixin4j.mp.token.WeixinJSTicketCreator;
import com.foxinmy.weixin4j.mp.token.WeixinTokenCreator;
import com.foxinmy.weixin4j.mp.type.DatacubeType;
import com.foxinmy.weixin4j.mp.type.IndustryType;
@@ -78,6 +79,7 @@ public class WeixinProxy {
private final DataApi dataApi;
private final TokenHolder tokenHolder;
+ private String appId;
/**
* 默认使用文件方式保存token、使用weixin4j.properties配置的账号信息
@@ -115,15 +117,16 @@ public class WeixinProxy {
TokenStorager tokenStorager) {
this(new TokenHolder(new WeixinTokenCreator(appid, appsecret),
tokenStorager));
+ this.appId = appid;
}
/**
* 注意:TokenCreator 需为 WeixinTokenCreator
*
- * @see com.foxinmy.weixin4j.mp.token.WeixinTokenCreator.WeixinTokenCreator
+ * @see com.foxinmy.weixin4j.mp.token.WeixinTokenCreator
* @param tokenHolder
*/
- public WeixinProxy(TokenHolder tokenHolder) {
+ private WeixinProxy(TokenHolder tokenHolder) {
this.tokenHolder = tokenHolder;
this.mediaApi = new MediaApi(tokenHolder);
this.notifyApi = new NotifyApi(tokenHolder);
@@ -138,10 +141,34 @@ public class WeixinProxy {
this.dataApi = new DataApi(tokenHolder);
}
+ /**
+ * 获取appid
+ *
+ * @return
+ */
+ public String getAppId() {
+ return this.appId;
+ }
+
+ /**
+ * token获取
+ *
+ * @return
+ */
public TokenHolder getTokenHolder() {
return this.tokenHolder;
}
+ /**
+ * 获取JSSDK的tokenHolder
+ *
+ * @return
+ */
+ public TokenHolder getJSTicketHolder() {
+ return new TokenHolder(new WeixinJSTicketCreator(this.appId,
+ this.tokenHolder), this.tokenHolder.getTokenStorager());
+ }
+
/**
* 上传图文消息内的图片获取URL
* 请注意,本接口所上传的图片不占用公众号的素材库中图片数量的5000个的限制。图片仅支持jpg/png格式,大小必须在1MB以下。
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/MenuApi.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/MenuApi.java
index 5cb3de18..a0a952be 100644
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/MenuApi.java
+++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/MenuApi.java
@@ -58,7 +58,7 @@ public class MenuApi extends MpApi {
private JsonResult createMenu0(String url, JSONObject data)
throws WeixinException {
WeixinResponse response = weixinExecutor.post(
- String.format(url, "h5hb64iP9mBzt0rK6DW1OuOpE066F6iQXmHUqJ83fxTHkDaA0tNOjMMuUrWGwAves4Vi5bfwPKdp3IVhCsZCOHhsX74GXnrTtMg_oFPgiUwSXEhAIABGN"),
+ String.format(url, tokenHolder.getAccessToken()),
JSON.toJSONString(data, new NameFilter() {
@Override
public String process(Object object, String name,
@@ -129,8 +129,8 @@ public class MenuApi extends MpApi {
for (int i = 0; i < menuObjs.size(); i++) {
menuObj = menuObjs.getJSONObject(i);
menus.add(new Menu(menuObj.getString("menuid"),
- buttonsConvertor(menuObj),
- menuObj.getObject("matchrule", MenuMatchRule.class)));
+ buttonsConvertor(menuObj), menuObj.getObject(
+ "matchrule", MenuMatchRule.class)));
}
}
return menus;
diff --git a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/MenuTest.java b/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/MenuTest.java
index a2e92cdc..65bc42c6 100644
--- a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/MenuTest.java
+++ b/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/MenuTest.java
@@ -45,7 +45,11 @@ public class MenuTest extends TokenTest {
Button button = new Button("小哥介绍", domain, ButtonType.view);
button.pushSub(new Button(
"小哥介绍",
- "http://mp.weixin.qq.com/s?__biz=MzI2MTA5OTM4OQ==&mid=400990970&idx=1&sn=5c7fd72e782c49f7c933b91c63eddc80#rd",
+ "http://x.eqxiu.com/s/89oy462U",
+ ButtonType.view));
+ button.pushSub(new Button(
+ "小哥官网",
+ "http://www.jdxiaoge.com",
ButtonType.view));
button.pushSub(new Button("兴趣部落", "http://buluo.qq.com/p/barindex.html?from=share&bid=282651", ButtonType.view));
button.pushSub(new Button("服务流程", "FLOW", ButtonType.click));
diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinProxy.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinProxy.java
index dd9c8740..b6e53fa0 100644
--- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinProxy.java
+++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinProxy.java
@@ -39,6 +39,7 @@ import com.foxinmy.weixin4j.qy.model.IdParameter;
import com.foxinmy.weixin4j.qy.model.Party;
import com.foxinmy.weixin4j.qy.model.Tag;
import com.foxinmy.weixin4j.qy.model.User;
+import com.foxinmy.weixin4j.qy.suite.WeixinTokenSuiteCreator;
import com.foxinmy.weixin4j.qy.token.WeixinTokenCreator;
import com.foxinmy.weixin4j.qy.type.ChatType;
import com.foxinmy.weixin4j.qy.type.InviteType;
@@ -71,6 +72,7 @@ public class WeixinProxy {
private final ChatApi chatApi;
private final TokenHolder tokenHolder;
+ private String corpId;
/**
* 默认使用文件方式保存token、使用weixin4j.properties配置的账号信息
@@ -113,6 +115,21 @@ public class WeixinProxy {
TokenStorager tokenStorager) {
this(new TokenHolder(new WeixinTokenCreator(corpid, corpsecret),
tokenStorager));
+ this.corpId = corpid;
+ }
+
+ /**
+ * 第三方套件(永久授权码机制)
+ *
+ * @param tokenCreator
+ * 微信企业号token创建(永久授权码)
+ * @param tokenStorager
+ * token存储
+ */
+ public WeixinProxy(WeixinTokenSuiteCreator tokenCreator,
+ TokenStorager tokenStorager) {
+ this(new TokenHolder(tokenCreator, tokenStorager));
+ this.corpId = tokenCreator.getAuthCorpId();
}
/**
@@ -121,7 +138,7 @@ public class WeixinProxy {
* @see com.foxinmy.weixin4j.qy.token.WeixinTokenCreator.WeixinTokenCreator
* @param tokenHolder
*/
- public WeixinProxy(TokenHolder tokenHolder) {
+ private WeixinProxy(TokenHolder tokenHolder) {
this.tokenHolder = tokenHolder;
this.partyApi = new PartyApi(tokenHolder);
this.userApi = new UserApi(tokenHolder);
@@ -135,10 +152,27 @@ public class WeixinProxy {
this.chatApi = new ChatApi(tokenHolder);
}
+ /**
+ * token获取
+ *
+ * @return
+ */
public TokenHolder getTokenHolder() {
return this.tokenHolder;
}
+ /**
+ * 获取JSSDK的tokenHolder
+ *
+ * @return
+ */
+ public TokenHolder getJSTicketHolder() {
+ return new TokenHolder(
+ new com.foxinmy.weixin4j.qy.token.WeixinJSTicketCreator(
+ this.corpId, this.tokenHolder),
+ this.tokenHolder.getTokenStorager());
+ }
+
/**
* 发送客服消息(需要管理员对应用有使用权限,对收件人touser、toparty、totag有查看权限,否则本次调用失败)
*
diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/SuiteApi.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/SuiteApi.java
index 4a3ed25e..41295396 100644
--- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/SuiteApi.java
+++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/SuiteApi.java
@@ -6,6 +6,7 @@ import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.http.weixin.JsonResult;
import com.foxinmy.weixin4j.http.weixin.WeixinResponse;
import com.foxinmy.weixin4j.model.Token;
+import com.foxinmy.weixin4j.qy.WeixinProxy;
import com.foxinmy.weixin4j.qy.model.AgentInfo;
import com.foxinmy.weixin4j.qy.model.AgentSetter;
import com.foxinmy.weixin4j.qy.model.OUserInfo;
@@ -65,7 +66,7 @@ public class SuiteApi extends QyApi {
*
* @return
*/
- public TokenHolder getTokenHolder() {
+ public TokenHolder getSuiteTokenHolder() {
return this.suiteTokenHolder;
}
@@ -107,12 +108,25 @@ public class SuiteApi extends QyApi {
* 授权方corpid
* @return 企业号token
*/
- public TokenHolder createTokenHolder(String authCorpId) {
+ public TokenHolder getTokenSuiteHolder(String authCorpId) {
return new TokenHolder(new WeixinTokenSuiteCreator(
getPerCodeHolder(authCorpId), suiteTokenHolder),
suiteTicketHolder.getTokenStorager());
}
+ /**
+ * 创建WeixinProxy对象
+ *
+ * @param authCorpId
+ * 已授权的corpid
+ * @return
+ */
+ public WeixinProxy getWeixinProxy(String authCorpId) {
+ return new WeixinProxy(new WeixinTokenSuiteCreator(
+ getPerCodeHolder(authCorpId), suiteTokenHolder),
+ suiteTicketHolder.getTokenStorager());
+ }
+
/**
* 设置套件授权配置:如果需要对某次授权进行配置,则调用本接口,目前仅可以设置哪些应用可以授权,不调用则默认允许所有应用进行授权。
*
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 3f8a2630..0ea26519 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
@@ -63,4 +63,13 @@ public class WeixinTokenSuiteCreator implements TokenCreator {
token.setTime(System.currentTimeMillis());
return token;
}
+
+ /**
+ * 获取授权放的corpid
+ *
+ * @return
+ */
+ public String getAuthCorpId() {
+ return this.perCodeHolder.getAuthCorpId();
+ }
}