상세 컨텐츠

본문 제목

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

학부/캡스톤(a.k.a 졸작)

by ranlan 2021. 11. 8. 14:17

본문

728x90

이번에는 주문이 완료되었거나 음식 준비가 완료되어 픽업 메시지를 보내야할때를 구현하였다.

처음에는 알림톡 발송을 하려 하였으나 우리 카카오채널을 비니지스 채널로 변경할 수 없다는 점이 있어 문자 메시지로 발송하기로 하였다.

생각해보면 카톡이 없는 사람들을 위해 문자 메시지가 더 좋은듯 하다 ㅎㅎ

 


 

네이버 클라우드 플랫폼

문자 메시지 발송도 유료여서 이곳저곳 찾아보다가 네이버 클라우드 플랫폼에서 제공하는 기능을 사용하기로 하였다.

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

 

NAVER CLOUD PLATFORM

cloud computing services for corporations, IaaS, PaaS, SaaS, with Global region and Security Technology Certification

www.ncloud.com

매달 50건이 무료 + 1건당 9원밖에 안함(어디서 처음 가입하면 10만원 충전해준다했는데 그건 잘 몰겠삼.. 가입했을 때 본거같기도하고..)

 

 

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

회원가입을 따로 해도 원래 있던 네이버 아이디랑 알아서 연동됨

 

https://www.ncloud.com/join/type

 

NAVER CLOUD PLATFORM

cloud computing services for corporations, IaaS, PaaS, SaaS, with Global region and Security Technology Certification

www.ncloud.com

또는 https://www.ncloud.com/product/applicationService/sens > 신청하기

 

NAVER CLOUD PLATFORM

cloud computing services for corporations, IaaS, PaaS, SaaS, with Global region and Security Technology Certification

www.ncloud.com

 

 

2. 서비스키 발급

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

 

2-1) Access Key

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

 

초록색 부분이 Access Key

2-2) Secret Key

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

 

초록색 부분이 Scerect Key

2-3) Service ID

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

 

https://console.ncloud.com/sens/home (로그인 필요)

콘솔 > Simple & Easy Notification Service(사용하려는 서비스 명) > Project

 

 

2-4) 발송 전화번호 등록

콘솔 > Simple & Easy Notification Service(사용하려는 서비스 명) > Calling Number

 

 

 

코드 작성

필요한 라이브러리

 crypto-js  해시 함수를 통한 암호화를 할 수 있도록 해주는 nodejs 패키지

 request  HTTP 요청관련 라이브러리

const CryptoJS = require('crypto-js');
var request = require('request');
require('dotenv').config();

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

 

📄 send.js > sendOrderMsg(req, res)

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

// 에러 코드
const finErrCode = 404;
const date = Date.now().toString();

 

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 모듈 설치

npm i -s dotenv

모듈 사용

require('dotenv').config();

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

 

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

// 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 요청

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

function sendOrderMsg(req, res) {
    ....
}

module.exports.sendOrderMsg = sendOrderMsg;

 

++  axios  모듈 이용

// npm i axios
const axios = require('axios');
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;

 

 

두둥

 

 


 

카카오로 내 친구목록에 있는 사람한테 카톡 발송하는 것도 파이썬을 했는데 그건 나중에 올려야겠다..

분명 난 채널 등록을 해서 채널 이름으로 메시지가 갈 줄 알았는데 내 아이디로 간다..

뭐 암튼 오늘 밀린 포스팅 2개 다 쓰느라 아직 할일을 하나도 못해서 이건 나중에 올려야지

 

 

 

728x90

관련글 더보기

댓글 영역