diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaDeviceSubscribeService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaDeviceSubscribeService.java index f44f64e48d..b45bc058a6 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaDeviceSubscribeService.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaDeviceSubscribeService.java @@ -1,9 +1,10 @@ package cn.binarywang.wx.miniapp.api; -import cn.binarywang.wx.miniapp.bean.device.WxMaDeviceSubscribeMessageRequest; -import cn.binarywang.wx.miniapp.bean.device.WxMaDeviceTicketRequest; +import cn.binarywang.wx.miniapp.bean.device.*; import me.chanjar.weixin.common.error.WxErrorException; +import java.util.List; + /** * 小程序设备订阅消息相关 API * 文档: @@ -21,6 +22,7 @@ public interface WxMaDeviceSubscribeService { * 注意: * 设备ticket有效时间为5分钟 * + * * @param deviceTicketRequest * @return * @throws WxErrorException @@ -37,4 +39,53 @@ public interface WxMaDeviceSubscribeService { */ void sendDeviceSubscribeMsg(WxMaDeviceSubscribeMessageRequest deviceSubscribeMessageRequest) throws WxErrorException; + /** + *
+   * 创建设备组
+   * 详情请见:https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/hardware-device/createIotGroupId.html
+   * 
+ * + * @param createIotGroupIdRequest 请求参数 + * @return 设备组的唯一标识 + * @throws WxErrorException + */ + String createIotGroupId(WxMaCreateIotGroupIdRequest createIotGroupIdRequest) throws WxErrorException; + + /** + *
+   * 查询设备组信息
+   * 详情请见:https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/hardware-device/getIotGroupInfo.html
+   * 
+ * + * @param getIotGroupInfoRequest 请求参数 + * @return 设备组信息 + * @throws WxErrorException + */ + WxMaIotGroupDeviceInfoResponse getIotGroupInfo(WxMaGetIotGroupInfoRequest getIotGroupInfoRequest) throws WxErrorException; + + /** + *
+   * 设备组添加设备
+   * 一个设备组最多添加 50 个设备。 一个设备同一时间只能被添加到一个设备组中。
+   * 详情请见:https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/hardware-device/addIotGroupDevice.html
+   * 
+ * + * @param request 请求参数 + * @return 成功添加的设备信息 + * @throws WxErrorException + */ + List addIotGroupDevice(WxMaIotGroupDeviceRequest request) throws WxErrorException; + + /** + *
+   * 设备组删除设备
+   * 详情请见:https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/hardware-device/removeIotGroupDevice.html
+   * 
+ * + * @param request 请求参数 + * @return 成功删除的设备信息 + * @throws WxErrorException + */ + List removeIotGroupDevice(WxMaIotGroupDeviceRequest request) throws WxErrorException; + } diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaDeviceSubscribeServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaDeviceSubscribeServiceImpl.java index 7f8dce1df8..632fe7bd94 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaDeviceSubscribeServiceImpl.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaDeviceSubscribeServiceImpl.java @@ -2,18 +2,26 @@ import cn.binarywang.wx.miniapp.api.WxMaDeviceSubscribeService; import cn.binarywang.wx.miniapp.api.WxMaService; -import cn.binarywang.wx.miniapp.bean.device.WxMaDeviceSubscribeMessageRequest; -import cn.binarywang.wx.miniapp.bean.device.WxMaDeviceTicketRequest; +import cn.binarywang.wx.miniapp.bean.device.*; +import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder; import com.google.gson.JsonObject; +import com.google.gson.reflect.TypeToken; import lombok.RequiredArgsConstructor; import me.chanjar.weixin.common.api.WxConsts; import me.chanjar.weixin.common.enums.WxType; import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.json.GsonParser; +import me.chanjar.weixin.common.util.json.WxGsonBuilder; + +import java.util.List; import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.DeviceSubscribe.GET_SN_TICKET_URL; import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.DeviceSubscribe.SEND_DEVICE_SUBSCRIBE_MSG_URL; +import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.DeviceSubscribe.CREATE_IOT_GROUP_ID_URL; +import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.DeviceSubscribe.GET_IOT_GROUP_INFO_URL; +import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.DeviceSubscribe.ADD_IOT_GROUP_DEVICE_URL; +import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.DeviceSubscribe.REMOVE_IOT_GROUP_DEVICE_URL; /** * 小程序设备订阅消息相关 API @@ -47,4 +55,46 @@ public void sendDeviceSubscribeMsg(WxMaDeviceSubscribeMessageRequest deviceSubsc throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp)); } } + + @Override + public String createIotGroupId(WxMaCreateIotGroupIdRequest createIotGroupIdRequest) throws WxErrorException { + String responseContent = this.service.post(CREATE_IOT_GROUP_ID_URL, createIotGroupIdRequest.toJson()); + JsonObject jsonObject = GsonParser.parse(responseContent); + if (jsonObject.get(WxConsts.ERR_CODE).getAsInt() != 0) { + throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp)); + } + return jsonObject.get("group_id").getAsString(); + } + + @Override + public WxMaIotGroupDeviceInfoResponse getIotGroupInfo(WxMaGetIotGroupInfoRequest getIotGroupInfoRequest) throws WxErrorException { + String responseContent = this.service.post(GET_IOT_GROUP_INFO_URL, getIotGroupInfoRequest.toJson()); + JsonObject jsonObject = GsonParser.parse(responseContent); + if (jsonObject.get(WxConsts.ERR_CODE).getAsInt() != 0) { + throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp)); + } + return WxGsonBuilder.create().fromJson(responseContent, WxMaIotGroupDeviceInfoResponse.class); + } + + @Override + public List addIotGroupDevice(WxMaIotGroupDeviceRequest request) throws WxErrorException { + String responseContent = this.service.post(ADD_IOT_GROUP_DEVICE_URL, request.toJson()); + JsonObject jsonObject = GsonParser.parse(responseContent); + if (jsonObject.get(WxConsts.ERR_CODE).getAsInt() != 0) { + throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp)); + } + return WxMaGsonBuilder.create().fromJson(jsonObject.getAsJsonArray("device_list"), new TypeToken>() { + }.getType()); + } + + @Override + public List removeIotGroupDevice(WxMaIotGroupDeviceRequest request) throws WxErrorException { + String responseContent = this.service.post(REMOVE_IOT_GROUP_DEVICE_URL, request.toJson()); + JsonObject jsonObject = GsonParser.parse(responseContent); + if (jsonObject.get(WxConsts.ERR_CODE).getAsInt() != 0) { + throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp)); + } + return WxMaGsonBuilder.create().fromJson(jsonObject.getAsJsonArray("device_list"), new TypeToken>() { + }.getType()); + } } diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/device/WxMaCreateIotGroupIdRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/device/WxMaCreateIotGroupIdRequest.java new file mode 100644 index 0000000000..20a0a146ae --- /dev/null +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/device/WxMaCreateIotGroupIdRequest.java @@ -0,0 +1,38 @@ +package cn.binarywang.wx.miniapp.bean.device; + +import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder; +import com.google.gson.annotations.SerializedName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * @Author: yanglegetuo + * @Date: 2025/12/22 8:51 + * @Description: 创建设备组 请求参数 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class WxMaCreateIotGroupIdRequest implements Serializable { + private static final long serialVersionUID = 1827809470414413390L; + /** + * 设备型号id。通过注册设备获得(必填) + */ + @SerializedName("model_id") + private String modelId; + /** + * 设备组的名称(创建时决定,无法修改) + */ + @SerializedName("group_name") + private String groupName; + + + public String toJson() { + return WxMaGsonBuilder.create().toJson(this); + } +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/device/WxMaGetIotGroupInfoRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/device/WxMaGetIotGroupInfoRequest.java new file mode 100644 index 0000000000..47ebc2be44 --- /dev/null +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/device/WxMaGetIotGroupInfoRequest.java @@ -0,0 +1,33 @@ +package cn.binarywang.wx.miniapp.bean.device; + +import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder; +import com.google.gson.annotations.SerializedName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * @Author: yanglegetuo + * @Date: 2025/12/22 8:51 + * @Description: 查询设备组信息 请求参数 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class WxMaGetIotGroupInfoRequest implements Serializable { + + private static final long serialVersionUID = 4913375114243384968L; + /** + * 设备组的唯一标识(必填) + */ + @SerializedName("group_id") + private String groupId; + + public String toJson() { + return WxMaGsonBuilder.create().toJson(this); + } +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/device/WxMaIotGroupDeviceInfoResponse.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/device/WxMaIotGroupDeviceInfoResponse.java new file mode 100644 index 0000000000..e7bd92edf8 --- /dev/null +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/device/WxMaIotGroupDeviceInfoResponse.java @@ -0,0 +1,51 @@ +package cn.binarywang.wx.miniapp.bean.device; + +import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder; +import com.google.gson.annotations.SerializedName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +/** + * @Author: yanglegetuo + * @Date: 2025/12/22 8:51 + * @Description: 设备组信息 响应参数 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class WxMaIotGroupDeviceInfoResponse implements Serializable { + + private static final long serialVersionUID = 6615660801230308048L; + /** + * 设备组名称 + */ + @SerializedName("group_name") + private String groupName; + /** + * 设备列表 + */ + @SerializedName("device_list") + private List deviceList; + + /** + * 设备型号id。通过注册设备获得(必填) + */ + @SerializedName("model_id") + private String modelId; + /** + * 设备类型 + */ + @SerializedName("model_type") + private String modelType; + + + public String toJson() { + return WxMaGsonBuilder.create().toJson(this); + } +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/device/WxMaIotGroupDeviceRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/device/WxMaIotGroupDeviceRequest.java new file mode 100644 index 0000000000..02b87d6f02 --- /dev/null +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/device/WxMaIotGroupDeviceRequest.java @@ -0,0 +1,44 @@ +package cn.binarywang.wx.miniapp.bean.device; + +import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder; +import com.google.gson.annotations.SerializedName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +/** + * @Author: yanglegetuo + * @Date: 2025/12/22 8:51 + * @Description: 设备组 添加/移除 设备 请求参数 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class WxMaIotGroupDeviceRequest implements Serializable { + private static final long serialVersionUID = -5648997758678588138L; + + /** + * 设备组的唯一标识(必填) + */ + @SerializedName("group_id") + private String groupId; + /** + * 设备列表 + */ + @SerializedName("device_list") + private List deviceList; + /** + * 是否强制更新设备列表,等于 true 时将已存在其它设备组中的设备移除并添加到当前设备组,慎用。 + */ + @SerializedName("force_add") + private Boolean forceAdd; + + public String toJson() { + return WxMaGsonBuilder.create().toJson(this); + } +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java index 76625334f4..2a7496e06e 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java @@ -569,6 +569,14 @@ public interface DeviceSubscribe { /** 发送设备订阅消息 */ String SEND_DEVICE_SUBSCRIBE_MSG_URL = "https://api.weixin.qq.com/cgi-bin/message/device/subscribe/send"; + /** 创建设备组 */ + String CREATE_IOT_GROUP_ID_URL = "https://api.weixin.qq.com/wxa/business/group/createid"; + /** 设备组添加设备 */ + String ADD_IOT_GROUP_DEVICE_URL = "https://api.weixin.qq.com/wxa/business/group/adddevice"; + /** 设备组删除设备 */ + String REMOVE_IOT_GROUP_DEVICE_URL = "https://api.weixin.qq.com/wxa/business/group/removedevice"; + /** 查询设备组信息 */ + String GET_IOT_GROUP_INFO_URL = "https://api.weixin.qq.com/wxa/business/group/getinfo"; } /** diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaDeviceSubscribeServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaDeviceSubscribeServiceImplTest.java index e1c4390549..838713868a 100644 --- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaDeviceSubscribeServiceImplTest.java +++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaDeviceSubscribeServiceImplTest.java @@ -1,24 +1,27 @@ package cn.binarywang.wx.miniapp.api.impl; import cn.binarywang.wx.miniapp.api.WxMaService; -import cn.binarywang.wx.miniapp.bean.device.WxMaDeviceSubscribeMessageRequest; -import cn.binarywang.wx.miniapp.bean.device.WxMaDeviceTicketRequest; +import cn.binarywang.wx.miniapp.bean.device.*; import cn.binarywang.wx.miniapp.test.ApiTestModule; import com.google.common.collect.Lists; -import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; import com.google.inject.Inject; +import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.json.GsonParser; import org.testng.annotations.Guice; import org.testng.annotations.Test; +import java.util.Collections; +import java.util.List; + /** * 小程序设备订阅消息相关 测试类 * * @author JCLee * @since 2021-12-16 17:13:35 */ +@Slf4j @Test @Guice(modules = ApiTestModule.class) public class WxMaDeviceSubscribeServiceImplTest { @@ -27,7 +30,7 @@ public class WxMaDeviceSubscribeServiceImplTest { protected WxMaService wxService; @Test - public void testGetSnTicket() throws WxErrorException{ + public void testGetSnTicket() throws WxErrorException { WxMaDeviceTicketRequest wxMaDeviceTicketRequest = new WxMaDeviceTicketRequest(); wxMaDeviceTicketRequest.setModelId("11111"); wxMaDeviceTicketRequest.setSn("11111"); @@ -36,7 +39,7 @@ public void testGetSnTicket() throws WxErrorException{ } @Test - public void sendDeviceSubscribeMsg() throws WxErrorException{ + public void sendDeviceSubscribeMsg() throws WxErrorException { WxMaDeviceSubscribeMessageRequest wxMaDeviceSubscribeMessageRequest = new WxMaDeviceSubscribeMessageRequest(); wxMaDeviceSubscribeMessageRequest.setToOpenidList(Lists.newArrayList("1", "2")); wxMaDeviceSubscribeMessageRequest.setPage("pages/index/index"); @@ -56,4 +59,46 @@ public void sendDeviceSubscribeMsg() throws WxErrorException{ wxMaDeviceSubscribeMessageRequest.setData(data); this.wxService.getDeviceSubscribeService().sendDeviceSubscribeMsg(wxMaDeviceSubscribeMessageRequest); } + + @Test + public void testCreateIotGroupId() throws WxErrorException { + WxMaCreateIotGroupIdRequest request = new WxMaCreateIotGroupIdRequest(); + request.setModelId("11111"); + request.setGroupName("测试设备组"); + String groupId = this.wxService.getDeviceSubscribeService().createIotGroupId(request); + System.out.println(groupId); + } + + @Test + public void testGetIotGroupInfo() throws WxErrorException { + WxMaGetIotGroupInfoRequest request = new WxMaGetIotGroupInfoRequest(); + request.setGroupId("12313123"); + WxMaIotGroupDeviceInfoResponse response = this.wxService.getDeviceSubscribeService().getIotGroupInfo(request); + log.info("testGetIotGroupInfo = {}", response); + } + + @Test + public void testAddIotGroupDevice() throws WxErrorException { + WxMaDeviceTicketRequest deviceTicketRequest = new WxMaDeviceTicketRequest(); + deviceTicketRequest.setSn("2222222"); + deviceTicketRequest.setModelId("sdfeweee"); + WxMaIotGroupDeviceRequest request = new WxMaIotGroupDeviceRequest(); + request.setGroupId("12313123"); + request.setDeviceList(Collections.singletonList(deviceTicketRequest)); + request.setForceAdd(true); + List response = this.wxService.getDeviceSubscribeService().addIotGroupDevice(request); + log.info("testAddIotGroupDevice = {}", response); + } + + @Test + public void testRemoveIotGroupDevice() throws WxErrorException { + WxMaDeviceTicketRequest deviceTicketRequest = new WxMaDeviceTicketRequest(); + deviceTicketRequest.setSn("2222222"); + deviceTicketRequest.setModelId("sdfeweee"); + WxMaIotGroupDeviceRequest request = new WxMaIotGroupDeviceRequest(); + request.setGroupId("12313123"); + request.setDeviceList(Collections.singletonList(deviceTicketRequest)); + List response = this.wxService.getDeviceSubscribeService().removeIotGroupDevice(request); + log.info("testRemoveIotGroupDevice = {}", response); + } }