From d70b9074071f4f08cb23697e43ec132a9f21619b Mon Sep 17 00:00:00 2001 From: JCLee <452415615@qq.com> Date: Fri, 17 Dec 2021 11:57:15 +0800 Subject: [PATCH] =?UTF-8?q?:new:=20#2451=20=E3=80=90=E5=B0=8F=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F=E3=80=91=E5=A2=9E=E5=8A=A0=E8=AE=BE=E5=A4=87=E8=AE=A2?= =?UTF-8?q?=E9=98=85=E6=B6=88=E6=81=AF=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/WxMaDeviceSubscribeService.java | 40 +++++++++++ .../wx/miniapp/api/WxMaService.java | 7 ++ .../miniapp/api/impl/BaseWxMaServiceImpl.java | 4 ++ .../impl/WxMaDeviceSubscribeServiceImpl.java | 50 +++++++++++++ .../WxMaDeviceSubscribeMessageRequest.java | 72 +++++++++++++++++++ .../bean/device/WxMaDeviceTicketRequest.java | 41 +++++++++++ .../miniapp/constant/WxMaApiUrlConstants.java | 14 ++++ .../WxMaDeviceSubscribeServiceImplTest.java | 59 +++++++++++++++ 8 files changed, 287 insertions(+) create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaDeviceSubscribeService.java create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaDeviceSubscribeServiceImpl.java create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/device/WxMaDeviceSubscribeMessageRequest.java create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/device/WxMaDeviceTicketRequest.java create mode 100644 weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaDeviceSubscribeServiceImplTest.java 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 new file mode 100644 index 000000000..f44f64e48 --- /dev/null +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaDeviceSubscribeService.java @@ -0,0 +1,40 @@ +package cn.binarywang.wx.miniapp.api; + +import cn.binarywang.wx.miniapp.bean.device.WxMaDeviceSubscribeMessageRequest; +import cn.binarywang.wx.miniapp.bean.device.WxMaDeviceTicketRequest; +import me.chanjar.weixin.common.error.WxErrorException; + +/** + * 小程序设备订阅消息相关 API + * 文档: + * + * @author JCLee + * @since 2021-12-16 17:13:35 + */ +public interface WxMaDeviceSubscribeService { + + /** + *
+   * 获取设备票据
+   * 应用场景:
+   * 小程序前端界面拉起设备消息授权订阅弹框界面
+   * 注意:
+   * 设备ticket有效时间为5分钟
+   * 
+ * @param deviceTicketRequest + * @return + * @throws WxErrorException + */ + String getSnTicket(WxMaDeviceTicketRequest deviceTicketRequest) throws WxErrorException; + + /** + *
+   * 发送设备订阅消息
+   * 
+ * + * @param deviceSubscribeMessageRequest 订阅消息 + * @throws WxErrorException . + */ + void sendDeviceSubscribeMsg(WxMaDeviceSubscribeMessageRequest deviceSubscribeMessageRequest) throws WxErrorException; + +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaService.java index d0b2dcf12..b22f86538 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaService.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaService.java @@ -462,4 +462,11 @@ public interface WxMaService extends WxService { * @return */ WxMaReimburseInvoiceService getReimburseInvoiceService(); + + /** + * 返回设备订阅消息相关接口服务对象 + * + * @return WxMaDeviceSubscribeService plugin service + */ + WxMaDeviceSubscribeService getDeviceSubscribeService(); } diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java index ecbce2ee0..e6ab2b988 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java @@ -75,6 +75,7 @@ public abstract class BaseWxMaServiceImpl implements WxMaService, RequestH private final WxMaShopDeliveryService shopDeliveryService = new WxMaShopDeliveryServiceImpl(this); private final WxMaLinkService linkService = new WxMaLinkServiceImpl(this); private final WxMaReimburseInvoiceService reimburseInvoiceService = new WxMaReimburseInvoiceServiceImpl(this); + private final WxMaDeviceSubscribeService deviceSubscribeService = new WxMaDeviceSubscribeServiceImpl(this); private Map configMap; private int retrySleepMillis = 1000; private int maxRetryTimes = 5; @@ -573,4 +574,7 @@ public abstract class BaseWxMaServiceImpl implements WxMaService, RequestH public WxMaReimburseInvoiceService getReimburseInvoiceService() { return this.reimburseInvoiceService; } + + @Override + public WxMaDeviceSubscribeService getDeviceSubscribeService(){ return this.deviceSubscribeService; } } 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 new file mode 100644 index 000000000..db12ab9b5 --- /dev/null +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaDeviceSubscribeServiceImpl.java @@ -0,0 +1,50 @@ +package cn.binarywang.wx.miniapp.api.impl; + +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.constant.WxMaConstants; +import com.google.gson.JsonObject; +import lombok.RequiredArgsConstructor; +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 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; + +/** + * 小程序设备订阅消息相关 API + * 文档: + * + * @author JCLee + * @since 2021-12-16 17:13:35 + */ + +@RequiredArgsConstructor +public class WxMaDeviceSubscribeServiceImpl implements WxMaDeviceSubscribeService { + + private final WxMaService service; + + @Override + public String getSnTicket(WxMaDeviceTicketRequest deviceTicketRequest) throws WxErrorException { + String responseContent = this.service.post(GET_SN_TICKET_URL, deviceTicketRequest.toJson()); + JsonObject jsonObject = GsonParser.parse(responseContent); + if (jsonObject.get(WxMaConstants.ERRCODE).getAsInt() != 0) { + throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp)); + } + String snTicket = jsonObject.get("sn_ticket").getAsString(); + return snTicket; + } + + @Override + public void sendDeviceSubscribeMsg(WxMaDeviceSubscribeMessageRequest deviceSubscribeMessageRequest) throws WxErrorException { + String responseContent = this.service.post(SEND_DEVICE_SUBSCRIBE_MSG_URL, deviceSubscribeMessageRequest.toJson()); + JsonObject jsonObject = GsonParser.parse(responseContent); + if (jsonObject.get(WxMaConstants.ERRCODE).getAsInt() != 0) { + throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp)); + } + } +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/device/WxMaDeviceSubscribeMessageRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/device/WxMaDeviceSubscribeMessageRequest.java new file mode 100644 index 000000000..34158391a --- /dev/null +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/device/WxMaDeviceSubscribeMessageRequest.java @@ -0,0 +1,72 @@ +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 JCLee + * @since 2021-12-16 17:13:22 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class WxMaDeviceSubscribeMessageRequest implements Serializable { + + private static final long serialVersionUID = -7973228178407991299L; + + /** + * 接收者(用户)的 openid列表. + */ + @SerializedName("to_openid_list") + private List toOpenidList; + + /** + * 下发通知的设备唯⼀序列号。由⼚商⽣成 + */ + @SerializedName("sn") + private String sn; + + /** + * 所需下发的消息模板ID + */ + @SerializedName("template_id") + private String templateId; + + /** + * 点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转. + */ + @SerializedName("page") + private String page; + + /** + * 跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版. + */ + @SerializedName("miniprogram_state") + private String miniprogramState; + + /** + * 进入小程序查看”的语言类型,支持zh_CN(简体中文)、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文),默认为zh_CN. + */ + @SerializedName("lang") + private String lang; + + /** + * 模板内容,格式形如 { "key1": { "value": any }, "key2": { "value": any } }. + */ + @SerializedName("data") + private Object data; + + public String toJson() { + return WxMaGsonBuilder.create().toJson(this); + } +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/device/WxMaDeviceTicketRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/device/WxMaDeviceTicketRequest.java new file mode 100644 index 000000000..c3319eecd --- /dev/null +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/device/WxMaDeviceTicketRequest.java @@ -0,0 +1,41 @@ +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; + +/** + * 小程序设备ticket请求参数 + * + * @author JCLee + * @since 2021-12-16 17:13:28 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class WxMaDeviceTicketRequest implements Serializable { + private static final long serialVersionUID = -2152114813101871295L; + + /** + * 设备型号id。通过注册设备获得(必填) + * + */ + @SerializedName("model_id") + private String modelId; + + /** + * 设备唯⼀序列号。由⼚商分配。⻓度不能超过128字节。字符只接受数字与⼤⼩写字⺟(必填) + */ + @SerializedName("sn") + private String sn; + + 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 17b72c8db..0ab0d279d 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 @@ -396,4 +396,18 @@ public class WxMaApiUrlConstants { public interface Internet{ String GET_USER_ENCRYPT_KEY = "https://api.weixin.qq.com/wxa/business/getuserencryptkey"; } + + /** + * 设备订阅消息 + */ + public interface DeviceSubscribe { + /** + * 获取设备票据 + */ + String GET_SN_TICKET_URL = "https://api.weixin.qq.com/wxa/getsnticket"; + /** + * 发送设备订阅消息 + */ + String SEND_DEVICE_SUBSCRIBE_MSG_URL = "https://api.weixin.qq.com/cgi-bin/message/device/subscribe/send"; + } } 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 new file mode 100644 index 000000000..e1c439054 --- /dev/null +++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaDeviceSubscribeServiceImplTest.java @@ -0,0 +1,59 @@ +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.test.ApiTestModule; +import com.google.common.collect.Lists; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; +import com.google.inject.Inject; +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; + +/** + * 小程序设备订阅消息相关 测试类 + * + * @author JCLee + * @since 2021-12-16 17:13:35 + */ +@Test +@Guice(modules = ApiTestModule.class) +public class WxMaDeviceSubscribeServiceImplTest { + + @Inject + protected WxMaService wxService; + + @Test + public void testGetSnTicket() throws WxErrorException{ + WxMaDeviceTicketRequest wxMaDeviceTicketRequest = new WxMaDeviceTicketRequest(); + wxMaDeviceTicketRequest.setModelId("11111"); + wxMaDeviceTicketRequest.setSn("11111"); + String snTicket = this.wxService.getDeviceSubscribeService().getSnTicket(wxMaDeviceTicketRequest); + System.out.println(snTicket); + } + + @Test + public void sendDeviceSubscribeMsg() throws WxErrorException{ + WxMaDeviceSubscribeMessageRequest wxMaDeviceSubscribeMessageRequest = new WxMaDeviceSubscribeMessageRequest(); + wxMaDeviceSubscribeMessageRequest.setToOpenidList(Lists.newArrayList("1", "2")); + wxMaDeviceSubscribeMessageRequest.setPage("pages/index/index"); + wxMaDeviceSubscribeMessageRequest.setTemplateId("11111111"); + wxMaDeviceSubscribeMessageRequest.setSn("111111"); + JsonObject data = GsonParser.parse("{\n" + + "\t\t\"thing2\": {\n" + + "\t\t\t\"value\": \"阳台\"\n" + + "\t\t},\n" + + "\t\t\"time1\": {\n" + + "\t\t\t\"value\": \"2021-09-30 13:32:44\"\n" + + "\t\t},\n" + + "\t\t\"thing3\": {\n" + + "\t\t\t\"value\": \"洗衣已完成\"\n" + + "\t\t}\n" + + "\t}"); + wxMaDeviceSubscribeMessageRequest.setData(data); + this.wxService.getDeviceSubscribeService().sendDeviceSubscribeMsg(wxMaDeviceSubscribeMessageRequest); + } +}