이번에는 주문이 완료되었거나 음식 준비가 완료되어 픽업 메시지를 보내야할때를 구현하였다.
처음에는 알림톡 발송을 하려 하였으나 우리 카카오채널을 비니지스 채널로 변경할 수 없다는 점이 있어 문자 메시지로 발송하기로 하였다.
생각해보면 카톡이 없는 사람들을 위해 문자 메시지가 더 좋은듯 하다 ㅎㅎ
문자 메시지 발송도 유료여서 이곳저곳 찾아보다가 네이버 클라우드 플랫폼에서 제공하는 기능을 사용하기로 하였다.
[NAVER CLOUD PLATFORM - SENS] https://www.ncloud.com/product/applicationService/sens
매달 50건이 무료 + 1건당 9원밖에 안함(어디서 처음 가입하면 10만원 충전해준다했는데 그건 잘 몰겠삼.. 가입했을 때 본거같기도하고..)
회원가입을 따로 해도 원래 있던 네이버 아이디랑 알아서 연동됨
https://www.ncloud.com/join/type
또는 https://www.ncloud.com/product/applicationService/sens > 신청하기
메시지 발송에 필요한 키는 총 3개
2-1) Access Key
네이버 클라우드 플랫폼 로그인 > 마이페이지 > 계정관리 > 인증키 관리 > Access Key ID
2-2) Secret Key
네이버 클라우드 플랫폼 로그인 > 마이페이지 > 계정관리 > 인증키 관리 > Scret 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개 다 쓰느라 아직 할일을 하나도 못해서 이건 나중에 올려야지
뿅
[캡스톤 일지] ~ 11.28(1) 일단은 밀린 캡스톤 일지 쓰기 (0) | 2021.11.29 |
---|---|
[캡스톤 일지] ~ 11.15 robotjs 이용한 마우스 클릭 (0) | 2021.11.15 |
[캡스톤 일지] ~ 11.04(1) 웹 쿠키 이용한 장바구니 기능 구현 (0) | 2021.11.08 |
[캡스톤 일지] ~10.26 미디어파이프 오류 해결과 노드 socket.io 예제 (0) | 2021.10.27 |
[캡스톤 일지] ~10.21 NodeJS TDD 웹개발 훑어보기(2) (0) | 2021.10.23 |
댓글 영역