From fafd2725c802ad4c0741dbca297725271f5de751 Mon Sep 17 00:00:00 2001 From: 3y Date: Mon, 9 May 2022 22:09:06 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E7=AB=AF=E6=8E=A5=E5=85=A5?= =?UTF-8?q?=E4=B8=AA=E6=8E=A8=20=E6=8E=A8=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/dto/model/PushContentModel.java | 14 ++ .../austin/handler/domain/push/PushParam.java | 33 +++++ .../domain/push/getui/BatchSendPushParam.java | 54 +++++++ .../{ => push}/getui/SendPushParam.java | 6 +- .../{ => push}/getui/SendPushResult.java | 2 +- .../handler/handler/impl/PushHandler.java | 136 +++++++++++++++++- 6 files changed, 240 insertions(+), 5 deletions(-) create mode 100644 austin-handler/src/main/java/com/java3y/austin/handler/domain/push/PushParam.java create mode 100644 austin-handler/src/main/java/com/java3y/austin/handler/domain/push/getui/BatchSendPushParam.java rename austin-handler/src/main/java/com/java3y/austin/handler/domain/{ => push}/getui/SendPushParam.java (95%) rename austin-handler/src/main/java/com/java3y/austin/handler/domain/{ => push}/getui/SendPushResult.java (92%) diff --git a/austin-common/src/main/java/com/java3y/austin/common/dto/model/PushContentModel.java b/austin-common/src/main/java/com/java3y/austin/common/dto/model/PushContentModel.java index abb427d..511d436 100644 --- a/austin-common/src/main/java/com/java3y/austin/common/dto/model/PushContentModel.java +++ b/austin-common/src/main/java/com/java3y/austin/common/dto/model/PushContentModel.java @@ -1,9 +1,23 @@ package com.java3y.austin.common.dto.model; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + /** * @author 3y + * + * 通知栏消息推送 */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor public class PushContentModel extends ContentModel { + private String title; + private String content; + private String url; } diff --git a/austin-handler/src/main/java/com/java3y/austin/handler/domain/push/PushParam.java b/austin-handler/src/main/java/com/java3y/austin/handler/domain/push/PushParam.java new file mode 100644 index 0000000..5ab85ca --- /dev/null +++ b/austin-handler/src/main/java/com/java3y/austin/handler/domain/push/PushParam.java @@ -0,0 +1,33 @@ +package com.java3y.austin.handler.domain.push; + + +import com.java3y.austin.common.domain.TaskInfo; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Set; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class PushParam { + + /** + * 调用 接口时需要的token + */ + private String token; + + /** + * 调用接口时需要的appId + */ + private String appId; + + /** + * 消息模板的信息 + */ + private TaskInfo taskInfo; + +} diff --git a/austin-handler/src/main/java/com/java3y/austin/handler/domain/push/getui/BatchSendPushParam.java b/austin-handler/src/main/java/com/java3y/austin/handler/domain/push/getui/BatchSendPushParam.java new file mode 100644 index 0000000..3afbb0a --- /dev/null +++ b/austin-handler/src/main/java/com/java3y/austin/handler/domain/push/getui/BatchSendPushParam.java @@ -0,0 +1,54 @@ +package com.java3y.austin.handler.domain.push.getui; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Set; + + +/** + * 批量推送消息的param + * + * @author 3y + * https://docs.getui.com/getui/server/rest_v2/push/ + */ +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class BatchSendPushParam { + + /** + * audience + */ + @JSONField(name = "audience") + private AudienceVO audience; + /** + * taskid + */ + @JSONField(name = "taskid") + private String taskId; + /** + * isAsync + */ + @JSONField(name = "is_async") + private Boolean isAsync; + + /** + * AudienceVO + */ + @NoArgsConstructor + @Data + @Builder + @AllArgsConstructor + public static class AudienceVO { + /** + * cid + */ + @JSONField(name = "cid") + private Set cid; + } +} diff --git a/austin-handler/src/main/java/com/java3y/austin/handler/domain/getui/SendPushParam.java b/austin-handler/src/main/java/com/java3y/austin/handler/domain/push/getui/SendPushParam.java similarity index 95% rename from austin-handler/src/main/java/com/java3y/austin/handler/domain/getui/SendPushParam.java rename to austin-handler/src/main/java/com/java3y/austin/handler/domain/push/getui/SendPushParam.java index f0a035e..664d748 100644 --- a/austin-handler/src/main/java/com/java3y/austin/handler/domain/getui/SendPushParam.java +++ b/austin-handler/src/main/java/com/java3y/austin/handler/domain/push/getui/SendPushParam.java @@ -1,4 +1,4 @@ -package com.java3y.austin.handler.domain.getui; +package com.java3y.austin.handler.domain.push.getui; import com.alibaba.fastjson.annotation.JSONField; import lombok.AllArgsConstructor; @@ -6,7 +6,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import java.util.List; +import java.util.Set; /** * 推送消息的param @@ -65,7 +65,7 @@ public class SendPushParam { * cid */ @JSONField(name = "cid") - private List cid; + private Set cid; } /** diff --git a/austin-handler/src/main/java/com/java3y/austin/handler/domain/getui/SendPushResult.java b/austin-handler/src/main/java/com/java3y/austin/handler/domain/push/getui/SendPushResult.java similarity index 92% rename from austin-handler/src/main/java/com/java3y/austin/handler/domain/getui/SendPushResult.java rename to austin-handler/src/main/java/com/java3y/austin/handler/domain/push/getui/SendPushResult.java index 6a14fc6..5175d27 100644 --- a/austin-handler/src/main/java/com/java3y/austin/handler/domain/getui/SendPushResult.java +++ b/austin-handler/src/main/java/com/java3y/austin/handler/domain/push/getui/SendPushResult.java @@ -1,4 +1,4 @@ -package com.java3y.austin.handler.domain.getui; +package com.java3y.austin.handler.domain.push.getui; import com.alibaba.fastjson.JSONObject; diff --git a/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/PushHandler.java b/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/PushHandler.java index deebddd..93feeef 100644 --- a/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/PushHandler.java +++ b/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/PushHandler.java @@ -1,12 +1,32 @@ package com.java3y.austin.handler.handler.impl; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.http.ContentType; +import cn.hutool.http.Header; +import cn.hutool.http.HttpRequest; +import com.alibaba.fastjson.JSON; +import com.google.common.base.Throwables; +import com.java3y.austin.common.constant.SendAccountConstant; import com.java3y.austin.common.domain.TaskInfo; +import com.java3y.austin.common.dto.account.GeTuiAccount; +import com.java3y.austin.common.dto.model.PushContentModel; import com.java3y.austin.common.enums.ChannelType; + +import com.java3y.austin.handler.domain.push.PushParam; +import com.java3y.austin.handler.domain.push.getui.BatchSendPushParam; +import com.java3y.austin.handler.domain.push.getui.SendPushParam; +import com.java3y.austin.handler.domain.push.getui.SendPushResult; import com.java3y.austin.handler.handler.BaseHandler; import com.java3y.austin.handler.handler.Handler; +import com.java3y.austin.support.utils.AccountUtils; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; +import java.util.Set; + /** * 通知栏消息发送处理 *

@@ -18,13 +38,127 @@ import org.springframework.stereotype.Component; @Slf4j public class PushHandler extends BaseHandler implements Handler { + private static final String BASE_URL = "https://restapi.getui.com/v2/"; + private static final String SINGLE_PUSH_PATH = "/push/single/cid"; + private static final String BATCH_PUSH_CREATE_TASK_PATH = "/push/list/message"; + private static final String BATCH_PUSH_PATH = "/push/list/cid"; + public PushHandler() { channelCode = ChannelType.PUSH.getCode(); } + @Autowired + private AccountUtils accountUtils; + @Autowired + private StringRedisTemplate redisTemplate; + + @Override public boolean handler(TaskInfo taskInfo) { - return true; + + try { + GeTuiAccount account = accountUtils.getAccount(taskInfo.getSendAccount(), SendAccountConstant.GE_TUI_ACCOUNT_KEY, SendAccountConstant.GE_TUI_ACCOUNT_PREFIX, GeTuiAccount.class); + String token = redisTemplate.opsForValue().get(SendAccountConstant.GE_TUI_ACCESS_TOKEN_PREFIX + taskInfo.getSendAccount()); + PushParam pushParam = PushParam.builder().token(token).appId(account.getAppId()).taskInfo(taskInfo).build(); + + String result; + if (taskInfo.getReceiver().size() == 1) { + result = singlePush(pushParam); + } else { + result = batchPush(createTaskId(pushParam), pushParam); + } + SendPushResult sendPushResult = JSON.parseObject(result, SendPushResult.class); + if (sendPushResult.getCode().equals(0)) { + return true; + } + // 常见的错误 应当 关联至 AnchorState,由austin后台统一透出失败原因 + log.error("PushHandler#handler fail!result:{},params:{}", JSON.toJSONString(sendPushResult), JSON.toJSONString(taskInfo)); + } catch (Exception e) { + log.error("PushHandler#handler fail!e:{},params:{}", Throwables.getStackTraceAsString(e), JSON.toJSONString(taskInfo)); + } + return false; + } + + + /** + * 单推 + * @param pushParam + * @return http result + */ + private String singlePush(PushParam pushParam) { + String url = BASE_URL + pushParam.getAppId() + SINGLE_PUSH_PATH; + SendPushParam sendPushParam = assembleParam((PushContentModel) pushParam.getTaskInfo().getContentModel(), pushParam.getTaskInfo().getReceiver()); + String body = HttpRequest.post(url).header(Header.CONTENT_TYPE.getValue(), ContentType.JSON.getValue()) + .header("token", pushParam.getToken()) + .body(JSON.toJSONString(sendPushParam)) + .timeout(2000) + .execute().body(); + return body; + } + + + /** + * 批量推送 + * + * @param taskId 个推 返回的任务Id + * @param pushParam + * @return + */ + private String batchPush(String taskId, PushParam pushParam) { + String url = BASE_URL + pushParam.getAppId() + BATCH_PUSH_PATH; + BatchSendPushParam batchSendPushParam = BatchSendPushParam.builder() + .taskId(taskId) + .isAsync(true) + .audience(BatchSendPushParam.AudienceVO.builder().cid(pushParam.getTaskInfo().getReceiver()).build()).build(); + String body = HttpRequest.post(url).header(Header.CONTENT_TYPE.getValue(), ContentType.JSON.getValue()) + .header("token", pushParam.getToken()) + .body(JSON.toJSONString(batchSendPushParam)) + .timeout(2000) + .execute().body(); + return body; + } + + + /** + * 群推前需要构建taskId + * @param pushParam + * @return http result + */ + private String createTaskId(PushParam pushParam) { + String url = BASE_URL + pushParam.getAppId() + BATCH_PUSH_CREATE_TASK_PATH; + SendPushParam param = assembleParam((PushContentModel) pushParam.getTaskInfo().getContentModel()); + String taskId = ""; + try { + String body = HttpRequest.post(url).header(Header.CONTENT_TYPE.getValue(), ContentType.JSON.getValue()) + .header("token", pushParam.getToken()) + .body(JSON.toJSONString(param)) + .timeout(2000) + .execute().body(); + + taskId = JSON.parseObject(body, SendPushResult.class).getData().getString("taskId"); + } catch (Exception e) { + log.error("PushHandler#createTaskId fail :{},params:{}", Throwables.getStackTraceAsString(e), JSON.toJSONString(pushParam.getTaskInfo())); + } + + return taskId; + } + + + private SendPushParam assembleParam(PushContentModel pushContentModel) { + return assembleParam(pushContentModel, null); + } + + private SendPushParam assembleParam(PushContentModel pushContentModel, Set cid) { + SendPushParam param = SendPushParam.builder() + .requestId(String.valueOf(IdUtil.getSnowflake().nextId())) + .pushMessage(SendPushParam.PushMessageVO.builder().notification(SendPushParam.PushMessageVO.NotificationVO.builder() + .title(pushContentModel.getTitle()).body(pushContentModel.getContent()).clickType("startapp").build()) + .build()) + .build(); + if (CollUtil.isNotEmpty(cid)) { + param.setAudience(SendPushParam.AudienceVO.builder().cid(cid).build()); + } + return param; } }