maven依赖
<dependency>
<groupId>cn.jpush.api</groupId>
<artifactId>jpush-client</artifactId>
<version>3.3.10</version>
</dependency>
<dependency>
<groupId>cn.jpush.api</groupId>
<artifactId>jsms-client</artifactId>
<version>1.2.9</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.3</version>
</dependency>
配置类
################### 极光推送配置 ###################
jpush:
# AppKey
appKey: **********
# 密钥
masterSecret: *************
# 短信模板ID
smsTempId: ***
# 离线消息保留时长(秒)
liveTime: 86400
package com.manage.framework.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "jpush")
public class JPushConfig {
private String appKey;
private String masterSecret;
private String groupKey;
private String groupMasterSecert;
private int smsTempId;
private int liveTime;
public String getAppKey() {
return appKey;
}
public void setAppKey(String appKey) {
this.appKey = appKey;
}
public String getMasterSecret() {
return masterSecret;
}
public void setMasterSecret(String masterSecret) {
this.masterSecret = masterSecret;
}
public String getGroupKey() {
return groupKey;
}
public void setGroupKey(String groupKey) {
this.groupKey = groupKey;
}
public String getGroupMasterSecert() {
return groupMasterSecert;
}
public void setGroupMasterSecert(String groupMasterSecert) {
this.groupMasterSecert = groupMasterSecert;
}
public int getSmsTempId() {
return smsTempId;
}
public void setSmsTempId(int smsTempId) {
this.smsTempId = smsTempId;
}
public int getLiveTime() {
return liveTime;
}
public void setLiveTime(int liveTime) {
this.liveTime = liveTime;
}
}
JPush常量
package com.manage.framework.jpush;
public class JPushConstants {
public static final String PLATFORM_ALL = "all";
public static final String PLATFORM_ANDROID = "android";
public static final String PLATFORM_IOS = "ios";
public static final String PLATFORM_WINPHONE = "winphone";
public static final String PLATFORM_ANDROID_IOS = "android_ios";
public static final String PLATFORM_ANDROID_WINPHONE = "android_winphone";
public static final String PLATFORM_IOS_WINPHONE = "ios_winphone";
public static final String AUDIENCE_ALL = "all";
public static final String AUDIENCE_TAG_AND = "tag_and";
public static final String AUDIENCE_TAG_NOT = "tag_not";
public static final String AUDIENCE_TAG = "tag";
public static final String AUDIENCE_ALIAS = "alias";
public static final String AUDIENCE_REGISTRATION_ID = "registration_id";
public static final String AUDIENCE_SEGMENT = "segment";
public static final String AUDIENCE_ABTEST = "abTest";
public static final String NOTIFICATION_ANDROID = "android";
public static final String NOTIFICATION_IOS = "ios";
public static final String NOTIFICATION_ANDROID_IOS = "android_ios";
public static final String NOTIFICATION_WINPHONE = "winphone";
}
推送类
package com.manage.framework.jpush;
import cn.jiguang.common.ClientConfig;
import cn.jiguang.common.ServiceHelper;
import cn.jiguang.common.connection.NativeHttpClient;
import cn.jiguang.common.resp.APIConnectionException;
import cn.jiguang.common.resp.APIRequestException;
import cn.jpush.api.JPushClient;
import cn.jpush.api.push.PushResult;
import cn.jpush.api.push.model.Options;
import cn.jpush.api.push.model.Platform;
import cn.jpush.api.push.model.PushPayload;
import cn.jpush.api.push.model.audience.Audience;
import cn.jpush.api.push.model.notification.AndroidNotification;
import cn.jpush.api.push.model.notification.IosNotification;
import cn.jpush.api.push.model.notification.Notification;
import cn.jsms.api.SendSMSResult;
import cn.jsms.api.common.SMSClient;
import cn.jsms.api.common.model.BatchSMSPayload;
import cn.jsms.api.common.model.BatchSMSResult;
import cn.jsms.api.common.model.RecipientPayload;
import cn.jsms.api.common.model.SMSPayload;
import com.alibaba.fastjson.JSONObject;
import com.manage.framework.config.JPushConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Service
public class JPushClientService {
private final static Logger log = LoggerFactory.getLogger(JPushClientService.class);
@Autowired
private JPushConfig jPushConfig;
public int sendPush(String platform, String audience, List<String> audienceValues, String title, String message, String extras) {
PushPayload payload = buildPushPayload(platform, audience, audienceValues, title, message, extras);
return sendPush(payload);
}
public int sendPush(PushPayload payload) {
log.info("开始推送push消息");
ClientConfig clientConfig = ClientConfig.getInstance();
ClientConfig.getInstance().setPushHostName("https://bjapi.push.jiguang.cn");
String authCode = ServiceHelper.getBasicAuthorization(jPushConfig.getAppKey(), jPushConfig.getMasterSecret());
NativeHttpClient httpClient = new NativeHttpClient(authCode, null, clientConfig);
JPushClient jpushClient = new JPushClient(jPushConfig.getMasterSecret(), jPushConfig.getAppKey(), null, clientConfig);
jpushClient.getPushClient().setHttpClient(httpClient);
try {
PushResult res = jpushClient.sendPush(payload);
if (res.isResultOK()) {
log.info("推送成功,PushResult:{}", res);
return 2;
} else {
log.info("推送失败,PushResult:{}", res);
return 3;
}
} catch (APIConnectionException e) {
log.error("Connection error. Should retry later. ", e);
log.error("Sendno: " + payload.getSendno());
return 3;
} catch (APIRequestException e) {
log.error("Error response from JPush server. Should review and fix it. ", e);
log.info("HTTP Status: " + e.getStatus());
log.info("Error Code: " + e.getErrorCode());
log.info("Error Message: " + e.getErrorMessage());
log.info("Msg ID: " + e.getMsgId());
log.error("Sendno: " + payload.getSendno());
return 3;
}
}
public PushPayload buildPushPayload(String platform, String audience, List<String> audienceValues, String title, String message, String extras) {
return PushPayload.newBuilder()
.setPlatform(buildPlatform(platform))
.setAudience(buildAudience(audience, audienceValues))
.setNotification(buildNotification(title, message, extras))
.setOptions(Options.newBuilder().setTimeToLive(jPushConfig.getLiveTime()).build())
.build();
}
private static Platform buildPlatform(String platform) {
switch (platform) {
case JPushConstants.PLATFORM_ALL:
return Platform.all();
case JPushConstants.PLATFORM_ANDROID:
return Platform.android();
case JPushConstants.PLATFORM_IOS:
return Platform.ios();
case JPushConstants.PLATFORM_WINPHONE:
return Platform.winphone();
case JPushConstants.PLATFORM_ANDROID_IOS:
return Platform.android_ios();
case JPushConstants.PLATFORM_ANDROID_WINPHONE:
return Platform.android_winphone();
case JPushConstants.PLATFORM_IOS_WINPHONE:
return Platform.ios_winphone();
}
return Platform.all();
}
private static Audience buildAudience(String audience, List<String> audienceValues) {
switch (audience) {
case JPushConstants.AUDIENCE_ALL:
return Audience.all();
case JPushConstants.AUDIENCE_TAG:
return Audience.tag(audienceValues);
case JPushConstants.AUDIENCE_TAG_AND:
return Audience.tag_and(audienceValues);
case JPushConstants.AUDIENCE_TAG_NOT:
return Audience.tag_not(audienceValues);
case JPushConstants.AUDIENCE_ALIAS:
return Audience.alias(audienceValues);
case JPushConstants.AUDIENCE_REGISTRATION_ID:
return Audience.registrationId(audienceValues);
case JPushConstants.AUDIENCE_SEGMENT:
return Audience.segment(audienceValues);
case JPushConstants.AUDIENCE_ABTEST:
return Audience.abTest(audienceValues);
}
return Audience.all();
}
private static Notification buildNotification(String title, String message, String extras) {
Notification.Builder notification = Notification.newBuilder()
.setAlert(message)
.addPlatformNotification(AndroidNotification.newBuilder().setTitle(title).setBuilderId(2).addExtra("extras", extras).build())
.addPlatformNotification(IosNotification.newBuilder().incrBadge(1).addExtra("extras", extras).build());
return notification.build();
}
public void sendTemplateSMS(String phone, Map<String, String> params) {
sendTemplateSMS(phone, params, jPushConfig.getSmsTempId());
}
public void sendTemplateSMS(String phone, Map<String, String> params, int tempId) {
log.info("开始发送模板短信");
Thread thread = new Thread(() -> {
SMSPayload.Builder payload = SMSPayload.newBuilder();
payload.setMobileNumber(phone);
payload.setTempId(tempId);
for (Map.Entry<String, String> entry : params.entrySet()) {
payload.addTempPara(entry.getKey(), entry.getValue());
}
try {
SMSClient client = new SMSClient(jPushConfig.getMasterSecret(), jPushConfig.getAppKey());
SendSMSResult res = client.sendTemplateSMS(payload.build());
log.info("SendSMSResult:{}", res);
if (res.getResponseCode() == 200) {
log.info("发送成功 手机号:" + phone + " 短信消息");
} else {
log.info("发送失败 手机号:" + phone + " 短信消息");
}
} catch (APIConnectionException e) {
log.error("Connection error. Should retry later. ", e);
} catch (APIRequestException e) {
log.error("Error response from JPush server. Should review and fix it. ", e);
log.info("HTTP Status: " + e.getStatus());
log.info("Error Code: " + e.getErrorCode());
log.info("Error Message: " + e.getMessage());
}
});
thread.start();
}
public void sendBatchTemplateSMS(List<String> phoneList, Map<String, String> params, int tempId) {
log.info("开始批量发送模板短信");
List<RecipientPayload> list = new ArrayList<>();
for (String phone : phoneList) {
RecipientPayload.Builder payload = RecipientPayload.newBuilder();
payload.setMobile(phone);
for (Map.Entry<String, String> entry : params.entrySet()) {
payload.addTempPara(entry.getKey(), entry.getValue());
}
list.add(payload.build());
}
RecipientPayload[] recipientPayloads = new RecipientPayload[list.size()];
BatchSMSPayload smsPayload = BatchSMSPayload.newBuilder()
.setTempId(tempId)
.setRecipients(list.toArray(recipientPayloads))
.build();
Thread thread = new Thread(() -> {
long start = System.currentTimeMillis();
try {
SMSClient client = new SMSClient(jPushConfig.getMasterSecret(), jPushConfig.getAppKey());
BatchSMSResult res = client.sendBatchTemplateSMS(smsPayload);
log.info("BatchSMSResult:{}", res);
for (String phone : phoneList) {
log.info("手机号:" + phone + " 短信消息");
}
} catch (APIConnectionException e) {
log.error("Connection error. Should retry later. ", e);
} catch (APIRequestException e) {
log.error("Error response from JPush server. Should review and fix it. ", e);
log.info("HTTP Status: " + e.getStatus());
log.info("Error Code: " + e.getErrorCode());
log.info("Error Message: " + e.getMessage());
}
log.info("批量发送模板短信,耗时" + (System.currentTimeMillis() - start) + "毫秒 ");
});
thread.start();
}
}