네이버 API 프로젝트 생성
네이버 클라우드에 먼저 가입한다. (가입 관련 내용이 많으니 참고)
NAVER CLOUD PLATFORM
cloud computing services for corporations, IaaS, PaaS, SaaS, with Global region and Security Technology Certification
www.ncloud.com
가입한 이후 해당 경로로 들어간다.
프로젝트 생성하기를 클릭하고 생성에 필요한 프로젝트 이름를 기입하고 서비스 Type은 SMS를 클릭한다.
생성 후에 아래와 같은 project 정보를 확인할 수 있다.
이제 발신번호를 등록하면 된다.
API 연동 정보 확인
Calling Number에서 발신 번호를 등록하면 된다.
이후 해당 발신 번호는 코드상으로 필요하다는 점 참고!!
계정의 인증키 관리에서 생성된 AccessKey와 SecretKey를 확인 할 수 있다.
따로 저장을 해두자.
프로젝트 조회 화면에서 서비스 ID를 클릭하면 해당 값을 확인 할 수 있다.
따로 저장을 해두자.
헤더 구성
https://api.ncloud-docs.com/docs/common-ncpapi
Ncloud API
api.ncloud-docs.com
위의 링크에서 signature-v2 부분을 어떻게 생성할지에 대해 답을 알려주고 있다.
그래도 복붙하면 잘 동작한다. 암호화 알고리즘이라고 겁 먹을 필요가 없다. 친절~
properties에서 해당 정보들을 추가해주자. senderPhone은 발신 번호이다.
service
public String makeSignature(Long time) throws Exception {
String space = " ";
String newLine = "\n";
String method = "POST";
String url = "/sms/v2/services/"+ this.serviceId+"/messages";
// 1) timestamp
String timestamp = time.toString();
// 2) access key
String accessKey = this.accessKey;
// 3) secretKey 암호화
String secretKey = this.secretKey;
// 알고리즘은 HmacSHA256 사용 - 바이트 배열의 데이터키를 비밀키로 변환
SecretKeySpec signingKey = new SecretKeySpec(secretKey.getBytes("UTF-8"), "HmacSHA256");
// HMAC 암호화 - 공유된 키를 가지고 메시지 해쉬값(MAC)을 만들어 냅니다. 변조와 위장을 막음
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(signingKey);
String message = new StringBuilder()
.append(method)
.append(space)
.append(url)
.append(newLine)
.append(timestamp)
.append(newLine)
.append(accessKey)
.toString();
//doFinal()은 HMAC 결과로 byte array를 리턴
byte[] rawHmac = mac.doFinal(message.getBytes("UTF-8"));
String encodeBase64String = Base64.encodeBase64String(rawHmac);
return encodeBase64String;
}
@Value("${naver-cloud-sms.accessKey}")
private String accessKey;
@Value("${naver-cloud-sms.secretKey}")
private String secretKey;
@Value("${naver-cloud-sms.serviceId}")
private String serviceId;
@Value("${naver-cloud-sms.senderPhone}")
private String senderPhone;
public SmsResponseDto sendSms(MessageDto messageDto) throws Exception{
Long time = System.currentTimeMillis();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("x-ncp-apigw-timestamp",time.toString());
headers.set("x-ncp-iam-access-key", accessKey);
headers.set("x-ncp-apigw-signature-v2", makeSignature(time));
List<MessageDto> messages = new ArrayList<>();
messages.add(messageDto);
SmsRequestDto request = SmsRequestDto.builder()
.type("MMS")
.contentType("COMM")
.countryCode("82")
.from(senderPhone)
.content(messageDto.getContent())
.messages(messages)
.build();
System.out.println("request = " + request);
ObjectMapper objectMapper = new ObjectMapper();
String body = objectMapper.writeValueAsString(request);
HttpEntity<String> httpBody = new HttpEntity<>(body, headers);
RestTemplate restTemplate = new RestTemplate();
//post 요청 -> 객체 반환
SmsResponseDto response = restTemplate.postForObject(new URI("https://sens.apigw.ntruss.com/sms/v2/services/"+ serviceId +"/messages"), httpBody, SmsResponseDto.class);
System.out.println("response = " + response);
return response;
}
controller
private final SmsService smsService;
@PostMapping("/send")
public ResponseEntity sendSms(@RequestBody MessageDto messageDto) {
try {
SmsResponseDto smsResponseDto = smsService.sendSms(messageDto);
return ResponseEntity.ok(smsResponseDto);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
postman test
성공적으로 문자 전송이 된 것을 확인 할 수 있다.
네이버 API 설명이 잘 되어있어서 구현에 큰 문제는 없었던 것 같다.
'SPRING BOOT' 카테고리의 다른 글
Spring Boot 프로젝트 외부 경로에 있는 파일 접근(addResourceHandlers) (0) | 2023.06.01 |
---|---|
[springboot] devtools 자동 재시작 (0) | 2023.02.09 |
mybatis sql관련 console 출력 (0) | 2023.02.08 |