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);
+ }
+}