From 17f32c613e6a48007b5f49ae03631fd83d5ae145 Mon Sep 17 00:00:00 2001
From: guoshilong <123456>
Date: Wed, 19 Jul 2023 11:20:00 +0800
Subject: [PATCH] 集成个推
---
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/resources/application-dev.yml | 7 +
skjcmanager/skjcmanager-service/skjcmanager-alerts/pom.xml | 6
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/controller/PushController.java | 11 +
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/utils/GeTuiUtils.java | 268 ++++++++++++++++++++++++++++++++++++++
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/service/IPushService.java | 7 +
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/config/GeTuiConfig.java | 44 ++++++
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/service/impl/PushServiceImpl.java | 40 ++++-
7 files changed, 372 insertions(+), 11 deletions(-)
diff --git a/skjcmanager/skjcmanager-service/skjcmanager-alerts/pom.xml b/skjcmanager/skjcmanager-service/skjcmanager-alerts/pom.xml
index 8b4bfc7..316ba29 100644
--- a/skjcmanager/skjcmanager-service/skjcmanager-alerts/pom.xml
+++ b/skjcmanager/skjcmanager-service/skjcmanager-alerts/pom.xml
@@ -38,6 +38,12 @@
<groupId>org.springblade</groupId>
<artifactId>blade-starter-excel</artifactId>
</dependency>
+ <!--个推-->
+ <dependency>
+ <groupId>com.getui.push</groupId>
+ <artifactId>restful-sdk</artifactId>
+ <version>1.0.0.11</version>
+ </dependency>
<dependency>
<groupId>cn.gistack</groupId>
<artifactId>skjcmanager-sm-api</artifactId>
diff --git a/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/config/GeTuiConfig.java b/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/config/GeTuiConfig.java
new file mode 100644
index 0000000..530cdbf
--- /dev/null
+++ b/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/config/GeTuiConfig.java
@@ -0,0 +1,44 @@
+package cn.gistack.alerts.push.config;
+
+import com.getui.push.v2.sdk.ApiHelper;
+import com.getui.push.v2.sdk.GtApiConfiguration;
+import com.getui.push.v2.sdk.api.PushApi;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class GeTuiConfig {
+ @Value("${getui.baseUrl}")
+ private String baseUrl;
+
+ @Value("${getui.appId}")
+ private String appId;
+
+ @Value("${getui.appKey}")
+ private String appKey;
+
+ @Value("${getui.appSecret}")
+ private String appSecret;
+
+ @Value("${getui.masterSecret}")
+ private String masterSecret;
+
+ @Bean(name = "myPushApi")
+ public PushApi pushApi() {
+ // 设置httpClient最大连接数,当并发较大时建议调大此参数。或者启动参数加上 -Dhttp.maxConnections=200
+ System.setProperty("http.maxConnections", "200");
+ GtApiConfiguration apiConfiguration = new GtApiConfiguration();
+ //填写应用配置
+ apiConfiguration.setAppId(appId);
+ apiConfiguration.setAppKey(appKey);
+ apiConfiguration.setMasterSecret(masterSecret);
+ // 接口调用前缀,请查看文档: 接口调用规范 -> 接口前缀, 可不填写appId
+ apiConfiguration.setDomain(baseUrl);
+
+ // 实例化ApiHelper对象,用于创建接口对象
+ ApiHelper apiHelper = ApiHelper.build(apiConfiguration);
+ // 创建对象,建议复用。目前有PushApi、StatisticApi、UserApi
+ return apiHelper.creatApi(PushApi.class);
+ }
+}
diff --git a/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/controller/PushController.java b/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/controller/PushController.java
index 24ae508..ee5505b 100644
--- a/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/controller/PushController.java
+++ b/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/controller/PushController.java
@@ -56,4 +56,15 @@
return R.data(pushService.pushMessageOnLaunch(userId));
}
+ /**
+ * 集成的个推sdk消息推送
+ * @param pushVO
+ * @return
+ */
+ @PostMapping("/geTuiPushMessage")
+ public R geTuiPushMessage(PushVO pushVO){
+ return R.data(pushService.geTuiPushMessage(pushVO));
+ }
+
+
}
diff --git a/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/service/IPushService.java b/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/service/IPushService.java
index 023c503..7692fc3 100644
--- a/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/service/IPushService.java
+++ b/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/service/IPushService.java
@@ -49,4 +49,11 @@
* @return
*/
Boolean pushMessageByUserId(PushVO pushVO);
+
+ /**
+ * 个推推送消息
+ * @param pushVO
+ * @return
+ */
+ Boolean geTuiPushMessage(PushVO pushVO);
}
diff --git a/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/service/impl/PushServiceImpl.java b/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/service/impl/PushServiceImpl.java
index 98a150c..260511c 100644
--- a/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/service/impl/PushServiceImpl.java
+++ b/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/service/impl/PushServiceImpl.java
@@ -1,6 +1,7 @@
package cn.gistack.alerts.push.service.impl;
import cn.gistack.alerts.push.service.IPushService;
+import cn.gistack.alerts.push.utils.GeTuiUtils;
import cn.gistack.alerts.push.vo.PushVO;
import cn.gistack.alerts.push.vo.UniCloudReturnRes;
import cn.gistack.sm.message.entity.MessageRecord;
@@ -25,10 +26,11 @@
private BladeRedis bladeRedis;
private IMessageClient messageClient;
+ private GeTuiUtils geTuiUtils;
@Override
- public Boolean saveCId(String userId,String cId) {
- bladeRedis.set(PUSH_CLIENT_ID + userId,cId);
+ public Boolean saveCId(String userId, String cId) {
+ bladeRedis.set(PUSH_CLIENT_ID + userId, cId);
return Boolean.TRUE;
}
@@ -80,7 +82,7 @@
@Override
public Boolean pushMessageByUserId(PushVO pushVO) {
- if (Func.isEmpty(pushVO.getUserId())){
+ if (Func.isEmpty(pushVO.getUserId())) {
throw new ServiceException("请填写用户id!");
}
@@ -92,33 +94,49 @@
return pushMessage(pushVO);
}
+ @Override
+ public Boolean geTuiPushMessage(PushVO pushVO) {
+
+ List<String> cIdList = new ArrayList<>();
+ cIdList.add(getClientIdByUserId(pushVO.getUserId()));
+ return geTuiUtils.pushMsg(cIdList, pushVO.getTitle(), pushVO.getContent());
+ }
+
/**
* 根据用户id从redis中获取cid
+ *
* @param userId
* @return
*/
- public String getClientIdByUserId(String userId){
- return bladeRedis.get(PUSH_CLIENT_ID+userId);
+ public String getClientIdByUserId(String userId) {
+
+ if (Func.isEmpty(userId)) {
+ throw new ServiceException("请填写用户id!");
+ }
+
+
+ return bladeRedis.get(PUSH_CLIENT_ID + userId);
}
/**
* 消息推送
+ *
* @param pushVO
* @return
*/
- public Boolean pushMessage(PushVO pushVO){
+ public Boolean pushMessage(PushVO pushVO) {
RestTemplate template = new RestTemplate();
Map<String, Object> params = new LinkedHashMap<>();
//用户cId,可数组,可字符串
- params.put("push_clientid",pushVO.getCIds());
+ params.put("push_clientid", pushVO.getCIds());
//标题
- params.put("title",pushVO.getTitle());
+ params.put("title", pushVO.getTitle());
//内容
- params.put("content",pushVO.getContent());
+ params.put("content", pushVO.getContent());
// UniCloudReturnRes uniCloudReturnRes = template.getForObject(UNI_CLOUD_PUSH_URL,UniCloudReturnRes.class,params);
- UniCloudReturnRes uniCloudReturnRes = template.postForObject(UNI_CLOUD_PUSH_URL,params,UniCloudReturnRes.class);
- return uniCloudReturnRes.getErrCode().equals(0)?true:false;
+ UniCloudReturnRes uniCloudReturnRes = template.postForObject(UNI_CLOUD_PUSH_URL, params, UniCloudReturnRes.class);
+ return uniCloudReturnRes.getErrCode().equals(0) ? true : false;
}
}
diff --git a/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/utils/GeTuiUtils.java b/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/utils/GeTuiUtils.java
new file mode 100644
index 0000000..6bd0ed4
--- /dev/null
+++ b/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/utils/GeTuiUtils.java
@@ -0,0 +1,268 @@
+package cn.gistack.alerts.push.utils;
+
+import com.alibaba.csp.sentinel.util.IdUtil;
+import com.getui.push.v2.sdk.api.PushApi;
+import com.getui.push.v2.sdk.common.ApiResult;
+import com.getui.push.v2.sdk.dto.req.Audience;
+import com.getui.push.v2.sdk.dto.req.Settings;
+import com.getui.push.v2.sdk.dto.req.Strategy;
+import com.getui.push.v2.sdk.dto.req.message.PushBatchDTO;
+import com.getui.push.v2.sdk.dto.req.message.PushChannel;
+import com.getui.push.v2.sdk.dto.req.message.PushDTO;
+import com.getui.push.v2.sdk.dto.req.message.PushMessage;
+import com.getui.push.v2.sdk.dto.req.message.android.AndroidDTO;
+import com.getui.push.v2.sdk.dto.req.message.android.GTNotification;
+import com.getui.push.v2.sdk.dto.req.message.android.ThirdNotification;
+import com.getui.push.v2.sdk.dto.req.message.android.Ups;
+import com.getui.push.v2.sdk.dto.req.message.ios.Alert;
+import com.getui.push.v2.sdk.dto.req.message.ios.Aps;
+import com.getui.push.v2.sdk.dto.req.message.ios.IosDTO;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+@Slf4j
+@Component
+public class GeTuiUtils {
+
+ @Resource(name = "myPushApi")
+ private PushApi myPushApi;
+
+ /**
+ * 单点推送(离线不推送)
+ *
+ * @param cid 目标
+ * @param title 标题
+ * @param content 内容
+ */
+ public void pushMsg(String cid, String title, String content) {
+ //根据cid进行单推
+ PushDTO<Audience> pushDTO = new PushDTO<>();
+ // 设置推送参数
+ pushDTO.setRequestId(UUID.randomUUID().toString());
+ // 个推推送消息参数
+ PushMessage pushMessage = new PushMessage();
+ pushDTO.setPushMessage(pushMessage);
+ /** 带跳转url*/
+// GTNotification notification = new GTNotification();
+// pushMessage.setNotification(notification);
+// notification.setTitle(title + new Date());
+// notification.setBody(content);
+// notification.setClickType("url");
+// notification.setUrl("https://www.baidu.com");// 跳转地址
+ /** 不带跳转url*/
+ pushMessage.setTransmission(" {title:\"" + title + "\",content:\"" + content + "\",payload:\"自定义数据\"}");
+ pushDTO.setPushMessage(pushMessage);
+ // 设置接收人信息
+ Audience audience = new Audience();
+ pushDTO.setAudience(audience);
+ audience.addCid(cid);
+ // 进行cid单推
+ ApiResult<Map<String, Map<String, String>>> apiResult = myPushApi.pushToSingleByCid(pushDTO);
+ if (apiResult.isSuccess()) {
+ // success
+ System.out.println(apiResult.getData());
+ } else {
+ // failed
+ System.out.println("code:" + apiResult.getCode() + ", msg: " + apiResult.getMsg());
+ }
+ }
+
+ /**
+ * 推送给多个
+ *
+ * @param cids 目标集
+ * @param title 标题
+ * @param content 内容
+ */
+ public Boolean pushMsg(List<String> cids, String title, String content) {
+ List<PushDTO<Audience>> list = new ArrayList<>(cids.size());
+ cids.forEach(cid -> {
+ PushDTO<Audience> pushDTO = new PushDTO<>();
+ // 唯一标识
+ pushDTO.setRequestId(UUID.randomUUID().toString());
+ // 消息内容
+ PushMessage pushMessage = new PushMessage();
+ pushMessage.setNetworkType(0);
+ // 透传消息内容
+// pushMessage.setTransmission(" {title:\"" + title + "\",content:\"" + content + "\",payload:\"自定义数据\"}");
+
+ GTNotification gtNotification = new GTNotification();
+ pushMessage.setNotification(gtNotification);
+ gtNotification.setTitle(title);
+ gtNotification.setBody(content);
+ gtNotification.setClickType("none");
+
+
+ pushDTO.setPushMessage(pushMessage);
+ // 消息接受人
+ Audience audience = new Audience();
+ audience.addCid(cid);
+ pushDTO.setAudience(audience);
+ list.add(pushDTO);
+ });
+ PushBatchDTO pushBatchDTO = new PushBatchDTO();
+ pushBatchDTO.setAsync(true);
+ pushBatchDTO.setMsgList(list);
+ ApiResult<Map<String, Map<String, String>>> mapApiResult = myPushApi.pushBatchByCid(pushBatchDTO);
+ if (mapApiResult.isSuccess()) {
+ // success
+ System.out.println(mapApiResult.getData());
+ } else {
+ // failed
+ System.out.println("code:" + mapApiResult.getCode() + ", msg: " + mapApiResult.getMsg());
+ }
+
+ return mapApiResult.isSuccess();
+
+ }
+
+ /**
+ * 消息推送(离线推送)
+ *
+ * @param cid 目标
+ * @param title 标题
+ * @param content 内容
+ */
+ public void offlinePushMsg(String cid, String title, String content) {
+ //根据cid进行单推
+ PushDTO<Audience> pushDTO = new PushDTO<>();
+ // 设置推送参数
+ pushDTO.setRequestId(System.currentTimeMillis() + "");//requestid需要每次变化唯一
+ //配置推送条件
+ // 1: 表示该消息在用户在线时推送个推通道,用户离线时推送厂商通道;
+ // 2: 表示该消息只通过厂商通道策略下发,不考虑用户是否在线;
+ // 3: 表示该消息只通过个推通道下发,不考虑用户是否在线;
+ // 4: 表示该消息优先从厂商通道下发,若消息内容在厂商通道代发失败后会从个推通道下发。
+ Strategy strategy = new Strategy();
+ strategy.setDef(1);
+ Settings settings = new Settings();
+ settings.setStrategy(strategy);
+ pushDTO.setSettings(settings);
+ settings.setTtl(3600000);//消息有效期,走厂商消息需要设置该值
+ //推送苹果离线通知标题内容
+ Alert alert = new Alert();
+ alert.setTitle(title);//苹果离线通知栏标题
+ alert.setBody(content);//苹果离线通知栏内容
+ Aps aps = new Aps();
+ //1表示静默推送(无通知栏消息),静默推送时不需要填写其他参数。
+ //苹果建议1小时最多推送3条静默消息
+ aps.setContentAvailable(0);
+ aps.setSound("default");
+ aps.setAlert(alert);
+ IosDTO iosDTO = new IosDTO();
+ iosDTO.setAps(aps);
+ iosDTO.setType("notify");
+ PushChannel pushChannel = new PushChannel();
+ pushChannel.setIos(iosDTO);
+ //安卓离线厂商通道推送消息体
+ PushChannel pushChannel1 = new PushChannel();
+ AndroidDTO androidDTO = new AndroidDTO();
+ Ups ups = new Ups();
+ ThirdNotification notification1 = new ThirdNotification();
+ ups.setNotification(notification1);
+ notification1.setTitle(title);//安卓离线展示的标题
+ notification1.setBody(content);//安卓离线展示的内容
+ notification1.setClickType("intent");
+ notification1.setIntent("intent:#Intent;launchFlags=0x04000000;action=android.intent.action.oppopush;component=io.dcloud.HBuilder/io.dcloud.PandoraEntry;S.UP-OL-SU=true;S.title=测试标题;S.content=测试内容;S.payload=test;end");
+ //各厂商自有功能单项设置
+ //ups.addOption("HW", "/message/android/notification/badge/class", "io.dcloud.PandoraEntry ");
+ //ups.addOption("HW", "/message/android/notification/badge/add_num", 1);
+ //ups.addOption("HW", "/message/android/notification/importance", "HIGH");
+ //ups.addOption("VV","classification",1);
+ androidDTO.setUps(ups);
+ pushChannel1.setAndroid(androidDTO);
+ pushDTO.setPushChannel(pushChannel1);
+
+ // PushMessage在线走个推通道才会起作用的消息体
+ PushMessage pushMessage = new PushMessage();
+ pushDTO.setPushMessage(pushMessage);
+ pushMessage.setTransmission(" {title:\"" + title + "\",content:\"" + content + "\",payload:\"自定义数据\"}");
+ // 设置接收人信息
+ Audience audience = new Audience();
+ pushDTO.setAudience(audience);
+ audience.addCid(cid);// cid
+ // 进行cid单推
+ ApiResult<Map<String, Map<String, String>>> apiResult = myPushApi.pushToSingleByCid(pushDTO);
+ if (apiResult.isSuccess()) {
+ // success
+ System.out.println(apiResult.getData());
+ } else {
+ // failed
+ System.out.println("code:" + apiResult.getCode() + ", msg: " + apiResult.getMsg());
+ }
+ }
+
+ /**
+ * 官方api案例
+ */
+ public void offlinePushMsg1() {
+ //根据cid进行单推
+ PushDTO<Audience> pushDTO = new PushDTO<Audience>();
+ // 设置推送参数
+ pushDTO.setRequestId(System.currentTimeMillis() + "");
+ /**** 设置个推通道参数 *****/
+ PushMessage pushMessage = new PushMessage();
+ pushDTO.setPushMessage(pushMessage);
+ GTNotification notification = new GTNotification();
+ pushMessage.setNotification(notification);
+ notification.setTitle("个title");
+ notification.setBody("个body");
+ notification.setClickType("url");
+ notification.setUrl("https://www.getui.com");
+ /**** 设置个推通道参数,更多参数请查看文档或对象源码 *****/
+
+ /**** 设置厂商相关参数 ****/
+ PushChannel pushChannel = new PushChannel();
+ pushDTO.setPushChannel(pushChannel);
+ /*配置安卓厂商参数*/
+ AndroidDTO androidDTO = new AndroidDTO();
+ pushChannel.setAndroid(androidDTO);
+ Ups ups = new Ups();
+ androidDTO.setUps(ups);
+ ThirdNotification thirdNotification = new ThirdNotification();
+ ups.setNotification(thirdNotification);
+ thirdNotification.setTitle("厂商title");
+ thirdNotification.setBody("厂商body");
+ thirdNotification.setClickType("url");
+ thirdNotification.setUrl("https://www.getui.com");
+ // 两条消息的notify_id相同,新的消息会覆盖老的消息,取值范围:0-2147483647
+ // thirdNotification.setNotifyId("11177");
+ /*配置安卓厂商参数结束,更多参数请查看文档或对象源码*/
+
+ /*设置ios厂商参数*/
+ IosDTO iosDTO = new IosDTO();
+ pushChannel.setIos(iosDTO);
+ // 相同的collapseId会覆盖之前的消息
+ iosDTO.setApnsCollapseId("xxx");
+ Aps aps = new Aps();
+ iosDTO.setAps(aps);
+ Alert alert = new Alert();
+ aps.setAlert(alert);
+ alert.setTitle("通知消息标题");
+ alert.setBody("通知消息内容");
+ /*设置ios厂商参数结束,更多参数请查看文档或对象源码*/
+
+ /*设置接收人信息*/
+ Audience audience = new Audience();
+ pushDTO.setAudience(audience);
+ audience.addCid("xxx");
+ /*设置接收人信息结束*/
+ /**** 设置厂商相关参数,更多参数请查看文档或对象源码 ****/
+
+ // 进行cid单推
+ ApiResult<Map<String, Map<String, String>>> apiResult = myPushApi.pushToSingleByCid(pushDTO);
+ if (apiResult.isSuccess()) {
+ // success
+ System.out.println(apiResult.getData());
+ } else {
+ // failed
+ System.out.println("code:" + apiResult.getCode() + ", msg: " + apiResult.getMsg());
+ }
+ }
+}
diff --git a/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/resources/application-dev.yml b/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/resources/application-dev.yml
index 815f19d..6641055 100644
--- a/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/resources/application-dev.yml
+++ b/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/resources/application-dev.yml
@@ -47,3 +47,10 @@
password: ${blade.datasource.dev.znwh.password}
main:
allow-circular-references: true
+getui:
+ appId: "zyUET0RTBHAzLyMhV7dY32"
+ appKey: "wuY8226sbu66P6tF9T0Fj5"
+ appSecret: "IN3UEIeUccAiYgcBTLcK3A"
+ masterSecret: "vlhKpASV66AJEfWnCgFsB2"
+ # Url前缀
+ baseUrl: "https://restapi.getui.com/v2/"
--
Gitblit v1.9.3