네이버 ncloud SENS (Simple & Easy Notification Service) 로 문자 전송
대망의 JSP 편!!
할말이 없으니 바로 소스
앞선 글에서 귀찮아서 안 적었는데 혹시 모르니..
일단 사용하고 있는 라이브러리 인증샷!
하일라이트는 아무 의미 없는 것이다!!
gson은 다른 서비스 개발하느라 쓰는 중이고..
문자 때문에 추가한 라이브러리는 하단의 4개
json-20220924.jar
json-simple-1.1.1.jar
security~~~~~.jar
server-1.0~~~~~.jar
json 라이브러리는 구글링 하면 나오고.. 밑에 2개는 네이버에서 제공하는 SDK임..
위에 들어가서 Server와 Security 만 받으면 됨.
자 이제 진짜 소스!!
- <%@ include file="내가 만든 개발 환경 설정용 코드.jsp" %>
- <%@page import = "java.io.BufferedReader" %>
- <%@page import = "java.io.DataOutputStream" %>
- <%@page import = "java.io.InputStreamReader" %>
- <%@page import = "java.io.PrintWriter" %>
- <%@page import = "java.io.UnsupportedEncodingException" %>
- <%@page import = "java.net.HttpURLConnection" %>
- <%@page import = "java.net.URL" %>
- <%@page import = "java.net.HttpURLConnection" %>
- <%@page import = "java.security.InvalidKeyException" %>
- <%@page import = "java.security.NoSuchAlgorithmException" %>
- <%@page import = "java.util.Base64" %>
- <%@page import = "org.json.JSONArray" %>
- <%@page import = "org.json.JSONException" %>
- <%@page import = "org.json.JSONObject" %>
- <%@page import = "javax.crypto.Mac" %>
- <%@page import = "javax.crypto.spec.SecretKeySpec" %>
- <%!
- //jsp는 final static 선언이 안되서 이렇게 따로 선언부를 두고 써야 함.
- String idx = "";
- String tgt = "";
- String msgbody = "";
- String title = "";
- String msgImgPath = "";
- String host = "첨부파일 앞에 붙일 host 주소";
- %>
- <%
- idx = request.getParameter("idx")==null ? "" : request.getParameter("idx");
- tgt = request.getParameter("tgt")==null ? "" : request.getParameter("tgt");
- msgbody = request.getParameter("msgbody")==null ? "" : request.getParameter("msgbody");
- title = request.getParameter("title")==null ? "" : request.getParameter("title");
- Class.forName("org.mariadb.jdbc.Driver");
- PreparedStatement pstmt = null;
- ResultSet rs = null;
- String sql = "첨부링크로 보낼 파일 경로를 가져오는 쿼리가 있었음";
- try {
- pstmt = conn.prepareStatement(sql);
- rs = pstmt.executeQuery();
- if(rs.next()) {
- msgImgPath = rs.getString("filepath");
- sendSMS();
- }
- rs.close();
- pstmt.close();
- e.printStackTrace();
- }
- %>
- <%!
- // https://api.ncloud-docs.com/docs/common-ncpapi
- public String makeSignature(String url, String timestamp, String method, String accessKey, String secretKey) throws NoSuchAlgorithmException, InvalidKeyException {
- .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);
- // TODO Auto-generated catch block
- encodeBase64String = e.toString();
- }
- return encodeBase64String;
- }
- private void sendSMS() {
- String ACCECSS_KEY = "네이버 API 키";
- String SMS_SERVICEID = "SMS SERVICE ID 넣으셈";
- String API_SECRECT_KEY = "네이버 API 키의 SECRECT KEY";
- String accessKey = ACCECSS_KEY; // 네이버 클라우드 플랫폼 회원에게 발급되는 개인 인증키 // Access Key : https://www.ncloud.com/mypage/manage/info > 인증키 관리 > Access Key ID
- String secretKey = API_SECRECT_KEY; // API 개인 인증키의 secret key // Service Key : https://www.ncloud.com/mypage/manage/info > 인증키 관리 > Access Key ID
- String serviceId = SMS_SERVICEID; // 프로젝트에 할당된 SMS 서비스 ID // service ID : https://console.ncloud.com/sens/project > Simple & ... > Project > 서비스 ID
- requestUrl += serviceId + requestUrlType;
- String apiUrl = hostNameUrl + requestUrl;
- // JSON 을 활용한 body data 생성
- JSONObject bodyJson = new JSONObject();
- JSONObject toJson = new JSONObject();
- JSONArray toArr = new JSONArray();
- toJson.put("subject",title); // Optional, messages.subject 개별 메시지 제목, LMS, MMS에서만 사용 가능
- //toJson.put("content","sms test in spring 111"); // Optional, messages.content 개별 메시지 내용, SMS: 최대 80byte, LMS, MMS: 최대 2000byte
- toJson.put("to",tgt); // Mandatory(필수), messages.to 수신번호, -를 제외한 숫자만 입력 가능
- toArr.put(toJson);
- bodyJson.put("type","LMS"); // Madantory, 메시지 Type (SMS | LMS | MMS), (소문자 가능)
- //bodyJson.put("contentType",""); // 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",msgbody + "\n" + host + msgImgPath); // Mandatory(필수), 기본 메시지 내용, SMS: 최대 80byte, LMS, MMS: 최대 2000byte
- bodyJson.put("messages", toArr); // Mandatory(필수), 아래 항목들 참조 (messages.XXX), 최대 1,000개
- //String body = bodyJson.toJSONString();
- //System.out.println(body);
- 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", accessKey);
- con.setRequestProperty("x-ncp-apigw-signature-v2", makeSignature(requestUrl, timestamp, method, accessKey, secretKey));
- con.setRequestMethod(method);
- con.setDoOutput(true);
- wr.write(body.getBytes());
- wr.flush();
- wr.close();
- int responseCode = con.getResponseCode();
- BufferedReader br;
- if(responseCode == 202) { // 정상 호출
- } else { // 에러 발생
- }
- String inputLine;
- while ((inputLine = br.readLine()) != null) {
- response.append(inputLine);
- }
- br.close();
- //System.out.println(response.toString());
- //out.println(tgt);
- //out.println(response.toString());
- //out.print(e.getMessage());
- e.printStackTrace();
- }
- }
- %>
개발한 것은.. 뭐 입력 폼에서 POST로 제목, 내용 등을 POST로 넘겨서
처리한 것으로 jsp 는 final static 이 선언이 안되서
<%! %> 이 선언부에 일단 변수를 선언하고
값을 받아서 할당하는 식으로 처리했음..
JAVA랑 미묘하게 다른 부분이 있어서 헷갈리는 삐약이들을 위해 소스 공개함..
다시 한번 말하지만... 남에게 뭔가를 공개하려면
그 공개하면서 시간들이는 노고는 알지만.. 그래도 좀 확인은 하고 공개합시다..
잘못된 정보로 그걸 보고 하는 사람은 수많은 시행착오를 겪게 된다오..
자... 그럼.. 끗!!
댓글 없음:
댓글 쓰기