| 
					
				 | 
			
			
				@@ -5,7 +5,6 @@ import com.alibaba.fastjson.JSONObject; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ym.mec.thirdparty.exception.ThirdpartyException; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ym.mec.thirdparty.message.MessageSenderPlugin; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ym.mec.util.http.HttpUtil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.apache.commons.codec.binary.Base64; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.apache.commons.lang3.StringUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.beans.factory.InitializingBean; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -15,7 +14,7 @@ import org.springframework.stereotype.Service; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.io.IOException; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.Arrays; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.HashMap; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import java.util.Map; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.Optional; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.stream.Collectors; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -24,164 +23,168 @@ import java.util.stream.Collectors; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @Service 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 public class JiguangPushPlugin implements MessageSenderPlugin, InitializingBean { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	@Value("${push.jiguang.appKey.student}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	private String studentAppKey; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	@Value("${push.jiguang.masterSecret.student}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	private String studentMasterSecret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	@Value("${push.jiguang.appKey.teacher}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	private String teacherAppKey; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	@Value("${push.jiguang.masterSecret.teacher}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	private String teacherMasterSecret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	@Value("${push.jiguang.appKey.system}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	private String systemAppKey; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	@Value("${push.jiguang.masterSecret.system}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	private String systemMasterSecret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	@Value("${push.jiguang.apns_production:false}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	private boolean apns_production = true; // 推送环境 True 表示推送生产环境,False 表示要推送开发环境 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	@Value("${push.jiguang.time_to_live:86400}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	private int time_to_live = 86400; // 离线保留时长 秒为单位 默认1天 最大10天 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	@Value("${push.jiguang.reqURL:https://api.jpush.cn/v3/push}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	private String reqURL = "https://api.jpush.cn/v3/push";// 请求极光地址 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	public static String getName() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return "jiguang"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 * 组装推送Json串 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 * @param alias 别名推送 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 * @param alert 消息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 * @param content 消息内容 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 * @return json对象 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	private JSONObject generateJson(String[] alias, String alert, String content, String url,String sound,String channelId) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		JSONObject json = new JSONObject(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		JSONArray platform = new JSONArray();// 平台 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		platform.add("android"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		platform.add("ios"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		JSONObject audience = new JSONObject();// 推送目标 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		JSONArray aliasJsonArr = new JSONArray(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		for (String alia : alias) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			aliasJsonArr.add(alia); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		audience.put("alias", aliasJsonArr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		JSONObject notification = new JSONObject();// 通知内容 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		JSONObject android = new JSONObject();// android通知内容 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		android.put("alert", alert); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		android.put("sound", sound.split("\\.")[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		JSONObject options = new JSONObject();// 设置参数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if(StringUtils.isNotEmpty(channelId)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			JSONObject thirdParty = new JSONObject(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			JSONObject xiaomi = new JSONObject(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			xiaomi.put("distribution","secondary_push"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			xiaomi.put("channel_id",channelId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			thirdParty.put("xiaomi",xiaomi); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			options.put("third_party_channel",thirdParty); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		android.put("builder_id", 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		JSONObject android_extras = new JSONObject();// android额外参数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		android_extras.put("type", "infomation"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		android_extras.put("url", url); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		android_extras.put("memo", url); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		android.put("extras", android_extras); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        //2022年5月27日 增加以下参数,是因为安卓无法跳转到APP中 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        JSONObject intentParam = new JSONObject(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//        intentParam.put("url", "intent:#Intent;action=android.intent.action.MAIN;end"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        //2022年6月3日 修改参数,安卓通知需要后台修改 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        intentParam.put("url", "intent:#Intent;action=cn.jiguang.push.customAction;component=com.daya.studaya_android/com.daya.studaya_android.ui.MainActivity;end"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        android.put("intent", intentParam); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		JSONObject ios = new JSONObject();// ios通知内容 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		ios.put("alert", alert); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		ios.put("sound", sound); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		ios.put("badge", "+1"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		JSONObject ios_extras = new JSONObject();// ios额外参数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		ios_extras.put("type", "infomation"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		ios_extras.put("url", url); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		ios_extras.put("memo", url); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		ios.put("extras", ios_extras); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		notification.put("android", android); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		notification.put("ios", ios); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		JSONObject message = new JSONObject();// 通知消息内容 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		message.put("title", alert); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		message.put("msg_content", content); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		message.put("content_type","text"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		options.put("time_to_live", this.time_to_live); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		options.put("apns_production", this.apns_production); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		json.put("platform", platform); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		json.put("audience", audience); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		json.put("notification", notification); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		json.put("options", options); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		json.put("message", message); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return json; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 * 调用极光api 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 * @param alias 推送对象别名 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 * @param alert 推送消息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 * @param content 推送内容 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	private String push(String[] alias, String alert, String content, String url,String type,String sound,String channelId) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		String base64_auth_string = ""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		switch (type){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			case "STUDENT": 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				base64_auth_string = encryptBASE64(this.studentAppKey + ":" + this.studentMasterSecret); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			case "TEACHER": 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				base64_auth_string = encryptBASE64(this.teacherAppKey + ":" + this.teacherMasterSecret); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			default: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				base64_auth_string = encryptBASE64(this.systemAppKey + ":" + this.systemMasterSecret); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		String authorization = "Basic " + base64_auth_string; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return sendPostRequest(generateJson(alias, alert, content, url,sound,channelId).toString(), authorization); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 * 发送Post请求(json格式) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 * @param data //封装的json串 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 * @param authorization 验签 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 * @return result 返回一个json字符串 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	private String sendPostRequest(String data, String authorization) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		String result = ""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		HashMap<String, String> reqHeader = new HashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		reqHeader.put("Authorization", authorization.trim()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			result = HttpUtil.postForHttps(this.reqURL, data, reqHeader); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} catch (Exception e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			throw new ThirdpartyException("HttpUtil Connection Exception", e); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 *     * BASE64加密工具 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	private String encryptBASE64(String str) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		byte[] key = str.getBytes(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		String strs = Base64.encodeBase64String(key); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return strs; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	@Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	public void afterPropertiesSet() throws Exception { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		// 参数检查 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Value("${push.jiguang.appKey.student}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private String studentAppKey; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Value("${push.jiguang.masterSecret.student}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private String studentMasterSecret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Value("${push.jiguang.appKey.teacher}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private String teacherAppKey; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Value("${push.jiguang.masterSecret.teacher}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private String teacherMasterSecret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Value("${push.jiguang.appKey.system}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private String systemAppKey; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Value("${push.jiguang.masterSecret.system}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private String systemMasterSecret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Value("${push.jiguang.apns_production:false}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private boolean apns_production = true; // 推送环境 True 表示推送生产环境,False 表示要推送开发环境 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Value("${push.jiguang.time_to_live:86400}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private int time_to_live = 86400; // 离线保留时长 秒为单位 默认1天 最大10天 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Value("${push.jiguang.reqURL:https://api.jpush.cn/v3/push}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private String reqURL = "https://api.jpush.cn/v3/push";// 请求极光地址 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public static String getName() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return "jiguang"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 组装推送Json串 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param alias   别名推送 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param alert   消息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param content 消息内容 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @return json对象 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private JSONObject generateJson(String[] alias, String alert, String content, String url, String sound, String channelId, JSONObject androidIntent) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        JSONObject json = new JSONObject(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        JSONArray platform = new JSONArray();// 平台 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        platform.add("android"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        platform.add("ios"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        JSONObject audience = new JSONObject();// 推送目标 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        JSONArray aliasJsonArr = new JSONArray(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for (String alia : alias) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            aliasJsonArr.add(alia); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        audience.put("alias", aliasJsonArr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        JSONObject notification = new JSONObject();// 通知内容 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        JSONObject android = new JSONObject();// android通知内容 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        android.put("alert", alert); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        android.put("sound", sound.split("\\.")[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        JSONObject options = new JSONObject();// 设置参数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (StringUtils.isNotEmpty(channelId)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            JSONObject thirdParty = new JSONObject(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            JSONObject xiaomi = new JSONObject(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            xiaomi.put("distribution", "secondary_push"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            xiaomi.put("channel_id", channelId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            thirdParty.put("xiaomi", xiaomi); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            options.put("third_party_channel", thirdParty); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        android.put("builder_id", 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        JSONObject android_extras = new JSONObject();// android额外参数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        android_extras.put("type", "infomation"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        android_extras.put("url", url); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        android_extras.put("memo", url); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        android.put("extras", android_extras); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Optional.ofNullable(androidIntent) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .ifPresent(intent -> android.put("intent", intent)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        JSONObject ios = new JSONObject();// ios通知内容 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ios.put("alert", alert); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ios.put("sound", sound); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ios.put("badge", "+1"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        JSONObject ios_extras = new JSONObject();// ios额外参数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ios_extras.put("type", "infomation"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ios_extras.put("url", url); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ios_extras.put("memo", url); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ios.put("extras", ios_extras); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        notification.put("android", android); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        notification.put("ios", ios); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        JSONObject message = new JSONObject();// 通知消息内容 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        message.put("title", alert); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        message.put("msg_content", content); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        message.put("content_type", "text"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        options.put("time_to_live", this.time_to_live); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        options.put("apns_production", this.apns_production); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        json.put("platform", platform); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        json.put("audience", audience); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        json.put("notification", notification); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        json.put("options", options); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        json.put("message", message); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return json; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 调用极光api 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param alias   推送对象别名 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param alert   推送消息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param content 推送内容 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private String push(String[] alias, String alert, String content, String url, String type, String sound, String channelId) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String base64_auth_string = ""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        JSONObject androidIntent = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        switch (type) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            case "STUDENT": 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                base64_auth_string = encryptBASE64(this.studentAppKey + ":" + this.studentMasterSecret); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                androidIntent = new JSONObject(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //2022年5月27日 增加以下参数,是因为安卓无法跳转到APP中 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //intentParam.put("url", "intent:#Intent;action=android.intent.action.MAIN;end"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //2022年6月3日 修改参数,安卓通知需要后台修改 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                androidIntent.put("url", "intent:#Intent;action=cn.jiguang.push.customAction;component=com.daya.studaya_android/com.daya.studaya_android.ui.MainActivity;end"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            case "TEACHER": 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                base64_auth_string = encryptBASE64(this.teacherAppKey + ":" + this.teacherMasterSecret); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            default: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                base64_auth_string = encryptBASE64(this.systemAppKey + ":" + this.systemMasterSecret); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String authorization = "Basic " + base64_auth_string; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        JSONObject jsonObject = generateJson(alias, alert, content, url, sound, channelId, androidIntent); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return sendPostRequest(jsonObject.toString(), authorization); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 发送Post请求(json格式) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param data          //封装的json串 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param authorization 验签 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @return result 返回一个json字符串 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private String sendPostRequest(String data, String authorization) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String result = ""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        HashMap<String, String> reqHeader = new HashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        reqHeader.put("Authorization", authorization.trim()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            result = HttpUtil.postForHttps(this.reqURL, data, reqHeader); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } catch (Exception e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            throw new ThirdpartyException("HttpUtil Connection Exception", e); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     *     * BASE64加密工具 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private String encryptBASE64(String str) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        byte[] key = str.getBytes(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String strs = Base64.encodeBase64String(key); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return strs; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void afterPropertiesSet() throws Exception { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 参数检查 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		/*if (StringUtils.isBlank(appKey)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			throw new RuntimeException("Init parameter [appKey] can not blank"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -191,73 +194,29 @@ public class JiguangPushPlugin implements MessageSenderPlugin, InitializingBean 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if (StringUtils.isBlank(reqURL)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			throw new RuntimeException("Init parameter [reqURL] can not blank"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		}*/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	@Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	public boolean send(String subject, String content, String receiver, String url, String type,String sound,String channelId) throws IOException { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		String[] alias = { receiver }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		String result = this.push(alias, subject, content, url,type,sound,channelId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		JSONObject json = JSONObject.parseObject(result); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if (json.containsKey("error")) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			JSONObject jsonObject = json.getJSONObject("error"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			throw new ThirdpartyException(jsonObject.get("message").toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	@Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	public boolean batchSend(String subject, String content, String[] receivers, String url, String type,String sound,String channelId) throws IOException { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		String result = this.push(receivers, subject, content, url,type,sound,channelId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		JSONObject json = JSONObject.parseObject(result); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if (json.containsKey("error")) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			JSONObject jsonObject = json.getJSONObject("error"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			throw new ThirdpartyException(jsonObject.get("message").toString()+"["+Arrays.stream(receivers).collect(Collectors.joining(","))+"]"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	public void setStudentAppKey(String studentAppKey) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		this.studentAppKey = studentAppKey; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	public void setStudentMasterSecret(String studentMasterSecret) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		this.studentMasterSecret = studentMasterSecret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	public void setTeacherAppKey(String teacherAppKey) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		this.teacherAppKey = teacherAppKey; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	public void setTeacherMasterSecret(String teacherMasterSecret) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		this.teacherMasterSecret = teacherMasterSecret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	public String getSystemAppKey() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return systemAppKey; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	public void setSystemAppKey(String systemAppKey) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		this.systemAppKey = systemAppKey; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	public String getSystemMasterSecret() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return systemMasterSecret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	public void setSystemMasterSecret(String systemMasterSecret) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		this.systemMasterSecret = systemMasterSecret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	public void setApns_production(boolean apns_production) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		this.apns_production = apns_production; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	public void setTime_to_live(int time_to_live) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		this.time_to_live = time_to_live; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	public void setReqURL(String reqURL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		this.reqURL = reqURL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public boolean send(String subject, String content, String receiver, String url, String type, String sound, String channelId) throws IOException { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String[] alias = {receiver}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String result = this.push(alias, subject, content, url, type, sound, channelId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        JSONObject json = JSONObject.parseObject(result); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (json.containsKey("error")) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            JSONObject jsonObject = json.getJSONObject("error"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            throw new ThirdpartyException(jsonObject.get("message").toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public boolean batchSend(String subject, String content, String[] receivers, String url, String type, String sound, String channelId) throws IOException { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String result = this.push(receivers, subject, content, url, type, sound, channelId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        JSONObject json = JSONObject.parseObject(result); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (json.containsKey("error")) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            JSONObject jsonObject = json.getJSONObject("error"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            throw new ThirdpartyException(jsonObject.get("message").toString() + "[" + Arrays.stream(receivers).collect(Collectors.joining(",")) + "]"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |