Node.js

카카오 알림톡 API (네이버 클라우드 플랫폼) 설정법 및 예제 코드

museyooni 2022. 8. 20. 21:33

첫 블러그 포스팅입니다!

Ncloud에서는 카카오 알림톡, 친구톡 등을 발송할 때 사용할 수 있는 API를 제공하고 있습니다. 이하 내용은 Ncloud SENS콘솔에서 템플릿 설정 방법과 node.js를 이용해 서버에서 Ncloud API를 통해 카카오톡 알림톡을 전송하는 코드에 대한 설명입니다 :) 

 

필요사항(Requirements)

관리자로 등록되어 있는 카카오톡 채널  // 카카오톡 채널은 사업자등록번호를 사용해 만들 수 있습니다.

Ncloud Simple&Easy Notification Service(SENS)에서 채널 등록

Ncloud 계정

Ncloud API key // 콘솔 우측 상단 프로필 - 계정 관리에서 API키를 복사해 두세요.

Node.js가 설치된 서버

Node 모듈 (crypto-js, request) // npm install [모듈 이름]

템플릿 작성법

간단합니다. 원하는 템플릿 유형을 그대로 적고 변수가 들어가는 부분에서만 #{변수 이름}으로 적으면 됩니다. 단, 광고성 정보 등은 알림톡에서 허용하지 않기 때문에 템플릿 검수 과정에서 반려될 수 있음을 주의하세요. 

 

템플릿 예(기본형 또는 부가 정보형):

오늘의 날씨

#{today}의 날씨는 #{weather}입니다. 좋은 하루 보내세요!

 

코드에서 API로 값을 넘길 때는 이렇게 적으시면 됩니다. 자바스크립트에서 개행은 \n으로 적어야 정상적으로 처리됩니다.

content: `오늘의 날씨\n\n${today}의 날씨는 ${weather}입니다. 좋은 하루 보내세요!`

사실 변수 부분에는 어떤 글자를 넣어도 상관없습니다. 템플릿에 변수로 설정해 놓았더라도 content값에는 변수 대신 텍스트로 작성하셔도 됩니다. 대신, 다른 부분은 템플릿과 정확히 일치해야 합니다. 

content: `오늘의 날씨\n\n${today}의 날씨는 ${weather}입니다. 파이팅!` //에러
content: `오늘의 날씨\n${today}의 날씨는 ${weather}입니다. 좋은 하루 보내세요!`//에러

 

 

예제 코드

var CryptoJS = require("crypto-js");
var SHA256 = require("crypto-js/sha256");
var Base64 = require("crypto-js/enc-base64");
const request = require('request');
const receiver = "01012345678"; //수신자 전화번호 설정하세요

//이 부분은 필요에 맞게 변수를 설정하세요
const today = "8월 20일 토요일";
const weather = "맑음";
//원하는 변수를 설정해서 사용하세요!

const date = Date.now().toString(); 
const uri = "서비스 아이디 입력하세요"; //알림톡 프로젝트에서 표시되는 서비스 ID
const accessKey = "액세스 키 입력하세요"; //API ACESS KEY
const secretKey = "시크릿 키 입력하세요"; //API SECRET KEY
const method = "POST";
const space = " ";
const newLine = "\n";
const url = `https://sens.apigw.ntruss.com/alimtalk/v2/services/${uri}/messages`;
const url2 = `/alimtalk/v2/services/${uri}/messages`;

const hmac = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, secretKey);

hmac.update(method);
hmac.update(space);
hmac.update(url2);
hmac.update(newLine);
hmac.update(date);
hmac.update(newLine);
hmac.update(accessKey);

const hash = hmac.finalize();
const signature = hash.toString(CryptoJS.enc.Base64);

request(
    {
      method: method,
      json: true,
      uri: url,
      headers: {
        "Content-type": "application/json; charset=utf-8",
        "x-ncp-apigw-timestamp": date,
        "x-ncp-iam-access-key": accessKey,
        "x-ncp-apigw-signature-v2": signature,
    },
      body: {
        plusFriendId: "@채널 이름", //카카오톡 채널 이름
        templateCode: "알림톡 템플릿 코드", //승인된 템플릿의 템플릿 코드
        messages: [
          {
            to: receiver,
            content: `오늘의 날씨\n\n${today}의 날씨는 ${weather}입니다. 좋은 하루 보내세요!`,
            useSmsFailover: true,
            failoverConfig: {
                type: "LMS",
                from: `발신자번호`, //알림톡전송 실패 시 SMS로 전송 시도
                subject: "anything",
                content: `오늘의 날씨\n\n${today}의 날씨는 ${weather}입니다. 좋은 하루 보내세요!`
            }
          },
        ],
      },
    },
  );

 

다른 템플릿 유형을 적용할 때 필요한 Request Body 작성법입니다. 자세한 설명은 공식 문서(링크)를 참고하세요!

https://api.ncloud-docs.com/docs/ai-application-service-sens-alimtalkv2#%EB%A9%94%EC%8B%9C%EC%A7%80%EB%B0%9C%EC%86%A1

 

알림톡 API - Simple & Easy Notification Service

 

api.ncloud-docs.com

{
    plusFriendId:"string",
    templateCode:"string",
    messages:[
        {
            countryCode:"string",
            to:"string",
            title:"string",
            content:"string",
            headerContent:"string",
            itemHighlight:{
                title:"string",
                description:"string"
            },
            item:{
                list:[
                    {
                        title":"string",
                        description":"string"
                    }
                ],
                summary:{
                    title:"string",
                    description:"string"
                }
            },
            buttons:[
                {
                    type:"string",
                    name:"string",
                    linkMobile:"string",
                    linkPc:"string",
                    schemeIos:"string",
                    schemeAndroid:"string"
                }
            ],
            useSmsFailover: boolean,
            failoverConfig: {
                type: "string",
                from: "string",
                subject: "string",
                content: "string"
            }
        }
    ],
    reserveTime: "yyyy-MM-dd HH:mm",
    reserveTimeZone: "string",
    scheduleCode: "string"
}