菜单接口的支持

This commit is contained in:
Daniel Qian
2014-10-21 18:50:32 +08:00
parent a7ad46b8f1
commit 161a6423ce
7 changed files with 33 additions and 35 deletions

View File

@@ -110,7 +110,7 @@ public interface WxCpService {
* @param menu * @param menu
* @throws WxErrorException * @throws WxErrorException
*/ */
public void menuCreate(WxMenu menu) throws WxErrorException; public void menuCreate(WxCpMenu menu) throws WxErrorException;
/** /**
* <pre> * <pre>
@@ -129,7 +129,7 @@ public interface WxCpService {
* @return * @return
* @throws WxErrorException * @throws WxErrorException
*/ */
public WxMenu menuGet() throws WxErrorException; public WxCpMenu menuGet() throws WxErrorException;
/** /**
* <pre> * <pre>

View File

@@ -106,7 +106,7 @@ public class WxCpServiceImpl implements WxCpService {
execute(new SimplePostRequestExecutor(), url, message.toJson()); execute(new SimplePostRequestExecutor(), url, message.toJson());
} }
public void menuCreate(WxMenu menu) throws WxErrorException { public void menuCreate(WxCpMenu menu) throws WxErrorException {
String url = "https://api.weixin.qq.com/cgi-bin/menu/create"; String url = "https://api.weixin.qq.com/cgi-bin/menu/create";
execute(new SimplePostRequestExecutor(), url, menu.toJson()); execute(new SimplePostRequestExecutor(), url, menu.toJson());
} }
@@ -116,11 +116,11 @@ public class WxCpServiceImpl implements WxCpService {
execute(new SimpleGetRequestExecutor(), url, null); execute(new SimpleGetRequestExecutor(), url, null);
} }
public WxMenu menuGet() throws WxErrorException { public WxCpMenu menuGet() throws WxErrorException {
String url = "https://api.weixin.qq.com/cgi-bin/menu/get"; String url = "https://api.weixin.qq.com/cgi-bin/menu/get";
try { try {
String resultContent = execute(new SimpleGetRequestExecutor(), url, null); String resultContent = execute(new SimpleGetRequestExecutor(), url, null);
return WxMenu.fromJson(resultContent); return WxCpMenu.fromJson(resultContent);
} catch (WxErrorException e) { } catch (WxErrorException e) {
// 46003 不存在的菜单数据 // 46003 不存在的菜单数据
if (e.getError().getErrorCode() == 46003) { if (e.getError().getErrorCode() == 46003) {

View File

@@ -12,7 +12,7 @@ import me.chanjar.weixin.enterprise.util.json.WxCpGsonBuilder;
* @author Daniel Qian * @author Daniel Qian
* *
*/ */
public class WxMenu { public class WxCpMenu {
private List<WxMenuButton> buttons = new ArrayList<WxMenuButton>(); private List<WxMenuButton> buttons = new ArrayList<WxMenuButton>();
@@ -28,12 +28,12 @@ public class WxMenu {
return WxCpGsonBuilder.create().toJson(this); return WxCpGsonBuilder.create().toJson(this);
} }
public static WxMenu fromJson(String json) { public static WxCpMenu fromJson(String json) {
return WxCpGsonBuilder.create().fromJson(json, WxMenu.class); return WxCpGsonBuilder.create().fromJson(json, WxCpMenu.class);
} }
public static WxMenu fromJson(InputStream is) { public static WxCpMenu fromJson(InputStream is) {
return WxCpGsonBuilder.create().fromJson(new InputStreamReader(is), WxMenu.class); return WxCpGsonBuilder.create().fromJson(new InputStreamReader(is), WxCpMenu.class);
} }
public static class WxMenuButton { public static class WxMenuButton {

View File

@@ -13,7 +13,7 @@ public class WxCpGsonBuilder {
static { static {
INSTANCE.disableHtmlEscaping(); INSTANCE.disableHtmlEscaping();
INSTANCE.registerTypeAdapter(WxCpMessage.class, new WxCpMessageGsonAdapter()); INSTANCE.registerTypeAdapter(WxCpMessage.class, new WxCpMessageGsonAdapter());
INSTANCE.registerTypeAdapter(WxMenu.class, new WxCpMenuGsonAdapter()); INSTANCE.registerTypeAdapter(WxCpMenu.class, new WxCpMenuGsonAdapter());
INSTANCE.registerTypeAdapter(WxCpDepart.class, new WxCpDepartGsonAdapter()); INSTANCE.registerTypeAdapter(WxCpDepart.class, new WxCpDepartGsonAdapter());
INSTANCE.registerTypeAdapter(WxUser.class, new WxCpUserGsonAdapter()); INSTANCE.registerTypeAdapter(WxUser.class, new WxCpUserGsonAdapter());
INSTANCE.registerTypeAdapter(WxUserList.class, new WxCpUserListGsonAdapter()); INSTANCE.registerTypeAdapter(WxUserList.class, new WxCpUserListGsonAdapter());

View File

@@ -11,7 +11,7 @@ package me.chanjar.weixin.enterprise.util.json;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import me.chanjar.weixin.common.GsonHelper; import me.chanjar.weixin.common.GsonHelper;
import me.chanjar.weixin.enterprise.bean.WxMenu; import me.chanjar.weixin.enterprise.bean.WxCpMenu;
import com.google.gson.JsonArray; import com.google.gson.JsonArray;
import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializationContext;
@@ -27,13 +27,13 @@ import com.google.gson.JsonSerializer;
* @author Daniel Qian * @author Daniel Qian
* *
*/ */
public class WxCpMenuGsonAdapter implements JsonSerializer<WxMenu>, JsonDeserializer<WxMenu> { public class WxCpMenuGsonAdapter implements JsonSerializer<WxCpMenu>, JsonDeserializer<WxCpMenu> {
public JsonElement serialize(WxMenu menu, Type typeOfSrc, JsonSerializationContext context) { public JsonElement serialize(WxCpMenu menu, Type typeOfSrc, JsonSerializationContext context) {
JsonObject json = new JsonObject(); JsonObject json = new JsonObject();
JsonArray buttonArray = new JsonArray(); JsonArray buttonArray = new JsonArray();
for (WxMenu.WxMenuButton button : menu.getButtons()) { for (WxCpMenu.WxMenuButton button : menu.getButtons()) {
JsonObject buttonJson = convertToJson(button); JsonObject buttonJson = convertToJson(button);
buttonArray.add(buttonJson); buttonArray.add(buttonJson);
} }
@@ -42,7 +42,7 @@ public class WxCpMenuGsonAdapter implements JsonSerializer<WxMenu>, JsonDeserial
return json; return json;
} }
protected JsonObject convertToJson(WxMenu.WxMenuButton button) { protected JsonObject convertToJson(WxCpMenu.WxMenuButton button) {
JsonObject buttonJson = new JsonObject(); JsonObject buttonJson = new JsonObject();
buttonJson.addProperty("type", button.getType()); buttonJson.addProperty("type", button.getType());
buttonJson.addProperty("name", button.getName()); buttonJson.addProperty("name", button.getName());
@@ -50,7 +50,7 @@ public class WxCpMenuGsonAdapter implements JsonSerializer<WxMenu>, JsonDeserial
buttonJson.addProperty("url", button.getUrl()); buttonJson.addProperty("url", button.getUrl());
if (button.getSubButtons() != null && button.getSubButtons().size() > 0) { if (button.getSubButtons() != null && button.getSubButtons().size() > 0) {
JsonArray buttonArray = new JsonArray(); JsonArray buttonArray = new JsonArray();
for (WxMenu.WxMenuButton sub_button : button.getSubButtons()) { for (WxCpMenu.WxMenuButton sub_button : button.getSubButtons()) {
buttonArray.add(convertToJson(sub_button)); buttonArray.add(convertToJson(sub_button));
} }
buttonJson.add("sub_button", buttonArray); buttonJson.add("sub_button", buttonArray);
@@ -58,18 +58,17 @@ public class WxCpMenuGsonAdapter implements JsonSerializer<WxMenu>, JsonDeserial
return buttonJson; return buttonJson;
} }
public WxMenu deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { public WxCpMenu deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
/* /*
* 操蛋的微信 * 操蛋的微信
* 创建菜单时是 { button : ... } * 创建菜单时是 { button : ... }
* 查询菜单时是 { menu : { button : ... } } * 查询菜单时是 { menu : { button : ... } }
*/ */
WxMenu menu = new WxMenu(); WxCpMenu menu = new WxCpMenu();
JsonObject menuJson = json.getAsJsonObject().get("menu").getAsJsonObject(); JsonArray buttonsJson = json.getAsJsonObject().get("button").getAsJsonArray();
JsonArray buttonsJson = menuJson.get("button").getAsJsonArray();
for (int i = 0; i < buttonsJson.size(); i++) { for (int i = 0; i < buttonsJson.size(); i++) {
JsonObject buttonJson = buttonsJson.get(i).getAsJsonObject(); JsonObject buttonJson = buttonsJson.get(i).getAsJsonObject();
WxMenu.WxMenuButton button = convertFromJson(buttonJson); WxCpMenu.WxMenuButton button = convertFromJson(buttonJson);
menu.getButtons().add(button); menu.getButtons().add(button);
if (buttonJson.get("sub_button") == null || buttonJson.get("sub_button").isJsonNull()) { if (buttonJson.get("sub_button") == null || buttonJson.get("sub_button").isJsonNull()) {
continue; continue;
@@ -83,8 +82,8 @@ public class WxCpMenuGsonAdapter implements JsonSerializer<WxMenu>, JsonDeserial
return menu; return menu;
} }
protected WxMenu.WxMenuButton convertFromJson(JsonObject json) { protected WxCpMenu.WxMenuButton convertFromJson(JsonObject json) {
WxMenu.WxMenuButton button = new WxMenu.WxMenuButton(); WxCpMenu.WxMenuButton button = new WxCpMenu.WxMenuButton();
button.setName(GsonHelper.getString(json, "name")); button.setName(GsonHelper.getString(json, "name"));
button.setKey(GsonHelper.getString(json, "key")); button.setKey(GsonHelper.getString(json, "key"));
button.setUrl(GsonHelper.getString(json, "url")); button.setUrl(GsonHelper.getString(json, "url"));

View File

@@ -2,6 +2,7 @@ package me.chanjar.weixin.enterprise.api;
import javax.xml.bind.JAXBException; import javax.xml.bind.JAXBException;
import me.chanjar.weixin.enterprise.bean.WxCpMenu;
import org.testng.Assert; import org.testng.Assert;
import org.testng.annotations.DataProvider; import org.testng.annotations.DataProvider;
import org.testng.annotations.Guice; import org.testng.annotations.Guice;
@@ -9,8 +10,7 @@ import org.testng.annotations.Test;
import com.google.inject.Inject; import com.google.inject.Inject;
import me.chanjar.weixin.enterprise.bean.WxMenu; import me.chanjar.weixin.enterprise.bean.WxCpMenu.WxMenuButton;
import me.chanjar.weixin.enterprise.bean.WxMenu.WxMenuButton;
import me.chanjar.weixin.enterprise.exception.WxErrorException; import me.chanjar.weixin.enterprise.exception.WxErrorException;
/** /**
@@ -20,14 +20,14 @@ import me.chanjar.weixin.enterprise.exception.WxErrorException;
*/ */
@Test(groups="menuAPI", dependsOnGroups="baseAPI") @Test(groups="menuAPI", dependsOnGroups="baseAPI")
@Guice(modules = ApiTestModule.class) @Guice(modules = ApiTestModule.class)
public class WxMenuAPITest { public class WxCpMenuAPITest {
@Inject @Inject
protected WxCpServiceImpl wxService; protected WxCpServiceImpl wxService;
@Test(dataProvider = "menu") @Test(dataProvider = "menu")
public void testCreateMenu(WxMenu wxMenu) throws WxErrorException { public void testCreateMenu(WxCpMenu wxCpMenu) throws WxErrorException {
wxService.menuCreate(wxMenu); wxService.menuCreate(wxCpMenu);
} }
@Test(dependsOnMethods = { "testCreateMenu"}) @Test(dependsOnMethods = { "testCreateMenu"})
@@ -42,7 +42,7 @@ public class WxMenuAPITest {
@DataProvider(name="menu") @DataProvider(name="menu")
public Object[][] getMenu() throws JAXBException { public Object[][] getMenu() throws JAXBException {
WxMenu menu = new WxMenu(); WxCpMenu menu = new WxCpMenu();
WxMenuButton button1 = new WxMenuButton(); WxMenuButton button1 = new WxMenuButton();
button1.setType(WxCpConsts.BUTTON_CLICK); button1.setType(WxCpConsts.BUTTON_CLICK);
button1.setName("今日歌曲"); button1.setName("今日歌曲");

View File

@@ -1,24 +1,23 @@
package me.chanjar.weixin.enterprise.bean; package me.chanjar.weixin.enterprise.bean;
import me.chanjar.weixin.enterprise.bean.WxMenu;
import org.testng.Assert; import org.testng.Assert;
import org.testng.annotations.DataProvider; import org.testng.annotations.DataProvider;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import me.chanjar.weixin.enterprise.bean.WxMenu.WxMenuButton; import me.chanjar.weixin.enterprise.bean.WxCpMenu.WxMenuButton;
@Test @Test
public class WxMenuTest { public class WxCpMenuTest {
@Test(dataProvider="wxReturnMenu") @Test(dataProvider="wxReturnMenu")
public void testFromJson(String json) { public void testFromJson(String json) {
WxMenu menu = WxMenu.fromJson(json); WxCpMenu menu = WxCpMenu.fromJson(json);
Assert.assertEquals(menu.getButtons().size(), 3); Assert.assertEquals(menu.getButtons().size(), 3);
} }
@Test(dataProvider="wxPushMenu") @Test(dataProvider="wxPushMenu")
public void testToJson(String json) { public void testToJson(String json) {
WxMenu menu = new WxMenu(); WxCpMenu menu = new WxCpMenu();
WxMenuButton button1 = new WxMenuButton(); WxMenuButton button1 = new WxMenuButton();
button1.setType("click"); button1.setType("click");
button1.setName("今日歌曲"); button1.setName("今日歌曲");