본문 바로가기
🎯 etc/API

[ Kakao API ] 개인화 메세지 (with. 카카오 모먼트)

by 깸뽀 2023. 10. 21.
728x90
🍃   spring boot-version '2.6.12'
🌎    java-version 11
🐘   gradle
🔐   spring security 포함

 

✍ 

이번에 개인화 메세지를 기능을 추가하기 위해 테스트 해보았다.

화면과 연결해보기 위해서 html,thymeleaf로 간단하게 만들었다.

API를 사용하는게 처음하면 좀 어렵긴 한데.. 재밌는것 같다!!!

 

✔ 개인화 메세지란? 👉 https://kakaobusiness.gitbook.io/main/ad/moment/start/personalizedmessage

✔ 전체코드 보러가기 👉 https://github.com/kimbokyung1220/SendTestPersonalMsg.git

 

GitHub - kimbokyung1220/SendTestPersonalMsg: 카카오API - 개인화 메세지 테스트

카카오API - 개인화 메세지 테스트. Contribute to kimbokyung1220/SendTestPersonalMsg development by creating an account on GitHub.

github.com

 


🌐 kakaoDeveloper 설정

✔ 카카오디펠로퍼 바로가기 👉 https://developers.kakao.com/

 

1. 로그인 > 내 어플리케이션 > 어플리케이션 추가

- 사업자번호, 카카오 모먼트계정, 카카오 모먼트에서 만튼 광고 소재 필수

 

 

 

 

2. API 확인

- REST API 키 사용

 

 

 

3. 카카오 로그인 활성화 및 Redirect URL 설정

1) 카카오 로그인 활성화

 

 

 

2) 리다이렉트 URL 설정

- URL은 본인이 원하는 대로 설정하면 됨

 


🌐 카카오 모먼트 광고 소재 만들기

✔ 카카오 모먼트 👉 https://moment.kakao.com/adaccount

카카오 모먼트에 회원가입 > 광고 모먼트 만들기

개인화 메세지에 들어갈 메세지의 변수값과 양식을 작성하면 된다.

 


💻  Code

  개인화 메세지 공식문서 👉 https://developers.kakao.com/docs/latest/ko/kakaomoment/personalized-msg

공식문서를 열어두고 하면 아주 좋음!

 

1.  Controller

@GetMapping("/dev/kakaoApiTest")
    public ModelAndView kakaoLogin(@RequestParam String code) throws JsonProcessingException {
        boolean success = kakaoUserService.kakaoLogin(code);
        ModelAndView modelAndView = new ModelAndView("result");
        modelAndView.addObject("success", success);
        return modelAndView;
    }

- kakao로그인 시, 인가코드를 받고 kakaoLoginService의 kakaoLogin() 메서드를 실행하여 엑세스토큰을 기반으로 개인화 메세지 전송까지 해볼 예정이다.

- 결과값은 boolean값으로 result 화면에서 true를 반환하면 메세지 전송 완료, false를 반환하면 메세지 전송 실패의 값을 보여주기 위해 model에 담아 result.html으로 데이터를 전송한다. 


2. DTO 

DefaultMessageDto 생성

@Getter
@Setter
public class DefaultMessageDto {
	private String phoneNumber;
	private String date1;
	private String date2;
	private String site_name1;
	private String user_name1;
	private String mobile_url1;
	private String pc_url1;
	private String mobile_url2;
	private String pc_url2;
}

3. Service

1) KakaoUserService

@Service
@AllArgsConstructor
public class KakaoUserService {
    private static final String AUTH_URL = "https://kauth.kakao.com/oauth/token";
    public static String authToken;
    private final CustomMessageService customMessageService;

    public boolean kakaoLogin(String code) throws JsonProcessingException {
        if(!getAccessToken(code)) {
            return false;
        }
        return customMessageService.sendMyMessage();
    }

    private boolean getAccessToken(String code) throws JsonProcessingException {

        // HTTP Header 생성
        HttpHeaders headers = new HttpHeaders();
        headers.add("Content-type", "application/x-www-form-urlencoded;charset=utf-8");

        // HTTP Body 생성
        MultiValueMap<String, String> body = new LinkedMultiValueMap<>();
        body.add("grant_type", "authorization_code");
        body.add("client_id", "REST API키 값을 입력하세요.");
        body.add("redirect_uri", "Redirect URL 입력하세요.");
        body.add("code", code);

        // HTTP 요청 보내기
        HttpEntity<MultiValueMap<String, String>> kakaoTokenRequest = new HttpEntity<>(body, headers);
        RestTemplate rt = new RestTemplate();
        ResponseEntity<String> response = rt.exchange(AUTH_URL, HttpMethod.POST, kakaoTokenRequest, String.class);

        // HTTP 응답 (JSON) -> 액세스 토큰 파싱
        String responseBody = response.getBody();
        if (responseBody.isEmpty()) {
            return false;
        }
        ObjectMapper objectMapper = new ObjectMapper();
        JsonNode jsonNode = objectMapper.readTree(responseBody);
        authToken = jsonNode.get("access_token").asText();
        return true;
    }

✔  카카오 로그인 과정 공식문서 👉 https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api

  • header에 정보를 넣는다.
  • body에 정보를 넣는다.
  • 요청을 보낸다.
  • access token값을 가져온다.


 

2) CustomMessageService

@Service
@RequiredArgsConstructor
public class CustomMessageService {
    private final MessageService messageService;

    public boolean sendMyMessage() {
        DefaultMessageDto myMsg = new DefaultMessageDto();
        myMsg.setPhoneNumber("개인화 메세지를 받을 사람의 핸드폰 번호를 입력하세요.");
        myMsg.setDate1("날짜를 입력하세요.");
        myMsg.setDate2("날짜를 입력하세요.");
        myMsg.setSite_name1("사이트명을 입력하세요.");
        myMsg.setUser_name1("개인화 메세지를 받을 사람의 이름을 입력하세요.");
        myMsg.setMobile_url1("https://m.naver.com/");
        myMsg.setMobile_url2("https://m.naver.com/");
        myMsg.setPc_url1("https://naver.com/");
        myMsg.setPc_url2("https://naver.com/");

        String accessToken = KakaoUserService.authToken;
        return messageService.sendMessage(accessToken, myMsg);
    }

  개인화 메세지 요청 및 응답 양식  👉 https://developers.kakao.com/docs/latest/ko/kakaomoment/personalized-msg

  • 카카오 모멘트에서 만든 소재에 나타나야 할 값들을 넣어준다.
  • 모바일과 pc의 url에서 링크양식을 체크하는 것 같다. 그래서 무조건 url형식으로 작성해야만 한다.
  • 만약, url형식이 아니라면 invalid URL 에러가 발생한다.

 

3) MessageService

@Service
public class MessageService {
	private Logger logger = LoggerFactory.getLogger(this.getClass());
	private static final String MSG_SEND_SERVICE_URL = "https://apis.moment.kakao.com/openapi/v4/messages/creatives/{소재ID}/sendTestPersonalMessage";
	private static final String SEND_SUCCESS_MSG = "메시지 전송에 성공했습니다.";
	private static final String SEND_FAIL_MSG = "메시지 전송에 실패했습니다.";
	private static final String SUCCESS_CODE = "200"; //kakao api에서 return해주는 success code 값

	public boolean sendMessage(String accessToken, DefaultMessageDto msgDto) {
		// HTTP 헤더
		HttpHeaders headers = new HttpHeaders();
		headers.set("Authorization", "Bearer " + accessToken);
		headers.setContentType(MediaType.APPLICATION_JSON);
		headers.set("adAccountId", "광고주ID를 입력해 주세요.");

		// HTTP 바디 (JSON)
		JSONObject variables = new JSONObject();
		variables.put("date1", msgDto.getDate1());
		variables.put("date2", msgDto.getDate2());
		variables.put("site_name1", msgDto.getSite_name1());
		variables.put("user_name1", msgDto.getUser_name1());
		variables.put("mobile_url1", msgDto.getMobile_url1());
		variables.put("mobile_url2", msgDto.getMobile_url2());
		variables.put("pc_url1", msgDto.getPc_url1());
		variables.put("pc_url2", msgDto.getPc_url2());

		JSONObject body = new JSONObject();
		body.put("phoneNumber", msgDto.getPhoneNumber());
		body.put("variables", variables);

		String resultCode = "";
		try {
		// HTTP 요청 보내기
		HttpEntity<String> sendMessgeInfo = new HttpEntity<>(body.toString(), headers);
		RestTemplate rt = new RestTemplate();
		ResponseEntity<String> response = rt.exchange(MSG_SEND_SERVICE_URL, HttpMethod.POST, sendMessgeInfo, String.class);
		resultCode = String.valueOf(response.getStatusCodeValue());
		} catch (Exception e) {
			resultCode = "500"; // 예외가 발생했을 경우에 대한 기본값 설정
		}

		return successCheck(resultCode);
	}

	public boolean successCheck(String resultCode) {
		if(resultCode.equals(SUCCESS_CODE)) {
			return true;
		}else {
			logger.debug(SEND_FAIL_MSG);
			return false;
		}
	}
  • 헤더에 값을 넣는다.
  • 바디에 값을 넣는다.
  • 개인화 메세지 API URL로 요청한다.
  • 응답코드(HttpStatusCode)를 확인하여 성공여부를 return한다.
  • 핸드폰번호는 개인화 메세지를 받을 사용자의 번호여야 한다.
  • variables에는 메세지 내용에 들어갈 값을 넣으면 된다.


4. HTML

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="preconnect" href="https://fonts.gstatic.com">
    <link href="https://fonts.googleapis.com/css2?family=Nanum+Gothic&display=swap" rel="stylesheet">
    <link rel="stylesheet" type="text/css" href="/css/style.css">
    <meta charset="UTF-8">
    <title>로그인 페이지</title>
</head>
<body>
<div id="login-form">
    <div id="login-title">메세지 테스트</div>
    <button id="login-kakao-btn"
            onclick="location.href='https://kauth.kakao.com/oauth/authorize?client_id=REST API키 값을 입력하세요.&redirect_uri=RedirectURL을 입력하세요.&response_type=code'">
        카카오로 로그인하기
    </button>
</div>
</body>
</html>

 

코드를 다 작성해 봤다

 

 

🌝 결과

 

 

아래 블로그를 참고해서 코드를 작성해봤다.

나는 급해서 닥치는대로 코드를 작성했는데... 아래 블로그에서는 코드 분리가 잘 되어 있는 것 같다..^^ㅎ

사업자 번호가 없고, 소재가 없다면 아래 블로그를 따라서 자신에게 먼저 메세지를 보내보는 테스트를 해보고

실무에서 적용해보면 좋을 것 같습니다..!!!

 

 👉 https://foot-develop.tistory.com/21

 

JAVA로 카카오 메시지 API연동

토이프로젝트를 진행하던 중, 카카오 메시지 API연동이 필요하던 참이었다. 목적이 Spring scheduler를 이용해 일정 시간마다 필요한 정보를 나에게 메시지를 뿌려주는 것이기 때문에 따로 화면단이

foot-develop.tistory.com

 

틀린 부분이 있다면 꼭 답글 부탁드립니다!

 

 

728x90

댓글