فهرست منبع

将菜单相关的类转移到单独的包里方便管理,以便于某些特殊需求

BinaryWang 8 سال پیش
والد
کامیت
f7a64a7cf6

+ 0 - 208
weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxMenu.java

@@ -1,208 +0,0 @@
-package me.chanjar.weixin.common.bean;
-
-import me.chanjar.weixin.common.util.json.WxGsonBuilder;
-
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Serializable;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * 企业号菜单
- *
- * @author Daniel Qian
- */
-public class WxMenu implements Serializable {
-
-  private static final long serialVersionUID = -7083914585539687746L;
-
-  private List<WxMenuButton> buttons = new ArrayList<WxMenuButton>();
-
-  private WxMenuRule matchRule;
-
-  /**
-   * 要用 http://mp.weixin.qq.com/wiki/16/ff9b7b85220e1396ffa16794a9d95adc.html 格式来反序列化
-   * 相比 http://mp.weixin.qq.com/wiki/13/43de8269be54a0a6f64413e4dfa94f39.html 的格式,外层多套了一个menu
-   */
-  public static WxMenu fromJson(String json) {
-    return WxGsonBuilder.create().fromJson(json, WxMenu.class);
-  }
-
-  /**
-   * 要用 http://mp.weixin.qq.com/wiki/16/ff9b7b85220e1396ffa16794a9d95adc.html 格式来反序列化
-   * 相比 http://mp.weixin.qq.com/wiki/13/43de8269be54a0a6f64413e4dfa94f39.html 的格式,外层多套了一个menu
-   */
-  public static WxMenu fromJson(InputStream is) {
-    return WxGsonBuilder.create().fromJson(new InputStreamReader(is, StandardCharsets.UTF_8), WxMenu.class);
-  }
-
-  public List<WxMenuButton> getButtons() {
-    return buttons;
-  }
-
-  public void setButtons(List<WxMenuButton> buttons) {
-    this.buttons = buttons;
-  }
-
-  public WxMenuRule getMatchRule() {
-    return matchRule;
-  }
-
-  public void setMatchRule(WxMenuRule matchRule) {
-    this.matchRule = matchRule;
-  }
-
-  public String toJson() {
-    return WxGsonBuilder.create().toJson(this);
-  }
-
-  @Override
-  public String toString() {
-    return "WxMenu{" +
-            "buttons=" + buttons +
-            '}';
-  }
-
-  public static class WxMenuButton {
-
-    private String type;
-    private String name;
-    private String key;
-    private String url;
-
-    private List<WxMenuButton> subButtons = new ArrayList<WxMenuButton>();
-
-    public String getType() {
-      return type;
-    }
-
-    public void setType(String type) {
-      this.type = type;
-    }
-
-    public String getName() {
-      return name;
-    }
-
-    public void setName(String name) {
-      this.name = name;
-    }
-
-    public String getKey() {
-      return key;
-    }
-
-    public void setKey(String key) {
-      this.key = key;
-    }
-
-    public String getUrl() {
-      return url;
-    }
-
-    public void setUrl(String url) {
-      this.url = url;
-    }
-
-    public List<WxMenuButton> getSubButtons() {
-      return subButtons;
-    }
-
-    public void setSubButtons(List<WxMenuButton> subButtons) {
-      this.subButtons = subButtons;
-    }
-
-    @Override
-    public String toString() {
-      return "WxMenuButton{" +
-              "type='" + type + '\'' +
-              ", name='" + name + '\'' +
-              ", key='" + key + '\'' +
-              ", url='" + url + '\'' +
-              ", subButtons=" + subButtons +
-              '}';
-    }
-  }
-
-  public static class WxMenuRule {
-    private String tagId;
-    private String sex;
-    private String country;
-    private String province;
-    private String city;
-    private String clientPlatformType;
-    private String language;
-
-    public String getTagId() {
-      return tagId;
-    }
-
-    public void setTagId(String tagId) {
-      this.tagId = tagId;
-    }
-
-    public String getSex() {
-      return sex;
-    }
-
-    public void setSex(String sex) {
-      this.sex = sex;
-    }
-
-    public String getCountry() {
-      return country;
-    }
-
-    public void setCountry(String country) {
-      this.country = country;
-    }
-
-    public String getProvince() {
-      return province;
-    }
-
-    public void setProvince(String province) {
-      this.province = province;
-    }
-
-    public String getCity() {
-      return city;
-    }
-
-    public void setCity(String city) {
-      this.city = city;
-    }
-
-    public String getClientPlatformType() {
-      return clientPlatformType;
-    }
-
-    public void setClientPlatformType(String clientPlatformType) {
-      this.clientPlatformType = clientPlatformType;
-    }
-
-    public String getLanguage() {
-      return language;
-    }
-
-    public void setLanguage(String language) {
-      this.language = language;
-    }
-
-    @Override
-    public String toString() {
-      return "matchrule:{" +
-              "tag_id='" + tagId + '\'' +
-              ", sex='" + sex + '\'' +
-              ", country" + country + '\'' +
-              ", province" + province + '\'' +
-              ", city" + city + '\'' +
-              ", client_platform_type" + clientPlatformType + '\'' +
-              ", language" + language + '\'' +
-              "}";
-    }
-  }
-
-}

+ 69 - 0
weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenu.java

@@ -0,0 +1,69 @@
+package me.chanjar.weixin.common.bean.menu;
+
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Serializable;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.List;
+
+import me.chanjar.weixin.common.bean.menu.WxMenuButton;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+
+/**
+ * 企业号菜单
+ *
+ * @author Daniel Qian
+ */
+public class WxMenu implements Serializable {
+
+  private static final long serialVersionUID = -7083914585539687746L;
+
+  private List<WxMenuButton> buttons = new ArrayList<WxMenuButton>();
+
+  private WxMenuRule matchRule;
+
+  /**
+   * 要用 http://mp.weixin.qq.com/wiki/16/ff9b7b85220e1396ffa16794a9d95adc.html 格式来反序列化
+   * 相比 http://mp.weixin.qq.com/wiki/13/43de8269be54a0a6f64413e4dfa94f39.html 的格式,外层多套了一个menu
+   */
+  public static WxMenu fromJson(String json) {
+    return WxGsonBuilder.create().fromJson(json, WxMenu.class);
+  }
+
+  /**
+   * 要用 http://mp.weixin.qq.com/wiki/16/ff9b7b85220e1396ffa16794a9d95adc.html 格式来反序列化
+   * 相比 http://mp.weixin.qq.com/wiki/13/43de8269be54a0a6f64413e4dfa94f39.html 的格式,外层多套了一个menu
+   */
+  public static WxMenu fromJson(InputStream is) {
+    return WxGsonBuilder.create().fromJson(new InputStreamReader(is, StandardCharsets.UTF_8), WxMenu.class);
+  }
+
+  public List<WxMenuButton> getButtons() {
+    return buttons;
+  }
+
+  public void setButtons(List<WxMenuButton> buttons) {
+    this.buttons = buttons;
+  }
+
+  public WxMenuRule getMatchRule() {
+    return matchRule;
+  }
+
+  public void setMatchRule(WxMenuRule matchRule) {
+    this.matchRule = matchRule;
+  }
+
+  public String toJson() {
+    return WxGsonBuilder.create().toJson(this);
+  }
+
+  @Override
+  public String toString() {
+    return "WxMenu{" +
+            "buttons=" + buttons +
+            '}';
+  }
+
+}

+ 62 - 0
weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenuButton.java

@@ -0,0 +1,62 @@
+package me.chanjar.weixin.common.bean.menu;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+public class WxMenuButton {
+
+  private String type;
+  private String name;
+  private String key;
+  private String url;
+
+  private List<WxMenuButton> subButtons = new ArrayList<WxMenuButton>();
+
+  public String getType() {
+    return type;
+  }
+
+  public void setType(String type) {
+    this.type = type;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public String getKey() {
+    return key;
+  }
+
+  public void setKey(String key) {
+    this.key = key;
+  }
+
+  public String getUrl() {
+    return url;
+  }
+
+  public void setUrl(String url) {
+    this.url = url;
+  }
+
+  public List<WxMenuButton> getSubButtons() {
+    return subButtons;
+  }
+
+  public void setSubButtons(List<WxMenuButton> subButtons) {
+    this.subButtons = subButtons;
+  }
+
+  @Override
+  public String toString() {
+    return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
+  }
+}

+ 75 - 0
weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenuRule.java

@@ -0,0 +1,75 @@
+package me.chanjar.weixin.common.bean.menu;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+public class WxMenuRule {
+  private String tagId;
+  private String sex;
+  private String country;
+  private String province;
+  private String city;
+  private String clientPlatformType;
+  private String language;
+
+  public String getTagId() {
+    return tagId;
+  }
+
+  public void setTagId(String tagId) {
+    this.tagId = tagId;
+  }
+
+  public String getSex() {
+    return sex;
+  }
+
+  public void setSex(String sex) {
+    this.sex = sex;
+  }
+
+  public String getCountry() {
+    return country;
+  }
+
+  public void setCountry(String country) {
+    this.country = country;
+  }
+
+  public String getProvince() {
+    return province;
+  }
+
+  public void setProvince(String province) {
+    this.province = province;
+  }
+
+  public String getCity() {
+    return city;
+  }
+
+  public void setCity(String city) {
+    this.city = city;
+  }
+
+  public String getClientPlatformType() {
+    return clientPlatformType;
+  }
+
+  public void setClientPlatformType(String clientPlatformType) {
+    this.clientPlatformType = clientPlatformType;
+  }
+
+  public String getLanguage() {
+    return language;
+  }
+
+  public void setLanguage(String language) {
+    this.language = language;
+  }
+
+  @Override
+  public String toString() {
+    return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
+  }
+}

+ 2 - 1
weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxGsonBuilder.java

@@ -2,8 +2,9 @@ package me.chanjar.weixin.common.util.json;
 
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
+
 import me.chanjar.weixin.common.bean.WxAccessToken;
-import me.chanjar.weixin.common.bean.WxMenu;
+import me.chanjar.weixin.common.bean.menu.WxMenu;
 import me.chanjar.weixin.common.bean.result.WxError;
 import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
 

+ 21 - 10
weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxMenuGsonAdapter.java

@@ -8,11 +8,22 @@
  */
 package me.chanjar.weixin.common.util.json;
 
-import com.google.gson.*;
-import me.chanjar.weixin.common.bean.WxMenu;
-
 import java.lang.reflect.Type;
 
+import com.google.gson.JsonArray;
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
+import com.google.gson.JsonSerializationContext;
+import com.google.gson.JsonSerializer;
+
+import me.chanjar.weixin.common.bean.menu.WxMenu;
+import me.chanjar.weixin.common.bean.menu.WxMenuButton;
+import me.chanjar.weixin.common.bean.menu.WxMenuRule;
+
+
 /**
  * @author Daniel Qian
  */
@@ -22,7 +33,7 @@ public class WxMenuGsonAdapter implements JsonSerializer<WxMenu>, JsonDeserializ
     JsonObject json = new JsonObject();
 
     JsonArray buttonArray = new JsonArray();
-    for (WxMenu.WxMenuButton button : menu.getButtons()) {
+    for (WxMenuButton button : menu.getButtons()) {
       JsonObject buttonJson = convertToJson(button);
       buttonArray.add(buttonJson);
     }
@@ -35,7 +46,7 @@ public class WxMenuGsonAdapter implements JsonSerializer<WxMenu>, JsonDeserializ
     return json;
   }
 
-  protected JsonObject convertToJson(WxMenu.WxMenuButton button) {
+  protected JsonObject convertToJson(WxMenuButton button) {
     JsonObject buttonJson = new JsonObject();
     buttonJson.addProperty("type", button.getType());
     buttonJson.addProperty("name", button.getName());
@@ -43,7 +54,7 @@ public class WxMenuGsonAdapter implements JsonSerializer<WxMenu>, JsonDeserializ
     buttonJson.addProperty("url", button.getUrl());
     if (button.getSubButtons() != null && button.getSubButtons().size() > 0) {
       JsonArray buttonArray = new JsonArray();
-      for (WxMenu.WxMenuButton sub_button : button.getSubButtons()) {
+      for (WxMenuButton sub_button : button.getSubButtons()) {
         buttonArray.add(convertToJson(sub_button));
       }
       buttonJson.add("sub_button", buttonArray);
@@ -51,7 +62,7 @@ public class WxMenuGsonAdapter implements JsonSerializer<WxMenu>, JsonDeserializ
     return buttonJson;
   }
 
-  protected JsonObject convertToJson(WxMenu.WxMenuRule menuRule) {
+  protected JsonObject convertToJson(WxMenuRule menuRule) {
     JsonObject matchRule = new JsonObject();
     matchRule.addProperty("tag_id", menuRule.getTagId());
     matchRule.addProperty("sex", menuRule.getSex());
@@ -74,7 +85,7 @@ public class WxMenuGsonAdapter implements JsonSerializer<WxMenu>, JsonDeserializ
     JsonArray buttonsJson = menuJson.get("button").getAsJsonArray();
     for (int i = 0; i < buttonsJson.size(); i++) {
       JsonObject buttonJson = buttonsJson.get(i).getAsJsonObject();
-      WxMenu.WxMenuButton button = convertFromJson(buttonJson);
+      WxMenuButton button = convertFromJson(buttonJson);
       menu.getButtons().add(button);
       if (buttonJson.get("sub_button") == null || buttonJson.get("sub_button").isJsonNull()) {
         continue;
@@ -88,8 +99,8 @@ public class WxMenuGsonAdapter implements JsonSerializer<WxMenu>, JsonDeserializ
     return menu;
   }
 
-  protected WxMenu.WxMenuButton convertFromJson(JsonObject json) {
-    WxMenu.WxMenuButton button = new WxMenu.WxMenuButton();
+  protected WxMenuButton convertFromJson(JsonObject json) {
+    WxMenuButton button = new WxMenuButton();
     button.setName(GsonHelper.getString(json, "name"));
     button.setKey(GsonHelper.getString(json, "key"));
     button.setUrl(GsonHelper.getString(json, "url"));

+ 5 - 2
weixin-java-common/src/test/java/me/chanjar/weixin/common/bean/WxMenuTest.java

@@ -1,10 +1,13 @@
 package me.chanjar.weixin.common.bean;
 
-import me.chanjar.weixin.common.bean.WxMenu.WxMenuButton;
 import org.testng.Assert;
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
+import me.chanjar.weixin.common.bean.menu.WxMenu;
+import me.chanjar.weixin.common.bean.menu.WxMenuButton;
+import me.chanjar.weixin.common.bean.menu.WxMenuRule;
+
 @Test
 public class WxMenuTest {
 
@@ -66,7 +69,7 @@ public class WxMenuTest {
 
     menu.getButtons().add(button1);
 
-    WxMenu.WxMenuRule wxMenuRule = new WxMenu.WxMenuRule();
+    WxMenuRule wxMenuRule = new WxMenuRule();
     wxMenuRule.setTagId("2");
     wxMenuRule.setSex("1");
     wxMenuRule.setCountry("中国");

+ 6 - 6
weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java

@@ -1,7 +1,12 @@
 package me.chanjar.weixin.cp.api;
 
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+
 import me.chanjar.weixin.common.bean.WxJsapiSignature;
-import me.chanjar.weixin.common.bean.WxMenu;
+import me.chanjar.weixin.common.bean.menu.WxMenu;
 import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
 import me.chanjar.weixin.common.exception.WxErrorException;
 import me.chanjar.weixin.common.session.WxSession;
@@ -12,11 +17,6 @@ import me.chanjar.weixin.cp.bean.WxCpMessage;
 import me.chanjar.weixin.cp.bean.WxCpTag;
 import me.chanjar.weixin.cp.bean.WxCpUser;
 
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.List;
-
 /**
  * 微信API的Service
  */

+ 28 - 19
weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java

@@ -1,5 +1,23 @@
 package me.chanjar.weixin.cp.api;
 
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringReader;
+import java.security.NoSuchAlgorithmException;
+import java.util.List;
+import java.util.UUID;
+
+import org.apache.http.HttpHost;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.BasicResponseHandler;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import com.google.gson.JsonArray;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
@@ -7,9 +25,10 @@ import com.google.gson.JsonPrimitive;
 import com.google.gson.internal.Streams;
 import com.google.gson.reflect.TypeToken;
 import com.google.gson.stream.JsonReader;
+
 import me.chanjar.weixin.common.bean.WxAccessToken;
 import me.chanjar.weixin.common.bean.WxJsapiSignature;
-import me.chanjar.weixin.common.bean.WxMenu;
+import me.chanjar.weixin.common.bean.menu.WxMenu;
 import me.chanjar.weixin.common.bean.result.WxError;
 import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
 import me.chanjar.weixin.common.exception.WxErrorException;
@@ -20,30 +39,20 @@ import me.chanjar.weixin.common.util.RandomUtils;
 import me.chanjar.weixin.common.util.StringUtils;
 import me.chanjar.weixin.common.util.crypto.SHA1;
 import me.chanjar.weixin.common.util.fs.FileUtils;
-import me.chanjar.weixin.common.util.http.*;
+import me.chanjar.weixin.common.util.http.ApacheHttpClientBuilder;
+import me.chanjar.weixin.common.util.http.DefaultApacheHttpHttpClientBuilder;
+import me.chanjar.weixin.common.util.http.MediaDownloadRequestExecutor;
+import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor;
+import me.chanjar.weixin.common.util.http.RequestExecutor;
+import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor;
+import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor;
+import me.chanjar.weixin.common.util.http.URIUtil;
 import me.chanjar.weixin.common.util.json.GsonHelper;
 import me.chanjar.weixin.cp.bean.WxCpDepart;
 import me.chanjar.weixin.cp.bean.WxCpMessage;
 import me.chanjar.weixin.cp.bean.WxCpTag;
 import me.chanjar.weixin.cp.bean.WxCpUser;
 import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
-import org.apache.http.HttpHost;
-import org.apache.http.client.ClientProtocolException;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.impl.client.BasicResponseHandler;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.StringReader;
-import java.security.NoSuchAlgorithmException;
-import java.util.List;
-import java.util.UUID;
 
 public class WxCpServiceImpl implements WxCpService {
 

+ 7 - 5
weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxMenuAPITest.java

@@ -1,15 +1,17 @@
 package me.chanjar.weixin.cp.api;
 
-import com.google.inject.Inject;
-import me.chanjar.weixin.common.api.WxConsts;
-import me.chanjar.weixin.common.bean.WxMenu;
-import me.chanjar.weixin.common.bean.WxMenu.WxMenuButton;
-import me.chanjar.weixin.common.exception.WxErrorException;
 import org.testng.Assert;
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Guice;
 import org.testng.annotations.Test;
 
+import com.google.inject.Inject;
+
+import me.chanjar.weixin.common.api.WxConsts;
+import me.chanjar.weixin.common.bean.menu.WxMenu;
+import me.chanjar.weixin.common.bean.menu.WxMenuButton;
+import me.chanjar.weixin.common.exception.WxErrorException;
+
 /**
  * 测试菜单
  * @author Daniel Qian

+ 1 - 1
weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMenuService.java

@@ -1,6 +1,6 @@
 package me.chanjar.weixin.mp.api;
 
-import me.chanjar.weixin.common.bean.WxMenu;
+import me.chanjar.weixin.common.bean.menu.WxMenu;
 import me.chanjar.weixin.common.exception.WxErrorException;
 
 /**

+ 1 - 1
weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMenuServiceImpl.java

@@ -1,6 +1,6 @@
 package me.chanjar.weixin.mp.api.impl;
 
-import me.chanjar.weixin.common.bean.WxMenu;
+import me.chanjar.weixin.common.bean.menu.WxMenu;
 import me.chanjar.weixin.common.exception.WxErrorException;
 import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor;
 import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor;

+ 8 - 6
weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMenuServiceImplTest.java

@@ -1,16 +1,18 @@
 package me.chanjar.weixin.mp.api.impl;
 
-import com.google.inject.Inject;
-import me.chanjar.weixin.common.api.WxConsts;
-import me.chanjar.weixin.common.bean.WxMenu;
-import me.chanjar.weixin.common.bean.WxMenu.WxMenuButton;
-import me.chanjar.weixin.common.exception.WxErrorException;
-import me.chanjar.weixin.mp.api.ApiTestModule;
 import org.testng.Assert;
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Guice;
 import org.testng.annotations.Test;
 
+import com.google.inject.Inject;
+
+import me.chanjar.weixin.common.api.WxConsts;
+import me.chanjar.weixin.common.bean.menu.WxMenu;
+import me.chanjar.weixin.common.bean.menu.WxMenuButton;
+import me.chanjar.weixin.common.exception.WxErrorException;
+import me.chanjar.weixin.mp.api.ApiTestModule;
+
 /**
  * 测试菜单
  * @author chanjarster