package com.push;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.gexin.rp.sdk.base.IIGtPush;
import com.gexin.rp.sdk.base.IPushResult;
import com.gexin.rp.sdk.base.impl.AppMessage;
import com.gexin.rp.sdk.base.impl.ListMessage;
import com.gexin.rp.sdk.base.impl.SingleMessage;
import com.gexin.rp.sdk.base.impl.Target;
import com.gexin.rp.sdk.base.notify.Notify;
import com.gexin.rp.sdk.base.payload.APNPayload;
import com.gexin.rp.sdk.base.payload.APNPayload.DictionaryAlertMsg;
import com.gexin.rp.sdk.base.uitls.AppConditions;
import com.gexin.rp.sdk.exceptions.RequestException;
import com.gexin.rp.sdk.http.IGtPush;
import com.gexin.rp.sdk.template.LinkTemplate;
import com.gexin.rp.sdk.template.NotificationTemplate;
import com.gexin.rp.sdk.template.RevokeTemplate;
import com.gexin.rp.sdk.template.TransmissionTemplate;
import com.gexin.rp.sdk.template.style.Style0;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class AppPush {
private static String appId = "";
private static String appkey = "";
private static String masterSecret = "";
private static String host = "http://sdk.open.api.igexin.com/apiex.htm";
// 客服id
public static String CLIENT_ID = "1d1ac8e2517a3883a5433058442feeb8";
// public static String CLIENT_ID = "a719b8df76290b8e61d7aa1900cc32e8";
public void setAppId(String appId) {
AppPush.appId = appId;
}
public void setAppKey(String appKey) {
AppPush.appkey = appKey;
}
public void setMasterSecret(String masterSecret) {
AppPush.masterSecret = masterSecret;
}
//1.點擊通知打開應用模板 在通知欄顯示一條含圖標舞吭、標題等的通知,用戶點擊后激活您的應用-打開應用的首頁 對應接口
public static NotificationTemplate notificationTemplate(TemplateVO vo) {
NotificationTemplate template = new NotificationTemplate();
template.setAppId(appId);
template.setAppkey(appkey);
template.setTransmissionType(vo.getTransmissionType());
template.setTransmissionContent(JSONUtil.toJsonStr(vo.getTransmissionContent()));
// 設置ios通知樣式
template.setAPNInfo(APNPayload(vo));
// 安卓設置
Notify notify = new Notify();
notify.setTitle(vo.getTitle());
notify.setContent(vo.getText());
notify.setPayload(JSONUtil.toJsonStr(vo.getTransmissionContent()));
notify.setUrl(vo.getResUrl());
// 安卓第三方設置
String intent = StrUtil.format(
"intent:#Intent;launchFlags=0x04000000;action=android.intent.action.oppopush;"
+ "package=com.tkgm.push;component=com.tkgm.push/io.dcloud.PandoraEntry;"
+ "S.UP-OL-SU=true;S.title={};S.content={};S.payload={};end",
vo.getTitle(), vo.getText(), vo.getTransmissionContent());
notify.setIntent(intent);
template.set3rdNotifyInfo(notify);
// 配置通知欄圖標
Style0 style = new Style0();
style.setLogoUrl(vo.getLogoUrl());
style.setText(vo.getText());
style.setLogo(vo.getLogo());
style.setTitle(vo.getTitle());
// 設置通知是否響鈴惕稻,震動再榄,或者
style.setRing(true);
style.setVibrate(true);
style.setClearable(true);
template.setStyle(style);
return template;
}
//2.點擊通知打開網(wǎng)頁模板 在通知欄顯示一條含圖標、標題等的通知襟诸,用戶點擊可打開您指定的網(wǎng)頁( iOS 不推薦使用該模板瓦堵,詳情請看 iOS 模板說明)
public static LinkTemplate linkTemplate(TemplateVO vo) {
LinkTemplate template = new LinkTemplate();
template.setAppId(appId);
template.setAppkey(appkey);
// 配置通知欄圖標
Style0 style = new Style0();
style.setLogoUrl(vo.getLogoUrl());
style.setText(vo.getText());
style.setLogo(vo.getLogo());
style.setTitle(vo.getTitle());
// 設置通知是否響鈴,震動歌亲,或者
style.setRing(true);
style.setVibrate(true);
style.setClearable(true);
template.setStyle(style);
// 設置打開的路徑
template.setUrl(vo.getLinkUrl());
return template;
}
//透傳消息模版
public static TransmissionTemplate transmissionTemplate(TemplateVO vo) {
// 生成模板
TransmissionTemplate template = new TransmissionTemplate();
template.setAppId(appId);
template.setAppkey(appkey);
// 配置透傳內容
template.setTransmissionType(vo.getTransmissionType());
template.setTransmissionContent(JSONUtil.toJsonStr(vo.getTransmissionContent()));
// 設置ios通知樣式
template.setAPNInfo(APNPayload(vo));
// 安卓設置
Notify notify = new Notify();
notify.setTitle(vo.getTitle());
notify.setContent(vo.getText());
notify.setPayload(JSONUtil.toJsonStr(vo.getTransmissionContent()));
notify.setUrl(vo.getResUrl());
// 安卓第三方設置
String intent = StrUtil.format(
"intent:#Intent;launchFlags=0x04000000;action=android.intent.action.oppopush;"
+ "package=com.tkgm.push;component=com.tkgm.push/io.dcloud.PandoraEntry;"
+ "S.UP-OL-SU=true;S.title={};S.content={};S.payload={};end",
vo.getTitle(), vo.getText(), vo.getTransmissionContent());
notify.setIntent(intent);
template.set3rdNotifyInfo(notify);
return template;
}
private static APNPayload APNPayload(TemplateVO vo) {
APNPayload payload = new APNPayload();
// 通知消息
DictionaryAlertMsg alertMsg = new APNPayload.DictionaryAlertMsg();
alertMsg.setTitle(vo.getTitle());
alertMsg.setBody(vo.getText());
payload.setAlertMsg(alertMsg);
// 設置應用右上角數(shù)字菇用,用于提醒用戶未閱讀消息數(shù)量,支持在原有數(shù)字上的+陷揪、-操作
payload.setAutoBadge("+1");
// 推送直接帶有透傳數(shù)據(jù)
payload.setContentAvailable(0);
Map<String, Object> beanToMap = BeanUtil.beanToMap(vo.getTransmissionContent());
beanToMap.forEach((key, value) -> {
payload.addCustomMsg(key, value);
});
// 語音播報0:不 1:播報內容 2:自定義
payload.setVoicePlayType(0);
// 默認聲音
payload.setSound("default");
return payload;
}
public static void main(String[] args) {
String title = "重要提醒";
String text = "提醒信息,999請忽這個消息";
TemplateVO template = new TemplateVO();
template.setTitle(title);
template.setText(text);
TransmissionContent transmissionContent = new TransmissionContent();
// 輪播圖類型0:商品詳情 1:點擊沒有反應 2:首頁推薦 3:外部H5頁面 4.內部瀏覽器 5:許愿池
transmissionContent.setUuid(IdUtil.simpleUUID());
transmissionContent.setJumpType(3);
transmissionContent.setJumpUrl("http://www.baidu.com");
template.setTransmissionContent(transmissionContent);
template.setTransmissionType(2);
// 全部用戶
// pushMessageToApp(template, 1);
// 對單個推送消息
template.setClientId(CLIENT_ID);
pushMessageToSingle(template, 1);
}
//對單個?戶推送消息
public static boolean pushMessageToSingle(TemplateVO vo, int type) {
SingleMessage message = new SingleMessage();
message.setOffline(true);
// 離線有效時間惋鸥,單位為毫秒杂穷,可選
message.setOfflineExpireTime(24 * 3600 * 1000);
// 可選,1為wifi卦绣,0為不限制?絡環(huán)境耐量。根據(jù)?機處于的?絡情況,決定是否下發(fā)
message.setPushNetWorkType(0);
// 模板內容
switch (type) {
case 1:
message.setData(notificationTemplate(vo));
break;
case 2:
message.setData(linkTemplate(vo));
break;
case 4:
message.setData(transmissionTemplate(vo));
break;
}
// 用戶信息
Target target = new Target();
target.setAppId(appId);
target.setClientId(vo.getClientId());
target.setAlias(vo.getAlias());
IGtPush push = new IGtPush(host, appkey, masterSecret);
IPushResult result;
try {
result = push.pushMessageToSingle(message, target);
} catch (RequestException e) {
result = push.pushMessageToSingle(message, target, e.getRequestId());
log.error("單體推送異常", e);
}
log.info("單體推送返回結果:{}", result == null ? "推送無數(shù)據(jù)返回" : result.getResponse().toString());
if (result != null && "ok".equals(result.getResponse().get("")))
return true;
return false;
}
//對指定?戶列表推送消息
public static boolean pushMessageToList(TemplateVO vo, int type) {
ListMessage message = new ListMessage();
// 設置消息離線迎卤,并設置離線時間
message.setOffline(true);
// 離線有效時間拴鸵,單位為毫秒,可選
message.setOfflineExpireTime(24 * 1000 * 3600);
switch (type) {
case 1:
message.setData(notificationTemplate(vo));
break;
case 2:
message.setData(linkTemplate(vo));
break;
case 4:
message.setData(transmissionTemplate(vo));
break;
}
List<Target> targets = new ArrayList<Target>();
if (vo.getAliasList() != null && !vo.getAliasList().isEmpty()) {
vo.getAliasList().forEach(action -> {
Target target = new Target();
target.setAlias(action);
target.setAppId(appId);
targets.add(target);
});
}
if (vo.getClientIdList() != null && !vo.getClientIdList().isEmpty()) {
vo.getClientIdList().forEach(action -> {
Target target = new Target();
target.setClientId(action);
target.setAppId(appId);
targets.add(target);
});
}
IGtPush push = new IGtPush(host, appkey, masterSecret);
String taskId = push.getContentId(message);
IPushResult result = push.pushMessageToList(taskId, targets);
log.info("單體推送返回結果:{}", result == null ? "推送無數(shù)據(jù)返回" : result.getResponse().toString());
if (result != null && "ok".equals(result.getResponse().get("")))
return true;
return false;
}
//對指定應?群推消息
public static boolean pushMessageToApp(TemplateVO vo, int type) {
AppMessage message = new AppMessage();
// 設置消息離線蜗搔,并設置離線時間
message.setOffline(true);
// 離線有效時間劲藐,單位為毫秒,可選
message.setOfflineExpireTime(24 * 1000 * 3600);
switch (type) {
case 1:
message.setData(notificationTemplate(vo));
break;
case 2:
message.setData(linkTemplate(vo));
break;
case 4:
message.setData(transmissionTemplate(vo));
break;
}
// 推送給App的?標?戶需要滿?的條件
AppConditions cdt = new AppConditions();
if (null != vo.getAppIdList() && !vo.getAppIdList().isEmpty()) {
message.setAppIdList(vo.getAliasList());
} else {
List<String> appIdList = new ArrayList<>();
appIdList.add(appId);
message.setAppIdList(appIdList);
}
// 機類型
List<String> phoneTypeList = new ArrayList<String>();
// 省份
List<String> provinceList = new ArrayList<String>();
// 定義tag
List<String> tagList = new ArrayList<String>();
cdt.addCondition(AppConditions.PHONE_TYPE, phoneTypeList);
cdt.addCondition(AppConditions.REGION, provinceList);
cdt.addCondition(AppConditions.TAG, tagList);
message.setConditions(cdt);
IGtPush push = new IGtPush(host, appkey, masterSecret);
IPushResult result = null;
try {
result = push.pushMessageToApp(message);
} catch (Exception e) {
log.error("對指定應?群推消息推送失敗", e);
}
log.info("對指定應?群推消息推送返回結果:{}", result == null ? "推送無數(shù)據(jù)返回" : result.getResponse().toString());
if (result != null && "ok".equals(result.getResponse().get("")))
return true;
return false;
}
//消息撤回模版
public static void revokeToApp(String oldTaskId, boolean force) {
// 推送主類
IIGtPush push = new IGtPush(host, appkey, masterSecret);
AppMessage message = new AppMessage();
// 推送模版
RevokeTemplate template = new RevokeTemplate();
template.setAppId(appId);// 應?appid
template.setAppkey(appkey);// 應?appkey
template.setOldTaskId(oldTaskId);
template.setForce(force);
message.setData(template);
message.setOffline(true);
message.setOfflineExpireTime(1000 * 1000);
List<String> appIdList = new ArrayList<String>();
appIdList.add(appId);
message.setAppIdList(appIdList);
push.pushMessageToApp(message);
}
}
package com.push;
import java.io.Serializable;
import lombok.Data;
@Data
public class TransmissionContent implements Serializable {
private static final long serialVersionUID = 1L;
private String jumpUrl;
private String uuid;
private Integer jumpType;
}
package com.push;
import java.io.Serializable;
import java.util.List;
import com.gexin.rp.sdk.base.payload.MultiMedia.MediaType;
import lombok.Data;
@Data
public class TemplateVO implements Serializable {
private static final long serialVersionUID = 1L;
// 配置通知欄網(wǎng)絡圖標
private String logoUrl = "";
// 配置通知欄圖標
private String logo = "";
// 標題
private String title = "";
// 顯示的內容
private String text = "";
// 別名
private String alias = "";
// clientId
private String clientId = "";
// ios自定義菜單素材類型
private MediaType mediaType;
// ios自定義菜單素材下載地址
private String resUrl = "";
// 別名列表
private List<String> aliasList;
// clientId列表
private List<String> clientIdList;
// appId列表
private List<String> appIdList;
// 透傳消息設置 1:強制啟動應用 2:等待啟動應用
private int transmissionType = 2;
// 透傳消息內容
private TransmissionContent transmissionContent;
// 點擊打開的通知瀏覽器打開的url
private String linkUrl = "";
// 下載參數(shù)
// 通知欄標題
private String notyTitle = "";
// 通知欄內容
private String notyContrent = "";
// 通知欄Icon
private String notyIcon = "";
// 彈框標題
private String popTitle = "";
// 彈框內容
private String popContent = "";
// 彈框Icon
private String popImage = "";
// 彈框右
private String popButton2 = "";
// 彈框左
private String popButton1 = "";
// 下載標題
private String loadTitle = "";
// 下載地址
private String loadUrl = "";
// 下載Icon
private String loadIcon = "";
}