네이버 클라우드 sens 알림톡 발송
2023. 9. 26. 10:22ㆍ스프링
기본적인 페이지에 연동작업은 생략하고
우선
service-id, access-key, secret-key를 암호화 후 yml 파일에 작성하거나 env파일로 작성한다.
백단에서 통신을 위한 작업을 진행한다.
우선 헤더에 timestamp, accessKey, signature를 보내줘야 하는데
timestamp 같은 경우
String time = String.valueOf(System.currentTimeMillis());
간단히 생성 가능하며 access-key는 저장된 키를 가져온다,
signature값 생성의 경우 자바로 예를 든다면
public String makeSignature(String method, String time, String url) throws NoSuchAlgorithmException, InvalidKeyException {
String message = new StringBuffer()
.append(method)
.append(SPACE)
.append(url)
.append(NEW_LINE)
.append(time)
.append(NEW_LINE)
.append(alimKey.getAccessKey())
.toString();
SecretKeySpec signingKey = new SecretKeySpec(alimKey.getSecretKey().getBytes(StandardCharsets.UTF_8), "HmacSHA256");
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(signingKey);
byte[] rawHmac = mac.doFinal(message.getBytes(StandardCharsets.UTF_8));
return Base64.encodeBase64String(rawHmac);
}
아래와 같이 생성이 가능하다. .method는 호출할 네이버 api의 method url의 경우 도메인을 제외한 uri를 입력해야 한다.
또한 time의 경우는 위에 명시한 timestamp값과 값이 일치해야 작동이 된다.
알림톡의 경우 템플릿에 등록한 내용이 정확히 일치해야 전송이 되므로 자바단에서
public String inquiryTemplateContents() {
return new StringBuffer()
.append("안녕하세요.")
.append(NEW_LINE)
.append("개발자 입니다.")
.append(NEW_LINE)
.append(NEW_LINE)
.append("문의주신 내용에 대한 답변이 등록되었습니다.")
.append(NEW_LINE)
.append(NEW_LINE)
.append("1:1 게시판 또는 FAQ를 확인하여 주시기 바랍니다.")
.append(NEW_LINE)
.append(NEW_LINE)
.append("감사합니다.")
.toString();
}
토시 하나 틀리지 않고 만들어줘야 한다. NEW_LINE은 "\n" 이다
service 단에 경우
@Transactional
public AlimResponse sendAlimtalk(Map<String, Object> params) throws NoSuchAlgorithmException, InvalidKeyException, URISyntaxException {
String url = TALK_TYPE + "/v2/services/" + kakaoHelper.getAlimKey().getServiceId() + RequestType.SEND.val();
String time = String.valueOf(System.currentTimeMillis());
HttpHeaders headers = kakaoHelper.makeHeaders(url, time, POST);
Alim alimRequest = getAlimRequest();
HttpEntity<Alim> httpPostBody = new HttpEntity<>(alimRequest, headers);
AlimResponse alimResponse = restTemplate.postForObject(new URI(DOMAIN + url), httpPostBody, AlimResponse.class);
return alimResponse;
}
private Alim getAlimRequest() {
// TODO request 정보 보내기
// TODO 버튼이 필요하면 아래와 같이 객체 생성 후 아래 message 객체에 넣기
// List<Buttons> buttons = new ArrayList<>();
// Buttons buttonRequest = Buttons.buttonCreator()
// .type("WL")
// .name("개발자 살아남기")
// .linkMobile("https://m.naver.com/")
// .linkPc("https://www.naver.com/")
// .build();
// buttons.add(buttonRequest);
List<AlimMessage> alermMessages = new ArrayList<>();
AlimMessage message = AlimMessage
.receiverMessage()
.to("0100100101") // 화면단에서 받음
.content(kakaoHelper.inquiryTemplateContents())
.build();
alermMessages.add(message);
// TODO templateCode만 화면단에서 받아오기
return Alim
.alimRequest()
.plusFriendId("@내카카오채널이름")
.messages(alermMessages)
.templateCode("inquiry")
.useSmsFailover(false)
.build();
}
요청 url을 도메인 제외하고 만들어주고
위에서 봤던 header를 만들어준다.
필요한 요청을 가공해서 body값을 만들고 마지막에는 DOMAIN 값과 함께 url 요청을 해주면 응답을 받는다.
'스프링' 카테고리의 다른 글
스프링부트 개발 가이드 (1) | 2023.11.08 |
---|---|
springboot redis 연동 (0) | 2023.10.11 |
yml 파일 암호화 (1) | 2023.08.29 |
springdoc swagger 사용하기 (0) | 2023.03.09 |
스프링부트 다국어 설정 i18n (0) | 2023.03.09 |