|
@ -0,0 +1,229 @@
|
|
|
package com.yihu.jw.push.service;
|
|
|
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import com.getui.push.v2.sdk.ApiHelper;
|
|
|
import com.getui.push.v2.sdk.GtApiConfiguration;
|
|
|
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.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 com.yihu.jw.entity.hospital.consult.WlyyHospitalSysDictDO;
|
|
|
import com.yihu.jw.push.dao.PushHospitalSysDictDao;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.data.redis.core.StringRedisTemplate;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
|
|
|
/**
|
|
|
* Created with IntelliJ IDEA.
|
|
|
* 个推推送工具类
|
|
|
* @Author: yeshijie
|
|
|
* @Date: 2021/7/8
|
|
|
* @Description:
|
|
|
*/
|
|
|
@Service
|
|
|
public class GetuiService {
|
|
|
|
|
|
@Autowired
|
|
|
private StringRedisTemplate redisTemplate;
|
|
|
@Autowired
|
|
|
private PushHospitalSysDictDao sysDictDao;
|
|
|
|
|
|
private static final Logger logger = LoggerFactory.getLogger(GetuiService.class);
|
|
|
|
|
|
private static PushApi pushApi;
|
|
|
private String AppID;
|
|
|
private String AppKey;
|
|
|
private String AppSecret;
|
|
|
private String MasterSecret;
|
|
|
|
|
|
|
|
|
// public static String AppID = "I6JAs97T818HD0hGzG1EH4";
|
|
|
// public static String AppKey = "JC2LAW9IK27pansBB4jN87";
|
|
|
// public static String AppSecret = "Sn9PLz1hA6NNgyb7WHx45";
|
|
|
// public static String MasterSecret = "Rd86CP8bOy7RHyTf4ZE3R4";
|
|
|
public static String cloudCareDoctor = "com.zjxl.medicalcare.doctor";
|
|
|
public static String cloudCarePatientPad = "com.zjxl.medicalcare.patient.pad";
|
|
|
|
|
|
private String key = "hz_yxyzh_push_getui";
|
|
|
|
|
|
/**
|
|
|
* 初始化接口参数
|
|
|
*/
|
|
|
private void init(){
|
|
|
if(redisTemplate.hasKey(key+ ":AppID")){
|
|
|
AppID = redisTemplate.opsForValue().get(key + ":AppID");
|
|
|
AppKey = redisTemplate.opsForValue().get(key + ":AppKey");
|
|
|
AppSecret = redisTemplate.opsForValue().get(key + ":AppSecret");
|
|
|
MasterSecret = redisTemplate.opsForValue().get(key + ":MasterSecret");
|
|
|
return;
|
|
|
}
|
|
|
forceInit();
|
|
|
}
|
|
|
|
|
|
public void forceInit(){
|
|
|
List<WlyyHospitalSysDictDO> dictDOList = sysDictDao.findByDictName(key);
|
|
|
for (WlyyHospitalSysDictDO wlyyHospitalSysDictDO:dictDOList){
|
|
|
if (wlyyHospitalSysDictDO.getDictCode().equalsIgnoreCase("AppID")){
|
|
|
AppID=wlyyHospitalSysDictDO.getDictValue();
|
|
|
redisTemplate.opsForValue().set(key + ":AppID",AppID);
|
|
|
}else if (wlyyHospitalSysDictDO.getDictCode().equalsIgnoreCase("AppKey")){
|
|
|
AppKey=wlyyHospitalSysDictDO.getDictValue();
|
|
|
redisTemplate.opsForValue().set(key + ":AppKey",AppKey);
|
|
|
}else if (wlyyHospitalSysDictDO.getDictCode().equalsIgnoreCase("AppSecret")){
|
|
|
AppSecret=wlyyHospitalSysDictDO.getDictValue();
|
|
|
redisTemplate.opsForValue().set(key + ":AppSecret",AppSecret);
|
|
|
}else if (wlyyHospitalSysDictDO.getDictCode().equalsIgnoreCase("MasterSecret")){
|
|
|
MasterSecret=wlyyHospitalSysDictDO.getDictValue();
|
|
|
redisTemplate.opsForValue().set(key + ":MasterSecret",MasterSecret);
|
|
|
}
|
|
|
}
|
|
|
pushApi = getPushApi();
|
|
|
}
|
|
|
|
|
|
private PushApi getPushApi(){
|
|
|
GtApiConfiguration apiConfiguration = new GtApiConfiguration();
|
|
|
//填写应用配置
|
|
|
apiConfiguration.setAppId(AppID);
|
|
|
apiConfiguration.setAppKey(AppKey);
|
|
|
apiConfiguration.setMasterSecret(MasterSecret);
|
|
|
// 接口调用前缀,请查看文档: 接口调用规范 -> 接口前缀, 可不填写appId
|
|
|
apiConfiguration.setDomain("https://restapi.getui.com/v2/");
|
|
|
// 实例化ApiHelper对象,用于创建接口对象
|
|
|
ApiHelper apiHelper = ApiHelper.build(apiConfiguration);
|
|
|
// 创建对象,建议复用。目前有PushApi、StatisticApi、UserApi
|
|
|
PushApi pushApi = apiHelper.creatApi(PushApi.class);
|
|
|
return pushApi;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Rest-V2厂商推送
|
|
|
* type 1 安卓 2 ios
|
|
|
*/
|
|
|
public void push2(String cid,int type,JSONObject json){
|
|
|
init();
|
|
|
//根据cid进行单推
|
|
|
PushDTO<Audience> pushDTO = new PushDTO<Audience>();
|
|
|
// 设置推送参数
|
|
|
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);//消息有效期,走厂商消息需要设置该值
|
|
|
PushChannel pushChannel = new PushChannel();
|
|
|
if(type == 1){
|
|
|
//安卓离线厂商通道推送消息体
|
|
|
AndroidDTO androidDTO = new AndroidDTO();
|
|
|
Ups ups = new Ups();
|
|
|
ThirdNotification notification1 = new ThirdNotification();
|
|
|
notification1.setTitle(json.getString("title"));
|
|
|
notification1.setBody(json.getString("body"));
|
|
|
notification1.setClickType("intent");
|
|
|
//component 包名 调起app
|
|
|
String intent = "intent:#Intent;launchFlags=0x04000000;action=android.intent.action.oppopush;" +
|
|
|
"component="+json.getString("platform")+"/io.dcloud.PandoraEntry;S.UP-OL-SU=true;" +
|
|
|
"S.title="+json.getString("title")+";" +
|
|
|
"S.content="+json.getString("body")+";" +
|
|
|
"S.payload="+json.getString("payload")+";end";
|
|
|
notification1.setIntent(intent);
|
|
|
|
|
|
ups.setNotification(notification1);
|
|
|
//各厂商自有功能单项设置
|
|
|
//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);
|
|
|
pushChannel.setAndroid(androidDTO);
|
|
|
} else{
|
|
|
//推送苹果离线通知标题内容
|
|
|
Alert alert=new Alert();
|
|
|
alert.setTitle(json.getString("title"));
|
|
|
alert.setBody(json.getString("body"));
|
|
|
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.setIos(iosDTO);
|
|
|
}
|
|
|
|
|
|
pushDTO.setPushChannel(pushChannel);
|
|
|
// PushMessage在线走个推通道才会起作用的消息体
|
|
|
PushMessage pushMessage = new PushMessage();
|
|
|
// pushMessage.setTransmission(" {title:\""+json.getString("title")+"\",content:\""+json.getString("body")+"\",payload:\""+json.getString("payload")+"\"}");
|
|
|
pushMessage.setTransmission(" {\"title\":\""+json.getString("title")+"\",\"content\":\""+json.getString("body")+"\",\"url\":\""+json.getString("url")+"\"}");
|
|
|
pushDTO.setPushMessage(pushMessage);
|
|
|
// 设置接收人信息
|
|
|
Audience audience = new Audience();
|
|
|
pushDTO.setAudience(audience);
|
|
|
audience.addCid(cid);
|
|
|
|
|
|
// 进行cid单推
|
|
|
ApiResult<Map<String, Map<String, String>>> apiResult = pushApi.pushToSingleByCid(pushDTO);
|
|
|
if (apiResult.isSuccess()) {
|
|
|
// success
|
|
|
logger.info("发送成功:"+apiResult.getData());
|
|
|
} else {
|
|
|
// failed
|
|
|
logger.info("code:" + apiResult.getCode() + ", msg: " + apiResult.getMsg());
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 单推
|
|
|
*/
|
|
|
public ApiResult<Map<String, Map<String, String>>> pushToSingleByCid(String cid, JSONObject json) {
|
|
|
init();
|
|
|
//根据cid进行单推
|
|
|
PushDTO<Audience> pushDTO = new PushDTO<>();
|
|
|
// 设置推送参数
|
|
|
pushDTO.setRequestId(System.currentTimeMillis() + "");
|
|
|
PushMessage pushMessage = new PushMessage();
|
|
|
pushDTO.setPushMessage(pushMessage);
|
|
|
GTNotification notification = new GTNotification();
|
|
|
pushMessage.setNotification(notification);
|
|
|
notification.setTitle(json.getString("title"));
|
|
|
notification.setBody(json.getString("body"));
|
|
|
notification.setClickType(json.getString("clickType"));
|
|
|
notification.setUrl(json.getString("url"));
|
|
|
// 设置接收人信息
|
|
|
Audience audience = new Audience();
|
|
|
pushDTO.setAudience(audience);
|
|
|
audience.addCid(cid);
|
|
|
//消息离线时间设置
|
|
|
Settings settings = new Settings();
|
|
|
// 消息离线时间设置,单位毫秒,-1表示不设离线,-1 ~ 3 * 24 * 3600 * 1000(3天)之间
|
|
|
settings.setTtl(3 * 24 * 3600 * 1000);
|
|
|
pushDTO.setSettings(settings);
|
|
|
// 进行cid单推
|
|
|
return pushApi.pushToSingleByCid(pushDTO);
|
|
|
}
|
|
|
|
|
|
}
|