🍃 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
🌐 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
틀린 부분이 있다면 꼭 답글 부탁드립니다!
'🎯 etc > API' 카테고리의 다른 글
[ API ] 영화진흥위원회 오픈 API 키 발급방법 ( +JSON Viewer 설치) (0) | 2024.06.26 |
---|---|
[ kakaoMap API ] geolocation 사용 (0) | 2022.11.21 |
[ 공공기관 오픈API ] 금융위원회_기업기본정보 오픈API 사용 및 Json 파싱 (2) - JAVA (2) | 2022.11.19 |
[ 공공기관 오픈API ] 금융위원회_기업기본정보 오픈API신청 (1) - JAVA (1) | 2022.11.18 |
[ Google vision Cloud OCR (3)] OCR / MultipartFile - JAVA ( + ❗❗ 트러블슈팅) (0) | 2022.11.18 |
댓글