diff --git a/README.md b/README.md
index 17bc11a8..4248af0a 100644
--- a/README.md
+++ b/README.md
@@ -146,6 +146,10 @@ https://github.com/foxinmy/weixin4j/releases
+ **weixin4j-base**: 将Action跟Mapping基础类并入到项目
+ **weixin4j-qy**: 新增netty服务与消息分发
+
+* 2014-11-27
+
+ + **weixin-base**: 将BaseApi移入
接下来
------
diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/BaseApi.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/BaseApi.java
similarity index 81%
rename from weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/BaseApi.java
rename to weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/BaseApi.java
index 6248698a..800fee52 100644
--- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/BaseApi.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/BaseApi.java
@@ -1,4 +1,4 @@
-package com.foxinmy.weixin4j.mp.api;
+package com.foxinmy.weixin4j.api;
import java.util.Map;
import java.util.ResourceBundle;
@@ -12,20 +12,19 @@ import com.thoughtworks.xstream.core.ClassLoaderReference;
import com.thoughtworks.xstream.mapper.DefaultMapper;
/**
- *
+ * API基础
* @className BaseApi
* @author jy.hu
* @date 2014年9月26日
* @since JDK 1.7
- * @see api文档
+ * @see 微信公众平台API文档
+ * @see 微信企业号API文档
*/
public class BaseApi {
protected final HttpRequest request = new HttpRequest();
protected final static XStream mapXstream = XStream.get();
- private final static ResourceBundle weixinBundle;
+ protected static ResourceBundle weixinBundle;
static {
- weixinBundle = ResourceBundle
- .getBundle("com/foxinmy/weixin4j/mp/api/weixin");
mapXstream.alias("xml", Map.class);
mapXstream.registerConverter(new Map2ObjectConverter(new DefaultMapper(
new ClassLoaderReference(XStream.class.getClassLoader()))));
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 636eeca8..9e0901ce 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
@@ -12,6 +12,7 @@ public final class Consts {
public static final String PROTOCOL_FILE = "file";
public static final String PROTOCOL_JAR = "jar";
+ 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";
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 ad29b88d..e8a749a4 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
@@ -1,6 +1,10 @@
package com.foxinmy.weixin4j.model;
import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+
+import org.apache.commons.lang3.StringUtils;
/**
* 微信账号信息
@@ -64,6 +68,39 @@ public abstract class WeixinAccount implements Serializable {
this.encodingAesKey = encodingAesKey;
}
+ /**
+ * 拼接授权URL
+ *
+ * @param redirectUri
+ * 授权后重定向的回调链接地址
+ * @param scope
+ * 应用授权作用域,snsapi_base
+ * (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo
+ * (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息)
+ * @param state
+ * 重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值
+ * @return 授权URL
+ */
+ public String getOauthAuthorizeUrl(String redirectUri, String scope,
+ String state) {
+ if (StringUtils.isBlank(scope)) {
+ scope = "snsapi_base";
+ }
+ if (StringUtils.isBlank(state)) {
+ state = "STATE";
+ }
+ try {
+ return String.format(
+ Consts.OAUTH_AUTHORIZE_URL,
+ URLEncoder.encode(redirectUri,
+ org.apache.http.Consts.UTF_8.name()), id, scope,
+ state);
+ } catch (UnsupportedEncodingException ignore) {
+ ;
+ }
+ return "";
+ }
+
@Override
public String toString() {
return "WeixinAccount [id=" + id + ", secret=" + secret + ", token="
diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/CustomApi.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/CustomApi.java
index 32e2441e..96f3c1c5 100644
--- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/CustomApi.java
+++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/CustomApi.java
@@ -21,7 +21,7 @@ import com.foxinmy.weixin4j.token.TokenHolder;
* @since JDK 1.7
* @see 多客服说明
*/
-public class CustomApi extends BaseApi {
+public class CustomApi extends MpApi {
private final TokenHolder tokenHolder;
diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/GroupApi.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/GroupApi.java
index 0606ebdf..bd4220ed 100644
--- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/GroupApi.java
+++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/GroupApi.java
@@ -21,7 +21,7 @@ import com.foxinmy.weixin4j.token.TokenHolder;
* BB%84%E7%AE%A1%E7%90%86%E6%8E%A5%E5%8F%A3">分组接口
* @see com.foxinmy.weixin4j.mp.model.Group
*/
-public class GroupApi extends BaseApi {
+public class GroupApi extends MpApi {
private final TokenHolder tokenHolder;
public GroupApi(TokenHolder tokenHolder) {
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 b65a2569..b09de179 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
@@ -22,7 +22,7 @@ import com.foxinmy.weixin4j.token.TokenHolder;
* @since JDK 1.7
* @see
*/
-public class HelperApi extends BaseApi {
+public class HelperApi extends MpApi {
private final TokenHolder tokenHolder;
diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/MassApi.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/MassApi.java
index 61009a2c..0eb85dc5 100644
--- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/MassApi.java
+++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/MassApi.java
@@ -29,7 +29,7 @@ import com.foxinmy.weixin4j.token.TokenHolder;
* href="http://mp.weixin.qq.com/wiki/index.php?title=%E9%AB%98%E7%BA%A7%E7%BE%A4%E5%8F%91%E6%8E%A5%E5%8F%A3">群发接口
* @see com.foxinmy.weixin4j.msg.model.MpArticle
*/
-public class MassApi extends BaseApi {
+public class MassApi extends MpApi {
private final TokenHolder tokenHolder;
diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/MediaApi.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/MediaApi.java
index a835d470..2856a4e9 100644
--- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/MediaApi.java
+++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/MediaApi.java
@@ -29,7 +29,7 @@ import com.foxinmy.weixin4j.util.IOUtil;
* href="http://mp.weixin.qq.com/wiki/index.php?title=%E4%B8%8A%E4%BC%A0%E4%B8%8B%E8%BD%BD%E5%A4%9A%E5%AA%92%E4%BD%93%E6%96%87%E4%BB%B6">上传多媒体文件
* @see com.foxinmy.weixin4j.type.MediaType
*/
-public class MediaApi extends BaseApi {
+public class MediaApi extends MpApi {
private final TokenHolder tokenHolder;
diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/MenuApi.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/MenuApi.java
index cd448044..d46e6478 100644
--- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/MenuApi.java
+++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/MenuApi.java
@@ -20,7 +20,7 @@ import com.foxinmy.weixin4j.token.TokenHolder;
* @since JDK 1.7
* @see com.foxinmy.weixin4j.model.Button
*/
-public class MenuApi extends BaseApi {
+public class MenuApi extends MpApi {
private final TokenHolder tokenHolder;
diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/MpApi.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/MpApi.java
new file mode 100644
index 00000000..a80ff71d
--- /dev/null
+++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/MpApi.java
@@ -0,0 +1,22 @@
+package com.foxinmy.weixin4j.mp.api;
+
+import java.util.ResourceBundle;
+
+import com.foxinmy.weixin4j.api.BaseApi;
+
+/**
+ * 微信公众平台API
+ *
+ * @className MpApi
+ * @author jy.hu
+ * @date 2014年9月26日
+ * @since JDK 1.7
+ * @see com.foxinmy.weixin4j.api.BaseApi
+ * @see api文档
+ */
+public class MpApi extends BaseApi {
+ static {
+ weixinBundle = ResourceBundle
+ .getBundle("com/foxinmy/weixin4j/mp/api/weixin");
+ }
+}
diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/NotifyApi.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/NotifyApi.java
index 34fe64dd..dc48cbe6 100644
--- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/NotifyApi.java
+++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/NotifyApi.java
@@ -19,7 +19,7 @@ import com.foxinmy.weixin4j.token.TokenHolder;
* href="http://mp.weixin.qq.com/wiki/index.php?title=%E5%8F%91%E9%80%81%E5%AE%A2%E6%9C%8D%E6%B6%88%E6%81%AF">客服消息
* @see com.foxinmy.weixin4j.mp.message.NotifyMessage
*/
-public class NotifyApi extends BaseApi {
+public class NotifyApi extends MpApi {
private final TokenHolder tokenHolder;
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 a7deec63..16c239c3 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
@@ -68,7 +68,7 @@ import com.foxinmy.weixin4j.util.RandomUtil;
* @since JDK 1.7
* @see
*/
-public class PayApi extends BaseApi {
+public class PayApi extends MpApi {
private final TokenHolder tokenHolder;
private final WeixinMpAccount weixinAccount;
diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/QrApi.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/QrApi.java
index 42c4c3f3..0f8c3ef0 100644
--- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/QrApi.java
+++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/QrApi.java
@@ -22,7 +22,7 @@ import com.foxinmy.weixin4j.util.ConfigUtil;
* @see 二维码支持
*/
-public class QrApi extends BaseApi {
+public class QrApi extends MpApi {
private final TokenHolder tokenHolder;
diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/TmplApi.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/TmplApi.java
index 4b66d00d..efea9308 100644
--- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/TmplApi.java
+++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/TmplApi.java
@@ -17,7 +17,7 @@ import com.foxinmy.weixin4j.token.TokenHolder;
* @since JDK 1.7
* @see
*/
-public class TmplApi extends BaseApi {
+public class TmplApi extends MpApi {
private final TokenHolder tokenHolder;
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 d172aa8d..355f48a8 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
@@ -25,7 +25,7 @@ import com.foxinmy.weixin4j.token.TokenHolder;
* @since JDK 1.7
* @see com.foxinmy.weixin4j.mp.model.User
*/
-public class UserApi extends BaseApi {
+public class UserApi extends MpApi {
private final TokenHolder tokenHolder;
diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/model/AuthResult.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/model/AuthResult.java
deleted file mode 100644
index d6b01c45..00000000
--- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/model/AuthResult.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package com.foxinmy.weixin4j.mp.model;
-
-import java.io.Serializable;
-
-/**
- * 网页授权结果
- *
- * @className AuthResult
- * @author jy.hu
- * @date 2014年4月8日
- * @since JDK 1.7
- * @see 网页授权获取用户基本资料
- */
-public class AuthResult implements Serializable {
-
- private static final long serialVersionUID = 654855396163854805L;
-
- /**
- * 网页授权获取code
- *
- * @className AuthScope
- * @author jy.hu
- * @date 2014年4月8日
- * @since JDK 1.7
- * @see 获取code
- */
- public enum AuthScope {
- BASE("snsapi_base"), USERINFO("snsapi_userinfo");
-
- private String name;
-
- AuthScope(String name) {
- this.name = name;
- }
-
- public String getName() {
- return name;
- }
- }
-
- public enum AuthCode {
- OK, FAILED, REDIRECT
- }
-
- private AuthCode authCode;
- private String location;
- private OauthToken accessToken;
-
- public AuthResult(String location) {
- this.location = location;
- this.authCode = AuthCode.REDIRECT;
- }
-
- public AuthResult(OauthToken accessToken) {
- this.authCode = AuthCode.OK;
- this.accessToken = accessToken;
- }
-
- public AuthResult(String location, AuthCode authCode) {
- this.location = location;
- this.authCode = authCode;
- }
-
- public AuthCode getAuthCode() {
- return authCode;
- }
-
- public void setAuthCode(AuthCode authCode) {
- this.authCode = authCode;
- }
-
- public String getLocation() {
- return location;
- }
-
- public void setLocation(String location) {
- this.location = location;
- }
-
- public OauthToken getAccessToken() {
- return accessToken;
- }
-
- public void setAccessToken(OauthToken accessToken) {
- this.accessToken = accessToken;
- }
-
- @Override
- public String toString() {
- StringBuilder sb = new StringBuilder();
- sb.append("[AuthResult authCode=").append(authCode);
- sb.append(", location=").append(location);
- sb.append(", accessToken=").append(accessToken).append("]");
- return sb.toString();
- }
-}
diff --git a/weixin4j-mp/weixin4j-mp-api/src/test/java/com/foxinmy/weixin4j/mp/test/UserTest.java b/weixin4j-mp/weixin4j-mp-api/src/test/java/com/foxinmy/weixin4j/mp/test/UserTest.java
index c5966ff3..7f6f2a72 100644
--- a/weixin4j-mp/weixin4j-mp-api/src/test/java/com/foxinmy/weixin4j/mp/test/UserTest.java
+++ b/weixin4j-mp/weixin4j-mp-api/src/test/java/com/foxinmy/weixin4j/mp/test/UserTest.java
@@ -32,6 +32,7 @@ public class UserTest extends TokenTest {
User user = userApi.getUser("owGBft_vbBbOaQOmpEUE4xDLeRSU");
Assert.assertNotNull(user);
System.out.println(user);
+ following();
}
@Test
diff --git a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/BaseApi.java b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/BaseApi.java
deleted file mode 100644
index bbddb79a..00000000
--- a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/BaseApi.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package com.foxinmy.weixin4j.qy.api;
-
-import java.util.Map;
-import java.util.ResourceBundle;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import com.foxinmy.weixin4j.http.HttpRequest;
-import com.foxinmy.weixin4j.xml.Map2ObjectConverter;
-import com.foxinmy.weixin4j.xml.XStream;
-import com.thoughtworks.xstream.core.ClassLoaderReference;
-import com.thoughtworks.xstream.mapper.DefaultMapper;
-
-/**
- *
- * @className BaseApi
- * @author jy.hu
- * @date 2014年11月18日
- * @since JDK 1.7
- * @see api文档
- */
-public class BaseApi {
- protected final HttpRequest request = new HttpRequest();
- protected final static XStream mapXstream = XStream.get();
- private final static ResourceBundle weixinBundle;
- static {
- weixinBundle = ResourceBundle
- .getBundle("com/foxinmy/weixin4j/qy/api/weixin");
- mapXstream.alias("xml", Map.class);
- mapXstream.registerConverter(new Map2ObjectConverter(new DefaultMapper(
- new ClassLoaderReference(XStream.class.getClassLoader()))));
- }
-
- protected String map2xml(Map, ?> map) {
- return mapXstream.toXML(map).replaceAll("__", "_");
- }
-
- @SuppressWarnings("unchecked")
- protected Map xml2map(String xml) {
- return mapXstream.fromXML(xml, Map.class);
- }
-
- protected String getRequestUri(String key) {
- String url = weixinBundle.getString(key);
- Pattern p = Pattern.compile("(\\{[^\\}]*\\})");
- Matcher m = p.matcher(url);
- StringBuffer sb = new StringBuffer();
- String sub = null;
- while (m.find()) {
- sub = m.group();
- m.appendReplacement(sb,
- getRequestUri(sub.substring(1, sub.length() - 1)));
- }
- m.appendTail(sb);
- return sb.toString();
- }
-}
diff --git a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/DepartApi.java b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/DepartApi.java
index 53a3b18f..d42172ea 100644
--- a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/DepartApi.java
+++ b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/DepartApi.java
@@ -22,7 +22,7 @@ import com.foxinmy.weixin4j.token.TokenHolder;
* @see 管理部门说明
*/
-public class DepartApi extends BaseApi {
+public class DepartApi extends QyApi {
private final TokenHolder tokenHolder;
public DepartApi(TokenHolder tokenHolder) {
diff --git a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/MediaApi.java b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/MediaApi.java
index 83409559..d0c5dbd3 100644
--- a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/MediaApi.java
+++ b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/MediaApi.java
@@ -29,7 +29,7 @@ import com.foxinmy.weixin4j.util.IOUtil;
* href="http://qydev.weixin.qq.com/wiki/index.php?title=%E7%AE%A1%E7%90%86%E5%A4%9A%E5%AA%92%E4%BD%93%E6%96%87%E4%BB%B6">管理多媒体文件
* @see com.foxinmy.weixin4j.type.MediaType
*/
-public class MediaApi extends BaseApi {
+public class MediaApi extends QyApi {
private final TokenHolder tokenHolder;
diff --git a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/MenuApi.java b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/MenuApi.java
index ae30c659..dc01c64b 100644
--- a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/MenuApi.java
+++ b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/MenuApi.java
@@ -20,7 +20,7 @@ import com.foxinmy.weixin4j.token.TokenHolder;
* @since JDK 1.7
* @see com.foxinmy.weixin4j.model.Button
*/
-public class MenuApi extends BaseApi {
+public class MenuApi extends QyApi {
private final TokenHolder tokenHolder;
diff --git a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/NotifyApi.java b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/NotifyApi.java
index 49f6abae..c3175d02 100644
--- a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/NotifyApi.java
+++ b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/NotifyApi.java
@@ -26,7 +26,7 @@ import com.foxinmy.weixin4j.token.TokenHolder;
* @see com.foxinmy.weixin4j.msg.model.News
* @see com.foxinmy.weixin4j.msg.model.MpNews
*/
-public class NotifyApi extends BaseApi {
+public class NotifyApi extends QyApi {
private final TokenHolder tokenHolder;
diff --git a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/QyApi.java b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/QyApi.java
new file mode 100644
index 00000000..d7394cf6
--- /dev/null
+++ b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/QyApi.java
@@ -0,0 +1,22 @@
+package com.foxinmy.weixin4j.qy.api;
+
+import java.util.ResourceBundle;
+
+import com.foxinmy.weixin4j.api.BaseApi;
+
+/**
+ * 微信企业号API
+ *
+ * @className QyApi
+ * @author jy.hu
+ * @date 2014年11月18日
+ * @since JDK 1.7
+ * @see com.foxinmy.weixin4j.api.BaseApi
+ * @see api文档
+ */
+public class QyApi extends BaseApi {
+ static {
+ weixinBundle = ResourceBundle
+ .getBundle("com/foxinmy/weixin4j/qy/api/weixin");
+ }
+}
diff --git a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/TagApi.java b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/TagApi.java
index d8afcd1d..76d1cd2c 100644
--- a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/TagApi.java
+++ b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/TagApi.java
@@ -22,7 +22,7 @@ import com.foxinmy.weixin4j.token.TokenHolder;
* @see 管理标签
*/
-public class TagApi extends BaseApi {
+public class TagApi extends QyApi {
private final TokenHolder tokenHolder;
public TagApi(TokenHolder tokenHolder) {
diff --git a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/UserApi.java b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/UserApi.java
index 46c7df22..aac4cab8 100644
--- a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/UserApi.java
+++ b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/UserApi.java
@@ -23,7 +23,7 @@ import com.foxinmy.weixin4j.token.TokenHolder;
* @see 管理成员说明
*/
-public class UserApi extends BaseApi {
+public class UserApi extends QyApi {
private final TokenHolder tokenHolder;
public UserApi(TokenHolder tokenHolder) {