diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMenuService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMenuService.java new file mode 100644 index 00000000..865bfb00 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMenuService.java @@ -0,0 +1,62 @@ +package me.chanjar.weixin.mp.api; + +import me.chanjar.weixin.common.bean.WxMenu; +import me.chanjar.weixin.common.exception.WxErrorException; +import me.chanjar.weixin.mp.bean.kefu.request.WxMpKfAccountRequest; +import me.chanjar.weixin.mp.bean.kefu.result.*; + +import java.io.File; +import java.util.Date; + +/** + * 菜单相关操作接口 + * @author Binary Wang + * + */ +public interface WxMpMenuService { + + /** + *
+ * 自定义菜单创建接口 + * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=自定义菜单创建接口 + * 如果要创建个性化菜单,请设置matchrule属性 + * 详情请见:http://mp.weixin.qq.com/wiki/0/c48ccd12b69ae023159b4bfaa7c39c20.html + *+ */ + public void menuCreate(WxMenu menu) throws WxErrorException; + + /** + *
+ * 自定义菜单删除接口 + * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=自定义菜单删除接口 + *+ */ + public void menuDelete() throws WxErrorException; + + /** + *
+ * 删除个性化菜单接口 + * 详情请见: http://mp.weixin.qq.com/wiki/0/c48ccd12b69ae023159b4bfaa7c39c20.html + *+ * @param menuid + */ + public void menuDelete(String menuid) throws WxErrorException; + + /** + *
+ * 自定义菜单查询接口 + * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=自定义菜单查询接口 + *+ */ + public WxMenu menuGet() throws WxErrorException; + + /** + *
+ * 测试个性化菜单匹配结果 + * 详情请见: http://mp.weixin.qq.com/wiki/0/c48ccd12b69ae023159b4bfaa7c39c20.html + *+ * @param userid 可以是粉丝的OpenID,也可以是粉丝的微信号。 + */ + public WxMenu menuTryMatch(String userid) throws WxErrorException; + +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java index 3779c3c7..2dc94260 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java @@ -1,8 +1,6 @@ package me.chanjar.weixin.mp.api; import java.io.File; -import java.io.IOException; -import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; @@ -10,8 +8,6 @@ import java.util.Map; import me.chanjar.weixin.common.bean.WxCardApiSignature; import me.chanjar.weixin.common.bean.WxJsapiSignature; -import me.chanjar.weixin.common.bean.WxMenu; -import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.common.util.http.RequestExecutor; import me.chanjar.weixin.mp.bean.WxMpCustomMessage; @@ -22,20 +18,11 @@ import me.chanjar.weixin.mp.bean.WxMpMassNews; import me.chanjar.weixin.mp.bean.WxMpMassOpenIdsMessage; import me.chanjar.weixin.mp.bean.WxMpMassPreviewMessage; import me.chanjar.weixin.mp.bean.WxMpMassVideo; -import me.chanjar.weixin.mp.bean.WxMpMaterial; -import me.chanjar.weixin.mp.bean.WxMpMaterialArticleUpdate; -import me.chanjar.weixin.mp.bean.WxMpMaterialNews; import me.chanjar.weixin.mp.bean.WxMpSemanticQuery; import me.chanjar.weixin.mp.bean.WxMpTemplateMessage; -import me.chanjar.weixin.mp.bean.result.WxMediaImgUploadResult; import me.chanjar.weixin.mp.bean.result.WxMpCardResult; import me.chanjar.weixin.mp.bean.result.WxMpMassSendResult; import me.chanjar.weixin.mp.bean.result.WxMpMassUploadResult; -import me.chanjar.weixin.mp.bean.result.WxMpMaterialCountResult; -import me.chanjar.weixin.mp.bean.result.WxMpMaterialFileBatchGetResult; -import me.chanjar.weixin.mp.bean.result.WxMpMaterialNewsBatchGetResult; -import me.chanjar.weixin.mp.bean.result.WxMpMaterialUploadResult; -import me.chanjar.weixin.mp.bean.result.WxMpMaterialVideoInfoResult; import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken; import me.chanjar.weixin.mp.bean.result.WxMpPayCallback; import me.chanjar.weixin.mp.bean.result.WxMpPayRefundResult; @@ -161,50 +148,6 @@ public interface WxMpService { */ public WxMpMassSendResult massOpenIdsMessageSend(WxMpMassOpenIdsMessage message) throws WxErrorException; - /** - *
- * 自定义菜单创建接口 - * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=自定义菜单创建接口 - * 如果要创建个性化菜单,请设置matchrule属性 - * 详情请见:http://mp.weixin.qq.com/wiki/0/c48ccd12b69ae023159b4bfaa7c39c20.html - *- */ - public void menuCreate(WxMenu menu) throws WxErrorException; - - /** - *
- * 自定义菜单删除接口 - * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=自定义菜单删除接口 - *- */ - public void menuDelete() throws WxErrorException; - - /** - *
- * 删除个性化菜单接口 - * 详情请见: http://mp.weixin.qq.com/wiki/0/c48ccd12b69ae023159b4bfaa7c39c20.html - *- * @param menuid - */ - public void menuDelete(String menuid) throws WxErrorException; - - /** - *
- * 自定义菜单查询接口 - * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=自定义菜单查询接口 - *- */ - public WxMenu menuGet() throws WxErrorException; - - /** - *
- * 测试个性化菜单匹配结果 - * 详情请见: http://mp.weixin.qq.com/wiki/0/c48ccd12b69ae023159b4bfaa7c39c20.html - *- * @param userid 可以是粉丝的OpenID,也可以是粉丝的微信号。 - */ - public WxMenu menuTryMatch(String userid) throws WxErrorException; - /** *
* 分组管理接口 - 创建分组 @@ -760,11 +703,17 @@ public interface WxMpService { WxMpKefuService getKefuService(); /** - * 返回客服接口方法实现类,以方便调用个其各种接口 + * 返回素材相关接口的方法实现类,以方便调用个其各种接口 * @return WxMpMaterialService */ WxMpMaterialService getMaterialService(); + /** + * 返回素材相关接口的方法实现类,以方便调用个其各种接口 + * @return WxMpMenuService + */ + WxMpMenuService getMenuService(); + /** * 获取WxMpConfigStorage 对象 * @return WxMpConfigStorage diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpServiceImpl.java index 8b7997a5..c7ab51c8 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpServiceImpl.java @@ -2,7 +2,6 @@ package me.chanjar.weixin.mp.api; import java.io.File; import java.io.IOException; -import java.io.InputStream; import java.io.StringReader; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; @@ -16,9 +15,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.SortedMap; import java.util.TreeMap; -import java.util.UUID; -import me.chanjar.weixin.mp.api.impl.WxMpMaterialServiceImpl; import org.apache.http.Consts; import org.apache.http.HttpHost; import org.apache.http.client.ClientProtocolException; @@ -44,33 +41,28 @@ import com.google.gson.reflect.TypeToken; import com.google.gson.stream.JsonReader; import com.thoughtworks.xstream.XStream; -import me.chanjar.weixin.common.api.WxConsts; import me.chanjar.weixin.common.bean.WxAccessToken; import me.chanjar.weixin.common.bean.WxCardApiSignature; import me.chanjar.weixin.common.bean.WxJsapiSignature; -import me.chanjar.weixin.common.bean.WxMenu; import me.chanjar.weixin.common.bean.result.WxError; -import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.common.session.StandardSessionManager; import me.chanjar.weixin.common.session.WxSessionManager; import me.chanjar.weixin.common.util.RandomUtils; import me.chanjar.weixin.common.util.crypto.SHA1; import me.chanjar.weixin.common.util.crypto.WxCryptUtil; -import me.chanjar.weixin.common.util.fs.FileUtils; 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.http.Utf8ResponseHandler; import me.chanjar.weixin.common.util.json.GsonHelper; -import me.chanjar.weixin.common.util.json.WxGsonBuilder; import me.chanjar.weixin.common.util.xml.XStreamInitializer; import me.chanjar.weixin.mp.api.impl.WxMpKefuServiceImpl; +import me.chanjar.weixin.mp.api.impl.WxMpMaterialServiceImpl; +import me.chanjar.weixin.mp.api.impl.WxMpMenuServiceImpl; import me.chanjar.weixin.mp.bean.WxMpCustomMessage; import me.chanjar.weixin.mp.bean.WxMpGroup; import me.chanjar.weixin.mp.bean.WxMpIndustry; @@ -79,20 +71,11 @@ import me.chanjar.weixin.mp.bean.WxMpMassNews; import me.chanjar.weixin.mp.bean.WxMpMassOpenIdsMessage; import me.chanjar.weixin.mp.bean.WxMpMassPreviewMessage; import me.chanjar.weixin.mp.bean.WxMpMassVideo; -import me.chanjar.weixin.mp.bean.WxMpMaterial; -import me.chanjar.weixin.mp.bean.WxMpMaterialArticleUpdate; -import me.chanjar.weixin.mp.bean.WxMpMaterialNews; import me.chanjar.weixin.mp.bean.WxMpSemanticQuery; import me.chanjar.weixin.mp.bean.WxMpTemplateMessage; -import me.chanjar.weixin.mp.bean.result.WxMediaImgUploadResult; import me.chanjar.weixin.mp.bean.result.WxMpCardResult; import me.chanjar.weixin.mp.bean.result.WxMpMassSendResult; import me.chanjar.weixin.mp.bean.result.WxMpMassUploadResult; -import me.chanjar.weixin.mp.bean.result.WxMpMaterialCountResult; -import me.chanjar.weixin.mp.bean.result.WxMpMaterialFileBatchGetResult; -import me.chanjar.weixin.mp.bean.result.WxMpMaterialNewsBatchGetResult; -import me.chanjar.weixin.mp.bean.result.WxMpMaterialUploadResult; -import me.chanjar.weixin.mp.bean.result.WxMpMaterialVideoInfoResult; import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken; import me.chanjar.weixin.mp.bean.result.WxMpPayCallback; import me.chanjar.weixin.mp.bean.result.WxMpPayRefundResult; @@ -105,12 +88,6 @@ import me.chanjar.weixin.mp.bean.result.WxMpUserCumulate; import me.chanjar.weixin.mp.bean.result.WxMpUserList; import me.chanjar.weixin.mp.bean.result.WxMpUserSummary; import me.chanjar.weixin.mp.bean.result.WxRedpackResult; -import me.chanjar.weixin.mp.util.http.MaterialDeleteRequestExecutor; -import me.chanjar.weixin.mp.util.http.MaterialNewsInfoRequestExecutor; -import me.chanjar.weixin.mp.util.http.MaterialUploadRequestExecutor; -import me.chanjar.weixin.mp.util.http.MaterialVideoInfoRequestExecutor; -import me.chanjar.weixin.mp.util.http.MaterialVoiceAndImageDownloadRequestExecutor; -import me.chanjar.weixin.mp.util.http.MediaImgUploadRequestExecutor; import me.chanjar.weixin.mp.util.http.QrCodeRequestExecutor; import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; @@ -139,6 +116,8 @@ public class WxMpServiceImpl implements WxMpService { protected WxMpMaterialService materialService = new WxMpMaterialServiceImpl(this); + protected WxMpMenuService menuService = new WxMpMenuServiceImpl(this); + protected CloseableHttpClient httpClient; protected HttpHost httpProxy; @@ -259,59 +238,6 @@ public class WxMpServiceImpl implements WxMpService { execute(new SimplePostRequestExecutor(), url, message.toJson()); } - @Override - public void menuCreate(WxMenu menu) throws WxErrorException { - if (menu.getMatchRule() != null) { - String url = "https://api.weixin.qq.com/cgi-bin/menu/addconditional"; - execute(new SimplePostRequestExecutor(), url, menu.toJson()); - } else { - String url = "https://api.weixin.qq.com/cgi-bin/menu/create"; - execute(new SimplePostRequestExecutor(), url, menu.toJson()); - } - } - - @Override - public void menuDelete() throws WxErrorException { - String url = "https://api.weixin.qq.com/cgi-bin/menu/delete"; - execute(new SimpleGetRequestExecutor(), url, null); - } - - @Override - public void menuDelete(String menuid) throws WxErrorException { - String url = "https://api.weixin.qq.com/cgi-bin/menu/delconditional"; - execute(new SimpleGetRequestExecutor(), url, "menuid=" + menuid); - } - - @Override - public WxMenu menuGet() throws WxErrorException { - String url = "https://api.weixin.qq.com/cgi-bin/menu/get"; - try { - String resultContent = execute(new SimpleGetRequestExecutor(), url, null); - return WxMenu.fromJson(resultContent); - } catch (WxErrorException e) { - // 46003 不存在的菜单数据 - if (e.getError().getErrorCode() == 46003) { - return null; - } - throw e; - } - } - - @Override - public WxMenu menuTryMatch(String userid) throws WxErrorException { - String url = "https://api.weixin.qq.com/cgi-bin/menu/trymatch"; - try { - String resultContent = execute(new SimpleGetRequestExecutor(), url, "user_id=" + userid); - return WxMenu.fromJson(resultContent); - } catch (WxErrorException e) { - // 46003 不存在的菜单数据 46002 不存在的菜单版本 - if (e.getError().getErrorCode() == 46003 || e.getError().getErrorCode() == 46002) { - return null; - } - throw e; - } - } - @Override public WxMpMassUploadResult massNewsUpload(WxMpMassNews news) throws WxErrorException { String url = "https://api.weixin.qq.com/cgi-bin/media/uploadnews"; @@ -1323,5 +1249,10 @@ public class WxMpServiceImpl implements WxMpService { public WxMpMaterialService getMaterialService() { return this.materialService; } - + + @Override + public WxMpMenuService getMenuService() { + return this.menuService; + } + } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMenuServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMenuServiceImpl.java new file mode 100644 index 00000000..5ecb0d93 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMenuServiceImpl.java @@ -0,0 +1,73 @@ +package me.chanjar.weixin.mp.api.impl; + +import me.chanjar.weixin.common.bean.WxMenu; +import me.chanjar.weixin.common.exception.WxErrorException; +import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor; +import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor; +import me.chanjar.weixin.mp.api.WxMpMenuService; +import me.chanjar.weixin.mp.api.WxMpService; + +/** + * Created by Binary Wang on 2016/7/21. + */ +public class WxMpMenuServiceImpl implements WxMpMenuService { + + private WxMpService wxMpService; + + public WxMpMenuServiceImpl(WxMpService wxMpService) { + this.wxMpService = wxMpService; + } + + @Override + public void menuCreate(WxMenu menu) throws WxErrorException { + if (menu.getMatchRule() != null) { + String url = "https://api.weixin.qq.com/cgi-bin/menu/addconditional"; + this.wxMpService.execute(new SimplePostRequestExecutor(), url, menu.toJson()); + } else { + String url = "https://api.weixin.qq.com/cgi-bin/menu/create"; + this.wxMpService.execute(new SimplePostRequestExecutor(), url, menu.toJson()); + } + } + + @Override + public void menuDelete() throws WxErrorException { + String url = "https://api.weixin.qq.com/cgi-bin/menu/delete"; + this.wxMpService.execute(new SimpleGetRequestExecutor(), url, null); + } + + @Override + public void menuDelete(String menuid) throws WxErrorException { + String url = "https://api.weixin.qq.com/cgi-bin/menu/delconditional"; + this.wxMpService.execute(new SimpleGetRequestExecutor(), url, "menuid=" + menuid); + } + + @Override + public WxMenu menuGet() throws WxErrorException { + String url = "https://api.weixin.qq.com/cgi-bin/menu/get"; + try { + String resultContent = this.wxMpService.execute(new SimpleGetRequestExecutor(), url, null); + return WxMenu.fromJson(resultContent); + } catch (WxErrorException e) { + // 46003 不存在的菜单数据 + if (e.getError().getErrorCode() == 46003) { + return null; + } + throw e; + } + } + + @Override + public WxMenu menuTryMatch(String userid) throws WxErrorException { + String url = "https://api.weixin.qq.com/cgi-bin/menu/trymatch"; + try { + String resultContent = this.wxMpService.execute(new SimpleGetRequestExecutor(), url, "user_id=" + userid); + return WxMenu.fromJson(resultContent); + } catch (WxErrorException e) { + // 46003 不存在的菜单数据 46002 不存在的菜单版本 + if (e.getError().getErrorCode() == 46003 || e.getError().getErrorCode() == 46002) { + return null; + } + throw e; + } + } +} diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMenuAPITest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMenuServiceImplTest.java similarity index 87% rename from weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMenuAPITest.java rename to weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMenuServiceImplTest.java index 581c67ee..10e050ea 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMenuAPITest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMenuServiceImplTest.java @@ -1,10 +1,12 @@ -package me.chanjar.weixin.mp.api; +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 me.chanjar.weixin.mp.api.WxMpServiceImpl; import org.testng.Assert; import org.testng.annotations.DataProvider; import org.testng.annotations.Guice; @@ -13,11 +15,12 @@ import org.testng.annotations.Test; /** * 测试菜单 * @author chanjarster + * @author Binary Wang * */ -@Test(groups="menuAPI", dependsOnGroups="baseAPI") +@Test(groups="menuAPI") @Guice(modules = ApiTestModule.class) -public class WxMpMenuAPITest { +public class WxMpMenuServiceImplTest { @Inject protected WxMpServiceImpl wxService; @@ -25,7 +28,7 @@ public class WxMpMenuAPITest { @Test(dataProvider = "menu") public void testCreateMenu(WxMenu wxMenu) throws WxErrorException { System.out.println(wxMenu.toJson()); - wxService.menuCreate(wxMenu); + this.wxService.getMenuService().menuCreate(wxMenu); } @Test @@ -69,17 +72,19 @@ public class WxMpMenuAPITest { WxMenu menu = WxMenu.fromJson(a); System.out.println(menu.toJson()); - wxService.menuCreate(menu); + this.wxService.getMenuService().menuCreate(menu); } @Test(dependsOnMethods = { "testCreateMenu"}) public void testGetMenu() throws WxErrorException { - Assert.assertNotNull(wxService.menuGet()); + WxMenu wxMenu = this.wxService.getMenuService().menuGet(); + Assert.assertNotNull(wxMenu); + System.out.println(wxMenu.toJson()); } @Test(dependsOnMethods = { "testGetMenu"}) public void testDeleteMenu() throws WxErrorException { - wxService.menuDelete(); + this.wxService.getMenuService().menuDelete(); } @DataProvider(name="menu") diff --git a/weixin-java-mp/src/test/resources/testng.xml b/weixin-java-mp/src/test/resources/testng.xml index 003af428..09184112 100644 --- a/weixin-java-mp/src/test/resources/testng.xml +++ b/weixin-java-mp/src/test/resources/testng.xml @@ -6,7 +6,7 @@- +