From 2e6b5deb0f0893ef95973600dc1c3e0354c51434 Mon Sep 17 00:00:00 2001 From: jiwoo Date: Tue, 14 Nov 2023 14:27:43 +0900 Subject: [PATCH] =?UTF-8?q?=EC=9D=B4=EC=A7=80=EC=9A=B0=20-=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=EC=9E=90=20>=20=EC=B2=AD=EC=86=8C=EB=85=84=20>=20?= =?UTF-8?q?=EA=B5=90=EC=9C=A1=EC=8B=A0=EC=B2=AD=EA=B4=80=EB=A6=AC=20>=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20>=20SMS=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 11 ++ src/main/java/kcc/ve/cmm/VeSendSMS.java | 156 ++++++++++++++++++ .../eduInfo/service/VEEduAplctVO.java | 7 + .../pblc/sndMng/web/SndMngController.java | 66 ++++++++ .../ve/edu/VEEduAplctSndHstry_SQL_Tibero.xml | 13 +- .../oprtn/tngrVisitEdu/eduAplctMngDetail.jsp | 34 +++- .../webapp/WEB-INF/jsp/web/main/mainPage.jsp | 20 +-- 7 files changed, 287 insertions(+), 20 deletions(-) create mode 100644 src/main/java/kcc/ve/cmm/VeSendSMS.java diff --git a/pom.xml b/pom.xml index d1c75cc6..4e8b44e2 100644 --- a/pom.xml +++ b/pom.xml @@ -474,6 +474,17 @@ httpclient 4.3.1 + + org.apache.httpcomponents + httpmime + 4.3.1 + + + org.apache.httpcomponents + httpcore + 4.4.4 + + org.apache.solr diff --git a/src/main/java/kcc/ve/cmm/VeSendSMS.java b/src/main/java/kcc/ve/cmm/VeSendSMS.java new file mode 100644 index 00000000..644b5e04 --- /dev/null +++ b/src/main/java/kcc/ve/cmm/VeSendSMS.java @@ -0,0 +1,156 @@ +package kcc.ve.cmm; + +import java.io.BufferedReader; +import java.io.File; +import java.io.InputStreamReader; +import java.net.URLEncoder; +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.mime.HttpMultipartMode; +import org.apache.http.entity.mime.MultipartEntityBuilder; +import org.apache.http.entity.mime.content.FileBody; +import org.apache.http.impl.client.HttpClients; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import kcc.com.cmm.service.EgovFileMngUtil; + +public class VeSendSMS { + + private static final Logger LOGGER = LoggerFactory.getLogger(EgovFileMngUtil.class); + + + //================================================================ + //찾교 관리자 SMS 발송 - 알리고 API + //사용자 ID : Identifier + //발급 키 : ny3v5te9d8131byxllc8c0v7cmx7jqo1 + + //*Request + // POST /send/ HTTP/1.1 + // Host: apis.aligo.in + // Service Port: 443 + + //key |인증용 API Key |필수 |String + //user_id |사용자id |필수 |String + //sender |발신자 전화번호 (최대 16bytes) |필수 |String + //receiver |수신자 전화번호 - 컴마(,)분기 입력 |필수 |String + //msg |메시지 내용 |필수 |String (1~2,000Byte) + //msg_type |SMS(단문) , LMS(장문), MMS(그림문자) 구분 |X |String + //title |문자제목(LMS,MMS만 허용) |X |String (1~44Byte) + //destination |%고객명% 치환용 입력 |X |String + //rdate |예약일 (현재일이상) |X |YYYYMMDD + //rtime |예약시간 - 현재시간기준 10분이후 |X |HHII + //image1 |첨부이미지 (image 또는 image1) |X |JPEG,PNG,GIF + //image2 |첨부이미지 |X |JPEG,PNG,GIF + //image3 |첨부이미지 |X |JPEG,PNG,GIF + //testmode_yn |연동테스트시 Y 적용 |X |String + + //*Response + //result_code |결과코드(API 수신유무) |Integer + //message |결과 메시지( result_code 가 0 보다 작은경우 실패사유 표기) |String + //msg_id |메시지 고유 ID |Integer + //success_cnt |요청성공 건수 |Integer + //error_cnt |요청실패 건수 |Integer + //msg_type |메시지 타입 (1. SMS, 2.LMS, 3. MMS) |String + //================================================================ + public Map VeSendSMS(String receiver, String msg) throws Exception { + + String result = ""; + Map resultMap = new HashMap<>(); + + try{ + + final String encodingType = "utf-8"; + final String boundary = "____boundary____"; + + /**************** 문자전송하기 예제 ******************/ + /* "result_code":결과코드,"message":결과문구, */ + /* "msg_id":메세지ID,"error_cnt":에러갯수,"success_cnt":성공갯수 */ + /* 동일내용 > 전송용 입니다. + /******************** 인증정보 ********************/ + String sms_url = "https://apis.aligo.in/send/"; // 전송요청 URL + + Map sms = new HashMap(); + + sms.put("user_id", "copy0723"); // SMS 아이디 + sms.put("key", "ny3v5te9d8131byxllc8c0v7cmx7jqo1"); //인증키 + + /******************** 인증정보 ********************/ + + /******************** 전송정보 ********************/ + //msg_type - SMS, LMS, MMS 미지정 시 자동 전환 + sms.put("msg", msg); // 메세지 내용 + sms.put("receiver", receiver); // 수신번호 + //sms.put("destination", "01111111111|담당자,01111111112|홍길동"); // 수신인 %고객명% 치환 + sms.put("sender", "055-792-0233"); // 발신번호 + //sms.put("rdate", ""); // 예약일자 - 20161004 : 2016-10-04일기준 + //sms.put("rtime", ""); // 예약시간 - 1930 : 오후 7시30분 + //sms.put("testmode_yn", "Y"); // Y 인경우 실제문자 전송X , 자동취소(환불) 처리 + sms.put("title", "교육운영관리시스템"); // LMS, MMS 제목 (미입력시 본문중 44Byte 또는 엔터 구분자 첫라인) + + String image = ""; + //image = "/tmp/pic_57f358af08cf7_sms_.jpg"; // MMS 이미지 파일 위치 + + /******************** 전송정보 ********************/ + + MultipartEntityBuilder builder = MultipartEntityBuilder.create(); + + builder.setBoundary(boundary); + builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); + builder.setCharset(Charset.forName(encodingType)); + + for(Iterator i = sms.keySet().iterator(); i.hasNext();){ + String key = i.next(); + builder.addTextBody(key, sms.get(key) + , ContentType.create("Multipart/related", encodingType)); + } + + File imageFile = new File(image); + if(image!=null && image.length()>0 && imageFile.exists()){ + + builder.addPart("image", + new FileBody(imageFile, ContentType.create("application/octet-stream"), + URLEncoder.encode(imageFile.getName(), encodingType))); + } + + HttpEntity entity = builder.build(); + + HttpClient client = HttpClients.createDefault(); + HttpPost post = new HttpPost(sms_url); + post.setEntity(entity); + + HttpResponse res = client.execute(post); + + + if(res != null){ + BufferedReader in = new BufferedReader(new InputStreamReader(res.getEntity().getContent(), encodingType)); + String buffer = null; + while((buffer = in.readLine())!=null){ + result += buffer; + } + in.close(); + } + + ObjectMapper objectMapper = new ObjectMapper(); + resultMap = objectMapper.readValue(result, new HashMap().getClass()); + + System.out.println(result); + + }catch(Exception e){ + System.out.println(e.getMessage()); + } + + return resultMap; + } +} + diff --git a/src/main/java/kcc/ve/instr/tngrVisitEdu/eduInfo/service/VEEduAplctVO.java b/src/main/java/kcc/ve/instr/tngrVisitEdu/eduInfo/service/VEEduAplctVO.java index 438006eb..e794a599 100644 --- a/src/main/java/kcc/ve/instr/tngrVisitEdu/eduInfo/service/VEEduAplctVO.java +++ b/src/main/java/kcc/ve/instr/tngrVisitEdu/eduInfo/service/VEEduAplctVO.java @@ -110,6 +110,7 @@ public class VEEduAplctVO extends ComDefaultVO implements Serializable { private String sndId; //발송자 private String sndCn; //발송내용 private String sndFlag; //메일발송 계정 구분 + private String trgtId; //메일,SMS 대상 ID //ve_edu_chasi private int chasi; // 차시 @@ -1694,6 +1695,12 @@ public class VEEduAplctVO extends ComDefaultVO implements Serializable { public void setCnclCn(String cnclCn) { this.cnclCn = cnclCn; } + public String getTrgtId() { + return trgtId; + } + public void setTrgtId(String trgtId) { + this.trgtId = trgtId; + } } diff --git a/src/main/java/kcc/ve/oprtn/pblc/sndMng/web/SndMngController.java b/src/main/java/kcc/ve/oprtn/pblc/sndMng/web/SndMngController.java index 99cae99e..4487472f 100644 --- a/src/main/java/kcc/ve/oprtn/pblc/sndMng/web/SndMngController.java +++ b/src/main/java/kcc/ve/oprtn/pblc/sndMng/web/SndMngController.java @@ -2,6 +2,7 @@ package kcc.ve.oprtn.pblc.sndMng.web; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Properties; import javax.annotation.Resource; @@ -30,6 +31,7 @@ import kcc.let.uss.ion.cnt.service.CntManageVO; import kcc.let.uss.ion.cnt.service.EgovCntManageService; import kcc.let.utl.fcc.service.EgovCryptoUtil; import kcc.ve.cmm.VeSendMail; +import kcc.ve.cmm.VeSendSMS; import kcc.ve.instr.tngrVisitEdu.asgnmInfo.service.VEAsgnmMIXService; import kcc.ve.instr.tngrVisitEdu.asgnmInfo.service.VEEduPnltyService; import kcc.ve.instr.tngrVisitEdu.asgnmInfo.service.VEInstrFeeService; @@ -405,6 +407,70 @@ public class SndMngController { } + + //================================================================ + //찾교 관리자 SMS 발송 - 알리고 API + //사용자 ID : Identifier + //발급 키 : ny3v5te9d8131byxllc8c0v7cmx7jqo1 + + //*Request + // POST /send/ HTTP/1.1 + // Host: apis.aligo.in + // Service Port: 443 + + //key |인증용 API Key |필수 |String + //user_id |사용자id |필수 |String + //sender |발신자 전화번호 (최대 16bytes) |필수 |String + //receiver |수신자 전화번호 - 컴마(,)분기 입력 |필수 |String + //msg |메시지 내용 |필수 |String (1~2,000Byte) + //msg_type |SMS(단문) , LMS(장문), MMS(그림문자) 구분 |X |String + //title |문자제목(LMS,MMS만 허용) |X |String (1~44Byte) + //destination |%고객명% 치환용 입력 |X |String + //rdate |예약일 (현재일이상) |X |YYYYMMDD + //rtime |예약시간 - 현재시간기준 10분이후 |X |HHII + //image1 |첨부이미지 (image 또는 image1) |X |JPEG,PNG,GIF + //image2 |첨부이미지 |X |JPEG,PNG,GIF + //image3 |첨부이미지 |X |JPEG,PNG,GIF + //testmode_yn |연동테스트시 Y 적용 |X |String + + //*Response + //result_code |결과코드(API 수신유무) |Integer + //message |결과 메시지( result_code 가 0 보다 작은경우 실패사유 표기) |String + //msg_id |메시지 고유 ID |Integer + //success_cnt |요청성공 건수 |Integer + //error_cnt |요청실패 건수 |Integer + //msg_type |메시지 타입 (1. SMS, 2.LMS, 3. MMS) |String + //================================================================ + @RequestMapping(value="offeduSMSSndAjax.do") + public ModelAndView offeduSMSSndAjax(VEEduAplctVO vEEduAplctVO) throws Exception { + + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("jsonView"); + + String result = "success"; + String message = "정상적으로 발송되었습니다."; + + VeSendSMS sendSMS = new VeSendSMS(); + Map resultMap = sendSMS.VeSendSMS(vEEduAplctVO.getClphone(), vEEduAplctVO.getSndCn()); + + LoginVO loginVO = checkLoginUtil.getAuthLoginVO(); + + //문자 발송 성공 시 로그 + if("1".equals(resultMap.get("result_code"))){ + String snd_ord = sndGnrService.getNextStringId(); + vEEduAplctVO.setSndHstryOrd(snd_ord); + vEEduAplctVO.setSndId(loginVO.getUniqId()); + vEEduAplctVO.setTrgt(vEEduAplctVO.getClphone()); + vEEduAplctSndHstryService.insert(vEEduAplctVO); + }else { + result = "fail"; + message = resultMap.get("message").toString(); + } + modelAndView.addObject("result", result); + modelAndView.addObject("message", message); + return modelAndView; + } + ////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // diff --git a/src/main/resources/egovframework/sqlmap/ve/edu/VEEduAplctSndHstry_SQL_Tibero.xml b/src/main/resources/egovframework/sqlmap/ve/edu/VEEduAplctSndHstry_SQL_Tibero.xml index 10d18a26..fe54214d 100644 --- a/src/main/resources/egovframework/sqlmap/ve/edu/VEEduAplctSndHstry_SQL_Tibero.xml +++ b/src/main/resources/egovframework/sqlmap/ve/edu/VEEduAplctSndHstry_SQL_Tibero.xml @@ -19,7 +19,9 @@ snd_cd, snd_pnttm, snd_id, - snd_cn + snd_cn, + trgt_id, + trgt @@ -61,8 +63,9 @@ #sndCd#, SYSDATE, #sndId#, - SUBSTR(#sndCn#,0,950) - + SUBSTR(#sndCn#,0,950), + #trgtId#, + #trgt# /* sndCn */ @@ -86,6 +89,10 @@ , snd_cn = sndCn */ , snd_cn = SUBSTR(#sndCn#,0,950) + + , trgt_id = #trgtId# + + , trgt = #trgt# diff --git a/src/main/webapp/WEB-INF/jsp/oprtn/tngrVisitEdu/eduAplctMngDetail.jsp b/src/main/webapp/WEB-INF/jsp/oprtn/tngrVisitEdu/eduAplctMngDetail.jsp index 70e6affc..8723bfe7 100644 --- a/src/main/webapp/WEB-INF/jsp/oprtn/tngrVisitEdu/eduAplctMngDetail.jsp +++ b/src/main/webapp/WEB-INF/jsp/oprtn/tngrVisitEdu/eduAplctMngDetail.jsp @@ -187,7 +187,7 @@ } //sms 발송 - function fncSndSms(){ + /* function fncSndSms(){ var p_smsMsg = $("#smsMsg").val(); @@ -203,6 +203,24 @@ p_smsMsg, "" ); + } */ + + function fncSndSms(){ + + var p_smsMsg = $("#smsMsg").val(); + + if (p_smsMsg==""){ + alert("SMS 발송 내용은 필수값입니다."); + return false; + } + + + fncContent( + "${pageContext.request.contextPath}/kccadr/oprtn/pblc/offeduSMSSndAjax.do", + "10", //코드 10:sms 20:mail + p_smsMsg, + "" + ); } //이메일 발송 @@ -237,7 +255,8 @@ "eduAplctOrd": $("#eduAplctOrd").val(), "clphone": '', "email": '', - "sndFlag": p_flag + "sndFlag": p_flag, + "trgtId" : '' }, dataType:'json', /* @@ -249,10 +268,9 @@ success:function(returnData){ if(returnData.result == "success"){ - alert("정상적으로 발송되었습니다."); - + alert(returnData.message); }else{ - alert("발송 중 오류가 발생하였습니다."); + alert(returnData.message); } }, error:function(request , status, error){ @@ -682,10 +700,12 @@
- + + +
-

0/90 byte

+ diff --git a/src/main/webapp/WEB-INF/jsp/web/main/mainPage.jsp b/src/main/webapp/WEB-INF/jsp/web/main/mainPage.jsp index 835d5c4b..42e37f13 100644 --- a/src/main/webapp/WEB-INF/jsp/web/main/mainPage.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/main/mainPage.jsp @@ -188,7 +188,7 @@ function instrChk(){

대국민 저작권 교육 서비스

찾아가는 교육 청소년!

편리하고 안전한 저작권 이용환경 조성을 통해 올바른 저작권 문화 구축에 앞장서겠습니다.

- 교육신청 등록 + 교육신청 등록 @@ -198,7 +198,7 @@ function instrChk(){

대국민 저작권 교육 서비스

찾아가는 교육 성인!

편리하고 안전한 저작권 이용환경 조성을 통해 올바른 저작권 문화 구축에 앞장서겠습니다.

- 교육신청 등록 + 교육신청 등록 @@ -208,7 +208,7 @@ function instrChk(){

대국민 저작권 교육 서비스

체험교실!

편리하고 안전한 저작권 이용환경 조성을 통해 올바른 저작권 문화 구축에 앞장서겠습니다.

- 교육신청 등록 + 교육신청 등록 @@ -218,7 +218,7 @@ function instrChk(){

대국민 저작권 교육 서비스

실무역량강화!

편리하고 안전한 저작권 이용환경 조성을 통해 올바른 저작권 문화 구축에 앞장서겠습니다.

- 교육신청 등록 + 교육신청 등록 @@ -228,7 +228,7 @@ function instrChk(){

대국민 저작권 교육 서비스

교육조건부 기소유예교육!

편리하고 안전한 저작권 이용환경 조성을 통해 올바른 저작권 문화 구축에 앞장서겠습니다.

- 교육신청 등록 + 교육신청 등록 @@ -244,31 +244,31 @@ function instrChk(){