이번에는 주문이 완료되었거나 음식 준비가 완료되어 픽업 메시지를 보내야할때를 구현하였다. 처음에는 알림톡 발송을 하려 하였으나 우리 카카오채널을 비니지스 채널로 변경할 수 없다는 점이 있어 문자 메시지로 발송하기로 하였다. 생각해보면 카톡이 없는 사람들을 위해 문자 메시지가 더 좋은듯 하다.
네이버 클라우드 플랫폼
NAVER CLOUD PLATFORM - SENS https://www.ncloud.com/product/applicationService/sens
문자 메시지 발송도 유료여서 이곳저곳 찾아보다가 네이버 클라우드 플랫폼에서 제공하는 기능을 사용하기로 하였다.
매달 50건이 무료 + 1건당 9원밖에 안함(어디서 처음 가입하면 10만원 충전해준다했는데 잘 모르겠다..)
1. 회원가입 & SENS 서비스 신청
📑 https://www.ncloud.com/join/type 회원가입을 따로 해도 원래 있던 네이버 아이디랑 알아서 연동됨
또는 https://www.ncloud.com/product/applicationService/sens 에서 이용 신청하기
2.서비스키 발급
메시지 발송에 필요한 키는 총 3개
Access Key
네이버 클라우드 플랫폼 로그인 > 마이페이지 > 계정관리 > 인증키 관리 > Access Key IDSecret Key
네이버 클라우드 플랫폼 로그인 > 마이페이지 > 계정관리 > 인증키 관리 > Scret Key 보기Service ID
네이버 클라우드 플랫폼 로그인 > 마이페이지 > 서비스 이용 현황 > 콘솔 바로가기 & 혹은 문의하기 옆에 콘솔 버튼https://console.ncloud.com/sens/home
로그인 > 콘솔 > Simple & Easy Notification Service(사용하려는 서비스 명) > Project발송 전화번호 등록
콘솔 > Simple & Easy Notification Service(사용하려는 서비스 명) > Calling Number
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();
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;
파이썬으로 내 친구목록에 있는 사람한테 카톡 발송하는 것도 했는데 그건 나중에 올려야겠다. 분명 난 채널 등록을 해서 채널 이름으로 메시지가 갈 줄 알았는데 내 아이디로 간다.. 뭐 암튼 오늘 밀린 포스팅 2개 다 쓰느라 아직 할일을 하나도 못해서 이건 나중에 올려야지
뿅