spring boot>>极光推送(标签或别名)

推送是手机APP必不可少的一样功能,这次项目有需要,记录一下java后台实现

一、maven导入jar包

        
        
            cn.jpush.api
            jpush-client
            3.3.5
        
        
            cn.jpush.api
            jiguang-common
            1.1.1
        
        
            io.netty
            netty-all
            4.1.24.Final
        
        
            com.google.code.gson
            gson
        
        
            org.slf4j
            slf4j-api
        
        

二、创建util

package com.baojian.zhang.util;

import java.util.HashSet;
import java.util.Set;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import cn.jiguang.common.resp.APIConnectionException;
import cn.jiguang.common.resp.APIRequestException;
import cn.jpush.api.JPushClient;
import cn.jpush.api.push.model.PushPayload;

/**
 * 
 * 功能:极光推送
* 作者:张tt
* 时间:2018年7月16日
* 版本:1.0
* */ @Service public class JPushService { @Value("${jpush.app.key}") private String jpushAppKey; @Value("${jpush.master.secret}") private String jpushMasterSecret; /** * 创建 基础 JPushClient * @return */ private JPushClient getJPushClient() { return new JPushClient(jpushMasterSecret, jpushAppKey); } /** * 注销pushid绑定的tag和alias * * @param pushId * 极光的推送编号 * @throws APIRequestException * @throws APIConnectionException */ public void logout(String pushId) throws APIConnectionException, APIRequestException { getJPushClient().updateDeviceTagAlias(pushId, true, true); } /** * 更新用户tags和alias * @param pushId * 推送push编号 * @param cardNumber * 用户卡号 * @param tagsToAdd * 用户标签 * @throws APIConnectionException * @throws APIRequestException */ public void updateTagAlias(String pushId, String cardNumber, Set tagsToAdd) throws APIConnectionException, APIRequestException { getJPushClient().updateDeviceTagAlias(pushId, cardNumber, tagsToAdd, new HashSet<>(getJPushClient().getDeviceTagAlias(pushId).tags)); } /** * 进行推送 * @param build * @throws APIConnectionException * @throws APIRequestException */ public void sendPush(PushPayload build) throws APIConnectionException, APIRequestException { getJPushClient().sendPush(build); } }

 

三、进行推送测试

 

@RequestMapping(value = "/pushArticleToUser", method = RequestMethod.POST)
	@ApiOperation(value = "推送公告给用户")	
	public BaseVO pushArticleToUser(
			@RequestParam(value = "cardNumber", required = true) @ApiParam(name = "cardNumber", value = "用户卡号", required = true) String cardNumber,
			@RequestParam(value = "pushId", required = true) @ApiParam(name = "pushId", value = "推送编号", required = true) String pushId,
			@RequestParam(value = "platform", required = true) @ApiParam(name = "platform", value = "推送平台(1: all,2: android, 3: ios)", required = true) Integer platform,
			@RequestParam(value = "audienceType", required = true) @ApiParam(name = "audienceType", value = "推送目标类型,(1表示全部,2表示按tag推送,3表示按卡号推送)", required = true) Integer audienceType,
			@RequestParam(value = "tags", required = false, defaultValue = "") @ApiParam(name = "tags", value = "推送标签,audienceType为2时传入,多个用逗号分开(,)", required = false, defaultValue = "") String tags,
			@RequestParam(value = "alias", required = false, defaultValue = "") @ApiParam(name = "alias", value = "推送别名,audienceType为3时传入,多个用逗号分开(,)", required = false, defaultValue = "") String alias,
			@RequestParam(value = "title", required = true) @ApiParam(name = "title", value = "推送标题", required = true) String title,
			@RequestParam(value = "secret", required = true) @ApiParam(name = "secret", value = "极光推送密码", required = true) String secret){
		
		// 根据用户卡号和标签设置极光tag和alias。这一步应该在用户登录时完成
		if (StringUtils.isNotBlank(cardNumber)) {
			// 设置tag和alias 例如:地区、会员级职
			Set tagsToAdd = new HashSet();
			tagsToAdd.add("北京");
			tagsToAdd.add("6");
			try {
				jPushService.updateTagAlias(pushId, cardNumber, tagsToAdd);
			} catch (APIConnectionException | APIRequestException e) {
				e.printStackTrace();
				return new BaseVO(11, "用户绑定标签错误!");
			}
		}
		// 当用户退出登录时,注销pushid绑定的tag和alias
		//try {
		//	jPushService.logout(pushId);
		//} catch (APIConnectionException | APIRequestException e1) {
		//	e1.printStackTrace();
		//}
		// 防止恶意调用推送
		if (!jpushMasterSecret.equals(secret)) {
			return new BaseVO(2, "推送失败,secret参数错误!");
		}
		Builder builder = PushPayload.newBuilder();
		// 判断推送平台
		switch (platform) {
		case 1:
			// 全部
			builder.setPlatform(Platform.all());
			break;
		case 2:
			// android
			builder.setPlatform(Platform.android());
			break;
		case 3:
			// ios
			builder.setPlatform(Platform.ios());
			break;
		default:
			break;
		}
		// 判断推送目标
		switch (audienceType) {
		case 1:
			// 全部
			builder.setAudience(Audience.all());
			break;
		case 2:
			// tags
			if (StringUtils.isBlank(tags)) {
				return new BaseVO(2, "推送目标为2,按标签推送时,tags参数不能为空!");
			}
			builder.setAudience(Audience.tag(StringUtils.split(tags, ',')));
			break;
		case 3:
			// 卡号
			if (StringUtils.isBlank(alias)) {
				return new BaseVO(2, "推送目标为3,按别名推送时,alias参数不能为空!");
			}
			builder.setAudience(Audience.alias(StringUtils.split(alias, ",")));
			break;
		default:
			break;
		}
		// 设置推送标题
		builder.setNotification(Notification.alert(title));
		// 设置推送内容
		builder.setMessage(Message.content("公告"));
		// 推送
		try {
			jPushService.sendPush(builder.build());
			return new BaseVO(1, "推送成功!");
		} catch (APIConnectionException | APIRequestException e) {
			e.printStackTrace();
			return new BaseVO(11, "推送失败!");
		}
	}

注:接口测试采用swagger,需要了解的参考以前文章

你可能感兴趣的:(spring,boot,spring,boot系列)