알바로 이것저것 하는 중에
네이버 ncloud SENS (Simple & Easy Notification Service) 로
문자 전송 (추후엔 카톡까지 연동) 을 개발하게 됨.
구글링 하다보니.. spring에서 돌리는 소스를 발견
내가 개발 중인 환경은 jsp 이기에 이 소스를 컨버젼해서 쓰면 되겠군.. (아싸 득템)
이란 마음으로 시작...
아오 썩을..
계속 401 오류가 나온다.. (Authentication Failed)
네이버 쉑끼들한데 문의를 해보니 원론적인 답변만...
API 문서 : https://api.ncloud-docs.com/docs/ai-application-service-sens
네이버 쉑끼들한데 일단 한마디..
니들이 뭐가 그리 잘나서 우리는 고객의 코드를 리뷰 안해줌~~ 이딴 소릴 지껄이냐..
내가 니들 서비스 공짜로 쓰냐! 다 돈내고 쓰는거고.. 내가 몇백줄을 보낸 것도 아니고..
거기다가.. 니들이 만든 문서하고는.. 온갖 개폼은 다 잡아놓은 문서임..
알아먹을려면 알아먹어봐라 라는 중2병스러운 쓰레기를 만들어 놓고는 꼴깝 좀 떨지마라..
그리고.. 잘못된 소스를 올려놓은 어떤 블로그에게 한마디..
님의 소스에 수많은 개발자들이 오늘도 삽질을 합니다.
좀 잘 좀 확인하고 올립시다.
내 뒤에 오는 사람들은 우리같은 고생은 안하는게 좋지 않겠습니까?
자 이제 진정하고.. 이제 소스 리뷰...
JAVA 버전부터..
- import java.io.BufferedReader;
- import java.io.DataOutputStream;
- import java.io.InputStreamReader;
- import java.io.UnsupportedEncodingException;
- import java.net.HttpURLConnection;
- import java.net.URL;
- import java.security.InvalidKeyException;
- import java.security.NoSuchAlgorithmException;
- import java.util.Base64;
- import java.util.Base64.Encoder;
- import org.json.JSONArray;
- import org.json.JSONObject;
- import javax.crypto.Mac;
- import javax.crypto.spec.SecretKeySpec;
- public class sendMessage {
- final static String ACCECSS_KEY = "네이버API인증키"; // 네이버 클라우드 플랫폼 회원에게 발급되는 개인 인증키 // Access Key : https://www.ncloud.com/mypage/manage/info > 인증키 관리 > Access Key ID
- final static String SMS_SERVICEID = "SMS서비스ID"; // 프로젝트에 할당된 SMS 서비스 ID // service ID : https://console.ncloud.com/sens/project > Simple & ... > Project > 서비스 ID
- final static String SMS_SECRECT_KEY = "네이버API인증키의 SECRET KEY"; // MyPage의 API 인증키에서 secret key // Service Key : https://www.ncloud.com/mypage/manage/info > 인증키 관리 > secret key
- // TODO Auto-generated method stub
- sendSMS();
- }
- // https://api.ncloud-docs.com/docs/common-ncpapi
- .append(method)
- .append(space)
- .append(url)
- .append(newLine)
- .append(timestamp)
- .append(newLine)
- .append(accessKey)
- .toString();
- SecretKeySpec signingKey;
- String encodeBase64String;
- try {
- signingKey = new SecretKeySpec(secretKey.getBytes("UTF-8"), "HmacSHA256");
- Mac mac = Mac.getInstance("HmacSHA256");
- mac.init(signingKey);
- byte[] rawHmac = mac.doFinal(message.getBytes("UTF-8"));
- //encodeBase64String = Base64.getEncoder().encodeToString(rawHmac);
- Encoder encoder = Base64.getEncoder();
- encodeBase64String = encoder.encodeToString(rawHmac);
- // TODO Auto-generated catch block
- encodeBase64String = e.toString();
- }
- return encodeBase64String;
- }
- private static void sendSMS() {
- String text = "보내는 내용...";
- requestUrl += SMS_SERVICEID + requestUrlType;
- String apiUrl = hostNameUrl + requestUrl;
- //System.out.println("APIURL ::: " + requestUrl);
- // JSON 을 활용한 body data 생성
- JSONObject bodyJson = new JSONObject();
- JSONObject toJson = new JSONObject();
- JSONArray toArr = new JSONArray();
- // toJson.put("subject",""); // Optional, messages.subject 개별 메시지 제목,
- // LMS, MMS에서만 사용 가능
- // toJson.put("content","sms test in spring 111"); // Optional,
- // messages.content 개별 메시지 내용, SMS: 최대 80byte, LMS, MMS: 최대 2000byte
- toJson.put("to", "받는번호"); // Mandatory(필수), messages.to 수신번호, -를 제외한 숫자만 입력 가능
- toArr.put(toJson);
- bodyJson.put("type", "LMS"); // Madantory, 메시지 Type (SMS | LMS | MMS), (소문자 가능)
- bodyJson.put("contentType", "COMM"); // Optional, 메시지 내용 Type (AD | COMM)
- // * AD: 광고용, COMM: 일반용 (default: COMM) * 광고용 메시지 발송 시 불법 스팸 방지를 위한
- // 정보통신망법 (제 50조)가 적용됩니다.
- bodyJson.put("countryCode", "82"); // Optional, 국가 전화번호, (default: 82)
- bodyJson.put("from", "보내는번호"); // Mandatory, 발신번호, 사전 등록된 발신번호만 사용 가능
- // bodyJson.put("subject",""); // Optional, 기본 메시지 제목, LMS, MMS에서만 사용 가능
- bodyJson.put("content", text); // Mandatory(필수), 기본 메시지 내용, SMS: 최대 80byte, LMS, MMS: 최대 2000byte
- bodyJson.put("messages", toArr); // Mandatory(필수), 아래 항목들 참조
- // (messages.XXX), 최대 1,000개
- /*
- JSONArray fileArr = new JSONArray();
- JSONObject fileJson = new JSONObject();
- fileJson.put("name", "02.jpg");
- String text = "/CL001/02.jpg";
- byte[] targetBytes = text.getBytes();
- Encoder encoder = Base64.getEncoder();
- byte[] encodedBytes = encoder.encode(targetBytes);
- fileJson.put("body", new String(encodedBytes));
- fileArr.put(fileJson);
- bodyJson.put("files", fileArr);
- */
- // String body = bodyJson.toJSONString();
- try {
- con.setUseCaches(false);
- con.setDoOutput(true);
- con.setDoInput(true);
- con.setRequestProperty("content-type", "application/json");
- con.setRequestProperty("x-ncp-apigw-timestamp", timestamp);
- con.setRequestProperty("x-ncp-iam-access-key", ACCECSS_KEY);
- con.setRequestProperty("x-ncp-apigw-signature-v2", makeSignature(requestUrl, timestamp, method, ACCECSS_KEY, SMS_SECRECT_KEY));
- con.setRequestMethod(method);
- con.setDoOutput(true);
- wr.write(body.getBytes());
- wr.flush();
- wr.close();
- int responseCode = con.getResponseCode();
- BufferedReader br;
- if (responseCode == 202) { // 정상 호출
- con.getInputStream()));
- } else { // 에러 발생
- con.getErrorStream()));
- }
- String inputLine;
- while ((inputLine = br.readLine()) != null) {
- response.append(inputLine);
- }
- br.close();
- }
- }
- }
소스의 원본은 인터넷에서 굴러다니는 거 줒어옴..(냠냠.. 줍줍)
문제가 뭐였냐면... SMS_SECRECT_KEY 이게 문제였음..
원본의 주석에는 SMS SERVICE의 SECRECT KEY를 넣으라고 써 있는데..
계속 인증 오류가 나서.. 혹시나 하는 마음에 ncloud API의 SECRECT KEY를 넣으니 바로 됨.
이 문제로 하루 날린거 생각하면.. 아 진짜... 열받음..
그리고 원래는 MMS로 개발하려 했으나..
네이버 놈들의 부실한 설명으로 이미지를 어떻게 첨부하라는 건지
도대체 알아먹을 수가 없겠음.. (아니면 내가 돌대가리 이거나..)
하여간 그래서 LMS로 전환해서 링크 넣는 식으로 처리해 버림..
(그래도 혹시 나중에 알면 내용 추가할려고 주석으로 흔적만 남겨 놓음)
여기서 끗???!!! 이 아니라.. 난 너무 친절한 놈이라.. JSP 버전도 준비했지!
의외로 JAVA 의 동생뻘이면서 약간씩 다른게 있어서리..
초보자들에게 삽질하지 말라고... (난 천사~~)
그건 다음 포스트에!! 두둥!!! (분량 늘리기냐!!!)
댓글 없음:
댓글 쓰기