From 5e633f4ea88d20b2fc16c3fa5113ad6b1c66fa6d Mon Sep 17 00:00:00 2001 From: wuhui Date: Wed, 9 Aug 2023 09:34:48 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat:=E8=8E=B7=E5=8F=96=E4=B8=AA=E6=8E=A8?= =?UTF-8?q?=E3=80=81=E9=92=89=E9=92=89=E7=AC=AC=E4=B8=89=E6=96=B9token?= =?UTF-8?q?=E8=A1=A5=E5=81=BF=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RefreshDingDingAccessTokenHandler.java | 2 +- .../RefreshGeTuiAccessTokenHandler.java | 2 +- austin-handler/pom.xml | 4 +++ .../impl/DingDingWorkNoticeHandler.java | 30 +++++++++++++++++-- .../handler/handler/impl/PushHandler.java | 26 +++++++++++++++- 5 files changed, 58 insertions(+), 6 deletions(-) diff --git a/austin-cron/src/main/java/com/java3y/austin/cron/handler/RefreshDingDingAccessTokenHandler.java b/austin-cron/src/main/java/com/java3y/austin/cron/handler/RefreshDingDingAccessTokenHandler.java index 0f35987..9ec3c95 100644 --- a/austin-cron/src/main/java/com/java3y/austin/cron/handler/RefreshDingDingAccessTokenHandler.java +++ b/austin-cron/src/main/java/com/java3y/austin/cron/handler/RefreshDingDingAccessTokenHandler.java @@ -68,7 +68,7 @@ public class RefreshDingDingAccessTokenHandler { * @param account * @return */ - private String getAccessToken(DingDingWorkNoticeAccount account) { + public String getAccessToken(DingDingWorkNoticeAccount account) { String accessToken = ""; try { DingTalkClient client = new DefaultDingTalkClient(URL); diff --git a/austin-cron/src/main/java/com/java3y/austin/cron/handler/RefreshGeTuiAccessTokenHandler.java b/austin-cron/src/main/java/com/java3y/austin/cron/handler/RefreshGeTuiAccessTokenHandler.java index 678b0eb..62dc6e0 100644 --- a/austin-cron/src/main/java/com/java3y/austin/cron/handler/RefreshGeTuiAccessTokenHandler.java +++ b/austin-cron/src/main/java/com/java3y/austin/cron/handler/RefreshGeTuiAccessTokenHandler.java @@ -67,7 +67,7 @@ public class RefreshGeTuiAccessTokenHandler { * @param account * @return */ - private String getAccessToken(GeTuiAccount account) { + public String getAccessToken(GeTuiAccount account) { String accessToken = ""; try { String url = "https://restapi.getui.com/v2/" + account.getAppId() + "/auth"; diff --git a/austin-handler/pom.xml b/austin-handler/pom.xml index 94ca8bb..70099ff 100644 --- a/austin-handler/pom.xml +++ b/austin-handler/pom.xml @@ -53,6 +53,10 @@ com.alipay.sdk alipay-sdk-java + + com.java3y.austin + austin-cron + diff --git a/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/DingDingWorkNoticeHandler.java b/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/DingDingWorkNoticeHandler.java index a2d3bef..b0fb26d 100644 --- a/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/DingDingWorkNoticeHandler.java +++ b/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/DingDingWorkNoticeHandler.java @@ -21,6 +21,7 @@ import com.java3y.austin.common.dto.account.DingDingWorkNoticeAccount; import com.java3y.austin.common.dto.model.DingDingWorkContentModel; import com.java3y.austin.common.enums.ChannelType; import com.java3y.austin.common.enums.SendMessageType; +import com.java3y.austin.cron.handler.RefreshDingDingAccessTokenHandler; import com.java3y.austin.handler.handler.BaseHandler; import com.java3y.austin.handler.handler.Handler; import com.java3y.austin.support.config.SupportThreadPoolConfig; @@ -54,6 +55,8 @@ public class DingDingWorkNoticeHandler extends BaseHandler implements Handler { private StringRedisTemplate redisTemplate; @Autowired private LogUtils logUtils; + @Autowired + private RefreshDingDingAccessTokenHandler refreshDingDingAccessTokenHandler; public DingDingWorkNoticeHandler() { channelCode = ChannelType.DING_DING_WORK_NOTICE.getCode(); @@ -70,7 +73,7 @@ public class DingDingWorkNoticeHandler extends BaseHandler implements Handler { try { DingDingWorkNoticeAccount account = accountUtils.getAccountById(taskInfo.getSendAccount(), DingDingWorkNoticeAccount.class); OapiMessageCorpconversationAsyncsendV2Request request = assembleParam(account, taskInfo); - String accessToken = redisTemplate.opsForValue().get(SendAccountConstant.DING_DING_ACCESS_TOKEN_PREFIX + taskInfo.getSendAccount()); + String accessToken = getAccessToken(account, Long.valueOf(taskInfo.getSendAccount())); OapiMessageCorpconversationAsyncsendV2Response response = new DefaultDingTalkClient(SEND_URL).execute(request, accessToken); // 发送成功后记录TaskId,用于消息撤回(支持当天的) @@ -183,7 +186,7 @@ public class DingDingWorkNoticeHandler extends BaseHandler implements Handler { SupportThreadPoolConfig.getPendingSingleThreadPool().execute(() -> { try { DingDingWorkNoticeAccount account = accountUtils.getAccountById(messageTemplate.getSendAccount(), DingDingWorkNoticeAccount.class); - String accessToken = redisTemplate.opsForValue().get(SendAccountConstant.DING_DING_ACCESS_TOKEN_PREFIX + messageTemplate.getSendAccount()); + String accessToken = getAccessToken(account, Long.valueOf(messageTemplate.getSendAccount())); while (redisTemplate.opsForList().size(DING_DING_RECALL_KEY_PREFIX + messageTemplate.getId()) > 0) { String taskId = redisTemplate.opsForList().leftPop(DING_DING_RECALL_KEY_PREFIX + messageTemplate.getId()); DingTalkClient client = new DefaultDingTalkClient(RECALL_URL); @@ -205,7 +208,7 @@ public class DingDingWorkNoticeHandler extends BaseHandler implements Handler { public void pull(Long accountId) { try { DingDingWorkNoticeAccount account = accountUtils.getAccountById(accountId.intValue(), DingDingWorkNoticeAccount.class); - String accessToken = redisTemplate.opsForValue().get(SendAccountConstant.DING_DING_ACCESS_TOKEN_PREFIX + accountId); + String accessToken = getAccessToken(account, accountId); DingTalkClient client = new DefaultDingTalkClient(PULL_URL); OapiMessageCorpconversationGetsendresultRequest req = new OapiMessageCorpconversationGetsendresultRequest(); req.setAgentId(Long.valueOf(account.getAgentId())); @@ -215,5 +218,26 @@ public class DingDingWorkNoticeHandler extends BaseHandler implements Handler { log.error("DingDingWorkNoticeHandler#pull fail:{}", Throwables.getStackTraceAsString(e)); } } + + /** + * 获取第三方token + * + * @param account 钉钉工作消息 账号信息 + * @param accountId 账号ID + * @return token + */ + private String getAccessToken(DingDingWorkNoticeAccount account, Long accountId) { + String accessToken = redisTemplate.opsForValue().get(SendAccountConstant.DING_DING_ACCESS_TOKEN_PREFIX + accountId); + if (StrUtil.isNotBlank(accessToken)) { + return accessToken; + } + accessToken = refreshDingDingAccessTokenHandler.getAccessToken(account); + if (StrUtil.isNotBlank(accessToken)) { + redisTemplate.opsForValue().set(SendAccountConstant.DING_DING_ACCESS_TOKEN_PREFIX + accountId, accessToken); + } else { + log.error("DingDingWorkNoticeHandler#getAccessToken fail accessToken{} accountId{} ", accessToken, accountId); + } + return accessToken; + } } 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 dfefcb0..1873de5 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 @@ -2,6 +2,7 @@ package com.java3y.austin.handler.handler.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; import cn.hutool.http.ContentType; import cn.hutool.http.Header; import cn.hutool.http.HttpRequest; @@ -12,6 +13,7 @@ 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.cron.handler.RefreshGeTuiAccessTokenHandler; 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; @@ -51,6 +53,8 @@ public class PushHandler extends BaseHandler implements Handler { private AccountUtils accountUtils; @Autowired private StringRedisTemplate redisTemplate; + @Autowired + private RefreshGeTuiAccessTokenHandler refreshGeTuiAccessTokenHandler; @Override @@ -58,7 +62,7 @@ public class PushHandler extends BaseHandler implements Handler { try { GeTuiAccount account = accountUtils.getAccountById(taskInfo.getSendAccount(), GeTuiAccount.class); - String token = redisTemplate.opsForValue().get(SendAccountConstant.GE_TUI_ACCESS_TOKEN_PREFIX + taskInfo.getSendAccount()); + String token = getAccessToken(taskInfo, account); PushParam pushParam = PushParam.builder().token(token).appId(account.getAppId()).taskInfo(taskInfo).build(); String result; @@ -145,6 +149,26 @@ public class PushHandler extends BaseHandler implements Handler { return taskId; } + /** + * 获取第三方token + * + * @param taskInfo 发送任务信息 + * @param account 个推账号时的元信息 + * @return token + */ + private String getAccessToken(TaskInfo taskInfo, GeTuiAccount account) { + String token = redisTemplate.opsForValue().get(SendAccountConstant.GE_TUI_ACCESS_TOKEN_PREFIX + taskInfo.getSendAccount()); + if (StrUtil.isNotBlank(token)) { + return token; + } + token = refreshGeTuiAccessTokenHandler.getAccessToken(account); + if (StrUtil.isNotBlank(token)) { + redisTemplate.opsForValue().set(SendAccountConstant.GE_TUI_ACCESS_TOKEN_PREFIX + taskInfo.getSendAccount(), token); + } else { + log.error("PushHandler#getAccessToken fail taskInfo:{} account:{}", taskInfo, account); + } + return token; + } private SendPushParam assembleParam(PushContentModel pushContentModel) { return assembleParam(pushContentModel, null); From 0adcff673451a8f66392ad81967170721c614e3d Mon Sep 17 00:00:00 2001 From: wuhui Date: Fri, 11 Aug 2023 10:41:45 +0800 Subject: [PATCH 2/3] =?UTF-8?q?feat:=E8=8E=B7=E5=8F=96=E4=B8=AA=E6=8E=A8?= =?UTF-8?q?=E3=80=81=E9=92=89=E9=92=89=E7=AC=AC=E4=B8=89=E6=96=B9token?= =?UTF-8?q?=E8=A1=A5=E5=81=BF=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RefreshDingDingAccessTokenHandler.java | 32 +------ .../RefreshGeTuiAccessTokenHandler.java | 39 +-------- .../impl/DingDingWorkNoticeHandler.java | 28 ++++++- .../handler/handler/impl/PushHandler.java | 24 +++++- .../support/dto/GeTuiTokenResultDTO.java | 37 +++++++++ .../support/dto/QueryTokenParamDTO.java | 36 ++++++++ .../support/utils/AccessTokenUtils.java | 83 +++++++++++++++++++ 7 files changed, 208 insertions(+), 71 deletions(-) create mode 100644 austin-support/src/main/java/com/java3y/austin/support/dto/GeTuiTokenResultDTO.java create mode 100644 austin-support/src/main/java/com/java3y/austin/support/dto/QueryTokenParamDTO.java create mode 100644 austin-support/src/main/java/com/java3y/austin/support/utils/AccessTokenUtils.java diff --git a/austin-cron/src/main/java/com/java3y/austin/cron/handler/RefreshDingDingAccessTokenHandler.java b/austin-cron/src/main/java/com/java3y/austin/cron/handler/RefreshDingDingAccessTokenHandler.java index 0f35987..1e86ab7 100644 --- a/austin-cron/src/main/java/com/java3y/austin/cron/handler/RefreshDingDingAccessTokenHandler.java +++ b/austin-cron/src/main/java/com/java3y/austin/cron/handler/RefreshDingDingAccessTokenHandler.java @@ -2,11 +2,6 @@ package com.java3y.austin.cron.handler; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; -import com.dingtalk.api.DefaultDingTalkClient; -import com.dingtalk.api.DingTalkClient; -import com.dingtalk.api.request.OapiGettokenRequest; -import com.dingtalk.api.response.OapiGettokenResponse; -import com.google.common.base.Throwables; import com.java3y.austin.common.constant.CommonConstant; import com.java3y.austin.common.constant.SendAccountConstant; import com.java3y.austin.common.dto.account.DingDingWorkNoticeAccount; @@ -14,6 +9,7 @@ import com.java3y.austin.common.enums.ChannelType; import com.java3y.austin.support.config.SupportThreadPoolConfig; import com.java3y.austin.support.dao.ChannelAccountDao; import com.java3y.austin.support.domain.ChannelAccount; +import com.java3y.austin.support.utils.AccessTokenUtils; import com.xxl.job.core.handler.annotation.XxlJob; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -34,9 +30,6 @@ import java.util.List; @Slf4j public class RefreshDingDingAccessTokenHandler { - - private static final String URL = "https://oapi.dingtalk.com/gettoken"; - @Autowired private StringRedisTemplate redisTemplate; @@ -54,7 +47,7 @@ public class RefreshDingDingAccessTokenHandler { List accountList = channelAccountDao.findAllByIsDeletedEqualsAndSendChannelEquals(CommonConstant.FALSE, ChannelType.DING_DING_WORK_NOTICE.getCode()); for (ChannelAccount channelAccount : accountList) { DingDingWorkNoticeAccount account = JSON.parseObject(channelAccount.getAccountConfig(), DingDingWorkNoticeAccount.class); - String accessToken = getAccessToken(account); + String accessToken = AccessTokenUtils.getDingDingAccessToken(account); if (StrUtil.isNotBlank(accessToken)) { redisTemplate.opsForValue().set(SendAccountConstant.DING_DING_ACCESS_TOKEN_PREFIX + channelAccount.getId(), accessToken); } @@ -62,25 +55,4 @@ public class RefreshDingDingAccessTokenHandler { }); } - /** - * 获取 access_token - * - * @param account - * @return - */ - private String getAccessToken(DingDingWorkNoticeAccount account) { - String accessToken = ""; - try { - DingTalkClient client = new DefaultDingTalkClient(URL); - OapiGettokenRequest req = new OapiGettokenRequest(); - req.setAppkey(account.getAppKey()); - req.setAppsecret(account.getAppSecret()); - req.setHttpMethod(CommonConstant.REQUEST_METHOD_GET); - OapiGettokenResponse rsp = client.execute(req); - accessToken = rsp.getAccessToken(); - } catch (Exception e) { - log.error("RefreshDingDingAccessTokenHandler#getAccessToken fail:{}", Throwables.getStackTraceAsString(e)); - } - return accessToken; - } } diff --git a/austin-cron/src/main/java/com/java3y/austin/cron/handler/RefreshGeTuiAccessTokenHandler.java b/austin-cron/src/main/java/com/java3y/austin/cron/handler/RefreshGeTuiAccessTokenHandler.java index 678b0eb..320258b 100644 --- a/austin-cron/src/main/java/com/java3y/austin/cron/handler/RefreshGeTuiAccessTokenHandler.java +++ b/austin-cron/src/main/java/com/java3y/austin/cron/handler/RefreshGeTuiAccessTokenHandler.java @@ -1,21 +1,15 @@ package com.java3y.austin.cron.handler; import cn.hutool.core.util.StrUtil; -import cn.hutool.crypto.SecureUtil; -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.CommonConstant; import com.java3y.austin.common.constant.SendAccountConstant; import com.java3y.austin.common.dto.account.GeTuiAccount; import com.java3y.austin.common.enums.ChannelType; -import com.java3y.austin.cron.dto.getui.GeTuiTokenResultDTO; -import com.java3y.austin.cron.dto.getui.QueryTokenParamDTO; import com.java3y.austin.support.config.SupportThreadPoolConfig; import com.java3y.austin.support.dao.ChannelAccountDao; import com.java3y.austin.support.domain.ChannelAccount; +import com.java3y.austin.support.utils.AccessTokenUtils; import com.xxl.job.core.handler.annotation.XxlJob; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -53,7 +47,7 @@ public class RefreshGeTuiAccessTokenHandler { List accountList = channelAccountDao.findAllByIsDeletedEqualsAndSendChannelEquals(CommonConstant.FALSE, ChannelType.PUSH.getCode()); for (ChannelAccount channelAccount : accountList) { GeTuiAccount account = JSON.parseObject(channelAccount.getAccountConfig(), GeTuiAccount.class); - String accessToken = getAccessToken(account); + String accessToken = AccessTokenUtils.getGeTuiAccessToken(account); if (StrUtil.isNotBlank(accessToken)) { redisTemplate.opsForValue().set(SendAccountConstant.GE_TUI_ACCESS_TOKEN_PREFIX + channelAccount.getId(), accessToken); } @@ -61,35 +55,6 @@ public class RefreshGeTuiAccessTokenHandler { }); } - /** - * 获取 access_token - * - * @param account - * @return - */ - private String getAccessToken(GeTuiAccount account) { - String accessToken = ""; - try { - String url = "https://restapi.getui.com/v2/" + account.getAppId() + "/auth"; - String time = String.valueOf(System.currentTimeMillis()); - String digest = SecureUtil.sha256().digestHex(account.getAppKey() + time + account.getMasterSecret()); - QueryTokenParamDTO param = QueryTokenParamDTO.builder() - .timestamp(time) - .appKey(account.getAppKey()) - .sign(digest).build(); - String body = HttpRequest.post(url).header(Header.CONTENT_TYPE.getValue(), ContentType.JSON.getValue()) - .body(JSON.toJSONString(param)) - .timeout(20000) - .execute().body(); - GeTuiTokenResultDTO geTuiTokenResultDTO = JSON.parseObject(body, GeTuiTokenResultDTO.class); - if (geTuiTokenResultDTO.getCode().equals(0)) { - accessToken = geTuiTokenResultDTO.getData().getToken(); - } - } catch (Exception e) { - log.error("RefreshGeTuiAccessTokenHandler#getAccessToken fail:{}", Throwables.getStackTraceAsString(e)); - } - return accessToken; - } } diff --git a/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/DingDingWorkNoticeHandler.java b/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/DingDingWorkNoticeHandler.java index a2d3bef..fdc9ada 100644 --- a/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/DingDingWorkNoticeHandler.java +++ b/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/DingDingWorkNoticeHandler.java @@ -25,6 +25,7 @@ import com.java3y.austin.handler.handler.BaseHandler; import com.java3y.austin.handler.handler.Handler; import com.java3y.austin.support.config.SupportThreadPoolConfig; import com.java3y.austin.support.domain.MessageTemplate; +import com.java3y.austin.support.utils.AccessTokenUtils; import com.java3y.austin.support.utils.AccountUtils; import com.java3y.austin.support.utils.LogUtils; import lombok.extern.slf4j.Slf4j; @@ -70,7 +71,7 @@ public class DingDingWorkNoticeHandler extends BaseHandler implements Handler { try { DingDingWorkNoticeAccount account = accountUtils.getAccountById(taskInfo.getSendAccount(), DingDingWorkNoticeAccount.class); OapiMessageCorpconversationAsyncsendV2Request request = assembleParam(account, taskInfo); - String accessToken = redisTemplate.opsForValue().get(SendAccountConstant.DING_DING_ACCESS_TOKEN_PREFIX + taskInfo.getSendAccount()); + String accessToken = getAccessToken(account, Long.valueOf(taskInfo.getSendAccount())); OapiMessageCorpconversationAsyncsendV2Response response = new DefaultDingTalkClient(SEND_URL).execute(request, accessToken); // 发送成功后记录TaskId,用于消息撤回(支持当天的) @@ -183,7 +184,7 @@ public class DingDingWorkNoticeHandler extends BaseHandler implements Handler { SupportThreadPoolConfig.getPendingSingleThreadPool().execute(() -> { try { DingDingWorkNoticeAccount account = accountUtils.getAccountById(messageTemplate.getSendAccount(), DingDingWorkNoticeAccount.class); - String accessToken = redisTemplate.opsForValue().get(SendAccountConstant.DING_DING_ACCESS_TOKEN_PREFIX + messageTemplate.getSendAccount()); + String accessToken = getAccessToken(account, Long.valueOf(messageTemplate.getSendAccount())); while (redisTemplate.opsForList().size(DING_DING_RECALL_KEY_PREFIX + messageTemplate.getId()) > 0) { String taskId = redisTemplate.opsForList().leftPop(DING_DING_RECALL_KEY_PREFIX + messageTemplate.getId()); DingTalkClient client = new DefaultDingTalkClient(RECALL_URL); @@ -205,7 +206,7 @@ public class DingDingWorkNoticeHandler extends BaseHandler implements Handler { public void pull(Long accountId) { try { DingDingWorkNoticeAccount account = accountUtils.getAccountById(accountId.intValue(), DingDingWorkNoticeAccount.class); - String accessToken = redisTemplate.opsForValue().get(SendAccountConstant.DING_DING_ACCESS_TOKEN_PREFIX + accountId); + String accessToken = getAccessToken(account, accountId); DingTalkClient client = new DefaultDingTalkClient(PULL_URL); OapiMessageCorpconversationGetsendresultRequest req = new OapiMessageCorpconversationGetsendresultRequest(); req.setAgentId(Long.valueOf(account.getAgentId())); @@ -215,5 +216,26 @@ public class DingDingWorkNoticeHandler extends BaseHandler implements Handler { log.error("DingDingWorkNoticeHandler#pull fail:{}", Throwables.getStackTraceAsString(e)); } } + + /** + * 获取第三方token + * + * @param account 钉钉工作消息 账号信息 + * @param accountId 账号ID + * @return token + */ + private String getAccessToken(DingDingWorkNoticeAccount account, Long accountId) { + String accessToken = redisTemplate.opsForValue().get(SendAccountConstant.DING_DING_ACCESS_TOKEN_PREFIX + accountId); + if (StrUtil.isNotBlank(accessToken)) { + return accessToken; + } + accessToken = AccessTokenUtils.getDingDingAccessToken(account); + if (StrUtil.isNotBlank(accessToken)) { + redisTemplate.opsForValue().set(SendAccountConstant.DING_DING_ACCESS_TOKEN_PREFIX + accountId, accessToken); + } else { + log.error("DingDingWorkNoticeHandler#getAccessToken fail accessToken{} accountId{} ", accessToken, accountId); + } + return accessToken; + } } 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 dfefcb0..9d528f4 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 @@ -2,6 +2,7 @@ package com.java3y.austin.handler.handler.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; import cn.hutool.http.ContentType; import cn.hutool.http.Header; import cn.hutool.http.HttpRequest; @@ -19,6 +20,7 @@ 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.domain.MessageTemplate; +import com.java3y.austin.support.utils.AccessTokenUtils; import com.java3y.austin.support.utils.AccountUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -58,7 +60,7 @@ public class PushHandler extends BaseHandler implements Handler { try { GeTuiAccount account = accountUtils.getAccountById(taskInfo.getSendAccount(), GeTuiAccount.class); - String token = redisTemplate.opsForValue().get(SendAccountConstant.GE_TUI_ACCESS_TOKEN_PREFIX + taskInfo.getSendAccount()); + String token = getAccessToken(taskInfo, account); PushParam pushParam = PushParam.builder().token(token).appId(account.getAppId()).taskInfo(taskInfo).build(); String result; @@ -145,6 +147,26 @@ public class PushHandler extends BaseHandler implements Handler { return taskId; } + /** + * 获取第三方token + * + * @param taskInfo 发送任务信息 + * @param account 个推账号时的元信息 + * @return token + */ + private String getAccessToken(TaskInfo taskInfo, GeTuiAccount account) { + String token = redisTemplate.opsForValue().get(SendAccountConstant.GE_TUI_ACCESS_TOKEN_PREFIX + taskInfo.getSendAccount()); + if (StrUtil.isNotBlank(token)) { + return token; + } + token = AccessTokenUtils.getGeTuiAccessToken(account); + if (StrUtil.isNotBlank(token)) { + redisTemplate.opsForValue().set(SendAccountConstant.GE_TUI_ACCESS_TOKEN_PREFIX + taskInfo.getSendAccount(), token); + } else { + log.error("PushHandler#getAccessToken fail taskInfo:{} account:{}", taskInfo, account); + } + return token; + } private SendPushParam assembleParam(PushContentModel pushContentModel) { return assembleParam(pushContentModel, null); diff --git a/austin-support/src/main/java/com/java3y/austin/support/dto/GeTuiTokenResultDTO.java b/austin-support/src/main/java/com/java3y/austin/support/dto/GeTuiTokenResultDTO.java new file mode 100644 index 0000000..48cae9f --- /dev/null +++ b/austin-support/src/main/java/com/java3y/austin/support/dto/GeTuiTokenResultDTO.java @@ -0,0 +1,37 @@ +package com.java3y.austin.support.dto; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author 3y + * @date 2022/5/8 + *

+ * https://docs.getui.com/getui/server/rest_v2/token/ + */ +@NoArgsConstructor +@Data +@AllArgsConstructor +@Builder +public class GeTuiTokenResultDTO { + + + @JSONField(name = "msg") + private String msg; + @JSONField(name = "code") + private Integer code; + @JSONField(name = "data") + private DataDTO data; + + @NoArgsConstructor + @Data + public static class DataDTO { + @JSONField(name = "expire_time") + private String expireTime; + @JSONField(name = "token") + private String token; + } +} diff --git a/austin-support/src/main/java/com/java3y/austin/support/dto/QueryTokenParamDTO.java b/austin-support/src/main/java/com/java3y/austin/support/dto/QueryTokenParamDTO.java new file mode 100644 index 0000000..dd44cc2 --- /dev/null +++ b/austin-support/src/main/java/com/java3y/austin/support/dto/QueryTokenParamDTO.java @@ -0,0 +1,36 @@ +package com.java3y.austin.support.dto; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + + +/** + * 请求token时的参数 + * + * @author 3y + * https://docs.getui.com/getui/server/rest_v2/token/ + */ +@NoArgsConstructor +@Data +@Builder +@AllArgsConstructor +public class QueryTokenParamDTO { + /** + * sign + */ + @JSONField(name = "sign") + private String sign; + /** + * timestamp + */ + @JSONField(name = "timestamp") + private String timestamp; + /** + * appkey + */ + @JSONField(name = "appkey") + private String appKey; +} diff --git a/austin-support/src/main/java/com/java3y/austin/support/utils/AccessTokenUtils.java b/austin-support/src/main/java/com/java3y/austin/support/utils/AccessTokenUtils.java new file mode 100644 index 0000000..de08eb3 --- /dev/null +++ b/austin-support/src/main/java/com/java3y/austin/support/utils/AccessTokenUtils.java @@ -0,0 +1,83 @@ +package com.java3y.austin.support.utils; + +import cn.hutool.crypto.SecureUtil; +import cn.hutool.http.ContentType; +import cn.hutool.http.Header; +import cn.hutool.http.HttpRequest; +import com.alibaba.fastjson.JSON; +import com.dingtalk.api.DefaultDingTalkClient; +import com.dingtalk.api.DingTalkClient; +import com.dingtalk.api.request.OapiGettokenRequest; +import com.dingtalk.api.response.OapiGettokenResponse; +import com.google.common.base.Throwables; +import com.java3y.austin.common.constant.CommonConstant; +import com.java3y.austin.common.dto.account.DingDingWorkNoticeAccount; +import com.java3y.austin.common.dto.account.GeTuiAccount; +import com.java3y.austin.support.dto.GeTuiTokenResultDTO; +import com.java3y.austin.support.dto.QueryTokenParamDTO; +import lombok.extern.slf4j.Slf4j; + +/** + * 获取第三发token工具类 + */ +@Slf4j +public class AccessTokenUtils { + + /** + * 钉钉获取token地址 + */ + private static final String DING_DING_TOKEN_URL = "https://oapi.dingtalk.com/gettoken"; + + /** + * 获取钉钉 access_token + * + * @param account 钉钉工作消息 账号信息 + * @return 钉钉 access_token + */ + public static String getDingDingAccessToken(DingDingWorkNoticeAccount account) { + String accessToken = ""; + try { + DingTalkClient client = new DefaultDingTalkClient(DING_DING_TOKEN_URL); + OapiGettokenRequest req = new OapiGettokenRequest(); + req.setAppkey(account.getAppKey()); + req.setAppsecret(account.getAppSecret()); + req.setHttpMethod(CommonConstant.REQUEST_METHOD_GET); + OapiGettokenResponse rsp = client.execute(req); + accessToken = rsp.getAccessToken(); + } catch (Exception e) { + log.error("AccessTokenUtils#getDingDingAccessToken fail:{}", Throwables.getStackTraceAsString(e)); + } + return accessToken; + } + + /** + * 获取个推的 access_token + * + * @param account 创建个推账号时的元信息 + * @return 个推的 access_token + */ + public static String getGeTuiAccessToken(GeTuiAccount account) { + String accessToken = ""; + try { + String url = "https://restapi.getui.com/v2/" + account.getAppId() + "/auth"; + String time = String.valueOf(System.currentTimeMillis()); + String digest = SecureUtil.sha256().digestHex(account.getAppKey() + time + account.getMasterSecret()); + QueryTokenParamDTO param = QueryTokenParamDTO.builder() + .timestamp(time) + .appKey(account.getAppKey()) + .sign(digest).build(); + + String body = HttpRequest.post(url).header(Header.CONTENT_TYPE.getValue(), ContentType.JSON.getValue()) + .body(JSON.toJSONString(param)) + .timeout(20000) + .execute().body(); + GeTuiTokenResultDTO geTuiTokenResultDTO = JSON.parseObject(body, GeTuiTokenResultDTO.class); + if (geTuiTokenResultDTO.getCode().equals(0)) { + accessToken = geTuiTokenResultDTO.getData().getToken(); + } + } catch (Exception e) { + log.error("AccessTokenUtils#getGeTuiAccessToken fail:{}", Throwables.getStackTraceAsString(e)); + } + return accessToken; + } +} From 4b59cf2e3eabbba68b7f4e0fa6fe86ee2489b702 Mon Sep 17 00:00:00 2001 From: wuhui Date: Fri, 11 Aug 2023 10:50:10 +0800 Subject: [PATCH 3/3] =?UTF-8?q?fix:=E5=88=A0=E9=99=A4austin-handler?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E4=BE=9D=E8=B5=96austin-cron=E6=A8=A1?= =?UTF-8?q?=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- austin-handler/pom.xml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/austin-handler/pom.xml b/austin-handler/pom.xml index 70099ff..94ca8bb 100644 --- a/austin-handler/pom.xml +++ b/austin-handler/pom.xml @@ -53,10 +53,6 @@ com.alipay.sdk alipay-sdk-java - - com.java3y.austin - austin-cron -