记录一次java集成华为,oppo,vivo推送的经历

背景:最近公司app做用户推送功能,通过用户分析,85%的用户用的是华为,oppo,vivo。所以先考虑集成此三个平台,再开发过程中还是有一些坑的,在此记录一下。
1.华为推送:
sdk地址:https://developer.huawei.com/consumer/cn/service/hms/catalog/huaweipush_v3.html?page=hmssdk_huaweipush_sample_code_v3_s
解压后导入开发工具中,然后打包放到公司私服上:
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020041115283077.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NoaWRlYmlu,size_16,color_FFFFFF,t_70打包前注意看一下这个类HuaweiMessageClientImpl的sendRequest方法,不然推送消息会中文乱码(我下的那个版本会):

在这里插入图片描述
注意这两个要是utf-8.
把pom.xml文件中的version改成1.0,因为这个jar包我们一般是不会改的。然后

把生成的上传到私服:
在这里插入图片描述
根据demo写个push的service:

 package com.service.push.impl;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import com.alibaba.fastjson.JSON;
import com.huawei.push.javasdk.exception.HuaweiMesssagingException;
import com.huawei.push.javasdk.message.AndroidConfig;
import com.huawei.push.javasdk.message.AndroidNotification;
import com.huawei.push.javasdk.message.ClickAction;
import com.huawei.push.javasdk.message.ClickAction.Builder;
import com.huawei.push.javasdk.message.Message;
import com.huawei.push.javasdk.message.Notification;
import com.huawei.push.javasdk.messaging.HuaweiApp;
import com.huawei.push.javasdk.messaging.HuaweiCredential;
import com.huawei.push.javasdk.messaging.HuaweiMessaging;
import com.huawei.push.javasdk.messaging.HuaweiOption;
import com.huawei.push.javasdk.messaging.ImplHuaweiTrampolines;
import com.huawei.push.javasdk.messaging.SendResponce;


//Push通知栏消息Demo
@Service
public class HuaPushServiceImpl extends PushService{
	private static final Logger logger = LoggerFactory.getLogger(HuaPushServiceImpl.class);
	private static String appId = "111111";
	private static String appSecret = "914ce65aaffcd68207027335bb07a6d6111";
	private static Map<String,HuaweiApp> appMap = new HashMap<>();
	
	public static void main(String[] args) throws Exception {
		String title = "这样的自驾游真是让人羡慕";
		String content = "美国30天,玩遍全美所有景点";
		Map<String, String> extras = new HashMap<String, String>();
		extras.put("type", "1");
		extras.put("videoId", "181578");
		extras.put("targetUid", "775923");
		String intent = "intent://com.piaoquantv/pushrouter?#Intent;scheme=pushscheme;launchFlags=0x4000000;";
		intent = intent + "S.data="+JSON.toJSONString(extras)+";end";
		logger.info("intent:"+intent);
		HuaPushServiceImpl pushService = new HuaPushServiceImpl();
		PushParamModel model = new PushParamModel();
		model.setTitle(title);
		model.setMsgContent(content);
		model.setPushBrand(PushBrandEnum.HW.getBrand());
		model.setApptype(AppTypeEnum.APPSPEED.getCode());
		model.setDeviceToken(new String[]{"AC2cBkB1uEJh16hUFk2W5MTCGoG7nQO1xWhBV2K_YrhEYn-fb002hLrS8iQqOsMiJ0bOrKzY1RUJWY7mrK2B2ncD7tUHgOD6DgUh3OU4xlShV0rj3zXJF3YmXU0bHJybIA"});
		model.setActionType(1);
		model.setActionContent(intent);
		pushService.sendNotificationMessage(model);
	}

	/**
	 * 
	 * @Title: sendNotificationMessage   
	 * @Description: 发送通知栏消息   
	 * @param: @param apptype app类型
	 * @param: @param title 消息标题
	 * @param: @param msgContent 消息内容
	 * @param: @param extras 业务信息
	 * @param: @param actionType 点击类型
	 * 1标识点击行为用户自定义;2标识打开特定URL;3标识打开本业务的APP;4标识打开富媒体信息。
	 * @param: @param actionContent
	 * 当type为1时必选 intent 当type为2时必选 url 当type为4时必选rich_resource     
	 * @param: @param deviceToken
	 * 用户注册id
	 * @param: @throws Exception      
	 * @return: void      
	 * @throws   
	 * @author:石德斌
	 * @date:2020年4月8日 下午9:13:14
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public PushResult sendNotificationMessage(PushParamModel model) throws Exception {
		Notification notification = new Notification(model.getTitle(),model.getMsgContent());
		Builder builder = ClickAction.builder();
		Integer apptype = model.getApptype();
		Integer actionType = HWActionType.parseDescr(ActionType.getDescr(model.getActionType()));
		String actionContent = model.getActionContent();
		String[] deviceToken = model.getDeviceToken();
		Map<String, String> extras = model.getExtras();
		builder = builder.setType(actionType);
		if(ActionType.INTENT.getCode().equals(actionType)){
			builder = builder.setIntent(actionContent);
		}else if(ActionType.URL.getCode().equals(actionType)){
			builder = builder.setUrl(actionContent);
		}else if(ActionType.APP.getCode().equals(actionType)){
			
		}else if(ActionType.RICH.getCode().equals(actionType)){
			builder = builder.setRichResource(actionContent);
		}
		ClickAction clickAction = builder.build(); 
		AndroidNotification androidNotification = AndroidNotification.builder().setClickAction(clickAction)
				.build();
		logger.info("发送消息:"+JSON.toJSONString(androidNotification));
		AndroidConfig androidConfig = AndroidConfig.builder().setNotification(androidNotification).build();
		
		Message normalNotificationMessage = buildNotificationMessage(JSON.toJSONString(extras),notification,
				androidConfig,Arrays.asList(deviceToken));
		 SendResponce responce = sendMessage(apptype,normalNotificationMessage,false);
		 PushResult result = new PushResult();
		 if(responce.getCode() == 80000000){
			 result.setCode(0);
		 }else{
			 result.setCode(-1);
		 }
		 result.setMsg(responce.getMsg());
		 result.setResponseId(responce.getRequestId());
		 return result;
	}

	public static HuaweiApp initializeApp() {
		HuaweiCredential credential = HuaweiCredential.builder().setAppId(appId).setAppSecret(appSecret).build();
		// Create HuaweiOption
		HuaweiOption option = HuaweiOption.builder().setCredential(credential).build();
		HuaweiApp app = HuaweiApp.initializeApp(option);
		synchronized (appMap) {
			if(appMap.get(appId) ==null){
				synchronized (appMap) {
					appMap.put(appId, app);
				}
			}
		}
		// Initialize HuaweiApp
		return app;
	}

	/**
	 * 
	 * @Title: sendToTopic   
	 * @Description: 构造广播消息   
	 * @param: @param apptype
	 * @param: @param topic
	 * @param: @param message
	 * @param: @return
	 * @param: @throws HuaweiMesssagingException      
	 * @return: Message      
	 * @throws   
	 * @author:石德斌
	 * @date:2020年4月8日 上午11:19:38
	 */
	public Message buildTopicMessage(String data,String topic,Message message) throws HuaweiMesssagingException {
		return Message.builder()
	                .setData(data)
	                .setTopic(topic)
	                .build();
	}

	/**
	 * 
	 * @Title: buildConditionMessage   
	 * @Description: 构造条件消息   
	 * @param: @param data
	 * @param: @param condition
	 * @param: @param message
	 * @param: @return
	 * @param: @throws HuaweiMesssagingException      
	 * @return: Message      
	 * @throws   
	 * @author:石德斌
	 * @date:2020年4月8日 上午11:17:32
	 */
	public Message buildConditionMessage(String data,String condition,Message message ) throws HuaweiMesssagingException {
		return Message.builder()
	                .setData(data)
	                .setTopic(condition)
	                .build();
	}

	/**
	 * 
	 * @Title: sendMessage   
	 * @Description: 发送push消息   
	 * @param: @param apptype
	 * @param: @param message
	 * @param: @param validateOnly true是测试消息,false是正式消息
	 * @param: @return
	 * @param: @throws HuaweiMesssagingException      
	 * @return: SendResponce   80000000:成功       
	 * @throws   
	 * @author:石德斌
	 * @date:2020年4月8日 下午3:14:31
	 */
	public static SendResponce sendMessage(Integer apptype,Message message,boolean validateOnly) throws HuaweiMesssagingException {
		if(AppTypeEnum.APPSPEED.getCode().equals(apptype)){
			appId = "10180121";
			appSecret = "1d7dfbed821296e308ac54ad008a160b4d219c96383aec39cc97897a82dde321321";
		}
		HuaweiApp app = appMap.get(appId);
		if(app == null){
			app = initializeApp();
		}
		logger.info("华为push拿到的accessToken{}",ImplHuaweiTrampolines.getAccessToken(app));
		SendResponce response = HuaweiMessaging.getInstance(app).send(message, validateOnly);
		logger.info("华为push请求结果{}",JSON.toJSONString(response));
		System.out.println(JSON.toJSONString(response));
		return response;
	}

	/**
	 * 
	 * @Title: buildNotificationMessage   
	 * @Description: 构造通知消息   
	 * @param: @param apptype
	 * @param: @param notification
	 * @param: @param androidConfig
	 * @param: @param tokens
	 * @param: @return      
	 * @return: Message      
	 * @throws   
	 * @author:石德斌
	 * @date:2020年4月8日 上午11:18:30
	 */
	public static Message buildNotificationMessage(String data,Notification notification,AndroidConfig androidConfig,List<String> tokens) {
		return Message.builder().setNotification(notification).setAndroidConfig(androidConfig)
				.addAllToken(tokens).setData(data).build();
	}

	@Override
	@PostConstruct
	public void initMap() {
		pushMap.put(PushBrandEnum.HW.getBrand(), this);
	}


}

vivo推送sdk:https://dev.vivo.com.cn/documentCenter/doc/197
直接解压后传到公司私服,然后工程pom文件引入就可以了。
pushservice:

package com..service.push.impl;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;

import javax.annotation.PostConstruct;

import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.vivo.push.sdk.notofication.InvalidUser;
import com.vivo.push.sdk.notofication.Message;
import com.vivo.push.sdk.notofication.Result;
import com.vivo.push.sdk.notofication.Statistic;
import com.vivo.push.sdk.notofication.TargetMessage;
import com.vivo.push.sdk.server.Sender;
@Service
public class VivoPushServiceImpl extends PushService{

	private static Logger logger = LoggerFactory.getLogger(VivoPushServiceImpl.class);
    private static Integer appId = 11111;
    private static String appKey = "0ec9694331704c70a8d3c6ca7404af432";
    private static String appSecret = "b692cdd94748451295327290cb922f312";
    private static Map<Integer,Sender> senderMap = new HashMap<>();

    private Sender getSender(Integer apptype) throws Exception{
    	if(AppTypeEnum.APPSPEED.getCode().equals(apptype)){
			appId = 1111;
			appKey = "87b90ec1-4f51-4968-a5db-a9196c2cf021322";
			appSecret = "c8bd3d43-89c4-4282-9d84-d40b397434”;
    	Sender sender = senderMap.get(appId);
    	if(sender == null){
    		synchronized(senderMap){
    			if(sender == null){
    				sender = new Sender(appSecret);//注册登录开发平台网站获取到的appSecret
    			    Result result = sender.getToken(appId , appKey);//注册登录开发平台网站获取到的appId和appKey
    			    sender.setAuthToken(result. getAuthToken());
        			senderMap.put(appId, sender);
    			}
    		}
    	}
    	return sender;
    }
    
    public Result sendSingle(Integer apptype,String title, String content
			, Integer skipType, String actionContent, Map<String,String> extras,String registerId) throws Exception {
		Sender sender = getSender(apptype);
		logger.info("业务数据:" + extras);
		//notifyType 1:无 2:响铃 3:振动 4:响铃和振动
		//skipType 1:打开APP首页 2:打开链接 3:自定义 4:打开app内指定页面
		Message singleMessage = new Message.Builder().regId(registerId)// 该测试手机设备订阅推送后生成的regId
				.notifyType(4).title(title).content(content).skipType(skipType).timeToLive(60*60*24)
				.skipContent(actionContent).requestId(registerId).clientCustomMap(extras).build();
		logger.info("发送消息:"+JSON.toJSONString(singleMessage));
		Result result = sender.sendSingle(singleMessage);
		logger.info(JSONObject.toJSONString(result));
		System.out.println(JSONObject.toJSONString(result));
		return result;
	}

	public Result sendBatch(Integer apptype,String title, String content
			,Integer actionType,String actionContent, Map<String,String> extras, Set<String> registerIds) throws Exception {
		Sender sender = getSender(apptype);
		logger.info("业务数据:" + extras);
		String requestId = UUID.randomUUID().toString();
		//notifyType 1:无 2:响铃 3:振动 4:响铃和振动
		//skipType 1:打开APP首页 2:打开链接 3:自定义 4:打开app内指定页面
		Message saveList = new Message.Builder().notifyType(4).title(title).content(content)
				.skipType(actionType).skipContent(actionContent).requestId(requestId)
				.clientCustomMap(extras).timeToLive(60*60*24).build();
		Result result = sender.saveListPayLoad(saveList);
		String taskId = result.getTaskId();
		logger.info(JSONObject.toJSONString(result));
		TargetMessage targetMessage = new TargetMessage.Builder().regIds(registerIds)
				.requestId(requestId).taskId(taskId).build();//构建批量推送的消息体
		logger.info("发送消息:"+JSON.toJSONString(targetMessage));
		result = sender.sendToList(targetMessage);
		logger.info(JSONObject.toJSONString(result));
		System.out.println(JSONObject.toJSONString(result));
		return result;
	}


	@Override
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public PushResult sendNotificationMessageAll(PushParamModel model) throws Exception {
		Integer apptype = model.getApptype();
		Integer actionType = VivoActionType.parseDescr(ActionType.getDescr(model.getActionType()));
		String actionContent = model.getActionContent();
		Map<String, String> extras = model.getExtras();
		String title = model.getTitle();
		String content = model.getMsgContent();
		PushResult result = new PushResult();
		Sender sender = getSender(apptype);
		String requestId = UUID.randomUUID().toString();
		//notifyType 1:无 2:响铃 3:振动 4:响铃和振动
		//skipType 1:打开APP首页 2:打开链接 3:自定义 4:打开app内指定页面
		logger.info("业务数据:" + extras);
		Message allMessage = new Message.Builder().notifyType(4).title(title).content(content)
				.skipType(actionType).skipContent(actionContent).requestId(requestId).clientCustomMap(extras).build();
		logger.info("发送消息:"+JSON.toJSONString(allMessage));
		Result allResult = sender.sendToAll(allMessage);
		logger.info(JSONObject.toJSONString(allResult));
		result.setCode(allResult.getResult());
		result.setMsg(allResult.getDesc());
		result.setResponseId(allResult.getTaskId());
		return result;
	}
	
	public Result sendTag(Integer apptype,String title, String content
			,Integer actionType,String actionContent, JSONObject extras, String... registerIds) throws Exception {
		Sender sender = getSender(apptype);
		logger.info("json:" + extras.toJSONString());
		Message tagMessage = new Message.Builder().regId("regId")// 该测试手机设备订阅推送后生成的regId
				.notifyType(3).title("try_title").content("try-content").timeToLive(1000).skipType(2)
				.skipContent("http://www.vivo.com").networkType(-1).requestId("1234567890123456").build();
		Result result = sender.sendToTag(tagMessage);
		logger.info(JSONObject.toJSONString(result));
		return result;
	}

    public static void main(String[] args) {
        Map<String,String> extras = new HashMap<>();
        extras.put("type", "1");
        extras.put("videoId", "510200"); //181578
        extras.put("targetUid", "3733524"); //775923
//        String []  registerIds=new String[]{"CN_0f636b8876bcfc8f29317e1fb6ef4404","CN_481f438b5b8439d2f7878095772e4d64"};
        //String   registerId="CN_481f438b5b8439d2f7878095772e4d64";
        try {
        	PushParamModel model = new PushParamModel();
    		model.setTitle("王者归来!");
    		model.setMsgContent("7记三分创生涯新高!罗斯对湖人砍31分集锦");
    		model.setPushBrand(PushBrandEnum.HW.getBrand());
    		model.setApptype(AppTypeEnum.APPSPEED.getCode());
    		model.setDeviceToken(new String[]{"15864871340512006118608","15864871340512006118610"});
    		model.setActionType(4);
    		model.setActionContent("intent://com.piaoquantv/pushrouter?#Intent;scheme=pushscheme;launchFlags=0x4000000;i.type=1;i.targetId=690880;end");
        	VivoPushServiceImpl vivoPushService = new VivoPushServiceImpl();
        	vivoPushService.sendNotificationMessage(model);
		} catch (Exception e) {
			e.printStackTrace();
		}
    }

	@PostConstruct
	public void initMap() {
		pushMap.put(PushBrandEnum.VIVO.getBrand(), this);
	}

	@Override
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public PushResult sendNotificationMessage(PushParamModel model)throws Exception {
		Integer apptype = model.getApptype();
		Integer actionType = VivoActionType.parseDescr(ActionType.getDescr(model.getActionType()));
		String actionContent = model.getActionContent();
		String[] deviceToken = model.getDeviceToken();
		Map<String, String> extras = model.getExtras();
		String title = model.getTitle();
		String msgContent = model.getMsgContent();
		PushResult result = new PushResult();
		if(deviceToken.length == 0 || deviceToken.length>1000){
			result.setCode(-1);
			result.setMsg("发送人数为0或超过1000");
			return result;
		}
		Result viResult = null;
		//单发
		if(deviceToken.length ==1){
			viResult = sendSingle(apptype,title,msgContent,actionType,actionContent,extras,deviceToken[0]);
		}else{
			Set<String> registerIds = new HashSet(Arrays.asList(deviceToken));
			viResult = sendBatch(apptype,title,msgContent,actionType,actionContent,extras,registerIds);
		}
		result.setCode(viResult.getResult() );
		result.setMsg(viResult.getDesc());
		result.setResponseId(viResult.getTaskId());
		List<String> invalidUsers = new ArrayList<>();
		InvalidUser invalidUser = viResult.getInvalidUser();
		if(invalidUser != null){
			invalidUsers.add(invalidUser.getUserid());
		}
		List<InvalidUser> invalidUsersList = viResult.getInvalidUsers();
		if(CollectionUtils.isNotEmpty(invalidUsersList)){
			invalidUsersList.forEach(action->{
				invalidUsers.add(action.getUserid());
			});
		}
		result.setInvalidUsers(invalidUsers);
		return result;
	}
	
	/**
	 * 
	 * @Title: getStatistics   
	 * @Description: 获取批量推送或全量推送返回的taskId对应的统计信息,单次查询的taskIds最多100个   
	 * @param: @param taskIds
	 * @param: @return
	 * @param: @throws Exception      
	 * @return: List<PushStatis>      
	 * @throws   
	 * @author:石德斌
	 * @date:2020年4月9日 下午5:08:45
	 */
	public PushResult<List<PushStatis>> getStatistics(Set<String>  taskIds) throws Exception{
		PushResult<List<PushStatis>> pushResult  = new PushResult<List<PushStatis>>();
		List<PushStatis> pushStatisList = new ArrayList<>();
		Sender sender = senderMap.get(appId);
		Result result = sender.getStatistics(taskIds);
		if(result.getResult() == 0){
			List<Statistic> statistics = result.getStatistics();
			for(Statistic statistic : statistics){
				PushStatis pushStatis = new PushStatis();
				BeanUtils.copyProperties(statistic, pushStatis);
				pushStatisList.add(pushStatis);
			}
		}
		pushResult.setCode(result.getResult());
		pushResult.setMsg(result.getDesc());
		pushResult.setResponseId(result.getTaskId());
		pushResult.setData(pushStatisList);
		return pushResult;
	}
}

注意timeToLive文档中说是非必填项,但真实是必填的

oppo推送sdk:https://open.oppomobile.com/wiki/doc#id=10203

package comservice.push.impl;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.oppo.push.server.Notification;
import com.oppo.push.server.Result;
import com.oppo.push.server.Sender;
import com.oppo.push.server.Target;
import com.oppo.push.server.TargetType;
@Service
public class OpPushServiceImpl extends PushService{

    private static Logger logger = LoggerFactory.getLogger(OpPushServiceImpl.class);
    private static String appId = "30323214";
    private static String appKey = "48e32b5f431ewrwe93ebc65d46e";
    private static String appMasterSecret = "fedece5de38c4fdsfdsc9fcdb8d4ec2ce";
    private static Map<String,Sender> senderMap = new HashMap<>();

    private Sender getSender(Integer apptype) throws Exception{
    	if(AppTypeEnum.APPSPEED.getCode().equals(apptype)){
			appId = "3032334";
			appKey = "48e32b5f431e4fdfas193ebc65d46e";
			appMasterSecret = "fedece5de38c433f88c9fcdb8d4ec2ce";
		}
    	Sender sender = senderMap.get(appId);
    	if(sender == null){
    		synchronized(senderMap){
    			if(sender == null){
    				sender = new Sender(appKey,appMasterSecret);
        			senderMap.put(appId, sender);
    			}
    		}
    	}
    	return sender;
    }
    
    public Result sendSingle(Integer apptype,String title, String content
    		,Integer actionType,String actionContent,String callbackUrl,Map<String, String> extras,String registerId) throws Exception{
    	Sender sender = getSender(apptype);
    	logger.info("业务信息:"+JSON.toJSONString(extras));
        Result result=null;
        Notification notification = getNotification(title,content,actionType,actionContent,callbackUrl,extras); //创建通知栏消息体
        logger.info("发送消息:"+JSON.toJSONString(notification));
        Target target = Target.build(registerId); //创建发送对象
        result = sender.unicastNotification(notification, target);  //发送单推消息
        result.getStatusCode(); // 获取http请求状态码
        result.getReturnCode(); // 获取平台返回码
        result.getMessageId();  // 获取平台返回的messageId
        logger.info("单个发送:{}",JSONObject.toJSONString(result));
        System.out.println(JSONObject.toJSONString(result));
        return result;
    }

	public Result sendBatch(Integer apptype,String title, String content
			,Integer actionType,String actionContent,String callbackUrl, Map<String, String> extras, String... registerIds) throws Exception {
		Sender sender = getSender(apptype);
		Notification broadNotification = getNotification(title, content,actionType,actionContent,callbackUrl, extras);// 创建通知栏消息体
		logger.info("发送消息:"+JSON.toJSONString(broadNotification));
		Result saveResult = sender.saveNotification(broadNotification); // 发送保存消息体请求
		saveResult.getStatusCode(); // 获取http请求状态码
		saveResult.getReturnCode(); // 获取平台返回码
		logger.info(JSONObject.toJSONString(saveResult));
		String messageId = saveResult.getMessageId(); // 获取messageId
		Target target = new Target(); // 创建广播目标
		StringBuffer buffer = new StringBuffer("");
		for (String registerId : registerIds) {
			buffer.append(registerId + ";");
		}
		int length = buffer.toString().length();
		target.setTargetType(TargetType.REGISTRATION_ID);
		target.setTargetValue(buffer.toString().substring(0, length - 1));
		Result broadResult = sender.broadcastNotification(messageId, target); // 发送广播消息
		broadResult.getTaskId(); // 获取广播taskId
		List<Result.BroadcastErrorResult> errorList = broadResult.getBroadcastErrorResults();
		if (errorList.size() > 0) { // 如果大小为0,代表所有目标发送成功
			for (Result.BroadcastErrorResult error : errorList) {
				error.getErrorCode(); // 错误码
				error.getTargetValue(); // 目标
			}
		}
		logger.info("批量发送:{}",JSONObject.toJSONString(broadResult));
		return broadResult;
	}


	@Override
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public PushResult sendNotificationMessageAll(PushParamModel model) throws Exception {
		Integer apptype = model.getApptype();
		Integer actionType = OppoActionType.parseDescr(ActionType.getDescr(model.getActionType()));
		String actionContent = model.getActionContent();
		Map<String, String> extras = model.getExtras();
		String title = model.getTitle();
		String content = model.getMsgContent();
		String callbackUrl = model.getCallbackUrl();
		PushResult result = new PushResult();
		Sender sender = getSender(apptype);
		Notification broadNotification = getNotification(title, content,actionType,actionContent,callbackUrl, extras);// 创建通知栏消息体
		logger.info("发送消息:"+JSON.toJSONString(broadNotification));
		Result saveResult = sender.saveNotification(broadNotification); // 发送保存消息体请求
		saveResult.getStatusCode(); // 获取http请求状态码
		saveResult.getReturnCode(); // 获取平台返回码
		logger.info(JSONObject.toJSONString(saveResult));
		String messageId = saveResult.getMessageId(); // 获取messageId
		Target target = new Target(); // 创建广播目标
		target.setTargetType(TargetType.ALL);
		Result broadResult = sender.broadcastNotification(messageId,target); // 发送广播消息
		broadResult.getTaskId(); // 获取广播taskId
		List<Result.BroadcastErrorResult> errorList = broadResult.getBroadcastErrorResults();
		if (errorList.size() > 0) { // 如果大小为0,代表所有目标发送成功
			for (Result.BroadcastErrorResult error : errorList) {
				error.getErrorCode(); // 错误码
				error.getTargetValue(); // 目标
			}
		}
		result.setCode(broadResult.getReturnCode().getCode());
		result.setMsg(broadResult.getReturnCode().getMessage());
		result.setResponseId(broadResult.getTaskId());
		logger.info(JSONObject.toJSONString(broadResult));
		return result;
	}

    /**
     * 
     * @Title: getNotification   
     * @Description: 构造通知消息   
     * @param: @param title 消息标题
     * @param: @param content 消息内容
     * @param: @param actionType 消息点击类型:点击动作类型0,启动应用;1,打开应用内页
     * (activity的intent action);2,打开网页;4,打开应用内页(activity);5,Intent scheme URL 【非必填,默认值为0】
     * @param: @param actionContent 应用内页地址【click_action_type为1或4时必填,长度500】,网页地址【click_action_type为2必填,长度500】
     * @param: @param extras 动作参数,打开应用内页或网页时传递给应用或网页【JSON格式,非必填】,字符数不能超过4K,示例:{"key1":"value1","key2":"value2"} 
     * @param: @return      
     * @return: Notification      
     * @throws   
     * @author:石德斌
     * @date:2020年4月8日 下午4:18:01
     */
    private static Notification getNotification(String title,String content,Integer actionType,
    		String actionContent,String callbackUrl,Map<String, String> extras ) {

        Notification notification = new Notification();
        /**
         * 参数必填项
         */
        notification.setTitle(title);
        if(title.length()>6){
            notification.setSubTitle(title.substring(0,6));
        }else{
            notification.setSubTitle(title);
        }
        notification.setContent(content);
        /**
         *   App开发者自定义消息Id,OPPO推送平台根据此ID做去重处理,
         *   对于广播推送相同appMessageId只会保存一次,对于单推相同appMessageId只会推送一次
         *  */
        notification.setAppMessageId(RandomUtil.generate18String());

        /**
         *  点击动作类型0,启动应用;1,打开应用内页(activity的intent action);
         *  2,打开网页;4,打开应用内页(activity);【非必填,默认值为0】;5,Intent scheme URL
         */
        notification.setClickActionType(actionType);
        /**
         * 应用内页地址 click_action_type为1或4时必填,长度500
         */
        if(StringUtils.isNotBlank(actionContent)){
        	notification.setClickActionActivity(actionContent);
        }
        /**
         * 动作参数,打开应用内页或网页时传递给应用或网页【JSON格式,非必填】
         * 字符数不能超过4K,示例:{"key1":"value1","key2":"value2"}
          */
        notification.setActionParameters(JSON.toJSONString(extras));
        /**
         * 展示类型 (0, “即时”),(1, “定时”)
         */
        notification.setShowTimeType(0);
        /**
          * 是否进离线消息,【非必填,默认为True】
         */
        notification.setOffLine(true);
        /**
         * 离线消息的存活时间(time_to_live) (单位:秒), 【off_line值为true时,必填,最长3天】
         */
        notification.setOffLineTtl(24 * 3600*3);
        /**
         *  0:不限联网方式, 1:仅wifi推送
         */
        notification.setNetworkType(0);
        notification.setCallBackUrl(callbackUrl);
        return notification;
    }

    public static void main(String[] args) {
    	Map<String, String> extras = new HashMap<>();
        extras.put("type", "1");
        extras.put("videoId", "510200"); //181578
        extras.put("targetUid", "3733524"); //775923
        //String   registerId="CN_481f438b5b8439d2f7878095772e4d64";
        logger.info(JSON.toJSONString(extras));
        try {
        	PushParamModel model = new PushParamModel();
    		model.setTitle("王者归来!");
    		model.setMsgContent("7记三分创生涯新高!罗斯对湖人砍31分集锦");
    		model.setPushBrand(PushBrandEnum.HW.getBrand());
    		model.setApptype(AppTypeEnum.APPSPEED.getCode());
    		model.setDeviceToken(new String[]{"CN_9489e97aae3e39fb030e79663310dbfe","CN_9489e97aae3e39fb030e79663310dbff"});
    		model.setActionType(1);
    		model.setActionContent("com.oppo.push.router");
        	OpPushServiceImpl opPushService = new OpPushServiceImpl();
        	PushResult sendNotificationMessage = opPushService.sendNotificationMessage(model);
        	System.out.println(JSON.toJSONString(sendNotificationMessage));
        } catch (Exception e) {
			e.printStackTrace();
		}
    }

	@Override
	@PostConstruct
	public void initMap() {
		pushMap.put(PushBrandEnum.OP.getBrand(), this);
	}

	@Override
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public PushResult sendNotificationMessage(PushParamModel model)throws Exception {
		Integer apptype = model.getApptype();
		Integer actionType = OppoActionType.parseDescr(ActionType.getDescr(model.getActionType()));
		String actionContent = model.getActionContent();
		String[] deviceToken = model.getDeviceToken();
		Map<String, String> extras = model.getExtras();
		String callbackUrl = model.getCallbackUrl();
		PushResult result = new PushResult();
		if(deviceToken.length == 0 || deviceToken.length>1000){
			result.setCode(-1);
			result.setMsg("发送人数为0或超过1000");
			return result;
		}
		Result opResult = null;
		//单发
		if(deviceToken.length ==1){
			opResult = sendSingle(apptype,model.getTitle(),model.getMsgContent(),actionType,actionContent,callbackUrl,extras,deviceToken[0]);
		}else{
			opResult = sendBatch(apptype,model.getTitle(),model.getMsgContent(),actionType,actionContent,callbackUrl,extras,deviceToken);
		}
		if(opResult.getReturnCode().getCode() == 0){
			result.setCode(0);
			result.setMsg("发送成功");
			result.setResponseId(opResult.getMessageId());
			return result;
		}
		result.setCode(-1);
		result.setMsg(opResult.getReturnCode().getMessage());
		result.setResponseId(opResult.getMessageId());
		return result;
	}
}

此文章同步到了我个人公众号:java面试工程师。关注公众号更加便于查阅。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值