| @@ -1,6 +1,7 @@ | |||||
| package me.chanjar.weixin.mp.api; | package me.chanjar.weixin.mp.api; | ||||
| import me.chanjar.weixin.common.error.WxErrorException; | import me.chanjar.weixin.common.error.WxErrorException; | ||||
| import me.chanjar.weixin.mp.bean.wifi.WxMpWifiShopDataResult; | |||||
| import me.chanjar.weixin.mp.bean.wifi.WxMpWifiShopListResult; | import me.chanjar.weixin.mp.bean.wifi.WxMpWifiShopListResult; | ||||
| /** | /** | ||||
| @@ -21,8 +22,27 @@ public interface WxMpWifiService { | |||||
| * http请求方式: POST | * http请求方式: POST | ||||
| * 请求URL:https://api.weixin.qq.com/bizwifi/shop/list?access_token=ACCESS_TOKEN | * 请求URL:https://api.weixin.qq.com/bizwifi/shop/list?access_token=ACCESS_TOKEN | ||||
| * </pre> | * </pre> | ||||
| * @param pageIndex 分页下标,默认从1开始 | |||||
| * | |||||
| * @param pageIndex 分页下标,默认从1开始 | |||||
| * @param pageSize 每页的个数,默认10个,最大20个 | * @param pageSize 每页的个数,默认10个,最大20个 | ||||
| * @return 结果 | |||||
| * @throws WxErrorException 异常 | |||||
| */ | */ | ||||
| WxMpWifiShopListResult listShop(int pageIndex, int pageSize) throws WxErrorException; | WxMpWifiShopListResult listShop(int pageIndex, int pageSize) throws WxErrorException; | ||||
| /** | |||||
| * <pre> | |||||
| * 查询门店Wi-Fi信息 | |||||
| * 通过此接口查询某一门店的详细Wi-Fi信息,包括门店内的设备类型、ssid、密码、设备数量、商家主页URL、顶部常驻入口文案。 | |||||
| * | |||||
| * http请求方式: POST | |||||
| * 请求URL:https://api.weixin.qq.com/bizwifi/shop/get?access_token=ACCESS_TOKEN | |||||
| * POST数据格式:JSON | |||||
| * </pre> | |||||
| * | |||||
| * @param shopId 门店ID | |||||
| * @return 结果 | |||||
| * @throws WxErrorException 异常 | |||||
| */ | |||||
| WxMpWifiShopDataResult getShopWifiInfo(int shopId) throws WxErrorException; | |||||
| } | } | ||||
| @@ -5,10 +5,11 @@ import lombok.RequiredArgsConstructor; | |||||
| import me.chanjar.weixin.common.error.WxErrorException; | import me.chanjar.weixin.common.error.WxErrorException; | ||||
| import me.chanjar.weixin.mp.api.WxMpService; | import me.chanjar.weixin.mp.api.WxMpService; | ||||
| import me.chanjar.weixin.mp.api.WxMpWifiService; | import me.chanjar.weixin.mp.api.WxMpWifiService; | ||||
| import me.chanjar.weixin.mp.bean.wifi.WxMpWifiShopDataResult; | |||||
| import me.chanjar.weixin.mp.bean.wifi.WxMpWifiShopListResult; | import me.chanjar.weixin.mp.bean.wifi.WxMpWifiShopListResult; | ||||
| import me.chanjar.weixin.mp.enums.WxMpApiUrl; | |||||
| import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Wifi.*; | |||||
| import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Wifi.BIZWIFI_SHOP_GET; | |||||
| import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Wifi.BIZWIFI_SHOP_LIST; | |||||
| /** | /** | ||||
| * <pre> | * <pre> | ||||
| @@ -29,4 +30,11 @@ public class WxMpWifiServiceImpl implements WxMpWifiService { | |||||
| final String result = this.wxMpService.post(BIZWIFI_SHOP_LIST, json.toString()); | final String result = this.wxMpService.post(BIZWIFI_SHOP_LIST, json.toString()); | ||||
| return WxMpWifiShopListResult.fromJson(result); | return WxMpWifiShopListResult.fromJson(result); | ||||
| } | } | ||||
| @Override | |||||
| public WxMpWifiShopDataResult getShopWifiInfo(int shopId) throws WxErrorException { | |||||
| JsonObject json = new JsonObject(); | |||||
| json.addProperty("shop_id", shopId); | |||||
| return WxMpWifiShopDataResult.fromJson(this.wxMpService.post(BIZWIFI_SHOP_GET, json.toString())); | |||||
| } | |||||
| } | } | ||||
| @@ -0,0 +1,114 @@ | |||||
| package me.chanjar.weixin.mp.bean.wifi; | |||||
| import com.google.gson.JsonParser; | |||||
| import com.google.gson.annotations.SerializedName; | |||||
| import lombok.Data; | |||||
| import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; | |||||
| import java.util.List; | |||||
| /** | |||||
| * 门店Wi-Fi信息. | |||||
| * | |||||
| * @author <a href="https://github.com/binarywang">Binary Wang</a> | |||||
| * @date 2019-06-16 | |||||
| */ | |||||
| @Data | |||||
| public class WxMpWifiShopDataResult { | |||||
| public static WxMpWifiShopDataResult fromJson(String json) { | |||||
| return WxMpGsonBuilder.create().fromJson( | |||||
| new JsonParser().parse(json).getAsJsonObject().get("data"), | |||||
| WxMpWifiShopDataResult.class); | |||||
| } | |||||
| /** | |||||
| * 门店名称. | |||||
| */ | |||||
| @SerializedName("shop_name") | |||||
| private String shopName; | |||||
| /** | |||||
| * 无线网络设备的ssid,未添加设备为空,多个ssid时显示第一个. | |||||
| */ | |||||
| @SerializedName("ssid") | |||||
| private String ssid; | |||||
| /** | |||||
| * 无线网络设备的ssid列表,返回数组格式. | |||||
| */ | |||||
| @SerializedName("ssid_list") | |||||
| private String[] ssidList; | |||||
| /** | |||||
| * ssid和密码的列表,数组格式。当为密码型设备时,密码才有值. | |||||
| */ | |||||
| @SerializedName("ssid_password_list") | |||||
| private List<SsidPassword> ssidPasswordList; | |||||
| /** | |||||
| * 设备密码,当设备类型为密码型时返回. | |||||
| */ | |||||
| @SerializedName("password") | |||||
| private String password; | |||||
| /** | |||||
| * 门店内设备的设备类型,0-未添加设备,4-密码型设备,31-portal型设备. | |||||
| */ | |||||
| @SerializedName("protocol_type") | |||||
| private Integer protocolType; | |||||
| /** | |||||
| * 门店内设备总数. | |||||
| */ | |||||
| @SerializedName("ap_count") | |||||
| private Integer apCount; | |||||
| /** | |||||
| * 商家主页模板类型. | |||||
| */ | |||||
| @SerializedName("template_id") | |||||
| private Integer templateId; | |||||
| /** | |||||
| * 商家主页链接. | |||||
| */ | |||||
| @SerializedName("homepage_url") | |||||
| private String homepageUrl; | |||||
| /** | |||||
| * 顶部常驻入口上显示的文本内容:0--欢迎光临+公众号名称;1--欢迎光临+门店名称;2--已连接+公众号名称+WiFi;3--已连接+门店名称+Wi-Fi. | |||||
| */ | |||||
| @SerializedName("bar_type") | |||||
| private Integer barType; | |||||
| /** | |||||
| * 连网完成页链接. | |||||
| */ | |||||
| @SerializedName("finishpage_url") | |||||
| private String finishPageUrl; | |||||
| /** | |||||
| * 商户自己的id,与门店poi_id对应关系,建议在添加门店时候建立关联关系,具体请参考“微信门店接口”. | |||||
| */ | |||||
| @SerializedName("sid") | |||||
| private String sid; | |||||
| /** | |||||
| * 门店ID(适用于微信卡券、微信门店业务),具体定义参考微信门店,与shop_id一一对应. | |||||
| */ | |||||
| @SerializedName("poi_id") | |||||
| private String poiId; | |||||
| @Data | |||||
| public static class SsidPassword { | |||||
| /** | |||||
| * 无线网络设备的ssid. | |||||
| */ | |||||
| private String ssid; | |||||
| /** | |||||
| * 无线网络设备的password. | |||||
| */ | |||||
| private String password; | |||||
| } | |||||
| } | |||||
| @@ -23,19 +23,19 @@ public class WxMpWifiShopListResult { | |||||
| } | } | ||||
| /** | /** | ||||
| * 总数 | |||||
| * 总数. | |||||
| */ | */ | ||||
| @SerializedName("totalcount") | @SerializedName("totalcount") | ||||
| private int totalCount; | private int totalCount; | ||||
| /** | /** | ||||
| * 分页下标 | |||||
| * 分页下标. | |||||
| */ | */ | ||||
| @SerializedName("pageindex") | @SerializedName("pageindex") | ||||
| private int pageIndex; | private int pageIndex; | ||||
| /** | /** | ||||
| * 分页页数 | |||||
| * 分页页数. | |||||
| */ | */ | ||||
| @SerializedName("pagecount") | @SerializedName("pagecount") | ||||
| private int pageCount; | private int pageCount; | ||||
| @@ -46,43 +46,46 @@ public class WxMpWifiShopListResult { | |||||
| public static class Record { | public static class Record { | ||||
| /** | /** | ||||
| * 门店ID(适用于微信连Wi-Fi业务) | |||||
| * 门店ID(适用于微信连Wi-Fi业务). | |||||
| */ | */ | ||||
| @SerializedName("shop_id") | @SerializedName("shop_id") | ||||
| private Integer shopId; | private Integer shopId; | ||||
| /** | /** | ||||
| * 门店名称 | |||||
| * 门店名称. | |||||
| */ | */ | ||||
| @SerializedName("shop_name") | @SerializedName("shop_name") | ||||
| private String shopName; | private String shopName; | ||||
| /** | /** | ||||
| * 无线网络设备的ssid,未添加设备为空,多个ssid时显示第一个 | |||||
| * 无线网络设备的ssid,未添加设备为空,多个ssid时显示第一个. | |||||
| */ | */ | ||||
| @SerializedName("ssid") | @SerializedName("ssid") | ||||
| private String ssid; | private String ssid; | ||||
| /** | /** | ||||
| * 无线网络设备的ssid列表,返回数组格式 | |||||
| * 无线网络设备的ssid列表,返回数组格式. | |||||
| */ | */ | ||||
| @SerializedName("ssid_list") | @SerializedName("ssid_list") | ||||
| private List<String> ssidList; | private List<String> ssidList; | ||||
| /** | /** | ||||
| * 门店内设备的设备类型,0-未添加设备,1-专业型设备,4-密码型设备,5-portal自助型设备,31-portal改造型设备 | |||||
| * 门店内设备的设备类型. | |||||
| * 0-未添加设备,1-专业型设备,4-密码型设备,5-portal自助型设备,31-portal改造型设备 | |||||
| */ | */ | ||||
| @SerializedName("protocol_type") | @SerializedName("protocol_type") | ||||
| private Integer protocolType; | private Integer protocolType; | ||||
| /** | /** | ||||
| * 商户自己的id,与门店poi_id对应关系,建议在添加门店时候建立关联关系,具体请参考“微信门店接口” | |||||
| * 商户自己的id. | |||||
| * 与门店poi_id对应关系,建议在添加门店时候建立关联关系,具体请参考“微信门店接口” | |||||
| */ | */ | ||||
| @SerializedName("sid") | @SerializedName("sid") | ||||
| private String sid; | private String sid; | ||||
| /** | /** | ||||
| * 门店ID(适用于微信卡券、微信门店业务),具体定义参考微信门店,与shop_id一一对应 | |||||
| * 门店ID(适用于微信卡券、微信门店业务). | |||||
| * 具体定义参考微信门店,与shop_id一一对应 | |||||
| */ | */ | ||||
| @SerializedName("poi_id") | @SerializedName("poi_id") | ||||
| private String poiId; | private String poiId; | ||||
| @@ -386,7 +386,12 @@ public interface WxMpApiUrl { | |||||
| /** | /** | ||||
| * list. | * list. | ||||
| */ | */ | ||||
| BIZWIFI_SHOP_LIST(API_DEFAULT_HOST_URL, "/bizwifi/shop/list"); | |||||
| BIZWIFI_SHOP_LIST(API_DEFAULT_HOST_URL, "/bizwifi/shop/list"), | |||||
| /** | |||||
| * get. | |||||
| */ | |||||
| BIZWIFI_SHOP_GET(API_DEFAULT_HOST_URL, "/bizwifi/shop/get"); | |||||
| private String prefix; | private String prefix; | ||||
| private String path; | private String path; | ||||
| @@ -4,11 +4,17 @@ import com.google.inject.Inject; | |||||
| import me.chanjar.weixin.common.error.WxErrorException; | import me.chanjar.weixin.common.error.WxErrorException; | ||||
| import me.chanjar.weixin.mp.api.WxMpService; | import me.chanjar.weixin.mp.api.WxMpService; | ||||
| import me.chanjar.weixin.mp.api.test.ApiTestModule; | import me.chanjar.weixin.mp.api.test.ApiTestModule; | ||||
| import me.chanjar.weixin.mp.bean.wifi.WxMpWifiShopDataResult; | |||||
| import me.chanjar.weixin.mp.bean.wifi.WxMpWifiShopListResult; | import me.chanjar.weixin.mp.bean.wifi.WxMpWifiShopListResult; | ||||
| import org.testng.annotations.Guice; | import org.testng.annotations.Guice; | ||||
| import org.testng.annotations.Test; | import org.testng.annotations.Test; | ||||
| import static org.testng.Assert.*; | |||||
| import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Wifi.BIZWIFI_SHOP_GET; | |||||
| import static org.assertj.core.api.Assertions.assertThat; | |||||
| import static org.mockito.Matchers.anyString; | |||||
| import static org.mockito.Matchers.eq; | |||||
| import static org.mockito.Mockito.mock; | |||||
| import static org.mockito.Mockito.when; | |||||
| /** | /** | ||||
| * <pre> | * <pre> | ||||
| @@ -26,6 +32,59 @@ public class WxMpWifiServiceImplTest { | |||||
| @Test | @Test | ||||
| public void testListShop() throws WxErrorException { | public void testListShop() throws WxErrorException { | ||||
| final WxMpWifiShopListResult result = this.wxService.getWifiService().listShop(1, 2); | final WxMpWifiShopListResult result = this.wxService.getWifiService().listShop(1, 2); | ||||
| assertThat(result).isNotNull(); | |||||
| System.out.println(result); | System.out.println(result); | ||||
| } | } | ||||
| @Test | |||||
| public void testGetShopWifiInfo() throws WxErrorException { | |||||
| final WxMpWifiShopDataResult wifiInfo = this.wxService.getWifiService().getShopWifiInfo(123); | |||||
| assertThat(wifiInfo).isNotNull(); | |||||
| System.out.println(wifiInfo); | |||||
| } | |||||
| public static class MockTest { | |||||
| private WxMpService wxService = mock(WxMpService.class); | |||||
| @Test | |||||
| public void testGetShopWifiInfo() throws Exception { | |||||
| String returnJson = "{\n" + | |||||
| " \"errcode\": 0,\n" + | |||||
| " \"data\": {\n" + | |||||
| " \"shop_name\": \"南山店\",\n" + | |||||
| " \"ssid\": \" WX123\",\n" + | |||||
| " \"ssid_list\": [\n" + | |||||
| " \"WX123\",\n" + | |||||
| " \"WX456\"\n" + | |||||
| " ],\n" + | |||||
| " \"ssid_password_list\": [\n" + | |||||
| " {\n" + | |||||
| " \"ssid\": \"WX123\",\n" + | |||||
| " \"password\": \"123456789\"\n" + | |||||
| " },\n" + | |||||
| " {\n" + | |||||
| " \"ssid\": \"WX456\",\n" + | |||||
| " \"password\": \"21332465dge\"\n" + | |||||
| " }\n" + | |||||
| " ],\n" + | |||||
| " \"password\": \"123456789\",\n" + | |||||
| " \"protocol_type\": 4,\n" + | |||||
| " \"ap_count\": 2,\n" + | |||||
| " \"template_id\": 1,\n" + | |||||
| " \"homepage_url\": \"http://www.weixin.qq.com/\",\n" + | |||||
| " \"bar_type\": 1,\n" + | |||||
| " \"sid\":\"\",\n" + | |||||
| " \"poi_id\":\"285633617\"\n" + | |||||
| " }\n" + | |||||
| "}"; | |||||
| when(wxService.post(eq(BIZWIFI_SHOP_GET), anyString())).thenReturn(returnJson); | |||||
| when(wxService.getWifiService()).thenReturn(new WxMpWifiServiceImpl(wxService)); | |||||
| final WxMpWifiShopDataResult wifiInfo = this.wxService.getWifiService().getShopWifiInfo(123); | |||||
| assertThat(wifiInfo).isNotNull(); | |||||
| System.out.println(wifiInfo); | |||||
| } | |||||
| } | |||||
| } | } | ||||