import java.net.URLEncoder;
import java.security.MessageDigest;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
import java.util.UUID;
import com.yfapp.platform.entity.PushMessage;
import net.sf.json.JSONObject;
/**
*
* @author PSVM
*
*/
public class BaiduPushUtil {
/**
* MD5加密
*
* @param s
* @return
*/
public String MD5(String s) {
char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
try {
byte[] strTemp = s.getBytes();
MessageDigest mdTemp = MessageDigest.getInstance("MD5");
mdTemp.update(strTemp);
byte[] md = mdTemp.digest();
int j = md.length;
char str[] = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) {
byte byte0 = md[i];
str[k++] = hexDigits[byte0 >>> 4 & 0xf];
str[k++] = hexDigits[byte0 & 0xf];
}
return new String(str);
} catch (Exception e) {
return null;
}
}
/**
* Map排序
*
* @param unsort_map
* @return
*/
private SortedMap<String, String> mapSortByKey(Map<String, String> unsort_map) {
TreeMap<String, String> result = new TreeMap<String, String>();
Object[] unsort_key = unsort_map.keySet().toArray();
Arrays.sort(unsort_key);
for (int i = 0; i < unsort_key.length; i++) {
result.put(unsort_key[i].toString(), unsort_map.get(unsort_key[i]));
}
return result.tailMap(result.firstKey());
}
public static String getMessage(String title, String description) {
PushMessage pushMessage = new PushMessage();
pushMessage.setTitle(title);
pushMessage.setDescription(description);
String messages = JSONObject.fromObject(pushMessage).toString();
return messages;
}
/**
* 获取签名
*
* @param url
* @param parameters
* @param secret
* @return
*/
public String getSignature(String url, Map<String, String> parameters, String secret) {
// 先将参数以其参数名的字典序升序进行排序
Map<String, String> sortedParams = new HashMap<String, String>(parameters);
sortedParams = mapSortByKey(sortedParams);
// 遍历排序后的字典,将所有参数按"key=value"格式拼接在一起
StringBuilder baseString = new StringBuilder();
baseString.append("POST");
baseString.append(url);
for (String key : sortedParams.keySet()) {
if (null != key && !"".equals(key)) {
baseString.append(key).append("=").append(sortedParams.get(key));
}
sortedParams.get(key);
}
baseString.append(secret);
String encodeString = URLEncoder.encode(baseString.toString());
String sign = MD5(encodeString);
return sign;
}
public String push_msg(String user_id, String title, String description) {
return this.push_msg(user_id, null, title, description);
}
/**
*
* @param user_id
* @param title
* @param description
* @return
*/
public String push_msg(String user_id, String channel_id, String title, String description) {
String url = "http://channel.api.duapp.com/rest/2.0/channel/channel";
// 方法名
String method = "push_msg";
// 访问令牌
String apikey = "WszZQSZgeKnYkQIlXsFUh2kF";
// 密匙
String secret = "U7Wl9eRF9GjQKFjAza1RAvaC0kkOqF5v";
// 推送类型,取值范围为:1~3
// 1:单个人,必须指定user_id 和 channel_id (指定用户的指定设备)或者user_id(指定用户的所有设备)
// 2:一群人,必须指定 tag
// 3:所有人,无需指定tag、user_id、channel_id
int push_type = 1;
// 设备类型
// 1:浏览器设备;
// 2:PC设备;
// 3:Andriod设备;
// 4:iOS设备;
// 5:Windows Phone设备;
int device_type = 3;
// 消息类型
// 0:消息(透传给应用的消息体)
// 1:通知(对应设备上的消息通知)
// 默认值为0。
int message_type = 1;
// 推送信息
String messages = getMessage(title, description);
// 消息标识。
// 指定消息标识,必须和messages一一对应。相同消息标识的消息会自动覆盖。
String msg_keys = UUID.randomUUID().toString();
// 用户发起请求时的Unix时间戳。本次请求签名的有效时间为该时间戳+10分钟。
String timestamp = Long.toString(new Date().getTime());
Map<String, String> parameters = new TreeMap<String, String>();
parameters.put("method", method);
parameters.put("apikey", apikey);
parameters.put("user_id", user_id);
if (null != channel_id) {
parameters.put("channel_id", channel_id);
}
parameters.put("push_type", push_type + "");
parameters.put("device_type", device_type + "");
parameters.put("message_type", message_type + "");
parameters.put("messages", messages);
parameters.put("msg_keys", msg_keys);
parameters.put("timestamp", timestamp + "");
String sign = getSignature(url, parameters, secret);
parameters.put("sign", sign);
String responseStr = HttpXmlClient.post(url, parameters);
return responseStr;
}
public String push_msgToAll(String title, String description) {
String url = "http://channel.api.duapp.com/rest/2.0/channel/channel";
// 方法名
String method = "push_msg";
// 访问令牌
String apikey = "WszZQSZgeKnYkQIlXsFUh2kF";
// 密匙
String secret = "U7Wl9eRF9GjQKFjAza1RAvaC0kkOqF5v";
// 推送类型,取值范围为:1~3
// 1:单个人,必须指定user_id 和 channel_id (指定用户的指定设备)或者user_id(指定用户的所有设备)
// 2:一群人,必须指定 tag
// 3:所有人,无需指定tag、user_id、channel_id
int push_type = 3;
// 设备类型
// 1:浏览器设备;
// 2:PC设备;
// 3:Android设备;
// 4:iOS设备;
// 5:Windows Phone设备;
int device_type = 3;
// 消息类型
// 0:消息(透传给应用的消息体)
// 1:通知(对应设备上的消息通知)
// 默认值为0。
int message_type = 1;
// 推送信息
String messages = getMessage(title, description);
// 消息标识。
// 指定消息标识,必须和messages一一对应。相同消息标识的消息会自动覆盖。
String msg_keys = UUID.randomUUID().toString();
// 用户发起请求时的Unix时间戳。本次请求签名的有效时间为该时间戳+10分钟。
String timestamp = Long.toString(new Date().getTime());
Map<String, String> parameters = new TreeMap<String, String>();
parameters.put("method", method);
parameters.put("apikey", apikey.toString());
parameters.put("push_type", push_type + "");
parameters.put("device_type", device_type + "");
parameters.put("message_type", message_type + "");
parameters.put("messages", messages.toString());
parameters.put("msg_keys", msg_keys.toString());
parameters.put("timestamp", timestamp + "");
String sign = getSignature(url, parameters, secret);
parameters.put("sign", sign.toString());
String responseStr = HttpXmlClient.post(url, parameters);
return responseStr;
}
public static void main(String[] args) {
// System.out.println(BaiduPushUtil.push_msg("990593941931946992",
// "4391131411952560641", new Date().toString(), "bbb"));
System.out.println(new BaiduPushUtil().push_msg("818670655850242201", "4222129398189191299", "推送成功", "推送成功"));
}
}
百度云推送(Java实现)
最新推荐文章于 2022-08-14 15:37:52 发布