|
@@ -63,11 +63,6 @@ public class KakaoMsgHandler {
|
|
@Resource(name="wallpadMsgSender")
|
|
@Resource(name="wallpadMsgSender")
|
|
WallpadMsgSender wallpadMsgSender;
|
|
WallpadMsgSender wallpadMsgSender;
|
|
|
|
|
|
- @Autowired
|
|
|
|
- DonghoInfoRepository donghoRepo;
|
|
|
|
-
|
|
|
|
- private static final int REPORTSTATE_REQUEST_FIRST = 0;
|
|
|
|
- private static final int REPORTSTATE_REQUEST_RETRY = 1;
|
|
|
|
/**
|
|
/**
|
|
* 카카오 전용 인증 프로세스
|
|
* 카카오 전용 인증 프로세스
|
|
* 월패드에 인증번호를 노출시키는 메시지를 전송한다.
|
|
* 월패드에 인증번호를 노출시키는 메시지를 전송한다.
|
|
@@ -258,7 +253,13 @@ public class KakaoMsgHandler {
|
|
|
|
|
|
String[] tmpSplit = endpointId.split("_");
|
|
String[] tmpSplit = endpointId.split("_");
|
|
String modelId = tmpSplit[0];
|
|
String modelId = tmpSplit[0];
|
|
- int devNum = tmpSplit.length == 1?1:Integer.parseInt(tmpSplit[1]);
|
|
|
|
|
|
+
|
|
|
|
+ if(tmpSplit.length == 1 && !modelId.equals(THINGS_INFO.THINGS.ELEVATOR.getKakaoDisplayName())) {
|
|
|
|
+ retMap.put(KEY_INFO.HTTP_KEY_ERROR, KAKAO_RESULT.getErrorInfo(KAKAO_RESULT.FAIL_NONEXIST));
|
|
|
|
+ return retMap;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ int devNum = modelId.equals(THINGS_INFO.THINGS.ELEVATOR.getKakaoDisplayName())?1:Integer.parseInt(tmpSplit[1]);
|
|
|
|
|
|
THINGS_INFO.THINGS things = THINGS_INFO.getThingsType(endpointId);
|
|
THINGS_INFO.THINGS things = THINGS_INFO.getThingsType(endpointId);
|
|
|
|
|
|
@@ -320,168 +321,6 @@ public class KakaoMsgHandler {
|
|
return retMap;
|
|
return retMap;
|
|
}
|
|
}
|
|
|
|
|
|
- /**
|
|
|
|
- * 상태 변경 이벤트 발생시 이벤트 결과를 카카오 이벤트 서버에 전송한다.
|
|
|
|
- * 전송시 토큰이 만료 되면 [sendKakaoTokenRefresh] method를 호출하여 토큰을 갱신한뒤 다시 재시도 한다.
|
|
|
|
- * @param dong
|
|
|
|
- * @param ho
|
|
|
|
- * @param params
|
|
|
|
- * @param reqType
|
|
|
|
- */
|
|
|
|
- public void SendStatusResult(int dong, int ho, Map<String, Object> params, int reqType) {
|
|
|
|
- try {
|
|
|
|
-
|
|
|
|
- if(params == null) return;
|
|
|
|
-
|
|
|
|
- // 먼저 이벤트 전송전 인증 토큰이 만료 됐는지 확인한다.
|
|
|
|
- // 인증 토큰이 만료 됐으면 인증토큰을 재생성 한뒤 이벤트를 전송한다.
|
|
|
|
- // reqType이 REPORTSTATE_REQUEST_FIRST 이면 이벤트 전송을 한번도 하지 않은 경우
|
|
|
|
- // reqType이 REPORTSTATE_REQUEST_RETRY 이면 이벤트 전송 후 인증토큰 만료 에러 때문에 인증토큰 갱신하고 재전송하는 경우
|
|
|
|
- DonghoInfoRepository repo = (DonghoInfoRepository)BeanUtils.getBean("donghoInfoRepository");
|
|
|
|
- List<DonghoInfo> dList = repo.findByDongAndHo(Integer.toString(dong), Integer.toString(ho));
|
|
|
|
-
|
|
|
|
- if(dList.size() != 1) {
|
|
|
|
- logger.error("[" + dong + "/"+ ho +"]-유저정보 없음- 이벤트 전송 불가.");
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- String tokenStartTime = dList.get(0).getKakaoTokenCreateTime();
|
|
|
|
- String tokenExpiresTime = dList.get(0).getKakaoTokenExpireTime();
|
|
|
|
- String currentTime = CommonUtil.getStrTypeCurTime();
|
|
|
|
-
|
|
|
|
- int result = CommonUtil.compareStringTypeTime(currentTime, tokenExpiresTime);
|
|
|
|
-
|
|
|
|
- // 현재 시간이 토큰 만료시간보다 크다면 토큰이 만료 됐다는 뜻.
|
|
|
|
- // 카카오 이벤트 서버에서 토큰을 갱신 받은 뒤 이벤트를 전송해야 한다.
|
|
|
|
- if(result < 1) {
|
|
|
|
- sendKakaoTokenRefresh(dong, ho, params);
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- String authorization = SERVERINFO.KAKAO_EVENT_CLIENT_ID+":"+SERVERINFO.KAKAO_EVENT_CLIENT_SECRET;
|
|
|
|
- String encoding = Base64.getEncoder().encodeToString(authorization.getBytes());
|
|
|
|
-
|
|
|
|
- CloseableHttpClient httpClient = HttpClients.custom().setSSLHostnameVerifier(new NoopHostnameVerifier()).build();
|
|
|
|
- HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
|
|
|
|
-
|
|
|
|
- requestFactory.setHttpClient(httpClient);
|
|
|
|
- requestFactory.setConnectTimeout(3000);
|
|
|
|
-
|
|
|
|
- RestTemplate restTemplate = new RestTemplate(requestFactory);
|
|
|
|
-
|
|
|
|
- HttpHeaders headers = new HttpHeaders();
|
|
|
|
-
|
|
|
|
- headers.setContentType(MediaType.APPLICATION_JSON);
|
|
|
|
- headers.set("Authorization", "Basic " + encoding);
|
|
|
|
- // 제어기기 별로 상태 이벤트 구분하여 처리하도록 해야 한다
|
|
|
|
- HttpEntity<Object> entity = new HttpEntity<Object>(params, headers);
|
|
|
|
-
|
|
|
|
- String url = SERVERINFO.SendDevEventURL + ":" + SERVERINFO.SendDevEventPort + "/events";
|
|
|
|
-
|
|
|
|
- logger.info("SendStatusResult URL : " + url);
|
|
|
|
- logger.info("SendStatusResult header : " + headers.toString());
|
|
|
|
- logger.info("SendStatusResult return value : " + params.toString());
|
|
|
|
-
|
|
|
|
- String answer = restTemplate.postForObject(url, entity, String.class);
|
|
|
|
-
|
|
|
|
- logger.info("SendStatusResult answer :" + answer);
|
|
|
|
-
|
|
|
|
- // 결과에 error가 있으면 error에 맞게 대응해줘야 한다.
|
|
|
|
- Map<String, Object> retMap = CommonUtil.jsonToMap(answer);
|
|
|
|
-
|
|
|
|
- if(retMap.containsKey(KEY_INFO.HTTP_KEY_ERROR)) {
|
|
|
|
- //error 결과가 -201 이면 인증토큰이 만료 됐다는 뜻
|
|
|
|
- Map<String, Object> errMap = (Map<String, Object>)retMap.get(KEY_INFO.HTTP_KEY_ERROR);
|
|
|
|
- int errorCode = Integer.parseInt((String)errMap.get(KEY_INFO.ERROR_KEY_CODE));
|
|
|
|
- String message = (String)errMap.get(KEY_INFO.ERROR_KEY_MESSAGE);
|
|
|
|
-
|
|
|
|
- logger.info("[KAKAO - ERROR] - [ CODE ] - " + errorCode + " || [message] - " + message );
|
|
|
|
-
|
|
|
|
- // 인증토큰 만료 에러
|
|
|
|
- if(reqType == REPORTSTATE_REQUEST_FIRST && errorCode == KAKAO_RESULT.CODE.FAIL_EXPIREDTOKEN.getResultCode()) {
|
|
|
|
- // 인증토큰 갱신 요청 보내기
|
|
|
|
- sendKakaoTokenRefresh(dong, ho, params);
|
|
|
|
- }
|
|
|
|
- }else {
|
|
|
|
- logger.info("EVENT SEND SUCCESS -- " + params.toString());
|
|
|
|
- }
|
|
|
|
- } catch (Exception e) {
|
|
|
|
- logger.info("SendStatusResult Exception e :" + e.toString());
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * 이벤트 전송시 토큰이 만료되면 해당 메서드가 호출된다.
|
|
|
|
- * 이벤트 토큰 만료시 카카오 이벤트 토큰 서버에 토큰 갱신 요청을 보낸다.
|
|
|
|
- * 토큰이 갱신 되면 이벤트 전송을 시도한다.
|
|
|
|
- * @param dong
|
|
|
|
- * @param ho
|
|
|
|
- * @param params
|
|
|
|
- */
|
|
|
|
- public boolean sendKakaoTokenRefresh(int dong, int ho, Map<String, Object> params){
|
|
|
|
- DonghoInfoRepository repo = (DonghoInfoRepository)BeanUtils.getBean("donghoInfoRepository");
|
|
|
|
- List<DonghoInfo> dList = repo.findByDongAndHo(Integer.toString(dong), Integer.toString(ho));
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- if(dList.size() != 1) return false;
|
|
|
|
- DonghoInfo donghoInfo = dList.get(0);
|
|
|
|
-
|
|
|
|
- String refreshToken = donghoInfo.getKakaoRefreshToken();
|
|
|
|
-
|
|
|
|
- String authorization = SERVERINFO.KAKAO_EVENT_CLIENT_ID+":"+SERVERINFO.KAKAO_EVENT_CLIENT_SECRET;
|
|
|
|
- String encoding = Base64.getEncoder().encodeToString(authorization.getBytes());
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- HttpHeaders headers = new HttpHeaders();
|
|
|
|
- headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
|
|
|
|
- headers.add("Authorization", "Basic " + encoding);
|
|
|
|
-
|
|
|
|
- MultiValueMap<String, String> parameters = new LinkedMultiValueMap<>();
|
|
|
|
- parameters.add("grant_type", "refresh_token");
|
|
|
|
- parameters.add("refresh_token", refreshToken);
|
|
|
|
-
|
|
|
|
- HttpEntity<MultiValueMap<String, String>> entity = new HttpEntity<>(parameters, headers);
|
|
|
|
-
|
|
|
|
- String url = SERVERINFO.SendDevEventURL + ":" + SERVERINFO.SendDevEventPort + "/events/token";
|
|
|
|
-
|
|
|
|
- logger.info("[TOKEN REFRESH REQUEST] URL : " + url);
|
|
|
|
- logger.info("[TOKEN REFRESH REQUEST] header : " + headers.toString());
|
|
|
|
- logger.info("[TOKEN REFRESH REQUEST] return value : " + entity.toString());
|
|
|
|
- URI uri = URI.create(url);
|
|
|
|
-
|
|
|
|
- CloseableHttpClient httpClient = HttpClients.custom().setSSLHostnameVerifier(new NoopHostnameVerifier()).build();
|
|
|
|
- HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
|
|
|
|
-
|
|
|
|
- requestFactory.setHttpClient(httpClient);
|
|
|
|
- requestFactory.setConnectTimeout(3000);
|
|
|
|
-
|
|
|
|
- RestTemplate restTemplate = new RestTemplate(requestFactory);
|
|
|
|
-
|
|
|
|
- String answer = restTemplate.postForObject(url, entity, String.class);
|
|
|
|
- logger.debug("[TOKEN REFRESH REQUEST] = " + answer);
|
|
|
|
-
|
|
|
|
- Map<String, Object> retMap = CommonUtil.jsonToMap(answer);
|
|
|
|
-
|
|
|
|
- if(retMap.containsKey(KEY_INFO.HTTP_KEY_ACCESS_TOKEN) && retMap.containsKey(KEY_INFO.HTTP_KEY_REFRESH_TOKEN) && retMap.containsKey(KEY_INFO.HTTP_KEY_EXPIRES_IN)) {
|
|
|
|
- donghoInfo.setKakaoAccessToken((String)retMap.get(KEY_INFO.HTTP_KEY_ACCESS_TOKEN));
|
|
|
|
- donghoInfo.setKakaoRefreshToken((String)retMap.get(KEY_INFO.HTTP_KEY_REFRESH_TOKEN));
|
|
|
|
- donghoInfo.setKakaoExpiresTime(Integer.toString((int)retMap.get(KEY_INFO.HTTP_KEY_EXPIRES_IN)));
|
|
|
|
-
|
|
|
|
- donghoInfo.setKakaoTokenCreateTime(CommonUtil.getStrTypeCurTime());
|
|
|
|
- donghoInfo.setKakaoTokenExpireTime(CommonUtil.getStrTypeCurTimeAfterSec(Integer.parseInt(donghoInfo.getKakaoExpiresTime())));
|
|
|
|
-
|
|
|
|
- repo.save(donghoInfo);
|
|
|
|
-
|
|
|
|
- SendStatusResult(dong, ho, params, REPORTSTATE_REQUEST_FIRST);
|
|
|
|
- return true;
|
|
|
|
- }else {
|
|
|
|
- logger.error("****************************************************");
|
|
|
|
- logger.error("토클 리프레시 실패");
|
|
|
|
- logger.error("****************************************************");
|
|
|
|
-
|
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
* 이벤트 발생시 카카오에 전송하는 Body를 반환한다.
|
|
* 이벤트 발생시 카카오에 전송하는 Body를 반환한다.
|
|
@@ -491,17 +330,13 @@ public class KakaoMsgHandler {
|
|
* @return
|
|
* @return
|
|
* @throws Exception
|
|
* @throws Exception
|
|
*/
|
|
*/
|
|
- public Map<String, Object> setKakaoEventMsg(int dong, int ho, Map<String, Object> body) throws Exception{
|
|
|
|
|
|
+ public Map<String, Object> setKakaoEventMsg(DonghoInfo donghoInfo, Map<String, Object> body) throws Exception{
|
|
Map<String, Object> retMap = new HashMap<String, Object>();
|
|
Map<String, Object> retMap = new HashMap<String, Object>();
|
|
List<String> unreachableIds = new ArrayList<>();
|
|
List<String> unreachableIds = new ArrayList<>();
|
|
- DonghoInfoRepository repo = (DonghoInfoRepository)BeanUtils.getBean("donghoInfoRepository");
|
|
|
|
- List<DonghoInfo> dList = repo.findByDongAndHo(Integer.toString(dong), Integer.toString(ho));
|
|
|
|
-
|
|
|
|
- if(dList.size() != 1) return null;
|
|
|
|
|
|
|
|
retMap.put(KEY_INFO.HTTP_KEY_ID, UUID.randomUUID().toString());
|
|
retMap.put(KEY_INFO.HTTP_KEY_ID, UUID.randomUUID().toString());
|
|
retMap.put(KEY_INFO.HTTP_KEY_TYPE, TYPE.REQ_TYPE.REPORTSTATE.getTypeName());
|
|
retMap.put(KEY_INFO.HTTP_KEY_TYPE, TYPE.REQ_TYPE.REPORTSTATE.getTypeName());
|
|
- retMap.put(KEY_INFO.HTTP_KEY_AUTHORIZATION, dList.get(0).getKakaoAccessToken());
|
|
|
|
|
|
+ retMap.put(KEY_INFO.HTTP_KEY_AUTHORIZATION, donghoInfo.getKakaoAccessToken());
|
|
retMap.put(KEY_INFO.HTTP_KEY_VERSION, "1");
|
|
retMap.put(KEY_INFO.HTTP_KEY_VERSION, "1");
|
|
retMap.put(KEY_INFO.HTTP_KEY_UNREACHABLEIDS, unreachableIds);
|
|
retMap.put(KEY_INFO.HTTP_KEY_UNREACHABLEIDS, unreachableIds);
|
|
retMap.put(KEY_INFO.HTTP_KEY_BODY, body);
|
|
retMap.put(KEY_INFO.HTTP_KEY_BODY, body);
|