一、代码实现
1.配置类—Env.java
package com.ray.jpush.config; /**@desc : 极光推送接入配置 * * @author: shirayner * @date : 2017年9月27日 下午4:57:36 */ public class Env { /** * 1.极光推送后台APPKEY,MASTER_SECRET */ public static final String APP_KEY = "354fb5c3dd4249ec11bc545d"; public static final String MASTER_SECRET = "8976605bf8a9ef9d8d97a8c2"; }
2.消息服务类—MessageService.java
package com.ray.jpush.service.message; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.ray.jpush.util.CommonUtil; import com.ray.jpush.util.HttpHelper; /**@desc : 极光推送消息服务 * * @author: shirayner * @date : 2017年11月29日 下午2:24:16 */ public class MessageService { private static final Logger log= LogManager.getLogger(MessageServiceTest.class); //1.发送通知 private static final String SEND_NOTIFICATION_URL="https://api.jpush.cn/v3/push"; /** * @desc : 1.调用极光API * * @param url 接口url * @param registration_id 注册id * @param alert 通知内容 * @param appKey * @param masterSecret * @return * JSONObject */ public static JSONObject sendNotification(String registration_id,String alert,String appKey,String masterSecret) { String base64_auth_string = CommonUtil.encryptBASE64(appKey + ":" + masterSecret); String authorization = "Basic " + base64_auth_string; String data=generateJson(registration_id,alert).toString(); log.debug("authorization:"+authorization); log.debug("data:"+data); return HttpHelper.doPost(SEND_NOTIFICATION_URL, data, authorization); } /** * @desc : 2.拼装请求json * * @param registration_id 注册id * @param alert 通知内容 * @return * JSONObject */ private static JSONObject generateJson(String registration_id,String alert){ JSONObject json = new JSONObject(); JSONArray platform = new JSONArray(); //1.推送平台设置 platform.add("android"); platform.add("ios"); JSONObject audience = new JSONObject(); //2.推送设备指定,即推送目标 JSONArray registrationIdList = new JSONArray(); registrationIdList.add(registration_id); audience.put("registration_id", registrationIdList); JSONObject notification = new JSONObject(); //3.通知内容 JSONObject android = new JSONObject(); //3.1 android通知内容 android.put("alert", alert); //设置通知内容 android.put("builder_id", 1); JSONObject android_extras = new JSONObject();//android额外参数 android_extras.put("type", "infomation"); android.put("extras", android_extras); JSONObject ios = new JSONObject();//3.2 ios通知内容 ios.put("alert", alert); ios.put("sound", "default"); ios.put("badge", "+1"); JSONObject ios_extras = new JSONObject();//ios额外参数 ios_extras.put("type", "infomation"); ios.put("extras", ios_extras); notification.put("android", android); notification.put("ios", ios); json.put("platform", platform); json.put("audience", audience); json.put("notification", notification); return json; } }
3.HttpHelper工具类—HttpHelper.java
package com.ray.jpush.util; import java.io.IOException; import org.apache.http.HttpEntity; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.protocol.BasicHttpContext; import org.apache.http.util.EntityUtils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; /** * HTTP请求工具类 */ public class HttpHelper { /** * @desc :1.发送POST请求-极光推送 * * @param url 接口url * @param data 请求包体 * @param authorization 验证字段,Authorization: Basic base64_auth_string * 其中 base64_auth_string 的生成算法为:base64(appKey:masterSecret) * 即,对 appKey 加上冒号,加上 masterSecret 拼装起来的字符串,再做 base64 转换。 * @return * @throws Exception * JSONObject */ public static JSONObject doPost(String url, String data ,String authorization) { //1.生成一个请求 HttpPost httpPost = new HttpPost(url); //2.配置请求属性 //2.1 设置请求超时时间 RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(100000).setConnectTimeout(100000).build(); httpPost.setConfig(requestConfig); //2.2 设置数据传输格式-json httpPost.addHeader("Content-Type", "application/json"); //2.3 设置Authorization httpPost.addHeader("Authorization", authorization.trim()); //2.3 设置请求实体,封装了请求参数 StringEntity requestEntity = new StringEntity(data, "utf-8"); httpPost.setEntity(requestEntity); //3.发起请求,获取响应信息 //3.1 创建httpClient CloseableHttpClient httpClient = HttpClients.createDefault(); CloseableHttpResponse response = null; try { //3.3 发起请求,获取响应 response = httpClient.execute(httpPost, new BasicHttpContext()); if (response.getStatusLine().getStatusCode() != 200) { System.out.println("request url failed, http code=" + response.getStatusLine().getStatusCode() + ", url=" + url); return null; } //获取响应内容 HttpEntity entity = response.getEntity(); if (entity != null) { String resultStr = EntityUtils.toString(entity, "utf-8"); System.out.println("POST请求结果:"+resultStr); //解析响应内容 JSONObject result = JSON.parseObject(resultStr); //请求失败 if (result.getInteger("errcode")!=null && 0 != result.getInteger("errcode")) { System.out.println("request url=" + url + ",return value="); System.out.println(resultStr); int errCode = result.getInteger("errcode"); String errMsg = result.getString("errmsg"); try { throw new Exception("error code:"+errCode+", error message:"+errMsg); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } //请求成功 } else { return result; } } } catch (IOException e) { System.out.println("request url=" + url + ", exception, msg=" + e.getMessage()); e.printStackTrace(); } finally { if (response != null) try { response.close(); //释放资源 } catch (IOException e) { e.printStackTrace(); } } return null; } }
4.通用工具类—CommonUtil.java
package com.ray.jpush.util; import sun.misc.BASE64Encoder; /**@desc : * * @author: shirayner * @date : 2017年11月29日 下午3:11:33 */ public class CommonUtil { /** * @desc :BASE64加密工具 * * @param str 待加密字符串 * @return * String */ public static String encryptBASE64(String str) { byte[] key = str.getBytes(); BASE64Encoder base64Encoder = new BASE64Encoder(); String strs = base64Encoder.encodeBuffer(key); return strs; } }
5.消息服务测试类—MessageServiceTest.java
package com.ray.jpush.service.message; import org.junit.Test; import com.ray.jpush.config.Env; /**@desc : 极光推送测试类 * * @author: shirayner * @date : 2017年11月29日 下午3:54:42 */ public class MessageServiceTest { /** * @desc :1.发送通知 * * void */ @Test public void testSendNotification() { String registration_id="121c83f760211fa5944"; //String alert="hello,my honey!"; String alert="您好:\\n 于岩军在2017-11-15提出了一张金额为5的费用报销单 BX10017110076 ,需要审批! \\n\\n\\n===================================================================\\n\\n秒针费用管理系统\\n\\n本邮件由系统自动发送,请勿回复。"; String appKey=Env.APP_KEY; String masterSecret=Env.MASTER_SECRET; MessageService.sendNotification(registration_id, alert, appKey, masterSecret); } }
二、参考资料
1.极光推送经验之谈-Java后台服务器实现极光推送的两种实现方式