카카오 푸시 알람{"msg":"InternalErrorException","code":-1}이 뜹니다

ID 788442 입니다.
2022-09-20 22:22:31.896 ERROR 109733 --- [nio-8080-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.web.client.HttpClientErrorException$BadRequest: 400 Bad Request: "{"msg":"InternalErrorException","code":-1}"] with root cause

FCM에서 토큰 발급 후 토큰 등록 api를 보내는데 자꾸 위의 오류가 뜨네요. 어디서 잘못된 걸까요?


    public void requestPushToken(Member member) throws IOException {
        HttpHeaders headers = new HttpHeaders();
        headers.add("Authorization","KakaoAK "+ adminKey);
        headers.add("Content-type", "application/x-www-form-urlencoded");
        log.info("달리다");
        String pushToken = FcmService.getAccessToken();
        log.info(pushToken);
        String deviceId = UUID.randomUUID().toString();
        MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
        body.add("uuid", member.getKakaoId().toString());
        body.add("device_id", deviceId);
        body.add("push_type", "fcm");
        body.add("push_token", pushToken);
        log.info("통과");
        // HTTP 요청 보내기
        HttpEntity<MultiValueMap<String, Object>> kakaoPushTokenRequest =
                new HttpEntity<>(body, headers);
        RestTemplate rt = new RestTemplate();
        ResponseEntity<String> response = rt.exchange(
                "https://kapi.kakao.com/v2/push/register",
                HttpMethod.POST,
                kakaoPushTokenRequest,
                String.class
        );
        String responseBody = response.getBody();
        log.info(responseBody);
        log.info("푸시토큰 발급 완료");
    }

통과 까지 무사히 뜬 후에 에러가 납니다. 도와주세요!

안녕하세요.

확인을 위해 앱 ID 부탁드립니다.


앱ID
https://developers.kakao.com/ 의 내 애플리케이션>앱 설정>요약 정보 : 기본정보에 있는 앱 ID
숫자로된 ID 입니다
ex) 123456

788442 입니다.

관련 부서에 문의 후, 피드백 드리도록 하겠습니다.

1개의 좋아요
ya29.c.b0AUFJQsGRruzbm8kPhrrVBAuiH5G5iXhRXyi92VR7QkoT8xa25Wqe3onandWVixwKpG7R2mNCL00RinFpfOthNXNvvx6N6IswSh4rIGHQqEI-gPXuzNvEFpasPx8PSYevrAwHUvj5iDT-UBe4eMfPbxMPcE4qK-Bi0vR0_K2RYt7JaxSNQJm3mYQi2Y8upuLqTHfoHdUMHLBr4QirZjZzLRQ5GIN70-Q00g......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................

@hajh5447 push_token 뒤에 위와 같이 잘못된 값이 붙어서 들어오고 있습니다. 확인 부탁드려요.

1개의 좋아요

토큰은 해결되었습니다. 이번에는 토큰 값 가져오기에서 문제가 생겼는데요

public PushTokenDto getPushToken(Member member) throws JsonProcessingException {
        log.info("푸시토큰 가져오기");

        HttpHeaders headers = new HttpHeaders();
        headers.add("Authorization","KakaoAK "+ adminKey);
        log.info("1");
        MultiValueMap<String, Object> tokenCheckBody = new LinkedMultiValueMap<>();
        tokenCheckBody.add("uuid", member.getKakaoId().toString());
        log.info("2");
        // HTTP 요청 보내기
        HttpEntity<MultiValueMap<String, Object>> kakaoPushTokenRequest =
                new HttpEntity<>(tokenCheckBody, headers);
        log.info("3");
        RestTemplate rt = new RestTemplate();
        ResponseEntity<String> response = rt.exchange(
                "https://kapi.kakao.com/v2/push/tokens",
                HttpMethod.GET,
                kakaoPushTokenRequest,
                String.class
        );
        log.info("푸시토큰 가져오기 완료");
        String responseBody = response.getBody();
        ObjectMapper objectMapper = new ObjectMapper();
        JsonNode jsonNode = objectMapper.readTree(responseBody);
        String uuid = jsonNode.get("uuid").asText();
        String deviceId = jsonNode.get("device_id").asText();
        String pushToken = jsonNode.get("push_token").asText();
        String pushType = jsonNode.get("push_type").asText();
        Long createdAt = jsonNode.get("created_at").asLong();
        Long updatedAt = jsonNode.get("updated_at").asLong();
        return PushTokenDto.builder()
                .uuid(uuid)
                .deviceId(deviceId)
                .pushToken(pushToken)
                .pushType(pushType)
                .createdAt(createdAt)
                .updatedAt(updatedAt)
                .build();
    }

위와 같이 토큰값을 불러오려고 하니 아래와 같은 오류가 납니다.

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.web.client.HttpClientErrorException$BadRequest: 400 Bad Request: "{"msg":"either uuid or uuids parameter is required.","code":-2}"] with root cause

org.springframework.web.client.HttpClientErrorException$BadRequest: 400 Bad Request: "{"msg":"either uuid or uuids parameter is required.","code":-2}"

body에 uuid를 넣었는데 왜 에러가 나는 걸까요?

@hajh5447
로그를 보니 파라메터가 넘어오지 않았습니다. 개발하신 로직 확인 부탁드려요.

1개의 좋아요

앞서 알려주신 로그 덕분에 GET에서 POST로 변환하니 uuid 값을 정상적으로 받는 것으로 보였습니다.

 @Transactional
    public void sendPushAlert(Member member, PushContentDto pushContentDto) throws JsonProcessingException {

        HttpHeaders headers = new HttpHeaders();
        headers.add("Authorization","KakaoAK "+ adminKey);
        headers.add("Content-type", "application/x-www-form-urlencoded");

        log.info("알러트 생성");
        List<String> uuids = new ArrayList<>();
        uuids.add(member.getKakaoId().toString());

        JSONObject pushMsgDto = makeJson(pushContentDto);

        MultiValueMap<String, Object> pushContentBody = new LinkedMultiValueMap<>();
        pushContentBody.add("uuids", uuids);
        pushContentBody.add("push_message", pushMsgDto);
        log.info(pushContentBody.toString());
        // HTTP 요청 보내기
        HttpEntity<MultiValueMap<String, Object>> kakaoPushTokenRequest =
                new HttpEntity<>(pushContentBody, headers);
        RestTemplate rt = new RestTemplate();
        ResponseEntity<String> response = rt.exchange(
                "https://kapi.kakao.com/v2/push/send",
                HttpMethod.POST,
                kakaoPushTokenRequest,
                String.class
        );
        log.info("통과");
        log.info("response: " + response);
    }

본 값으로 200으로 성공했는데요

여기에 코드를 입력하거나 붙여 넣습니다.

푸시알람 문서를 보면서 따라온터라 이후 어떤 과정을 거쳐야 실제로 PWA 앱에서 알람이 울리는지 설명이 없어 다시 문의 드립니다

아래 내용 참고 해보시면 좋을 것 같습니다.

android(kotlin) + fcm + Postman 예제 - 푸시 알림

1개의 좋아요