Home 캡스톤일지 | ~ 11.04(2) NCP 문자 메시지 발송 API
Post
Cancel

캡스톤일지 | ~ 11.04(2) NCP 문자 메시지 발송 API

이번에는 주문이 완료되었거나 음식 준비가 완료되어 픽업 메시지를 보내야할때를 구현하였다. 처음에는 알림톡 발송을 하려 하였으나 우리 카카오채널을 비니지스 채널로 변경할 수 없다는 점이 있어 문자 메시지로 발송하기로 하였다. 생각해보면 카톡이 없는 사람들을 위해 문자 메시지가 더 좋은듯 하다.


네이버 클라우드 플랫폼

NAVER CLOUD PLATFORM - SENS https://www.ncloud.com/product/applicationService/sens image

문자 메시지 발송도 유료여서 이곳저곳 찾아보다가 네이버 클라우드 플랫폼에서 제공하는 기능을 사용하기로 하였다.
매달 50건이 무료 + 1건당 9원밖에 안함(어디서 처음 가입하면 10만원 충전해준다했는데 잘 모르겠다..)

1. 회원가입 & SENS 서비스 신청

📑 https://www.ncloud.com/join/type 회원가입을 따로 해도 원래 있던 네이버 아이디랑 알아서 연동됨
또는 https://www.ncloud.com/product/applicationService/sens 에서 이용 신청하기

2.서비스키 발급

메시지 발송에 필요한 키는 총 3개

  1. Access Key
    네이버 클라우드 플랫폼 로그인 > 마이페이지 > 계정관리 > 인증키 관리 > Access Key ID image

  2. Secret Key
    네이버 클라우드 플랫폼 로그인 > 마이페이지 > 계정관리 > 인증키 관리 > Scret Key 보기 image

  3. Service ID
    네이버 클라우드 플랫폼 로그인 > 마이페이지 > 서비스 이용 현황 > 콘솔 바로가기 & 혹은 문의하기 옆에 콘솔 버튼 image

    https://console.ncloud.com/sens/home
    로그인 > 콘솔 > Simple & Easy Notification Service(사용하려는 서비스 명) > Project image

  4. 발송 전화번호 등록
    콘솔 > Simple & Easy Notification Service(사용하려는 서비스 명) > Calling Number image

3. 코드 작성

필요한 라이브러리

  • crypto-js 해시 함수를 통한 암호화를 할 수 있도록 해주는 nodejs 패키지
  • request HTTP 요청관련 라이브러리
1
2
3
const CryptoJS = require('crypto-js');
var request = require('request');
require('dotenv').config();

request 모듈은 2020년 2월 11일 이후 deprecated(중지) 되었다고한다. axios 모듈을 이용하던데 나도 수정해야겠다.

send.js > sendOrderMsg(req, res)

1
2
3
4
5
6
7
// req에서 받은 메시지 요청에 필요한 정보
const phone = req.body.phone; // 사용자 전화번호
const orderNo = req.body.orderNo; // 주문 번호

// 에러 코드
const finErrCode = 404;
const date = Date.now().toString();
1
2
3
4
const serviceId = process.env.SENS_SERVICE_ID; 
const secretKey = process.env.SENS_SECRET_ID; 
const accessKey = process.env.SENS_ACCESS_ID; 
const my_number = process.env.SENS_MYNUM;

환경변수로 저장한 서비스키

dotenv 모듈 설치

1
npm i -s dotenv

모듈 사용

1
require('dotenv').config();

.env 파일 생성 후 환경변수 작성 image

crypto-js 모듈 이용한 정보 암호화

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// url
const method = "POST";
const space = " ";
const newLine = "\n";
const url = `https://sens.apigw.ntruss.com/sms/v2/services/ncp:sms:kr:274650391224:airosk/messages`;
const url2 = `/sms/v2/services/${serviceId}/messages`;
    
// crypto-js 모듈을 이용한 암호화
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 모듈 이용하여 HTTP 요청

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
request({
    method : method,
    uri : url,
    headers : {
        'Contenc-type': 'application/json; charset=utf-8',
        'x-ncp-iam-access-key': accessKey,
        'x-ncp-apigw-timestamp': date,
        'x-ncp-apigw-signature-v2': signature
    },
    body : {
        'type' : 'SMS',
        'countryCode' : '82',
        'from': my_number, // 발송자 번호
        'content' : `주문이 완료되었습니다. 주문번호는 ${orderNo} 입니다.`,
        'messages' : [{
                'to' : `${phone}`
        }]
    }
}, function(err) {
    if(err) {
        console.log(err);
        // 실패 시 처리
    }
    else {
        console.log('success');
        // 성공 시 처리
    }
});

마지막으로 컨트롤러 export

1
2
3
4
5
function sendOrderMsg(req, res) {
    ....
}

module.exports.sendOrderMsg = sendOrderMsg;

axios 모듈 설치

1
npm i axios

axios 모듈 임포트 및 사용

1
const axios = require('axios');
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
axios({
    method: method,
    // request는 serviceId였지만 axios는 url
    url: url,
    headers: {
        "Contenc-type": "application/json; charset=utf-8",
        "x-ncp-iam-access-key": accessKey,
        "x-ncp-apigw-timestamp": date,
        "x-ncp-apigw-signature-v2": signature,
    },
    // request는 body였지만 axios는 data
    data: {
        type: "SMS",
        countryCode: "82",
        from: my_number, // 발송자 번호
        // 원하는 메세지 내용
        content : `주문이 완료되었습니다. 주문번호는 ${orderNo} 입니다.`,
        messages: [
        // 신청자의 전화번호
            { to: `${phone}`, },],
    },
}).then(res => {
    console.log(res.data);
}).catch(err => {
    console.log(err);
})
return finErrCode;

image



파이썬으로 내 친구목록에 있는 사람한테 카톡 발송하는 것도 했는데 그건 나중에 올려야겠다. 분명 난 채널 등록을 해서 채널 이름으로 메시지가 갈 줄 알았는데 내 아이디로 간다.. 뭐 암튼 오늘 밀린 포스팅 2개 다 쓰느라 아직 할일을 하나도 못해서 이건 나중에 올려야지

This post is licensed under CC BY 4.0 by the author.

캡스톤일지 | ~ 11.04(1) 웹 쿠키 장바구니 기능 구현

캡스톤일지 | ~ 11.15 robotjs 이용한 마우스 클릭