Framework/Spring
[Spring Boot]카카오 알림톡 보내기
SHXL2
2024. 3. 28. 16:25
반응형
오랜만에 알림톡을 다시 구현할 일이 생겼는데요.
연동 방법을 포스팅으로 남겨도 좋을 것 같아 내용을 정리해봤습니다.
알림톡 사용을 위해서 NHN Notification - KakaoTalk Bizmessage 서비스를 사용했으며, 발신 프로필이 등록되어야 테스트할 수 있습니다.
※ 테스트 환경
- Spring Boot
1. 알림톡 템플릿 등록
알림톡 전송시 사용될 템플릿이 등록되어야 합니다. NHN 접속 후 알림톡 - 템플릿 관리로 이동합니다.
템플릿 등록을 통해 각 내용을 기입합니다. 템플릿 내용에는 변수를 사용할 수 있습니다.
템플릿에는 변수를 사용해서 내용을 등록해두고 API 호출시 변수에 대응하는 값을 넣어주면 호출 내용대로 알림톡이 발송됩니다.
*템플릿 : #{이름} 알림톡입니다.
*API 호출 : 홍길동 알림톡입니다.
알림톡에 버튼도 추가할 수 있습니다.
본 예제에서는 버튼 타입의 웹 링크를 테스트해보겠습니다. 각 타입별로 코드가 다르고 API 호출시 해당 코드를 입력해야 합니다.
2. API 테스트
2-1) API 키 추가
API 호출시 3개의 키(발신키, 앱키, 시크릿키)가 필요합니다.
발신키는 발신 프로필에서 확인할 수 있고, API 키는 아래 화면에서 확인할 수 있습니다.
application.properties
spring.biz.senderKey=발신키
spring.biz.appKey=앱키
spring.biz.secretKey=시크릿키
2-2) DTO 생성
package com.app.basic.common.api.biz;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
public class BizDTO {
private String templateCode;
private String mobile;
}
컨트롤러에서 반환할 타입 Entity도 생성합니다.
@Data
@Builder
public class MsgEntity {
private StatusEnum message;
private Object result;
}
2-3) Controller 생성
@Slf4j
@RequiredArgsConstructor
@RestController
@RequestMapping("biz")
public class BizmessageApi {
private static final String ALIMTALK_API_URL = "https://api-alimtalk.cloud.toast.com/alimtalk/v2.2/appkeys";
@Value("${spring.biz.senderKey}")
private String BIZ_SENDER_KEY;
@Value("${spring.biz.appKey}")
private String BIZ_APP_KEY;
@Value("${spring.biz.secretKey}")
private String BIZ_SECRET_KEY;
@PostMapping(value="/send")
public MsgEntity send(@RequestBody BizDTO bizDTO) {
JSONArray recipientList = new JSONArray();
recipientList.add(getTemplateBody(bizDTO.getMobile()));
Map<String, Object> apiParamMap = callRestApi(bizDTO.getTemplateCode(), recipientList);
return MsgEntity.builder()
.message(StatusEnum.OK)
.build();
}
}
2-4) 템플릿 생성 메소드
1. 에서 등록한 알림톡 템플릿과 동일하게 파라미터를 셋팅합니다.
*버튼명이 다르거나 주소가 다른 경우에 전송이 안될 수 있습니다.
public JSONObject getTemplateBody(String mobile) {
JSONObject recipientJson = new JSONObject();
recipientJson.put("recipientNo", mobile);
recipientJson.put("content", "테스트 알림톡입니다.");
// 템플릿 버튼 추가
JSONArray buttonList = new JSONArray();
JSONObject buttonJson = new JSONObject();
buttonJson.put("ordering", 1);
buttonJson.put("type" , "WL");
buttonJson.put("name" , "테스트 이동");
buttonJson.put("linkMo" , "https://codedream.co.kr");
buttonJson.put("linkPc" , "https://codedream.co.kr");
buttonList.add(buttonJson);
recipientJson.put("buttons", buttonList);
return recipientJson;
}
2-5) API 호출 메소드
RestTemplate을 이용해 셋팅한 파라미터를 추가해 실제 API를 호출합니다.
private Map<String, Object> callRestApi(
String templateCode,
JSONArray recipientList
) {
String bizApiUrl = ALIMTALK_API_URL + "/" + BIZ_APP_KEY + "/raw-messages";
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("X-Secret-Key", BIZ_SECRET_KEY);
JSONObject paramJson = new JSONObject();
paramJson.put("senderKey", BIZ_SENDER_KEY);
paramJson.put("templateCode", templateCode);
paramJson.put("recipientList", recipientList);
HttpEntity<String> requestEntity = new HttpEntity<>(paramJson.toString(), headers);
ResponseEntity<String> responseEntity = restTemplate.postForEntity(bizApiUrl, requestEntity, String.class);
String responseBody = responseEntity.getBody();
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("code", responseEntity.getStatusCodeValue());
resultMap.put("message", responseEntity.getStatusCode().getReasonPhrase());
if (responseEntity.getStatusCode() == HttpStatus.OK) {
JsonParser parser = new JsonParser();
JsonObject responseData = parser.parse(responseBody).getAsJsonObject();
resultMap.put("responseData", responseData);
}
return resultMap;
}
3. 테스트
템플릿코드와 핸드폰 번호를 추가해 테스트해봅니다.
참고문서
반응형