1、pom文件引入相關jar包
<!--極光推送消息start--> <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</artifactId> <version>2.4</version> <classifier>jdk15</classifier> </dependency> <dependency> <groupId>cn.jpush.api</groupId> <artifactId>jpush-client</artifactId> <version>3.3.3</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>cn.jpush.api</groupId> <artifactId>jiguang-common</artifactId> <version>1.1.1</version> </dependency> <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.6.Final</version> <scope>compile</scope> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.3</version> </dependency> <!--極光推送消息end-->
2、提供相關包裝好的類
(1)消息封裝類
package com.test.entity.common; import com.google.gson.JsonObject; import java.util.List; import java.util.Map; /** * 極光推送消息類 */ public class JPushDeviceBean { private String token; private String alias_value;//別名值 private String registration_id; private List<String> username;//所有用戶別名 private String title;//標題 private String fsmessagecontent;//內容 private Integer count;//角標數 private Map<String, String> extrasMap; private JsonObject extra; public JsonObject getExtra() { return extra; } public void setExtra(JsonObject extra) { this.extra = extra; } public Map<String, String> getExtrasMap() { return extrasMap; } public void setExtrasMap(Map<String, String> extrasMap) { this.extrasMap = extrasMap; } public String getToken() { return token; } public void setToken(String token) { this.token = token; } public String getAlias_value() { return alias_value; } public void setAlias_value(String alias_value) { this.alias_value = alias_value; } public String getRegistration_id() { return registration_id; } public void setRegistration_id(String registration_id) { this.registration_id = registration_id; } public List<String> getUsername() { return username; } public void setUsername(List<String> username) { this.username = username; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getFsmessagecontent() { return fsmessagecontent; } public void setFsmessagecontent(String fsmessagecontent) { this.fsmessagecontent = fsmessagecontent; } public Integer getCount() { return count; } public void setCount(Integer count) { this.count = count; } }
(2)工具類
package com.test.util; import cn.jpush.api.push.model.Message; 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.audience.AudienceTarget; 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 com.google.gson.JsonObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Map; public class JPushDevice { protected static final Logger LOG =LoggerFactory.getLogger(JPushDevice.class); private static final String URL="https://device.jpush.cn";//極光訪問URL public static long timeToLive=60*60*24*10;//10天 //privatestaticJPushClientjpushClient= newJPushClient(masterSecret,appKey,null,ClientConfig.getInstance()); // //對於推送,您所需要做的就是構建PushPayload對象。 // PushPayloadpayload=buildPushObject_ios_audienceMore_messageWithExtras(); // PushResultresult=jpushClient.sendPush(payload); public static PushPayload buildPushObject_android_tag_alertWithTitle(String username){ return PushPayload.newBuilder() .setPlatform(Platform.all()) .setAudience(Audience.alias(username)) .setNotification(Notification.alert("ALERT")) .build(); } //彈框 public static PushPayload buildPushObject_ios_audienceMore_messageWithExtras(String username){ return PushPayload.newBuilder() .setPlatform(Platform.all()) .setAudience(Audience.alias(username)) .setMessage(Message.newBuilder() .setMsgContent("您有一條回復內容。。") .addExtra("from","JPush") .build()) .build(); } //推送全部平台(一個用戶)(無角標) public static PushPayload oneName(String username, String title, String fsmessagecontent, Map<String, String> extrasMap, JsonObject extra){ return PushPayload.newBuilder() .setPlatform(Platform.all())//推送全部平台 .setAudience(Audience.newBuilder()//推送目標:別名、標簽、注冊ID、分群、廣播等。 .addAudienceTarget(AudienceTarget.alias(username)) .build()) .setMessage(Message.newBuilder() .setMsgContent(fsmessagecontent)//消息內容 // .setTitle(count.toString())//當做安卓的角標數 .addExtra("from","JPush")//應用內消息通道 .build()) .setNotification(Notification.newBuilder()//notification:通知內容體。是被推送到客戶端的內容 .addPlatformNotification(IosNotification.newBuilder()//iOS .setAlert(title)//彈框顯示標題 // .setBadge(count)//角標 .build()) .addPlatformNotification(AndroidNotification.newBuilder()//安卓 .setAlert(fsmessagecontent)//彈框顯示內容 .setTitle(title)//彈框顯示標題 .addExtras(extrasMap) .addExtra("extra",extra) .build()) .build()) .build(); } //推送全部平台(傳多個別名用戶)(有角標) public static PushPayload AllName(String[] username,String title,String fsmessagecontent,Integer count){ return PushPayload.newBuilder() .setPlatform(Platform.all())//推送全部平台 .setAudience(Audience.newBuilder()//推送目標:別名、標簽、注冊ID、分群、廣播等。 .addAudienceTarget(AudienceTarget.alias(username))//別名可以是數組為並集,一次只能存1000個 .build()) .setMessage(Message.newBuilder() .setMsgContent(fsmessagecontent)//消息內容 .setTitle(count.toString())//當做安卓的角標數 .addExtra("from","JPush")//應用內消息通道 .build()) .setNotification(Notification.newBuilder()//notification:通知 .addPlatformNotification(IosNotification.newBuilder()//iOS .setAlert(title)//彈框顯示標題 .setBadge(count)//角標 .build()) .addPlatformNotification(AndroidNotification.newBuilder()//安卓 .setAlert(fsmessagecontent)//彈框顯示內容 .setTitle(title)//彈框顯示標題 .build()) .build()) .build(); } }
(3)實現類
package com.test.controller.common; import static com.yjl.util.UploadUtil.getErrorMsg; import static com.yjl.util.UploadUtil.getYjlResponseModel; import static com.yjl.util.UploadUtil.isSuccess; import static com.yjl.util.UploadUtil.setErrorMsg; import static com.yjl.util.UploadUtil.setSuccess; import static com.yjl.util.UploadUtil.setYjlResponseModel; import cn.jiguang.common.ClientConfig; 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.PushPayload; import com.google.gson.Gson; import com.yjl.entity.common.JPushDeviceBean; import com.yjl.entity.common.YJLResponseModel; import com.yjl.util.HttpClientUtil; import com.yjl.util.JPushDevice; import java.io.UnsupportedEncodingException; import java.util.HashMap; import java.util.List; import java.util.Map; import net.sf.json.JSONObject; import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; @Controller @RequestMapping("/JPushDevice") public class JPushDeviceController{ private static Logger logger = LoggerFactory.getLogger(JPushDeviceController.class); //極光訪問URL private static final String URL = "https://device.jpush.cn"; //極光用戶名 private static final String APPKEY ="極光平台生成的app的appkey"; //極光密碼 private static final String MASTERSECRET ="極光平台生成的app的mastersecret"; //1.推送一個人 @RequestMapping(value = "getOneJPushDevice", method = RequestMethod.POST) @ResponseBody public PushResult getOneJPushDevice(@RequestBody JPushDeviceBean j) { String aliases = getAliases(j.getAlias_value()); //一個別名 PushResult pResult = new PushResult(); //別名; if(StringUtils.isNotBlank(aliases)){ //極光推送 JPushClient jpushClient = new JPushClient(MASTERSECRET,APPKEY,null,ClientConfig.getInstance()); PushPayload payload = JPushDevice.oneName(aliases, j.getTitle(), j.getFsmessagecontent(),j.getExtrasMap(),j.getExtra()); try { pResult = jpushClient.sendPush(payload); System.out.println("Got result 推送一個人 - 3" + pResult ); Thread.sleep(5000); // 請求結束后,調用 NettyHttpClient 中的 close 方法,否則進程不會退出。 jpushClient.close(); } catch (APIConnectionException e) { e.printStackTrace(); } catch (APIRequestException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } return pResult; } //2.推送多人//先循環判斷別名 @RequestMapping(value = "getAllJPushDevice", method = RequestMethod.POST) @ResponseBody public YJLResponseModel getAllJPushDevice(@RequestBody JPushDeviceBean j) { setYjlResponseModel(new YJLResponseModel()); setErrorMsg(""); setSuccess(false); List<String> ulist = j.getUsername(); //判斷過得別名數組 if(null!=ulist && !ulist.isEmpty()){ String[] username = ulist.toArray(new String[ulist.size()]); //轉化為數組 //極光推送 JPushClient jpushClient = new JPushClient(MASTERSECRET,APPKEY,null, ClientConfig.getInstance()); PushPayload payload = JPushDevice.AllName(username, j.getTitle(), j.getFsmessagecontent(), j.getCount()); //用戶別名數組1000個一次,標題,內容,角標數 PushResult pResult; try { pResult = jpushClient.sendPush(payload); setSuccess(true); System.out.println("Got result - " + new Gson().toJson(pResult) ); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } // 請求結束后,調用 NettyHttpClient 中的 close 方法,否則進程不會退出。 jpushClient.close(); } catch (APIConnectionException e) { e.printStackTrace(); } catch (APIRequestException e) { e.printStackTrace(); } finally { getYjlResponseModel().setErrorMsg(getErrorMsg()); getYjlResponseModel().setSuccess(isSuccess()); } } return getYjlResponseModel(); } //查詢別名是否存在 public static String getAliases(String aliases){ String alia =""; JPushDeviceBean j = new JPushDeviceBean(); j.setAlias_value(aliases); YJLResponseModel map = getJPushDeviceAliases(j); //查詢是否含有別名 Map<String, Object> ma = (Map<String, Object>)map.getData(); if(ma.containsKey("registration_ids")){ List<String> list = (List<String>)ma.get("registration_ids"); //查詢registration_ids的值不為空則含有該別名 if(null!=list && !list.isEmpty()){ System.out.println("查詢別名----"+new Gson().toJson(list)); //在此內可調用極光的推送方法 alia = aliases; //如果存在就給返回該別名 } } return alia; } //--------------------查詢別名的方法------------------------------------------- //查詢別名(找不到統計項就是 null,否則為統計項的值。) @RequestMapping(value = "getJPushDeviceAliases", method = RequestMethod.POST) @ResponseBody public static YJLResponseModel getJPushDeviceAliases(@RequestBody JPushDeviceBean ht) { setYjlResponseModel(new YJLResponseModel()); setErrorMsg(""); setSuccess(false); JSONObject response = null; try { StringBuilder url = new StringBuilder(URL).append("/v3/aliases/"+ht.getAlias_value()); String authorValue = getBase64(); Map<String, String> para = new HashMap<>(); response = HttpClientUtil.doGet(url.toString(), authorValue, para); if (StringUtils.isNotEmpty((String)response.get("error"))) { logger.info("getAliases:url+params----" + url + para); throw new Exception(); } setSuccess(true); } catch (Exception e) { e.printStackTrace(); logger.error("getAliases:url+params----" + e); }finally { getYjlResponseModel().setErrorMsg(getErrorMsg()); getYjlResponseModel().setSuccess(isSuccess()); getYjlResponseModel().setData(response); } return getYjlResponseModel(); } //String轉base64 public static String getBase64(){ Base64 base64 = new Base64(); String base64Sign =""; String string = APPKEY+":"+MASTERSECRET; try { base64Sign = base64.encodeToString(string.getBytes("UTF-8")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return " Basic "+base64Sign; } //測試一下 public static void main(String[] args) { JPushDeviceController JPushDeviceController = new JPushDeviceController(); JPushDeviceBean jd = new JPushDeviceBean(); jd.setAlias_value("40");//此處為待推送的用戶id jd.setTitle("推送消息"); jd.setFsmessagecontent("測試一下服務器端"); PushResult pushResult = JPushDeviceController.getOneJPushDevice(jd); System.out.println(pushResult); } }
3.測試一下
//測試一下 public static void main(String[] args) { JPushDeviceController JPushDeviceController = new JPushDeviceController(); JPushDeviceBean jd = new JPushDeviceBean(); jd.setAlias_value("18037471792"); jd.setTitle("推送消息"); jd.setFsmessagecontent("測試一下服務器端"); Map<String,String> extrasParam = new HashMap<>(); extrasParam.put("額外參數1","額外參數內容1"); jd.setExtrasMap(extrasParam); PushResult pushResult = JPushDeviceController.getOneJPushDevice(jd); System.out.println(pushResult); }