guoshilong
2023-07-19 17f32c613e6a48007b5f49ae03631fd83d5ae145
集成个推
5 files modified
2 files added
383 ■■■■■ changed files
skjcmanager/skjcmanager-service/skjcmanager-alerts/pom.xml 6 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/config/GeTuiConfig.java 44 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/controller/PushController.java 11 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/service/IPushService.java 7 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/service/impl/PushServiceImpl.java 40 ●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/utils/GeTuiUtils.java 268 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/resources/application-dev.yml 7 ●●●●● patch | view | raw | blame | history
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>
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/config/GeTuiConfig.java
New file
@@ -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);
    }
}
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));
    }
}
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);
}
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;
    }
}
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/utils/GeTuiUtils.java
New file
@@ -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());
        }
    }
}
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/"