Naver Cloud Platform 문자 발송 API 이용하기

Chocomilk·2021년 1월 23일
1
post-custom-banner

SMS를 이용한 전화번호 인증 서비스를 개발하기 위해 많은 서비스들을 찾아봤다.
서비스를 제공하는 업체가 Twillo, 퍼플북등 다양하게 있었다.
그 중에서도 나에게 친숙하고 국내에 있는 대기업인 네이버 클라우드 플랫폼을 이용하기로 했다.

1. 해당 서비스를 이용하기 위해 Naver Cloud Platform에 가입을 해야 한다.

링크 ->https://www.ncloud.com/?language=ko-KR

2. 해당 페이지의 오른쪽 상단의 Console에서 문자서비스인 Simple&Easy Notification Service에 들어가면 된다.

3. 여기까지 진행했다면 다음과 같은 화면이 나올것이다.

해당 화면에서 프로젝트 생성하기를 누르고 이용하고자 하는 서비스를 체크하여 프로젝트를 생성하면 된다.

4. 이제 콘솔에서 설정해주어야 할 것은 끝이고 Flutter로 돌아와서 함수를 작성하면 된다.

https://apidocs.ncloud.com/ko/ai-application-service/sens/에 해당 API에 관한 설명이 자세하게 설명이 되어 있다.

해당 문자 서비스 API를 쓰려면 다음과 같이 4가지 요소가 필요하다. 시그니쳐 키를 얻는 방법은
다음과 같다.


 String getSignature(
      String serviceId, String timeStamp, String accessKey, String secretKey) {
    var space = " "; // one space
    var newLine = "\n"; // new line
    var method = "POST"; // method
    var url = "/sms/v2/services/$serviceId/messages";

    var buffer = new StringBuffer();
    buffer.write(method);
    buffer.write(space);
    buffer.write(url);
    buffer.write(newLine);
    buffer.write(timeStamp);
    buffer.write(newLine);
    buffer.write(accessKey);
    print(buffer.toString());

    /// signing key
    var key = utf8.encode(secretKey);
    var signingKey = new Hmac(sha256, key);

    var bytes = utf8.encode(buffer.toString());
    var digest = signingKey.convert(bytes);
    String signatureKey = base64.encode(digest.bytes);
    return signatureKey;
  }

출처 : https://g-y-e-o-m.tistory.com/167 (원작자님 감사합니다.......)


TimeStamp는 사용하는 그날인 DateTime.now()를 사용하면 된다.
accesskey 발급 방법 : NaverCloudPlatform - 내 계정 관리 - 인증키 관리 - 인증키 발급 / 발급한 인증키 사용
secretKey 발급 방법 : NaverCloudPlatform - 내 계정 관리 - 인증키 관리 - 발급한 인증키의 SecretKey 사용

5. 이제 http통신을 이용하여 문자를 보내면 끝!

void sendSMS(String phoneNumber) async{
   Map data = {
     "type":"SMS",
     "contentType":"COMM",
     "countryCode":"82",
     "from":"1234567890",
     "content" : "ABCD"  -- (A),
     "messages":[
       {
         "to":phoneNumber,
         "content":"EFGH" -- (B)
       }
     ],
   };
   var result = await http.post(
       "https://sens.apigw.ntruss.com/sms/v2/services/${Uri.encodeComponent('SecretKey')}/messages",
       headers: <String, String>{
         "accept" : "application/json",
         'content-Type': 'application/json; charset=UTF-8',
         'x-ncp-apigw-timestamp' :timeStamp,
         'x-ncp-iam-access-key': AccessKey,
         'x-ncp-apigw-signature-v2' : getSignature(Uri.encodeComponent(OpenAPIKey-ID),timeStamp,
             AccessKey, SecretKey)
       },
       body: json.encode(data)
   );
   print(result.body);
 }

함수내에 명사로 들어가 있는 값들은 4번항목의 설명에 맞추어 변환을 해주면 된다.
Map data안에 content가 두 개가 있는데 실제로 문자가 발송 되는 내용은 (B)의 Text를 따라간다.
그렇지만 A부분을 지우고 사용을 하면 에러가 발생한다.
그렇기에 비우지 않고 사용하면 아무 문제 없이 사용할 수 있을 것이다.

혹시 사이드 프로젝트나 회사 업무에 필요하게 되어서 이 기능을 처음 사용하게 될 때 요금에 대한 걱정이 있을수도 있다. 네이버 플랫폼을 선택한 이유중 하나는 무료 크래딧이다. 기본적으로 매월 50건의 무료 메세지를 발송 할 수 있으며 처음 네이버 클라우드 플랫폼 가입하는 사람에게는 10만 크래딧이 무료 제공된다. 그렇기에 요금에 대한 걱정 없이 개발만 열심히 하면 될 것이다!!

profile
어제보다 한 발짝 더 나아가려는 Flutter 개발자
post-custom-banner

2개의 댓글

comment-user-thumbnail
2023년 3월 18일

안녕하세요 제가 위 내용 따라 했을 때 error:200이 나오는데 해결 방법이 있을까요?

1개의 답글