diff --git a/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/task/SdtAccessTokenRefreshTask.java b/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/task/SdtAccessTokenRefreshTask.java new file mode 100644 index 0000000000..84159d1c4d --- /dev/null +++ b/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/task/SdtAccessTokenRefreshTask.java @@ -0,0 +1,41 @@ +/** + * Copyright (c) 2018 人人开源 All rights reserved. + * + * https://www.renren.io + * + * 版权所有,侵权必究! + */ + +package com.epmet.task; + +import com.epmet.commons.tools.utils.Result; +import com.epmet.feign.ThirdOpenFeignClient; +import com.epmet.service.TestTaskService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 山东通接口调用凭证定时刷新 + * @author wxz + * @date 2022/11/6 上午12:51 + + */ +@Component("sdtAccessTokenRefreshTask") +public class SdtAccessTokenRefreshTask implements ITask{ + private Logger logger = LoggerFactory.getLogger(getClass()); + + @Autowired + private ThirdOpenFeignClient thirdOpenFeignClient; + @Override + public void run(String params){ + logger.info("sdtAccessTokenRefreshTask定时任务正在执行,参数为:{}", params); + Result result = thirdOpenFeignClient.refreshAccessToken(); + if(result.success()){ + logger.info("sdtAccessTokenRefreshTask定时任务执行成功"); + }else{ + logger.error("sdtAccessTokenRefreshTask定时任务执行失败:"+result.getMsg()); + } + } +} diff --git a/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/feign/ThirdOpenFeignClient.java b/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/feign/ThirdOpenFeignClient.java index c130f8d27d..7ca8237762 100644 --- a/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/feign/ThirdOpenFeignClient.java +++ b/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/feign/ThirdOpenFeignClient.java @@ -118,4 +118,13 @@ public interface ThirdOpenFeignClient { */ @GetMapping("/third/sdt/getUserDetailByUserId") Result getUserDetailByUserId(@RequestParam("userId") String userId, @RequestParam("customerId") String customerId); + + /** + * 刷新山东通token + * @author wxz + * @date 2022/11/2 22:11 + * @return Result + */ + @GetMapping("/third/sdt/refreshAccessToken") + Result refreshAccessToken(); } diff --git a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/entity/SdtAppInfoEntity.java b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/entity/SdtAppInfoEntity.java index a61e2e5e9f..6fff9ef522 100755 --- a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/entity/SdtAppInfoEntity.java +++ b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/entity/SdtAppInfoEntity.java @@ -30,7 +30,10 @@ public class SdtAppInfoEntity extends BaseEpmetEntity { * 组织ID */ private String corpId; - + /** + * 应用id + */ + private String agentId; /** * 秘钥 */ diff --git a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/impl/SdtServiceImpl.java b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/impl/SdtServiceImpl.java index b7de7d7bd5..fce302ac10 100644 --- a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/impl/SdtServiceImpl.java +++ b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/impl/SdtServiceImpl.java @@ -72,7 +72,7 @@ public class SdtServiceImpl implements SdtService { return; } - SdtGetAccessTokenResult sdtResult = JSON.parseObject(stringResult.getMsg(), SdtGetAccessTokenResult.class); + SdtGetAccessTokenResult sdtResult = JSON.parseObject(stringResult.getData(), SdtGetAccessTokenResult.class); if (!sdtResult.success()) { log.error("【山东通】刷新accessToken失败:{}", sdtResult.getErrmsg()); return; @@ -88,7 +88,7 @@ public class SdtServiceImpl implements SdtService { sdtAppInfoDao.updateById(updateEntity); // token刷新了以后,要刷新缓存中的token,这样下次才能获取到最新的token - String key = RedisKeys.getOpenApiAccessTokenKey(customerIdInner); + String key = RedisKeys.getSdtAccessToken(customerIdInner); redisUtils.set(key, access_token, expires_in); }); @@ -129,17 +129,14 @@ public class SdtServiceImpl implements SdtService { */ @Override public String getCachedAccessToken(String customerId) { - String key = RedisKeys.getOpenApiAccessTokenKey(customerId); + String key = RedisKeys.getSdtAccessToken(customerId); String accessToken = redisUtils.getString(key); if (StringUtils.isNotBlank(accessToken)) { return accessToken; } // db中查询 - LambdaQueryWrapper query = new LambdaQueryWrapper<>(); - query.eq(SdtAppInfoEntity::getCustomerId, customerId); - SdtAppInfoEntity sdtAppInfoEntity = sdtAppInfoDao.selectOne(query); - + SdtAppInfoEntity sdtAppInfoEntity = getSdtInfoByCustomerId(customerId); if (sdtAppInfoEntity == null) { log.error("【查询山东通AccessToken】失败,原因:该客户id没有配置山东通相关信息"); return null; @@ -148,22 +145,44 @@ public class SdtServiceImpl implements SdtService { accessToken = sdtAppInfoEntity.getAccessToken(); Date expiresAt = sdtAppInfoEntity.getExpiresAt(); - if (StringUtils.isNotBlank(accessToken)) { - redisUtils.set(key, accessToken, getExpireIn(expiresAt)); + Long expireIn = getExpireIn(expiresAt); + + if (StringUtils.isNotBlank(accessToken) && expireIn > 0) { + // 没过期,可以用 + redisUtils.set(key, accessToken, expireIn); return accessToken; } else { - // 配置了appInfo,但是没有accessToken,刷新token,刷新缓存,然后重新从缓存中取 + // 配置了appInfo,但是没有accessToken或者accessToken已经过期,刷新token,刷新缓存,然后重新从缓存中取 refreshAccessToken(customerId); return redisUtils.getString(key); } } + /** + * 使用客户id查询山东通信息 + * @author wxz + * @date 2022/11/6 上午12:25 + * @param customerId + * @return SdtAppInfoEntity + */ + private SdtAppInfoEntity getSdtInfoByCustomerId(String customerId) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(SdtAppInfoEntity::getCustomerId, customerId); + return sdtAppInfoDao.selectOne(query); + } + @Override public SdtStaffInfoResult getUserInfoByCode(String authCode, String customerId) { + SdtAppInfoEntity sdtAppInfoEntity = getSdtInfoByCustomerId(customerId); + if (sdtAppInfoEntity == null) { + log.error("【查询山东通AccessToken】失败,原因:该客户id没有配置山东通相关信息"); + return null; + } + HashMap params = new HashMap<>(); params.put("access_token", getCachedAccessToken(customerId)); params.put("code", authCode); - Result sdtResult = HttpClientManager.getInstance().sendGet(API_GET_USER_INFO_URL, params); + Result sdtResult = HttpClientManager.getInstance().sendGet(sdtAppInfoEntity.getApiAddress() + API_GET_USER_INFO_URL, params); if (!sdtResult.success()) { // http状态判断 log.error("【山东通登录】查询用户编码-http错误:{}", sdtResult.getMsg()); @@ -182,10 +201,16 @@ public class SdtServiceImpl implements SdtService { @Override public SdtStaffDetailResult getUserDetailByUserId(String userId, String customerId) { + SdtAppInfoEntity sdtAppInfoEntity = getSdtInfoByCustomerId(customerId); + if (sdtAppInfoEntity == null) { + log.error("【查询山东通AccessToken】失败,原因:该客户id没有配置山东通相关信息"); + return null; + } + HashMap userDetailParams = new HashMap<>(); userDetailParams.put("access_token", getCachedAccessToken(customerId)); userDetailParams.put("userid", userId); - Result userDetailResult = HttpClientManager.getInstance().sendGet(API_GET_USER_DETAIL_URL, userDetailParams); + Result userDetailResult = HttpClientManager.getInstance().sendGet(sdtAppInfoEntity.getApiAddress() + API_GET_USER_DETAIL_URL, userDetailParams); if (!userDetailResult.success()) { // http状态判断 log.error("【山东通登录】查询用户详细信息-http错误:{}", userDetailResult.getMsg()); diff --git a/epmet-module/epmet-third/epmet-third-server/src/main/resources/db/migration/V0.0.19__sdt_create_corp_info.sql b/epmet-module/epmet-third/epmet-third-server/src/main/resources/db/migration/V0.0.19__sdt_create_corp_info.sql index a045a4559b..72c52c2906 100644 --- a/epmet-module/epmet-third/epmet-third-server/src/main/resources/db/migration/V0.0.19__sdt_create_corp_info.sql +++ b/epmet-module/epmet-third/epmet-third-server/src/main/resources/db/migration/V0.0.19__sdt_create_corp_info.sql @@ -2,8 +2,9 @@ create table sdt_app_info ( `ID` varchar(64) NOT NULL COMMENT '主键', `CUSTOMER_ID` varchar(64) NOT NULL COMMENT '客户ID', - `CORPID` varchar(32) not null comment '组织ID', - `CORPSECRET` varchar(64) not null comment '秘钥', + `CORP_ID` varchar(32) not null comment '组织ID', + `AGENT_ID` varchar(32) not null comment '应用ID', + `CORP_SECRET` varchar(64) not null comment '秘钥', `ACCESS_TOKEN` varchar(512) null comment '接口调用凭证', `API_ADDRESS` varchar(128) not null comment 'api地址', `EXPIRES_AT` datetime null comment '何时过期',