一、代码实现
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后台服务器实现极光推送的两种实现方式