Compare commits

...

60 Commits

Author SHA1 Message Date
hehihoho3@gmail.com
3a3867558e 5858 사이트맵 수정 2025-12-05 14:05:29 +09:00
hehihoho3@gmail.com
89aa2f99ab Merge branch 'api_advc' 2025-12-03 14:00:44 +09:00
hehihoho3@gmail.com
3341a8ce51 api 다운로드 URL 수정 샘플_예지_e2 -> r3 2025-12-03 14:00:38 +09:00
hehihoho3@gmail.com
5da092f832 Merge branch 'api_advc' 2025-12-03 12:53:40 +09:00
hehihoho3@gmail.com
d9ee601c42 5585 관련 api 정보에서 친구톡 제거 2025-12-03 12:53:33 +09:00
hehihoho3@gmail.com
4fdb8c7811 Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2025-12-01 11:15:10 +09:00
subsub
60af9f69dc 안드로이드 문구 갤럭시로 수정 2025-11-11 15:48:15 +09:00
subsub
dc441de569 (사용자) 폰주소록 등록 > 핸드폰 > 아이폰 추가 2025-11-11 15:24:30 +09:00
hehihoho3@gmail.com
b1a75f98ec 수신번호 하이픈 제거 2025-11-07 12:41:55 +09:00
hehihoho3@gmail.com
9ee68ddb1b 엑셀다운로드 web api 오류 수정 2025-11-06 15:07:18 +09:00
hehihoho3@gmail.com
d95ee87570 Merge branch 'master' into api_advc 2025-10-30 14:40:20 +09:00
hehihoho3@gmail.com
e0ac062274 카톡발송결과_수신자번호검색추가 2025-10-30 14:24:47 +09:00
hehihoho3@gmail.com
f1f610d0e8 Merge branch 'at_emoji' 2025-10-29 14:06:34 +09:00
hehihoho3@gmail.com
dfa0306189 Merge branch '5128_발송결과_리스트_내_수신번호_검색' 2025-10-29 14:05:26 +09:00
hehihoho3@gmail.com
11c9136f56 발송결과 수신번호 검색 2025-10-29 14:05:07 +09:00
hehihoho3@gmail.com
61ff9702bf jdbc url 수정 2025-10-28 15:04:21 +09:00
hehihoho3@gmail.com
01163c21df 알림톡 이모지 추가 2025-10-28 10:40:08 +09:00
subsub
7663b6f082 맞춤제작 요청 팝업 안내문구 추가, 제공방법 카카오톡 문구 문자로 변경 2025-10-27 11:34:23 +09:00
hehihoho3@gmail.com
3f68d808b4 api 예제 다운로드 링크 수정 2025-10-22 10:06:51 +09:00
hehihoho3@gmail.com
419c13528c 예제 다운로드 퍼블 수정 2025-10-22 10:02:54 +09:00
hehihoho3@gmail.com
324767d86d api 예제 다운로드 수정 2025-10-22 09:46:12 +09:00
hehihoho3@gmail.com
aee4527d18 시큐리티.xml 머지 완료 2025-10-22 09:36:19 +09:00
hehihoho3@gmail.com
c4107dd459 Merge branch 'cert_owner_name' 2025-10-17 18:44:34 +09:00
hehihoho3@gmail.com
5242047745 발신번호 인증 이름 2025-10-17 17:44:08 +09:00
fd7112cef8 구버전 본인인증 jar 삭제 2025-10-17 16:32:12 +09:00
hehihoho3@gmail.com
62e6fe53d8 Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2025-10-17 15:29:16 +09:00
hehihoho3@gmail.com
e48922754c 카카오톡 환불 sql에 FORCE index (IDX_MJ_MSG_DATA_13) 임시 추가 2025-10-17 15:29:09 +09:00
hehihoho3@gmail.com
7e06e08294 Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2025-10-17 11:29:48 +09:00
708aca25bc 카톡 환불 메소드 주기 수정 runKakaoOneTime
//	@Scheduled(cron = "0 0/3 * * * ?") 	// 3분마다 실행
	@Scheduled(cron = "0 0 0/2 * * ?") // 매시간 정각마다 실행
2025-10-17 11:29:40 +09:00
hehihoho3@gmail.com
21e0d52168 친구톡,알림톡 at_smishing_yn 데이터 null 방지 추가 2025-10-16 10:22:30 +09:00
hehihoho3@gmail.com
321bb9adeb 동보문자도 오픈 2025-10-15 18:15:02 +09:00
hehihoho3@gmail.com
523522cdd9 선거문자 임시 오픈 2025-10-15 17:50:58 +09:00
hehihoho3@gmail.com
9764781c22 Merge branch 'api_advc' of
http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git into api_advc
2025-10-15 17:45:41 +09:00
hehihoho3@gmail.com
31df8725ef [임시]선거문자 접근 IP 개발서버 활성화 2025-10-15 17:44:42 +09:00
hehihoho3@gmail.com
ef7d42b187 [임시]선거문자 접근 IP 개발서버 활성화 2025-10-15 17:37:23 +09:00
hehihoho3@gmail.com
d41c503de7 Merge branch 'master' into 알림톡api 2025-10-15 10:55:33 +09:00
c1d1913882 Merge branch 'master' of http://tolag3@vcs.iten.co.kr:9999/hylee/mjon_git 2025-10-13 10:44:08 +09:00
12eaff7979 Merge branch '4608_kmc암호화모듈' into master_tolag3 2025-10-13 10:27:13 +09:00
JIWOO
f1d93cfa14 이지우 - 채널명(발신프로필) 조인 원복 2025-09-29 14:12:58 +09:00
JIWOO
f2e5c4c608 Merge branch 'master' into 카카오톡_발신프로필 2025-09-24 15:46:55 +09:00
JIWOO
f9b34066d4 이지우 - 발신프로필 중복 등록 시 alert 문구 변경 2025-09-24 15:46:04 +09:00
JIWOO
be056b1b9e 이지우 - 사용자 카카오톡 발신프로필 등록 로직 변경 2025-09-19 11:24:23 +09:00
d5425fc8de Merge branch 'master_tolag3' 2025-09-18 11:06:31 +09:00
83a5d12869 /web/user/login/usrIdCheckAjax.do
무차별대입 공격대응
2025-09-18 11:06:12 +09:00
4d04091eb7 /web/user/login/usrIdCheckAjax.do 2025-09-18 11:04:39 +09:00
0377e75ebf http://pms.iten.co.kr:9999/issues/5419#note-10
수정
2025-09-16 12:23:09 +09:00
96583304ec 발송 기준 수정 2025-09-11 17:58:32 +09:00
hehihoho3@gmail.com
9f14958357 알림톡 스미싱오류 2025-09-11 15:26:48 +09:00
JIWOO
8edded03fb 이지우 - 사용자 > 요금 사용내역 > 검색 3개월 제한 제거 / 사용내역서 팩스 td 수정 2025-09-10 18:35:50 +09:00
ac0a3fb907 Merge branch '5419_전화번호거짓표시50건이상' into 4608_kmc암호화모듈 2025-09-10 14:53:45 +09:00
94c13d02ea 사용자 발송결과 > 수신번호 검색자 추가 2025-09-10 12:38:11 +09:00
bfe5f333f9 git ignore 추가 2025-09-10 11:19:15 +09:00
f4ae2dcf53 Merge branch 'master' into 4608_kmc암호화모듈 2025-09-10 11:17:55 +09:00
6f822ffa67 Merge branch 'master' into 5419_전화번호거짓표시50건이상
개발시 사용한 sysout 삭제
2025-09-10 11:13:02 +09:00
6460d95b8c Merge branch 'master' into 5419_전화번호거짓표시50건이상 2025-09-10 11:04:56 +09:00
fff68682bd 50건이상 발송시 안내문자 발송 관리자 on/off기능 추가 2025-09-10 11:03:50 +09:00
c664e67c59 [KISA] 전화번호 거짓표시 금지 고시 개정 관련 "대량문자 발송안내 서비스" 시스템 적용 요청
http://pms.iten.co.kr:9999/issues/5419
2025-08-29 18:03:47 +09:00
3dc2bb67d9 kmc 암호화모듈 개발완료
http://pms.iten.co.kr:9999/issues/4608
2025-08-26 09:28:44 +09:00
b63aad38d2 기존 jar 삭제 2025-08-25 11:07:42 +09:00
7374d2b65d kmc 본인인증 암호화 모듈 개발중 2025-08-25 11:03:20 +09:00
83 changed files with 1226 additions and 2601 deletions

1
.claude/.gitignore vendored
View File

@ -1 +1,2 @@
/settings.local.json
/mcp_settings.json

7
.gitignore vendored
View File

@ -204,3 +204,10 @@ rebel.xml
/.gemini
/.gemini.zip
/CLAUDE.md
<<<<<<< HEAD
# Mac OS
=======
### Mac OS ###
>>>>>>> refs/heads/5419_전화번호거짓표시50건이상
.DS_Store

11
pom.xml
View File

@ -146,7 +146,7 @@
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.31</version>
<version>5.1.49</version>
</dependency>
<!-- oracle 10g driver -->
@ -477,12 +477,19 @@
</dependency>
<!-- kmc 본인인증 -->
<dependency>
<!-- <dependency>
<groupId>kmc</groupId>
<artifactId>ICERTSecu_JDK18</artifactId>
<version>1</version>
<scope>system</scope>
<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/ICERTSecu_JDK18.jar</systemPath>
</dependency> -->
<!-- kmc 본인인증 ver 2 암호화 모듈 추가 버전 -->
<dependency>
<groupId>kmc</groupId>
<artifactId>ICERTSecu</artifactId>
<version>JDK18_v2</version>
</dependency>

View File

@ -61,6 +61,7 @@ public class IPIgnoreInterceptorHandler extends HandlerInterceptorAdapter{
v_ret = false;
}
// lettnloginlog 테이블에 insert 패턴 추가 (/web/user/login/usrIdCheckAjax.do)
}else if(request.getRequestURI().indexOf("ListAjax.do")>-1
|| request.getRequestURI().indexOf("ViewAjax.do")>-1
|| request.getRequestURI().indexOf("DataAjax.do")>-1
@ -74,6 +75,7 @@ public class IPIgnoreInterceptorHandler extends HandlerInterceptorAdapter{
|| request.getRequestURI().indexOf("MapUrl")>-1
|| request.getRequestURI().indexOf("uss/ion/fms/FmsFileInsertAjax")>-1
|| request.getRequestURI().indexOf("web/mjon/addr/sendExelFilePhoneNumAjax")>-1
|| request.getRequestURI().indexOf("/web/user/login/usrIdCheckAjax.do")>-1

View File

@ -34,12 +34,11 @@ public class CertPhoneWebController {
@RequestMapping(value = {"/web/cert/log/insertCertLog.do"})
public ResponseEntity<StatusResponse> insertCertLog(HttpServletRequest request) throws Exception {
return ResponseEntity.ok().body(new StatusResponse(HttpStatus.OK, certPhoneService.insertCertLog(request), LocalDateTime.now()));
}
}
@RequestMapping(value = {"/web/cert/log/kmcErrorPage.do"})
public String kmcErrorPage() throws Exception {
return "web/cop/kmc/certResultError";
}
}

View File

@ -135,6 +135,7 @@ public class KakaoSendUtil {
// 사용자 개인 단가 정보 불러오기
MberManageVO mberManageVO = mjonMsgDataService.selectMberManageInfo(kakaoVO.getUserId());
kakaoVO.setAtSmishingYn(mberManageVO.getAtSmishingYn());
float shortPrice = getValidPrice(mberManageVO.getShortPrice(), sysJoinSetVO.getShortPrice());
float longPrice = getValidPrice(mberManageVO.getLongPrice(), sysJoinSetVO.getLongPrice());
@ -354,7 +355,8 @@ public class KakaoSendUtil {
MberManageVO mberManageVO = mjonMsgDataService.selectMberManageInfo(kakaoVO.getUserId());
// 시스템 기본 단가 정보 불러오기
JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo();
kakaoVO.setAtSmishingYn(mberManageVO.getAtSmishingYn());
// 치환 문구가 있는지 확인
Boolean replaceYN = MsgSendUtils.getReplaceYN(templateContent);
@ -1892,7 +1894,8 @@ public class KakaoSendUtil {
Float totPrice = eachPrice * instCnt;
sendVO.setTotPrice(String.format("%.1f", totPrice));
sendVO.setAtDelayYn(kakaoVO.getAtDelayYn());
// sendVO.setAtDelayYn(kakaoVO.getAtDelayYn());
sendVO.setAtDelayYn(kakaoVO.getAtSmishingYn());
sendVO.setBizKakaoResendOrgnlTxt(kakaoVO.getSubMsgTxt());
sendVO.setBizKakaoResendType(sendVO.getSubMsgType());
sendVO.setBizKakaoImageType(kakaoVO.getImageType());

View File

@ -148,24 +148,8 @@ public class KakaoApiProfile {
kakaoReturnVO.setBizReturnMsg(msg);
if(code.equals("200")) {
JSONObject tempCate = (JSONObject) object.get("data");
String senderKey = tempCate.get("senderKey").toString();
kakaoVO.setSenderKey(senderKey);
int profileCnt = kakaoApiService.selectKakaoProfileCnt(kakaoVO);
//중복된 발신프로필이 없으면 추가 입력
if(profileCnt == 0) {
kakaoApiService.insertKakaoProfileInfo(kakaoVO);
}else {//중복이 있는 경우 처리
kakaoReturnVO.setBizReturnCode("310");
kakaoReturnVO.setBizReturnMsg("이미 등록되어 있는 발신프로필 입니다");
return kakaoReturnVO;
}
kakaoReturnVO.setSenderKey((String) ((JSONObject) object.get("data")).get("senderKey"));
}
}else {
kakaoReturnVO.setBizReturnCode(statusCode);

View File

@ -4,7 +4,7 @@ import java.util.List;
import javax.servlet.http.HttpServletRequest;
import itn.let.kakao.kakaoComm.KakaoSendAdvcVO;
import itn.let.kakao.kakaoComm.KakaoReturnVO;
import itn.let.kakao.kakaoComm.KakaoVO;
import itn.let.mail.service.StatusResponse;
import itn.let.mjo.msgdata.service.MjonMsgReturnVO;
@ -29,4 +29,7 @@ public interface KakaoAlimTalkService {
public List<KakaoVO> selectKakaoSentRefundListForSingle() throws Exception;
public void kakaoSingleRefund(KakaoVO kakaoVO) throws Exception;
//발신 프로필 등록 처리
public KakaoReturnVO createKaKaoProfile(KakaoVO kakaoVO) throws Exception;
}

View File

@ -20,8 +20,6 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;
import egovframework.rte.fdl.idgnr.EgovIdGnrService;
@ -29,9 +27,11 @@ import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
import itn.com.cmm.LoginVO;
import itn.com.utl.fcc.service.EgovStringUtil;
import itn.let.kakao.kakaoComm.BizKakaoPriceVO;
import itn.let.kakao.kakaoComm.KakaoReturnVO;
import itn.let.kakao.kakaoComm.KakaoSendAdvcVO;
import itn.let.kakao.kakaoComm.KakaoSendUtil;
import itn.let.kakao.kakaoComm.KakaoVO;
import itn.let.kakao.kakaoComm.kakaoApi.service.KakaoApiService;
import itn.let.kakao.user.kakaoAt.service.KakaoAlimTalkService;
import itn.let.mail.service.StatusResponse;
import itn.let.mjo.mjocommon.MjonCommon;
@ -86,6 +86,9 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements
/** userManageService */
@Resource(name = "userManageService")
private EgovUserManageService userManageService;
@Resource(name = "kakaoApiService")
private KakaoApiService kakaoApiService;
@Autowired
private MjonPayDAO mjonPayDAO;
@ -990,6 +993,8 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements
KakaoSendAdvcVO sendVO = groupedMsgList.get(0);
// log.info(" ++ kakaoVO.getAtSmishingYn() :: [{}]", kakaoVO.getAtSmishingYn());
// log.info(" ++ kakaoVO.getAtDelayYn() :: [{}]", kakaoVO.getAtDelayYn());
/** @groupData 테이블 insert */
kakaoSendUtil.insertKakaoGroupDataTb_advc(instCnt, kakaoVO, sendVO);
@ -1251,5 +1256,31 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements
@Override
public KakaoReturnVO createKaKaoProfile(KakaoVO kakaoVO) throws Exception {
KakaoReturnVO returnVO = new KakaoReturnVO();
/* senderKey 사용 우무 */
int profileCnt = kakaoApiService.selectKakaoProfileCnt(kakaoVO);
if(profileCnt > 0) {
returnVO.setBizReturnMsg("이미 등록된 발신프로필입니다. 동일 채널ID는 중복 등록이 불가합니다.");
}else {
List<KakaoVO> delProfileList = new ArrayList<KakaoVO>();
delProfileList = selectDeleteProfileInfo(kakaoVO);
if(delProfileList.size() != 0) {
kakaoVO.setProfileId(delProfileList.get(0).getProfileId());
kakaoVO.setDeleteYn("N");
updateKakaoProfileStatus(kakaoVO);
returnVO.setBizReturnMsg("삭제 발신프로필의 복구가 완료 되었습니다.");
}else {
kakaoApiService.insertKakaoProfileInfo(kakaoVO);
returnVO.setBizReturnMsg("발신프로필의 등록이 완료 되었습니다.");
}
}
return returnVO;
}
}

View File

@ -96,7 +96,10 @@ public class KakaoAlimTalkController {
KakaoReturnVO tmpProfileVO = kakaoApiProfile.kakaoApiProfileList(kakaoProfileVO);
resultApiProfileList.add(tmpProfileVO);
/* API를 통하여 정상적으로 조회된 프로필만 add 처리 */
if("200".equals(tmpProfileVO.getBizReturnCode())) {
resultApiProfileList.add(tmpProfileVO);
}
}
@ -137,21 +140,8 @@ public class KakaoAlimTalkController {
KakaoReturnVO kakaoInfo = kakaoApiProfile.kakaoApiProfileToken(kakaoVO); //발신프로필 인증 토큰 요청하기
String bizReturnCd = kakaoInfo.getBizReturnCode();
String bizReturnMsg = kakaoInfo.getBizReturnMsg();
List<KakaoVO> delProfileList = new ArrayList<KakaoVO>();
if(bizReturnCd.equals("310") && bizReturnMsg.equals("이미 등록되어 있는 발신프로필 입니다")) {
kakaoVO.setUserId(userId);
delProfileList = kakaoAlimTalkService.selectDeleteProfileInfo(kakaoVO);
}
int listSize = delProfileList.size();
modelAndView.addObject("kakaoInfo", kakaoInfo);
modelAndView.addObject("result", "success");
modelAndView.addObject("delInfoCnt", listSize);
}catch(Exception ex){
ex.printStackTrace();
@ -269,68 +259,14 @@ public class KakaoAlimTalkController {
kakaoVO.setLastUpdusrId(userId);
KakaoReturnVO kakaoInfo = kakaoApiProfile.kakaoApiProfileCreate(kakaoVO);
String bizReturnCd = kakaoInfo.getBizReturnCode();
String bizReturnMsg = kakaoInfo.getBizReturnMsg();
System.out.println(bizReturnCd);
System.out.println(bizReturnMsg);
/*
* 기존에 등록된 발신프로필이라고 결과가 오는 경우 데이터베이스에서 삭제 기록을 조회해 본다.
* 삭제 기록이 있는 경우 복구를 해주고(deleteYn 값을 'N'으로 변경)
* 기록이 없는 경우 사이트에 등록되었을 있음.
*
* */
List<KakaoVO> delProfileList = new ArrayList<KakaoVO>();
if((bizReturnCd.equals("509") && bizReturnMsg.equals("이미 사용중인 카카오톡 채널입니다.")) || (bizReturnCd.equals("310") && bizReturnMsg.equals("이미 등록되어 있는 발신프로필 입니다"))) {
delProfileList = kakaoAlimTalkService.selectDeleteProfileInfo(kakaoVO);
}
//삭제처리된 발신프로필이 있는 경우
if(delProfileList != null && delProfileList.size() > 0) {
int resultCnt = 0;
for(int i=0; i< delProfileList.size(); i++) {
KakaoVO tmpKakaoVO = new KakaoVO();
tmpKakaoVO.setUserId(userId);
tmpKakaoVO.setProfileId(delProfileList.get(i).getProfileId());
tmpKakaoVO.setDeleteYn("N");
int count = kakaoAlimTalkService.updateKakaoProfileStatus(tmpKakaoVO);
resultCnt = resultCnt + count;
}
KakaoReturnVO kakaoReturnVO = new KakaoReturnVO();
if(resultCnt > 0) {
kakaoReturnVO.setBizReturnCode("200");
kakaoReturnVO.setBizReturnMsg("삭제 발신프로필의 복구가 완료 되었습니다.");
modelAndView.addObject("kakaoInfo", kakaoReturnVO);
modelAndView.addObject("result", "success");
}else {
kakaoReturnVO.setBizReturnCode("200");
kakaoReturnVO.setBizReturnMsg("삭제 발신프로필의 복구에 오류가 발생하였습니다.");
modelAndView.addObject("kakaoInfo", kakaoReturnVO);
modelAndView.addObject("result", "zeroUpdate");
}
}else {//삭제된 내역이 없는 경우 사이트에 발신프로필이 등록되어 있을 있다.
modelAndView.addObject("kakaoInfo", kakaoInfo);
modelAndView.addObject("result", "success");
if("200".equals(kakaoInfo.getBizReturnCode())) {
kakaoVO.setSenderKey(kakaoInfo.getSenderKey());
KakaoReturnVO internalReuslt = kakaoAlimTalkService.createKaKaoProfile(kakaoVO);
kakaoInfo.setBizReturnMsg(internalReuslt.getBizReturnMsg());
}
modelAndView.addObject("kakaoInfo", kakaoInfo);
modelAndView.addObject("result", "success");
}
}catch(Exception ex){

View File

@ -34,6 +34,7 @@ import org.springframework.stereotype.Service;
import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;
import egovframework.rte.fdl.idgnr.EgovIdGnrService;
import itn.com.cmm.util.StringUtil;
import itn.let.kakao.admin.kakaoAt.service.MjonKakaoATVO;
import itn.let.kakao.user.sent.service.KakaoSentDetailVO;
import itn.let.kakao.user.sent.service.KakaoSentService;
@ -141,6 +142,12 @@ public class KakaoSentServiceImpl extends EgovAbstractServiceImpl implements Ka
List<KakaoSentVO> resultList = new ArrayList<KakaoSentVO>();
//수신번호 검색 번호 포멧 통일
if("4".equals(kakaoSentVO.getSearchCondition()) && StringUtil.isNotEmpty(kakaoSentVO.getSearchKeyword())) {
kakaoSentVO.setSearchKeyword(kakaoSentVO.getSearchKeyword().trim().replace("-", ""));
}
resultList = kakaoSentDAO.selectAllKakaoSentList_advc(kakaoSentVO);
System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
@ -653,7 +660,7 @@ public class KakaoSentServiceImpl extends EgovAbstractServiceImpl implements Ka
data[i][1] = sdf.format(vo.getReqdate());
//구분
data[i][2] = "H".equals(vo.getSendKind()) ? "WEB" : "API";
data[i][2] = "A".equals(vo.getSendKind()) ? "API" : "WEB";
//채널ID
data[i][3] = vo.getYellowId();

View File

@ -74,7 +74,7 @@ public class AddrGroupController {
private EgovMberManageService mberManageService;
@Resource(name = "KmcCertChecker")
private KmcCertChecker kmcCertCheck;
private KmcCertChecker kmcCertChecker;
/**
* 주소록 그룹 리스트
@ -954,7 +954,7 @@ public class AddrGroupController {
mberCertPhoneVO.setTrUrl("/web/cop/kmc/authRequestAddrSubmitAjax.do");
mberCertPhoneVO.setPlusInfo(mberManageVO.getMberId());
AuthCertVO certVO = kmcCertCheck.authCertCheck(mberCertPhoneVO, request);
AuthCertVO certVO = kmcCertChecker.authCertCheck(mberCertPhoneVO, request);
modelAndView.addObject("tr_cert", certVO.getTr_cert());
modelAndView.addObject("tr_url", certVO.getTr_url());
@ -979,241 +979,16 @@ public class AddrGroupController {
*/
@RequestMapping("/web/cop/kmc/authRequestAddrSubmitAjax.do")
public String authRequestFindIdPwAjax(HttpServletRequest request, ModelMap model,
@RequestParam Map<String, Object> commandMap, @ModelAttribute("searchVO") KmcVO kmcVO,
RedirectAttributes redirectAttributes) throws Exception {
public String authRequestFindIdPwAjax(
HttpServletRequest request
, HttpServletResponse response
, ModelMap model
, @RequestParam Map<String, Object> commandMap
, @ModelAttribute("searchVO") KmcVO kmcVO
, RedirectAttributes redirectAttributes
) throws Exception {
String errMessage = ""; // 에러메세지
String rec_cert = ""; // 결과값(암호화)
String certNum = ""; // certNum
rec_cert = request.getParameter("rec_cert").trim();
certNum = request.getParameter("certNum").trim();
kmcVO.setRecCert(rec_cert);
kmcVO.setCertNum(certNum);
// 파라미터 유효성 검증
if (rec_cert.length() == 0 || certNum.length() == 0) {
errMessage = "비정상";
return returnPage(model, errMessage, kmcVO);
}
// 변수선언
// --------------------------------------------------------------------------------------------------------
String k_certNum = ""; // 파라미터로 수신한 요청번호
k_certNum = certNum;
String date = ""; // 요청일시
String CI = ""; // 연계정보(CI)
String DI = ""; // 중복가입확인정보(DI)
String phoneNo = ""; // 휴대폰번호
String phoneCorp = ""; // 이동통신사
String birthDay = ""; // 생년월일
String gender = ""; // 성별
String nation = ""; // 내국인
String name = ""; // 성명
String M_name = ""; // 미성년자 성명
String M_birthDay = ""; // 미성년자 생년월일
String M_Gender = ""; // 미성년자 성별
String M_nation = ""; // 미성년자 내외국인
String result = ""; // 결과값
String certMet = ""; // 인증방법
String ip = ""; // ip주소
String plusInfo = "";
String encPara = "";
String encMsg1 = "";
String encMsg2 = "";
String msgChk = "";
com.icert.comm.secu.IcertSecuManager seed = new com.icert.comm.secu.IcertSecuManager();
// 02. 1차 복호화
// 수신된 certNum를 이용하여 복호화
rec_cert = seed.getDec(rec_cert, k_certNum);
// 03. 1차 파싱
int inf1 = rec_cert.indexOf("/", 0);
int inf2 = rec_cert.indexOf("/", inf1 + 1);
encPara = rec_cert.substring(0, inf1); // 암호화된 통합 파라미터
encMsg1 = rec_cert.substring(inf1 + 1, inf2); // 암호화된 통합 파라미터의 Hash값
// 04. 위변조 검증
encMsg2 = seed.getMsg(encPara);
kmcVO.setEncMsg2(encMsg2);
if (encMsg2.equals(encMsg1)) {
msgChk = "Y";
}
if (!"Y".equals(msgChk)) {
errMessage = "비정상접근입니다.";
return returnPage(model, errMessage, kmcVO);
}
// 05. 2차 복호화
rec_cert = seed.getDec(encPara, k_certNum);
kmcVO.setRecCert(rec_cert);
// 06. 2차 파싱
int info1 = rec_cert.indexOf("/", 0);
int info2 = rec_cert.indexOf("/", info1 + 1);
int info3 = rec_cert.indexOf("/", info2 + 1);
int info4 = rec_cert.indexOf("/", info3 + 1);
int info5 = rec_cert.indexOf("/", info4 + 1);
int info6 = rec_cert.indexOf("/", info5 + 1);
int info7 = rec_cert.indexOf("/", info6 + 1);
int info8 = rec_cert.indexOf("/", info7 + 1);
int info9 = rec_cert.indexOf("/", info8 + 1);
int info10 = rec_cert.indexOf("/", info9 + 1);
int info11 = rec_cert.indexOf("/", info10 + 1);
int info12 = rec_cert.indexOf("/", info11 + 1);
int info13 = rec_cert.indexOf("/", info12 + 1);
int info14 = rec_cert.indexOf("/", info13 + 1);
int info15 = rec_cert.indexOf("/", info14 + 1);
int info16 = rec_cert.indexOf("/", info15 + 1);
int info17 = rec_cert.indexOf("/", info16 + 1);
int info18 = rec_cert.indexOf("/", info17 + 1);
certNum = rec_cert.substring(0, info1);
kmcVO.setCertNum(certNum);
date = rec_cert.substring(info1 + 1, info2);
kmcVO.setDate(date);
CI = rec_cert.substring(info2 + 1, info3);
kmcVO.setCI(CI);
phoneNo = rec_cert.substring(info3 + 1, info4);
kmcVO.setPhoneNo(phoneNo);
phoneCorp = rec_cert.substring(info4 + 1, info5);
kmcVO.setPhoneCorp(phoneCorp);
birthDay = rec_cert.substring(info5 + 1, info6);
kmcVO.setBirthDay(birthDay);
gender = rec_cert.substring(info6 + 1, info7);
kmcVO.setGender(gender);
nation = rec_cert.substring(info7 + 1, info8);
kmcVO.setNation(nation);
name = rec_cert.substring(info8 + 1, info9);
kmcVO.setName(name);
result = rec_cert.substring(info9 + 1, info10);
kmcVO.setResult(result);
certMet = rec_cert.substring(info10 + 1, info11);
kmcVO.setCertMet(certMet);
ip = rec_cert.substring(info11 + 1, info12);
kmcVO.setIp(ip);
M_name = rec_cert.substring(info12 + 1, info13);
kmcVO.setMName(M_name);
M_birthDay = rec_cert.substring(info13 + 1, info14);
kmcVO.setMBirthDay(M_birthDay);
M_Gender = rec_cert.substring(info14 + 1, info15);
kmcVO.setMGender(M_Gender);
M_nation = rec_cert.substring(info15 + 1, info16);
kmcVO.setMNation(M_nation);
plusInfo = rec_cert.substring(info16 + 1, info17);
kmcVO.setPlusInfo(plusInfo);
DI = rec_cert.substring(info17 + 1, info18);
kmcVO.setDI(DI);
// 07. CI, DI 복호화
CI = seed.getDec(CI, k_certNum);
kmcVO.setCI(CI);
DI = seed.getDec(DI, k_certNum);
kmcVO.setDI(DI);
if ("Y".equals(result)) {
}
// --------------------------------------------------------------
String regex = "";
if (certNum.length() == 0 || certNum.length() > 40) {
errMessage = "요청번호 비정상.";
return returnPage(model, errMessage, kmcVO);
}
regex = "[0-9]*";
if (date.length() != 14 || !paramChk(regex, date)) {
errMessage = "요청일시";
return returnPage(model, errMessage, kmcVO);
}
regex = "[A-Z]*";
if (certMet.length() != 1 || !paramChk(regex, certMet)) {
errMessage = "본인인증방법 비정상" + certMet;
return returnPage(model, errMessage, kmcVO);
}
regex = "[0-9]*";
if ((phoneNo.length() != 10 && phoneNo.length() != 11) || !paramChk(regex, phoneNo)) {
errMessage = "휴대폰번호 비정상";
return returnPage(model, errMessage, kmcVO);
}
regex = "[A-Z]*";
if (phoneCorp.length() != 3 || !paramChk(regex, phoneCorp)) {
errMessage = "이동통신사 비정상";
return returnPage(model, errMessage, kmcVO);
}
regex = "[0-9]*";
if (birthDay.length() != 8 || !paramChk(regex, birthDay)) {
errMessage = "생년월일 비정상";
return returnPage(model, errMessage, kmcVO);
}
regex = "[0-9]*";
if (gender.length() != 1 || !paramChk(regex, gender)) {
errMessage = "성별 비정상";
return returnPage(model, errMessage, kmcVO);
}
regex = "[0-9]*";
if (nation.length() != 1 || !paramChk(regex, nation)) {
errMessage = "내/외국인 비정상";
return returnPage(model, errMessage, kmcVO);
}
regex = "[\\sA-Za-z가-<2D>R.,-]*";
if (name.length() > 60 || !paramChk(regex, name)) {
errMessage = "성명 비정상";
return returnPage(model, errMessage, kmcVO);
}
regex = "[A-Z]*";
if (result.length() != 1 || !paramChk(regex, result)) {
errMessage = "결과값 비정상";
return returnPage(model, errMessage, kmcVO);
}
regex = "[\\sA-Za-z가-?.,-]*";
if (M_name.length() != 0) {
if (M_name.length() > 60 || !paramChk(regex, M_name)) {
errMessage = "미성년자 성명 비정상";
return returnPage(model, errMessage, kmcVO);
}
}
regex = "[0-9]*";
if (M_birthDay.length() != 0) {
if (M_birthDay.length() != 8 || !paramChk(regex, M_birthDay)) {
errMessage = "미성년자 생년월일 비정상";
return returnPage(model, errMessage, kmcVO);
}
}
regex = "[0-9]*";
if (M_Gender.length() != 0) {
if (M_Gender.length() != 1 || !paramChk(regex, M_Gender)) {
errMessage = "미성년자 성별 비정상";
return returnPage(model, errMessage, kmcVO);
}
}
regex = "[0-9]*";
if (M_nation.length() != 0) {
if (M_nation.length() != 1 || !paramChk(regex, M_nation)) {
errMessage = "미성년자 내/외국인 비정상";
return returnPage(model, errMessage, kmcVO);
}
}
kmcVO = kmcCertChecker.authCertResult(request, response, model);
// KMC 본인인증 로그
AuthCertVO certVO = new AuthCertVO();

View File

@ -3,6 +3,8 @@ package itn.let.mjo.mjocommon;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
@ -16,10 +18,8 @@ import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.PostMethod;
import org.json.simple.JSONObject;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import com.mysql.jdbc.StringUtils;
import org.springframework.transaction.annotation.Transactional;
import egovframework.com.idgen.CustomIdGnrService;
import egovframework.rte.fdl.cmmn.exception.FdlException;
@ -27,17 +27,22 @@ import itn.com.cmm.MjonMsgSendVO;
import itn.com.cmm.OptimalMsgResultDTO;
import itn.com.cmm.util.MsgSendUtils;
import itn.com.cmm.util.SlackMessageFormatUtil;
import itn.com.cmm.util.StringUtil;
import itn.let.kakao.kakaoComm.KakaoSendAdvcVO;
import itn.let.kakao.kakaoComm.KakaoVO;
import itn.let.mail.service.StatusResponse;
import itn.let.mjo.event.service.MjonEventService;
import itn.let.mjo.event.service.MjonEventVO;
import itn.let.mjo.msg.service.MjonMsgVO;
import itn.let.mjo.msg.service.impl.MjonMsgDAO;
import itn.let.mjo.msgdata.service.MjonMsgDataService;
import itn.let.mjo.msgdata.service.MjonMsgReturnVO;
import itn.let.mjo.msgholiday.service.MsgAlarmSetVO;
import itn.let.mjo.msgholiday.service.MsgHolidayService;
import itn.let.mjo.msgholiday.service.MsgHolidayVO;
import itn.let.sym.site.service.EgovSiteManagerService;
import itn.let.sym.site.service.JoinSettingVO;
import itn.let.uat.uia.web.SendLogVO;
import itn.let.uss.umt.service.EgovUserManageService;
import itn.let.uss.umt.service.UserManageVO;
import lombok.extern.slf4j.Slf4j;
@ -70,6 +75,12 @@ public class MjonCommon {
@Resource(name = "egovMjonMsgIdCGnrService")
private CustomIdGnrService idgenMsgCId;
@Resource(name = "mjonMsgDAO")
private MjonMsgDAO mjonMsgDAO;
@Resource(name = "MjonMsgDataService")
private MjonMsgDataService mjonMsgDataService;
@ -784,8 +795,120 @@ private int parseIntOrDefault(String value, int defaultValue) {
return result;
}
public void sendMessagesIfOverFifty(int cnt, String callTo) throws Exception {
if(
cnt >= 50 //50건 이상일 경우만 발송
&& StringUtil.isNotEmpty(callTo) // null, "" 체크
&& callTo.startsWith("010") // 010으로 시작하는 휴대폰번호일 경우
&& "Y".equals(selectSmsNotiIfOverFiftySetting()) // 안내문자 발송 on 인경우만
&& !sysMsgTodaySendYn(callTo) // 금일 1회 이상 보낸 이력없을 경우만 발송
) {
//50건이상 발송 안내문자 구분값 = 01
String sendMsgType = "01";
String today = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
String contents = "[인터넷 대량문자발송안내] 문자온에서 "+ callTo + " 번호로 " + today + "에 인터넷 대량 문자(50통 이상)가 발송되었습니다."
+ "\n※ 번호도용이 의심되는 경우, 이용 중인 이동통신사의 휴대전화 번호도용 문자차단 부가서비스(무료)에 가입하여 피해를 예방할 수 있습니다.";
this.sendSysMsg(
"15518011"
, callTo
, contents
, sendMsgType
);
}
}
/**
* Method Name : sendSysMsg
* Description : 관리자 안내 문자 공통
*
* @param callFrom : 발신번호
* @param callTo : 수신번호
* @param contents : 내용
* @param sendMsgType : 발신내용 타입 - 01: 대량문자발송안내
* @return
* @throws Exception
* @return MjonMsgReturnVO 설명
*/
@Transactional(rollbackFor = Exception.class)
public MjonMsgReturnVO sendSysMsg(
String callFrom
, String callTo
, String contents
, String sendMsgType
) throws Exception {
//결과 vo
MjonMsgReturnVO returnVO = new MjonMsgReturnVO();
MjonMsgVO mjonMsgVO = new MjonMsgVO();
mjonMsgVO.setSmsTxt(contents);
mjonMsgVO.setReserveYn("N");
// 시스템 문자발송 번호
// mjonMsgVO.setCallFrom("15518011");
mjonMsgVO.setCallFrom(callFrom);
mjonMsgVO.setCallTo(callTo);
mjonMsgVO.setUserId("system");
/*
* 본문길이에 따른 단문/장문 구분
* 단문 4
* 장문 6
* 2000자 이상 invalid
*/
String msgType = MsgSendUtils.getMsgTypeWithByteValidation(new MjonMsgSendVO(), contents);//
mjonMsgVO.setMsgType(msgType);
// MsgDiv - S: 단문, L: 장문, P: 그림
if("4".equalsIgnoreCase(msgType)) {
mjonMsgVO.setMsgDiv("S");
}else if("6".equalsIgnoreCase(msgType)) {
mjonMsgVO.setMsgDiv("L");
}
else { // invalid
returnVO.setMsgGroupId("");
returnVO.setSendMsgCnt("0"); // 발송 건수 저장
returnVO.setSendMsgBlockCnt("0"); // 수신차단 건수 저장
return returnVO;
}
// 문자타입별 대표전송사 정보
MjonMsgVO mjonMsgVO2 = new MjonMsgVO();
mjonMsgVO2 = mjonMsgDAO.selectRepMsgAgetnInfo(mjonMsgVO);
// 전송사 구분 코드 - 01 : 아이하트, 02 : 현대 퓨쳐넷, 03 : 아이엠오, 04 : 다우기술
mjonMsgVO.setAgentCode(mjonMsgVO2.getAgentCode()); //전송사 선택
// 전송금액
mjonMsgVO.setTotPrice(mjonMsgVO2.getAgentPrice().toString()); //총금액
mjonMsgVO.setEachPrice(mjonMsgVO2.getAgentPrice().toString()); //한건 금액
returnVO = mjonMsgDataService.insertSysMsgDataInfo(mjonMsgVO);
// 시스템 발송 로그
SendLogVO sendLogVO = new SendLogVO();
// SendType 1:문자로 발송 2:이메일로 발송
sendLogVO.setSendId(returnVO.getMsgGroupId());
sendLogVO.setSendType("1");
sendLogVO.setFrstSendInfo(mjonMsgVO.getCallFrom());
sendLogVO.setReceive(mjonMsgVO.getCallTo());
sendLogVO.setContents(contents);
sendLogVO.setSendMsgType(sendMsgType);
mjonMsgDataService.insertSysMsgLog(sendLogVO);
return returnVO;
}
private Boolean sysMsgTodaySendYn(String callTo) throws Exception {
SendLogVO sendLogVO = new SendLogVO();
sendLogVO.setReceive(callTo);
return mjonMsgDataService.selectSysMsgTodaySendYn(sendLogVO);
}
private String selectSmsNotiIfOverFiftySetting() throws Exception {
JoinSettingVO joinSettingVO = egovSiteManagerService.selectAdminNotiDetail();
return joinSettingVO.getSmsNotiIfOverFifty();
}
}

View File

@ -211,9 +211,9 @@ public class MjonMsgCampainDataController {
// 외부에서 선거발송 페이지로 들어오는걸 막음
// 20250102 이호영
if (!"localhost".equals(hostName) && !"119.193.215.98".equals(hostName)) {
/*if (!"localhost".equals(hostName) && !"119.193.215.98".equals(hostName)) {
return "redirect:/web/mjon/msgdata/selectMsgDataView.do";
}
}*/
String categoryType = cateCode.getCateType();

View File

@ -200,9 +200,17 @@ public class MjonMsgCampainTWDataController {
// 외부에서 선거발송 페이지로 들어오는걸 막음
// 20250102 이호영
if (!"localhost".equals(hostName)) {
return "redirect:/web/mjon/msgdata/selectMsgDataView.do";
}
System.out.println("hostName :: "+ hostName);
System.out.println("hostName :: "+ hostName);
System.out.println("hostName :: "+ hostName);
System.out.println("hhhhhhhh hostName :: "+ hostName);
System.out.println("hostName :: "+ hostName);
System.out.println("hostName :: "+ hostName);
// if (!"localhost".equals(hostName)
// && !"119.193.215.98".equals(hostName))
// {
// return "redirect:/web/mjon/msgdata/selectMsgDataView.do";
// }
String categoryType = cateCode.getCateType();

View File

@ -190,7 +190,7 @@ public interface MjonMsgDataService {
public MjonMsgReturnVO sendSysMsgData(MjonMsgVO mjonMsgVO, HttpServletRequest request) throws Exception;
public Boolean selectSysMsgTodaySendYn(SendLogVO sendLogVO) throws Exception;
}

View File

@ -403,6 +403,10 @@ public class MjonMsgDataDAO extends EgovAbstractDAO {
return result;
}
public Boolean selectSysMsgTodaySendYn(SendLogVO sendLogVO) throws Exception{
return (Boolean) select("mjonMsgDataDAO.selectSysMsgTodaySendYn",sendLogVO);
}
/**
* 다량 데이터를 Batch 처리로 MJ_MSG_DATA 테이블에 INSERT

View File

@ -4224,6 +4224,17 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M
// int instCnt = mjonMsgDataDAO.insertMsgDataInfo_jdbc_advc(mjonMsgSendVOList);
//50건이상 문자발송 안내메시지 전송
try {
if(
"p".equals(userInfo.getDept()) // 개인회원일 경우에만 발송
) {
mjonCommon.sendMessagesIfOverFifty(instTotalCnt, mjonMsgVO.getCallFrom());
}
} catch (Exception e) {
System.out.println("sendMessagesIfOverFifty method exception.");
}
// TEST발송 발송 캐시가 있어야함.
returnMap.put("afterCash", priceAndPoint.getBefCash(userId));
//
@ -5191,4 +5202,9 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M
return returnVO;
}
@Override
public Boolean selectSysMsgTodaySendYn(SendLogVO sendLogVO) throws Exception{
return mjonMsgDataDAO.selectSysMsgTodaySendYn(sendLogVO);
}
}

View File

@ -34,6 +34,7 @@ import org.springframework.stereotype.Service;
import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;
import egovframework.rte.fdl.idgnr.EgovIdGnrService;
import itn.com.cmm.util.StringUtil;
import itn.com.cmm.util.StringUtil2;
import itn.let.cmm.vo.FileInfoVO;
import itn.let.fax.addr.service.FaxAddrGroupVO;
@ -126,6 +127,11 @@ public class MjonMsgSentServiceImpl extends EgovAbstractServiceImpl implements
Map<String, Object> resultMap = new HashMap<String, Object>();
//수신번호 검색 번호 포멧 통일
if("4".equals(mjonMsgSentVO.getSearchCondition()) && StringUtil.isNotEmpty(mjonMsgSentVO.getSearchKeyword())) {
mjonMsgSentVO.setSearchKeyword(mjonMsgSentVO.getSearchKeyword().trim().replace("-", ""));
}
// 목록
List<MjonMsgSentVO> resultList = mjonMsgSentDAO.selectAllMsgSentList_advc(mjonMsgSentVO);
@ -638,7 +644,7 @@ public class MjonMsgSentServiceImpl extends EgovAbstractServiceImpl implements
// log.info("엑셀에 넣을 데이터: [{}]", data[i][1]);
data[i][2] = "H".equals(vo.getSendKind()) ? "WEB" : "API";
data[i][2] = "A".equals(vo.getSendKind()) ? "API" : "WEB";
String msgType="단문";
if ("6".equals(vo.getMsgType())) {

View File

@ -18,10 +18,10 @@ public class KmcVO extends ComDefaultVO{
private String gender = ""; // 성별
private String nation = ""; // 내국인
private String name = ""; // 성명
private String MName = ""; // 미성년자 성명
private String MBirthDay = ""; // 미성년자 생년월일
private String MGender = ""; // 미성년자 성별
private String MNation = ""; // 미성년자 내외국인
// private String MName = ""; // 미성년자 성명
// private String MBirthDay = ""; // 미성년자 생년월일
// private String MGender = ""; // 미성년자 성별
// private String MNation = ""; // 미성년자 내외국인
private String result = ""; // 결과값
private String certMet = ""; // 인증방법
@ -41,6 +41,11 @@ public class KmcVO extends ComDefaultVO{
private String idx = ""; //본인인증 로그 idx
private String dnChk = ""; //본인명의 DN 체크
private String reserve1 = "";
private String reserve2 = "";
private String reserve3 = "";
private String reserve4 = "";
public String getUserId() {
return userId;
}
@ -177,30 +182,6 @@ public class KmcVO extends ComDefaultVO{
public void setCertNum(String certNum) {
this.certNum = certNum;
}
public String getMName() {
return MName;
}
public void setMName(String mName) {
MName = mName;
}
public String getMBirthDay() {
return MBirthDay;
}
public void setMBirthDay(String mBirthDay) {
MBirthDay = mBirthDay;
}
public String getMGender() {
return MGender;
}
public void setMGender(String mGender) {
MGender = mGender;
}
public String getMNation() {
return MNation;
}
public void setMNation(String mNation) {
MNation = mNation;
}
public String getRecCert() {
return recCert;
}
@ -225,7 +206,30 @@ public class KmcVO extends ComDefaultVO{
public void setCertType(String certType) {
this.certType = certType;
}
public String getReserve1() {
return reserve1;
}
public void setReserve1(String reserve1) {
this.reserve1 = reserve1;
}
public String getReserve2() {
return reserve2;
}
public void setReserve2(String reserve2) {
this.reserve2 = reserve2;
}
public String getReserve3() {
return reserve3;
}
public void setReserve3(String reserve3) {
this.reserve3 = reserve3;
}
public String getReserve4() {
return reserve4;
}
public void setReserve4(String reserve4) {
this.reserve4 = reserve4;
}
}

View File

@ -91,6 +91,7 @@ import itn.let.sym.grd.service.MberGrdVO;
import itn.let.sym.site.service.EgovSiteManagerService;
import itn.let.sym.site.service.JoinSettingVO;
import itn.let.uat.uia.service.AuthCertVO;
import itn.let.uat.uia.web.KmcCertChecker;
import itn.let.uss.umt.service.EgovMberManageService;
import itn.let.uss.umt.service.EgovUserManageService;
import itn.let.uss.umt.service.MberManageVO;
@ -165,7 +166,10 @@ public class MjonPayController {
EgovSiteManagerService egovSiteManagerService;
@Resource(name = "mberGrdService")
MberGrdService mberGrdService;
MberGrdService mberGrdService;
@Resource(name = "KmcCertChecker")
KmcCertChecker kmcCertChecker;
//배열 정의{"컬럼순차번호, 컬럼이름, 컬럼내용, 컬럼이름에 붙여야할 내용(엑셀코드양식다운로드시 필요)"}
private String[][] sendPayExcelValue ={
@ -930,7 +934,7 @@ public class MjonPayController {
}
/**
* 나이스페이(PG사 전송화면)
* 회원가입 본인인증
*
* @param
* @return
@ -941,270 +945,10 @@ public class MjonPayController {
ModelMap model , @RequestParam Map<String, Object> commandMap,
@ModelAttribute("searchVO") KmcVO kmcVO) throws Exception {
//크롬 SameSite정책 방지 - 도메인이 다른 타사로 이동 크롬 정책에 의해 세션 유실이 일어나는 경우가 있는데, 이를 방지하기 위해 samesite 보안을 none처리
response.setHeader("Set-Cookie", "mberSession=mberSession; Secure; SameSite=None");
System.out.println("++++++++++++ 세션체크 ::: "+ session.getAttribute("mberSession"));
String errMessage = ""; //에러메세지
String rec_cert = ""; // 결과값(암호화)
String certNum = ""; // certNum
rec_cert = request.getParameter("rec_cert").trim();
certNum = request.getParameter("certNum").trim();
kmcVO.setRecCert(rec_cert);
kmcVO.setCertNum(certNum);
// 파라미터 유효성 검증
if( rec_cert.length() == 0 || certNum.length() == 0 ){
errMessage = "비정상";
return returnPage(model , errMessage , kmcVO) ;
}
// 변수선언 --------------------------------------------------------------------------------------------------------
String k_certNum = ""; // 파라미터로 수신한 요청번호
k_certNum = certNum;
String date = ""; // 요청일시
String CI = ""; // 연계정보(CI)
String DI = ""; // 중복가입확인정보(DI)
String phoneNo = ""; // 휴대폰번호
String phoneCorp = ""; // 이동통신사
String birthDay = ""; // 생년월일
String gender = ""; // 성별
String nation = ""; // 내국인
String name = ""; // 성명
String M_name = ""; // 미성년자 성명
String M_birthDay = ""; // 미성년자 생년월일
String M_Gender = ""; // 미성년자 성별
String M_nation = ""; // 미성년자 내외국인
String result = ""; // 결과값
String certMet = ""; // 인증방법
String ip = ""; // ip주소
String plusInfo = "";
String encPara = "";
String encMsg1 = "";
String encMsg2 = "";
String msgChk = "";
com.icert.comm.secu.IcertSecuManager seed = new com.icert.comm.secu.IcertSecuManager();
//02. 1차 복호화
//수신된 certNum를 이용하여 복호화
rec_cert = seed.getDec(rec_cert, k_certNum);
//03. 1차 파싱
int inf1 = rec_cert.indexOf("/",0);
int inf2 = rec_cert.indexOf("/",inf1+1);
encPara = rec_cert.substring(0,inf1); //암호화된 통합 파라미터
encMsg1 = rec_cert.substring(inf1+1,inf2); //암호화된 통합 파라미터의 Hash값
//04. 위변조 검증
encMsg2 = seed.getMsg(encPara);
kmcVO.setEncMsg2(encMsg2);
if(encMsg2.equals(encMsg1)){
msgChk="Y";
}
if(!"Y".equals(msgChk)) {
errMessage = "비정상접근입니다.";
return returnPage(model , errMessage , kmcVO) ;
}
//05. 2차 복호화
rec_cert = seed.getDec(encPara, k_certNum);
kmcVO.setRecCert(rec_cert);
//06. 2차 파싱
int info1 = rec_cert.indexOf("/",0);
int info2 = rec_cert.indexOf("/",info1+1);
int info3 = rec_cert.indexOf("/",info2+1);
int info4 = rec_cert.indexOf("/",info3+1);
int info5 = rec_cert.indexOf("/",info4+1);
int info6 = rec_cert.indexOf("/",info5+1);
int info7 = rec_cert.indexOf("/",info6+1);
int info8 = rec_cert.indexOf("/",info7+1);
int info9 = rec_cert.indexOf("/",info8+1);
int info10 = rec_cert.indexOf("/",info9+1);
int info11 = rec_cert.indexOf("/",info10+1);
int info12 = rec_cert.indexOf("/",info11+1);
int info13 = rec_cert.indexOf("/",info12+1);
int info14 = rec_cert.indexOf("/",info13+1);
int info15 = rec_cert.indexOf("/",info14+1);
int info16 = rec_cert.indexOf("/",info15+1);
int info17 = rec_cert.indexOf("/",info16+1);
int info18 = rec_cert.indexOf("/",info17+1);
certNum = rec_cert.substring(0,info1); kmcVO.setCertNum(certNum);
date = rec_cert.substring(info1+1,info2); kmcVO.setDate(date);
CI = rec_cert.substring(info2+1,info3); kmcVO.setCI(CI);
phoneNo = rec_cert.substring(info3+1,info4); kmcVO.setPhoneNo(phoneNo);
phoneCorp = rec_cert.substring(info4+1,info5); kmcVO.setPhoneCorp(phoneCorp);
birthDay = rec_cert.substring(info5+1,info6); kmcVO.setBirthDay(birthDay);
gender = rec_cert.substring(info6+1,info7); kmcVO.setGender(gender);
nation = rec_cert.substring(info7+1,info8); kmcVO.setNation(nation);
name = rec_cert.substring(info8+1,info9); kmcVO.setName(name);
result = rec_cert.substring(info9+1,info10); kmcVO.setResult(result);
certMet = rec_cert.substring(info10+1,info11); kmcVO.setCertMet(certMet);
ip = rec_cert.substring(info11+1,info12); kmcVO.setIp(ip);
M_name = rec_cert.substring(info12+1,info13); kmcVO.setMName(M_name);
M_birthDay = rec_cert.substring(info13+1,info14); kmcVO.setMBirthDay(M_birthDay);
M_Gender = rec_cert.substring(info14+1,info15); kmcVO.setMGender(M_Gender);
M_nation = rec_cert.substring(info15+1,info16); kmcVO.setMNation(M_nation);
plusInfo = rec_cert.substring(info16+1,info17); kmcVO.setPlusInfo(plusInfo);
DI = rec_cert.substring(info17+1,info18); kmcVO.setDI(DI);
//07. CI, DI 복호화
CI = seed.getDec(CI, k_certNum); kmcVO.setCI(CI);
DI = seed.getDec(DI, k_certNum); kmcVO.setDI(DI);
if("Y".equals(result)) {
}
//--------------------------------------------------------------
String regex = "";
if( certNum.length() == 0 || certNum.length() > 40){
errMessage = "요청번호 비정상.";
return returnPage(model , errMessage , kmcVO) ;
}
regex = "[0-9]*";
if( date.length() != 14 || !paramChk(regex, date) ){
errMessage = "요청일시";
return returnPage(model , errMessage , kmcVO) ;
}
regex = "[A-Z]*";
if( certMet.length() != 1 || !paramChk(regex, certMet) ){
errMessage = "본인인증방법 비정상" + certMet;
return returnPage(model , errMessage , kmcVO) ;
}
regex = "[0-9]*";
if( (phoneNo.length() != 10 && phoneNo.length() != 11) || !paramChk(regex, phoneNo) ){
errMessage = "휴대폰번호 비정상" ;
return returnPage(model , errMessage , kmcVO) ;
}
regex = "[A-Z]*";
if( phoneCorp.length() != 3 || !paramChk(regex, phoneCorp) ){
errMessage = "이동통신사 비정상";
return returnPage(model , errMessage , kmcVO) ;
}
regex = "[0-9]*";
if( birthDay.length() != 8 || !paramChk(regex, birthDay) ){
errMessage = "생년월일 비정상";
return returnPage(model , errMessage , kmcVO) ;
}
regex = "[0-9]*";
if( gender.length() != 1 || !paramChk(regex, gender) ){
errMessage = "성별 비정상";
return returnPage(model , errMessage , kmcVO) ;
}
regex = "[0-9]*";
if( nation.length() != 1 || !paramChk(regex, nation) ){
errMessage = "내/외국인 비정상";
return returnPage(model , errMessage , kmcVO) ;
}
regex = "[\\sA-Za-z가-<2D>R.,-]*";
if( name.length() > 60 || !paramChk(regex, name) ){
errMessage = "성명 비정상";
return returnPage(model , errMessage , kmcVO) ;
}
regex = "[A-Z]*";
if( result.length() != 1 || !paramChk(regex, result) ){
errMessage = "결과값 비정상";
return returnPage(model , errMessage , kmcVO) ;
}
regex = "[\\sA-Za-z가-?.,-]*";
if( M_name.length() != 0 ){
if( M_name.length() > 60 || !paramChk(regex, M_name) ){
errMessage = "미성년자 성명 비정상";
return returnPage(model , errMessage , kmcVO) ;
}
}
regex = "[0-9]*";
if( M_birthDay.length() != 0 ){
if( M_birthDay.length() != 8 || !paramChk(regex, M_birthDay) ){
errMessage = "미성년자 생년월일 비정상";
return returnPage(model , errMessage , kmcVO) ;
}
}
regex = "[0-9]*";
if( M_Gender.length() != 0 ){
if( M_Gender.length() != 1 || !paramChk(regex, M_Gender) ){
errMessage = "미성년자 성별 비정상";
return returnPage(model , errMessage , kmcVO) ;
}
}
regex = "[0-9]*";
if( M_nation.length() != 0 ){
if( M_nation.length() != 1 || !paramChk(regex, M_nation) ){
errMessage = "미성년자 내/외국인 비정상";
return returnPage(model , errMessage , kmcVO) ;
}
}
//본인인증 결과 내용 저장하기.
/*System.out.println("+++++++++++++ getCertNum ::: "+kmcVO.getCertNum());
System.out.println("+++++++++++++ getDate ::: "+kmcVO.getDate());
System.out.println("+++++++++++++ getDI ::: "+kmcVO.getDI());
System.out.println("+++++++++++++ getPhoneNo ::: "+kmcVO.getPhoneNo());
System.out.println("+++++++++++++ getNation ::: "+kmcVO.getNation());
System.out.println("+++++++++++++ getName ::: "+kmcVO.getName());
System.out.println("+++++++++++++ getResult ::: "+kmcVO.getResult());
System.out.println("+++++++++++++ getCertMet ::: "+kmcVO.getCertMet());
System.out.println("+++++++++++++ getIp ::: "+kmcVO.getIp());*/
//KMC 본인인증 정보를 세션에 담아준다.
/*AuthCertVO certVO = new AuthCertVO();
certVO.setCertNum(kmcVO.getCertNum());
certVO.setCertDate(kmcVO.getDate());
certVO.setCertDi(kmcVO.getDI());
certVO.setCertPhone(kmcVO.getPhoneNo());
certVO.setCertNation(kmcVO.getNation());
certVO.setCertName(kmcVO.getName());
certVO.setCertResult(kmcVO.getResult());
certVO.setCertType("KMC문자인증");
certVO.setCertIpaddr(kmcVO.getIp());
certVO.setBirthDay(kmcVO.getBirthDay());
certVO.setSexdstnCode(kmcVO.getGender());*/
/*request.getSession().setAttribute("AuthKmcCertVO", certVO);*/
/*System.out.println("++++++++++++ 세션체크22 ::: "+(MberManageVO) session.getAttribute("mberSession"));*/
//KMC 본인인증 로그 insert
AuthCertVO certVO = new AuthCertVO();
certVO.setMberId(kmcVO.getPlusInfo());
certVO.setCertNum(kmcVO.getCertNum());
certVO.setCertDate(kmcVO.getDate());
certVO.setCertDi(kmcVO.getDI());
certVO.setCertPhone(kmcVO.getPhoneNo());
certVO.setCertNation(kmcVO.getNation());
certVO.setCertName(kmcVO.getName());
certVO.setCertResult(kmcVO.getResult());
certVO.setCertType("KMC_회원가입 인증");
certVO.setCertIpaddr(kmcVO.getIp());
certVO.setBirthDay(kmcVO.getBirthDay());
certVO.setSexdstnCode(kmcVO.getGender());
//디비 테이블에 저장하기
mberManageService.insertCertInfoLog(certVO);
//kmc 본인인증 결과처리
kmcVO = kmcCertChecker.authCertResult(request, response, model);
//kmc 본인인증 로그 처리
AuthCertVO certVO = kmcCertChecker.insertCertLog(kmcVO, "KMC_회원가입 인증");
kmcVO.setIdx(certVO.getIdx()); //본인인증 로그 Idx - 로그 insert idx selectKey
model.addAttribute("kmcVO", kmcVO);
@ -6179,5 +5923,6 @@ public class MjonPayController {
return p_response;
}
}

View File

@ -480,7 +480,8 @@ public class SchedulerUtil {
public LockProvider lockProvider(DataSource dataSource) {
return new JdbcTemplateLockProvider(dataSource);
}
// @Scheduled(cron = "0 0 0/2 * * ?") // 매시간 짝수 정각마다 실행
@Scheduled(cron = "0 0/3 * * * ?") // 3분마다 실행
@SchedulerLock(name = "runKakaoOneTime", lockAtMostForString = ONE_MIN, lockAtLeastForString = ONE_MIN)
public void runKakaoOneTime() throws Exception {

View File

@ -65,6 +65,7 @@ public class JoinSettingVO {
private String slackNoti; //관리자 SLACK 알림 여부
private String smishingNoti; //첫결제(카드제외) 스미싱의심 알림 여부
private String holiSmishingNoti; //야간 스미싱알림 여부
private String smsNotiIfOverFifty; //50건이상 문자발송 안내문자 발송
}

View File

@ -121,5 +121,4 @@ public interface EgovLoginService {
//비밀번호 실패 횟수 조회
public LoginVO selectPassMiss(LoginVO vo) throws Exception;
public KmcVO kmcDecryption(HttpServletRequest request, KmcVO kmcVO);
}

View File

@ -17,6 +17,7 @@ import egovframework.rte.fdl.idgnr.EgovIdGnrService;
import egovframework.rte.psl.dataaccess.util.EgovMap;
import itn.com.cmm.LoginVO;
import itn.let.mjo.pay.service.KmcVO;
import itn.let.uat.uia.service.AuthCertVO;
import itn.let.uat.uia.service.EgovLoginService;
import itn.let.uss.umt.service.UserManageVO;
import itn.let.utl.fcc.service.EgovNumberUtil;
@ -318,240 +319,6 @@ public class EgovLoginServiceImpl extends EgovAbstractServiceImpl implements
return loginDAO.selectPassMiss(vo);
}
@Override
public KmcVO kmcDecryption(HttpServletRequest request, KmcVO kmcVO) {
String rec_cert = request.getParameter("rec_cert").trim();
String certNum = request.getParameter("certNum").trim();
kmcVO.setRecCert(rec_cert);
kmcVO.setCertNum(certNum);
// 파라미터 유효성 검증
if (rec_cert.length() == 0 || certNum.length() == 0) {
kmcVO.setErrMessage("비정상");
return kmcVO;
}
// 변수선언
// --------------------------------------------------------------------------------------------------------
String k_certNum = ""; // 파라미터로 수신한 요청번호
k_certNum = certNum;
String date = ""; // 요청일시
String CI = ""; // 연계정보(CI)
String DI = ""; // 중복가입확인정보(DI)
String phoneNo = ""; // 휴대폰번호
String phoneCorp = ""; // 이동통신사
String birthDay = ""; // 생년월일
String gender = ""; // 성별
String nation = ""; // 내국인
String name = ""; // 성명
String M_name = ""; // 미성년자 성명
String M_birthDay = ""; // 미성년자 생년월일
String M_Gender = ""; // 미성년자 성별
String M_nation = ""; // 미성년자 내외국인
String result = ""; // 결과값
String certMet = ""; // 인증방법
String ip = ""; // ip주소
String plusInfo = "";
String encPara = "";
String encMsg1 = "";
String encMsg2 = "";
String msgChk = "";
IcertSecuManager seed = new IcertSecuManager();
// 02. 1차 복호화
// 수신된 certNum를 이용하여 복호화
rec_cert = seed.getDec(rec_cert, k_certNum);
// 03. 1차 파싱
int inf1 = rec_cert.indexOf("/", 0);
int inf2 = rec_cert.indexOf("/", inf1 + 1);
encPara = rec_cert.substring(0, inf1); // 암호화된 통합 파라미터
encMsg1 = rec_cert.substring(inf1 + 1, inf2); // 암호화된 통합 파라미터의 Hash값
// 04. 위변조 검증
encMsg2 = seed.getMsg(encPara);
kmcVO.setEncMsg2(encMsg2);
if (encMsg2.equals(encMsg1)) {
msgChk = "Y";
}
if (!"Y".equals(msgChk)) {
kmcVO.setErrMessage("비정상접근입니다.");
return kmcVO;
}
// 05. 2차 복호화
rec_cert = seed.getDec(encPara, k_certNum);
kmcVO.setRecCert(rec_cert);
// 06. 2차 파싱
int info1 = rec_cert.indexOf("/", 0);
int info2 = rec_cert.indexOf("/", info1 + 1);
int info3 = rec_cert.indexOf("/", info2 + 1);
int info4 = rec_cert.indexOf("/", info3 + 1);
int info5 = rec_cert.indexOf("/", info4 + 1);
int info6 = rec_cert.indexOf("/", info5 + 1);
int info7 = rec_cert.indexOf("/", info6 + 1);
int info8 = rec_cert.indexOf("/", info7 + 1);
int info9 = rec_cert.indexOf("/", info8 + 1);
int info10 = rec_cert.indexOf("/", info9 + 1);
int info11 = rec_cert.indexOf("/", info10 + 1);
int info12 = rec_cert.indexOf("/", info11 + 1);
int info13 = rec_cert.indexOf("/", info12 + 1);
int info14 = rec_cert.indexOf("/", info13 + 1);
int info15 = rec_cert.indexOf("/", info14 + 1);
int info16 = rec_cert.indexOf("/", info15 + 1);
int info17 = rec_cert.indexOf("/", info16 + 1);
int info18 = rec_cert.indexOf("/", info17 + 1);
certNum = rec_cert.substring(0, info1);
kmcVO.setCertNum(certNum);
date = rec_cert.substring(info1 + 1, info2);
kmcVO.setDate(date);
CI = rec_cert.substring(info2 + 1, info3);
kmcVO.setCI(CI);
phoneNo = rec_cert.substring(info3 + 1, info4);
kmcVO.setPhoneNo(phoneNo);
phoneCorp = rec_cert.substring(info4 + 1, info5);
kmcVO.setPhoneCorp(phoneCorp);
birthDay = rec_cert.substring(info5 + 1, info6);
kmcVO.setBirthDay(birthDay);
gender = rec_cert.substring(info6 + 1, info7);
kmcVO.setGender(gender);
nation = rec_cert.substring(info7 + 1, info8);
kmcVO.setNation(nation);
name = rec_cert.substring(info8 + 1, info9);
kmcVO.setName(name);
result = rec_cert.substring(info9 + 1, info10);
kmcVO.setResult(result);
certMet = rec_cert.substring(info10 + 1, info11);
kmcVO.setCertMet(certMet);
ip = rec_cert.substring(info11 + 1, info12);
kmcVO.setIp(ip);
M_name = rec_cert.substring(info12 + 1, info13);
kmcVO.setMName(M_name);
M_birthDay = rec_cert.substring(info13 + 1, info14);
kmcVO.setMBirthDay(M_birthDay);
M_Gender = rec_cert.substring(info14 + 1, info15);
kmcVO.setMGender(M_Gender);
M_nation = rec_cert.substring(info15 + 1, info16);
kmcVO.setMNation(M_nation);
plusInfo = rec_cert.substring(info16 + 1, info17);
kmcVO.setPlusInfo(plusInfo);
DI = rec_cert.substring(info17 + 1, info18);
kmcVO.setDI(DI);
// 07. CI, DI 복호화
CI = seed.getDec(CI, k_certNum);
kmcVO.setCI(CI);
DI = seed.getDec(DI, k_certNum);
kmcVO.setDI(DI);
if ("Y".equals(result)) {
}
// --------------------------------------------------------------
String regex = "";
if (certNum.length() == 0 || certNum.length() > 40) {
kmcVO.setErrMessage("요청번호 비정상.");
return kmcVO;
}
regex = "[0-9]*";
if (date.length() != 14 || !this.paramChk(regex, date)) {
kmcVO.setErrMessage("요청일시");
return kmcVO;
}
regex = "[A-Z]*";
if (certMet.length() != 1 || !this.paramChk(regex, certMet)) {
kmcVO.setErrMessage("본인인증방법 비정상" + certMet);
return kmcVO;
}
regex = "[0-9]*";
if ((phoneNo.length() != 10 && phoneNo.length() != 11) || !this.paramChk(regex, phoneNo)) {
kmcVO.setErrMessage("휴대폰번호 비정상");
return kmcVO;
}
regex = "[A-Z]*";
if (phoneCorp.length() != 3 || !this.paramChk(regex, phoneCorp)) {
kmcVO.setErrMessage("이동통신사 비정상");
return kmcVO;
}
regex = "[0-9]*";
if (birthDay.length() != 8 || !this.paramChk(regex, birthDay)) {
kmcVO.setErrMessage("생년월일 비정상");
return kmcVO;
}
regex = "[0-9]*";
if (gender.length() != 1 || !this.paramChk(regex, gender)) {
kmcVO.setErrMessage("성별 비정상");
return kmcVO;
}
regex = "[0-9]*";
if (nation.length() != 1 || !this.paramChk(regex, nation)) {
kmcVO.setErrMessage("내/외국인 비정상");
return kmcVO;
}
regex = "[\\sA-Za-z가-<2D>R.,-]*";
if (name.length() > 60 || !this.paramChk(regex, name)) {
kmcVO.setErrMessage("성명 비정상");
return kmcVO;
}
regex = "[A-Z]*";
if (result.length() != 1 || !this.paramChk(regex, result)) {
kmcVO.setErrMessage("결과값 비정상");
return kmcVO;
}
regex = "[\\sA-Za-z가-?.,-]*";
if (M_name.length() != 0) {
if (M_name.length() > 60 || !this.paramChk(regex, M_name)) {
kmcVO.setErrMessage("미성년자 성명 비정상");
return kmcVO;
}
}
regex = "[0-9]*";
if (M_birthDay.length() != 0) {
if (M_birthDay.length() != 8 || !this.paramChk(regex, M_birthDay)) {
kmcVO.setErrMessage("미성년자 생년월일 비정상");
}
}
regex = "[0-9]*";
if (M_Gender.length() != 0) {
if (M_Gender.length() != 1 || !paramChk(regex, M_Gender)) {
kmcVO.setErrMessage("미성년자 성별 비정상");
}
}
regex = "[0-9]*";
if (M_nation.length() != 0) {
if (M_nation.length() != 1 || !this.paramChk(regex, M_nation)) {
kmcVO.setErrMessage("미성년자 내/외국인 비정상");
}
}
return kmcVO;
}
public Boolean paramChk(String patn, String param) {
Pattern pattern = Pattern.compile(patn);
Matcher matcher = pattern.matcher(param);

View File

@ -253,7 +253,7 @@ public class EgovLoginController {
private CertIpService certIpService;
@Resource(name = "KmcCertChecker")
private KmcCertChecker kmcCertCheck;
private KmcCertChecker kmcCertChecker;
private static final Logger logger = LoggerFactory.getLogger(MjonMsgDataController.class);
@ -336,7 +336,7 @@ public class EgovLoginController {
MberCertPhoneVO mberCertPhoneVO = new MberCertPhoneVO();
mberCertPhoneVO.setTrUrl("/web/cop/kmc/authRequestAjax.do");
AuthCertVO certVO = kmcCertCheck.authCertCheck(mberCertPhoneVO, request);
AuthCertVO certVO = kmcCertChecker.authCertCheck(mberCertPhoneVO, request);
model.addAttribute("tr_cert", certVO.getTr_cert());
model.addAttribute("tr_url", certVO.getTr_url());
@ -385,7 +385,7 @@ public class EgovLoginController {
mberCertPhoneVO.setNation(mberManageVO.getNationality());
mberCertPhoneVO.setBirthDay(mberManageVO.getBirth());
AuthCertVO certVO = kmcCertCheck.authCertCheck(mberCertPhoneVO, request);
AuthCertVO certVO = kmcCertChecker.authCertCheck(mberCertPhoneVO, request);
// AuthCertVO certVO = kmcCertCheck.authCertCheckTwo(serverNm + "/web/cop/kmc/authRequestAjax.do",
// mberManageVO.getMberNm(), mberManageVO.getMoblphonNo(), mberManageVO.getSexdstnCode(),
@ -4035,7 +4035,7 @@ public class EgovLoginController {
}
mberCertPhoneVO.setPlusInfo(plusInfo);
AuthCertVO certVO = kmcCertCheck.authCertCheck(mberCertPhoneVO, request);
AuthCertVO certVO = kmcCertChecker.authCertCheck(mberCertPhoneVO, request);
modelAndView.addObject("tr_cert", certVO.getTr_cert());
modelAndView.addObject("tr_url", certVO.getTr_url());
@ -4060,22 +4060,26 @@ public class EgovLoginController {
*/
@RequestMapping("/web/cop/kmc/authRequestFindIdPwAjax.do")
public String authRequestFindIdPwAjax(HttpServletRequest request, ModelMap model,
public String authRequestFindIdPwAjax(HttpServletRequest request, HttpServletResponse response, ModelMap model,
@RequestParam Map<String, Object> commandMap, @ModelAttribute("searchVO") KmcVO kmcVO,
RedirectAttributes redirectAttributes) throws Exception {
KmcVO kmcRVO = loginService.kmcDecryption(request, kmcVO);
// KmcVO kmcRVO = loginService.kmcDecryption(request, kmcVO);
//kmc 본인인증 결과처리
kmcVO = kmcCertChecker.authCertResult(request, response, model);
//kmc 본인인증 로그 처리
AuthCertVO certVO = kmcCertChecker.insertCertLog(kmcVO, "KMC_아이디패스워드찾기");
String msg = "";
if (!findIdKmcCheck(kmcRVO.getDI(), kmcRVO.getName(), kmcRVO.getPhoneNo())) {
if (!findIdKmcCheck(kmcVO.getDI(), kmcVO.getName(), kmcVO.getPhoneNo())) {
msg = "일치하는 정보가 없습니다.";
redirectAttributes.addFlashAttribute("message", msg);
return "redirect:/web/user/findUserId.do";
}
kmcRVO.setCertType("KMC_아이디패스워드찾기");
// 디비 테이블에 저장하기
mberManageService.insertCertInfoLogBn(kmcRVO);
// kmcRVO.setCertType("KMC_아이디패스워드찾기");
// // 디비 테이블에 저장하기
// mberManageService.insertCertInfoLogBn(kmcRVO);
model.addAttribute("kmcVO", kmcVO);
return "web/login/findUserIdKmcReqPage";
@ -4092,18 +4096,24 @@ public class EgovLoginController {
* @discription 관리자 로그인 DN 최초 등록
*/
@RequestMapping("/web/cop/kmc/authRequestSelfLoginAjax.do")
public String authRequestSelfLoginAjax(HttpServletRequest request, ModelMap model,
public String authRequestSelfLoginAjax(HttpServletRequest request, HttpServletResponse response, ModelMap model,
@RequestParam Map<String, Object> commandMap, @ModelAttribute("searchVO") KmcVO kmcVO,
RedirectAttributes redirectAttributes, HttpSession session) throws Exception {
UserManageVO userManageVO = new UserManageVO();
KmcVO kmcRVO = loginService.kmcDecryption(request, kmcVO);
// KmcVO kmcRVO = loginService.kmcDecryption(request, kmcVO);
//kmc 본인인증 결과처리
kmcVO = kmcCertChecker.authCertResult(request, response, model);
//kmc 본인인증 로그 처리
AuthCertVO certVO = kmcCertChecker.insertCertLog(kmcVO, "KMC_아이디패스워드찾기");
userManageVO.setCrtfcDnValue(kmcRVO.getDI());
userManageVO.setEmplyrNm(kmcRVO.getName());
userManageVO.setEmplyrId(kmcRVO.getPlusInfo().split(",,,")[0]);
userManageVO.setPassword(kmcRVO.getPlusInfo().split(",,,")[1]);
userManageVO.setCrtfcDnValue(kmcVO.getDI());
userManageVO.setEmplyrNm(kmcVO.getName());
userManageVO.setEmplyrId(kmcVO.getPlusInfo().split(",,,")[0]);
userManageVO.setPassword(kmcVO.getPlusInfo().split(",,,")[1]);
userManageService.updateCrtfcDnValue(userManageVO);
@ -4121,20 +4131,20 @@ public class EgovLoginController {
e.printStackTrace();
// TODO: handle exception
}
kmcRVO.setCertType("KMC_관리자미인증IP접속인증");
// 디비 테이블에 저장하기
try {
mberManageService.insertCertInfoLogBn(kmcRVO);
} catch (Exception e) {
System.out.println("!!!!!!!!!!!!!!!!!");
e.printStackTrace();
// TODO: handle exception
}
// kmcRVO.setCertType("KMC_관리자미인증IP접속인증");
// // 디비 테이블에 저장하기
//
// try {
// mberManageService.insertCertInfoLogBn(kmcRVO);
//
// } catch (Exception e) {
// System.out.println("!!!!!!!!!!!!!!!!!");
// e.printStackTrace();
// // TODO: handle exception
// }
model.addAttribute("kmcVO", kmcRVO);
model.addAttribute("kmcVO", kmcVO);
System.out.println("======================================");
model.addAttribute("userManageVO", userManageVO);
@ -5425,7 +5435,7 @@ public class EgovLoginController {
mberCertPhoneVO.setNation(KMCInfoVO.getNationality());
mberCertPhoneVO.setPlusInfo(loginVO.getId());
AuthCertVO certVO = kmcCertCheck.authCertCheck(mberCertPhoneVO, request);
AuthCertVO certVO = kmcCertChecker.authCertCheck(mberCertPhoneVO, request);
modelAndView.addObject("tr_cert", certVO.getTr_cert());
modelAndView.addObject("tr_url", certVO.getTr_url());
@ -5446,245 +5456,19 @@ public class EgovLoginController {
*
*/
@RequestMapping("/web/cop/kmc/insertIPAjax.do")
public String insertIPAjax(HttpServletRequest request, ModelMap model, @RequestParam Map<String, Object> commandMap,
public String insertIPAjax(HttpServletRequest request, HttpServletResponse response, ModelMap model, @RequestParam Map<String, Object> commandMap,
@ModelAttribute("searchVO") KmcVO kmcVO) throws Exception {
String errMessage = ""; // 에러메세지
String rec_cert = ""; // 결과값(암호화)
String certNum = ""; // certNum
rec_cert = request.getParameter("rec_cert").trim();
certNum = request.getParameter("certNum").trim();
kmcVO.setRecCert(rec_cert);
kmcVO.setCertNum(certNum);
// 파라미터 유효성 검증
if (rec_cert.length() == 0 || certNum.length() == 0) {
errMessage = "비정상";
return returnPage(model, errMessage, kmcVO);
}
// 변수선언
// --------------------------------------------------------------------------------------------------------
String k_certNum = ""; // 파라미터로 수신한 요청번호
k_certNum = certNum;
String date = ""; // 요청일시
String CI = ""; // 연계정보(CI)
String DI = ""; // 중복가입확인정보(DI)
String phoneNo = ""; // 휴대폰번호
String phoneCorp = ""; // 이동통신사
String birthDay = ""; // 생년월일
String gender = ""; // 성별
String nation = ""; // 내국인
String name = ""; // 성명
String M_name = ""; // 미성년자 성명
String M_birthDay = ""; // 미성년자 생년월일
String M_Gender = ""; // 미성년자 성별
String M_nation = ""; // 미성년자 내외국인
String result = ""; // 결과값
String certMet = ""; // 인증방법
String ip = ""; // ip주소
String plusInfo = "";
String encPara = "";
String encMsg1 = "";
String encMsg2 = "";
String msgChk = "";
com.icert.comm.secu.IcertSecuManager seed = new com.icert.comm.secu.IcertSecuManager();
// 02. 1차 복호화
// 수신된 certNum를 이용하여 복호화
rec_cert = seed.getDec(rec_cert, k_certNum);
// 03. 1차 파싱
int inf1 = rec_cert.indexOf("/", 0);
int inf2 = rec_cert.indexOf("/", inf1 + 1);
encPara = rec_cert.substring(0, inf1); // 암호화된 통합 파라미터
encMsg1 = rec_cert.substring(inf1 + 1, inf2); // 암호화된 통합 파라미터의 Hash값
// 04. 위변조 검증
encMsg2 = seed.getMsg(encPara);
kmcVO.setEncMsg2(encMsg2);
if (encMsg2.equals(encMsg1)) {
msgChk = "Y";
}
if (!"Y".equals(msgChk)) {
errMessage = "비정상접근입니다.";
return returnPage(model, errMessage, kmcVO);
}
// 05. 2차 복호화
rec_cert = seed.getDec(encPara, k_certNum);
kmcVO.setRecCert(rec_cert);
// 06. 2차 파싱
int info1 = rec_cert.indexOf("/", 0);
int info2 = rec_cert.indexOf("/", info1 + 1);
int info3 = rec_cert.indexOf("/", info2 + 1);
int info4 = rec_cert.indexOf("/", info3 + 1);
int info5 = rec_cert.indexOf("/", info4 + 1);
int info6 = rec_cert.indexOf("/", info5 + 1);
int info7 = rec_cert.indexOf("/", info6 + 1);
int info8 = rec_cert.indexOf("/", info7 + 1);
int info9 = rec_cert.indexOf("/", info8 + 1);
int info10 = rec_cert.indexOf("/", info9 + 1);
int info11 = rec_cert.indexOf("/", info10 + 1);
int info12 = rec_cert.indexOf("/", info11 + 1);
int info13 = rec_cert.indexOf("/", info12 + 1);
int info14 = rec_cert.indexOf("/", info13 + 1);
int info15 = rec_cert.indexOf("/", info14 + 1);
int info16 = rec_cert.indexOf("/", info15 + 1);
int info17 = rec_cert.indexOf("/", info16 + 1);
int info18 = rec_cert.indexOf("/", info17 + 1);
certNum = rec_cert.substring(0, info1);
kmcVO.setCertNum(certNum);
date = rec_cert.substring(info1 + 1, info2);
kmcVO.setDate(date);
CI = rec_cert.substring(info2 + 1, info3);
kmcVO.setCI(CI);
phoneNo = rec_cert.substring(info3 + 1, info4);
kmcVO.setPhoneNo(phoneNo);
phoneCorp = rec_cert.substring(info4 + 1, info5);
kmcVO.setPhoneCorp(phoneCorp);
birthDay = rec_cert.substring(info5 + 1, info6);
kmcVO.setBirthDay(birthDay);
gender = rec_cert.substring(info6 + 1, info7);
kmcVO.setGender(gender);
nation = rec_cert.substring(info7 + 1, info8);
kmcVO.setNation(nation);
name = rec_cert.substring(info8 + 1, info9);
kmcVO.setName(name);
result = rec_cert.substring(info9 + 1, info10);
kmcVO.setResult(result);
certMet = rec_cert.substring(info10 + 1, info11);
kmcVO.setCertMet(certMet);
ip = rec_cert.substring(info11 + 1, info12);
kmcVO.setIp(ip);
M_name = rec_cert.substring(info12 + 1, info13);
kmcVO.setMName(M_name);
M_birthDay = rec_cert.substring(info13 + 1, info14);
kmcVO.setMBirthDay(M_birthDay);
M_Gender = rec_cert.substring(info14 + 1, info15);
kmcVO.setMGender(M_Gender);
M_nation = rec_cert.substring(info15 + 1, info16);
kmcVO.setMNation(M_nation);
plusInfo = rec_cert.substring(info16 + 1, info17);
kmcVO.setPlusInfo(plusInfo);
DI = rec_cert.substring(info17 + 1, info18);
kmcVO.setDI(DI);
// 07. CI, DI 복호화
CI = seed.getDec(CI, k_certNum);
kmcVO.setCI(CI);
DI = seed.getDec(DI, k_certNum);
kmcVO.setDI(DI);
if ("Y".equals(result)) {
}
// --------------------------------------------------------------
String regex = "";
if (certNum.length() == 0 || certNum.length() > 40) {
errMessage = "요청번호 비정상.";
return returnPage(model, errMessage, kmcVO);
}
regex = "[0-9]*";
if (date.length() != 14 || !paramChk(regex, date)) {
errMessage = "요청일시";
return returnPage(model, errMessage, kmcVO);
}
regex = "[A-Z]*";
if (certMet.length() != 1 || !paramChk(regex, certMet)) {
errMessage = "본인인증방법 비정상" + certMet;
return returnPage(model, errMessage, kmcVO);
}
regex = "[0-9]*";
if ((phoneNo.length() != 10 && phoneNo.length() != 11) || !paramChk(regex, phoneNo)) {
errMessage = "휴대폰번호 비정상";
return returnPage(model, errMessage, kmcVO);
}
regex = "[A-Z]*";
if (phoneCorp.length() != 3 || !paramChk(regex, phoneCorp)) {
errMessage = "이동통신사 비정상";
return returnPage(model, errMessage, kmcVO);
}
regex = "[0-9]*";
if (birthDay.length() != 8 || !paramChk(regex, birthDay)) {
errMessage = "생년월일 비정상";
return returnPage(model, errMessage, kmcVO);
}
regex = "[0-9]*";
if (gender.length() != 1 || !paramChk(regex, gender)) {
errMessage = "성별 비정상";
return returnPage(model, errMessage, kmcVO);
}
regex = "[0-9]*";
if (nation.length() != 1 || !paramChk(regex, nation)) {
errMessage = "내/외국인 비정상";
return returnPage(model, errMessage, kmcVO);
}
regex = "[\\sA-Za-z가-<2D>R.,-]*";
if (name.length() > 60 || !paramChk(regex, name)) {
errMessage = "성명 비정상";
return returnPage(model, errMessage, kmcVO);
}
regex = "[A-Z]*";
if (result.length() != 1 || !paramChk(regex, result)) {
errMessage = "결과값 비정상";
return returnPage(model, errMessage, kmcVO);
}
regex = "[\\sA-Za-z가-?.,-]*";
if (M_name.length() != 0) {
if (M_name.length() > 60 || !paramChk(regex, M_name)) {
errMessage = "미성년자 성명 비정상";
return returnPage(model, errMessage, kmcVO);
}
}
regex = "[0-9]*";
if (M_birthDay.length() != 0) {
if (M_birthDay.length() != 8 || !paramChk(regex, M_birthDay)) {
errMessage = "미성년자 생년월일 비정상";
return returnPage(model, errMessage, kmcVO);
}
}
regex = "[0-9]*";
if (M_Gender.length() != 0) {
if (M_Gender.length() != 1 || !paramChk(regex, M_Gender)) {
errMessage = "미성년자 성별 비정상";
return returnPage(model, errMessage, kmcVO);
}
}
regex = "[0-9]*";
if (M_nation.length() != 0) {
if (M_nation.length() != 1 || !paramChk(regex, M_nation)) {
errMessage = "미성년자 내/외국인 비정상";
return returnPage(model, errMessage, kmcVO);
}
}
//kmc 본인인증 결과처리
kmcVO = kmcCertChecker.authCertResult(request, response, model);
//kmc 본인인증 로그 처리
AuthCertVO certVO = kmcCertChecker.insertCertLog(kmcVO, "IP등록");
LoginVO loginVO = new LoginVO();
loginVO.setId(plusInfo);
loginVO.setId(kmcVO.getPlusInfo());
loginVO = loginService.selectKMCInfo(loginVO);
String userIp = EgovClntInfo.getClntIP(request);
loginVO.setIp(ip);
loginVO.setIp(kmcVO.getIp());
loginService.insertMberIp(loginVO);

File diff suppressed because it is too large Load Diff

View File

@ -1,29 +1,44 @@
package itn.let.uat.uia.web;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Map;
import java.util.Random;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.springframework.stereotype.Component;
import org.springframework.ui.ModelMap;
import org.springframework.web.servlet.FlashMap;
import org.springframework.web.servlet.FlashMapManager;
import org.springframework.web.servlet.support.RequestContextUtils;
import com.icert.comm.secu.IcertSecuManager;
import itn.let.cert.phone.service.CertPhoneService;
import itn.let.cert.phone.service.MberCertPhoneVO;
import itn.let.mjo.pay.service.KmcVO;
import itn.let.uat.uia.service.AuthCertVO;
import itn.let.uss.umt.service.MberManageVO;
import itn.let.uss.umt.service.EgovMberManageService;
@Component("KmcCertChecker")
public class KmcCertChecker {
@Resource(name = "CertPhoneService")
private CertPhoneService certPhoneService;
@Resource(name = "mberManageService")
private EgovMberManageService mberManageService;
//회원가입 인증수단을 휴대폰 본인인증만 했을 경우 사용
public AuthCertVO authCertCheck(
@ -64,11 +79,13 @@ public class KmcCertChecker {
String tr_add = "N"; // IFrame사용여부
//01. 한국모바일인증() 암호화 모듈 선언
IcertSecuManager seed = new IcertSecuManager();
// IcertSecuManager seed = new IcertSecuManager();
com.icert.comm.secu.IcertSecuManager seed = new com.icert.comm.secu.IcertSecuManager();
//02. 1차 암호화 (tr_cert 데이터변수 조합 암호화)
String enc_tr_cert = "";
tr_cert = cpId +"/"+ urlCode +"/"+ certNum +"/"+ date +"/"+ certMet +"/"+ birthDay +"/"+ gender +"/"+ name +"/"+ phoneNo +"/"+ phoneCorp +"/"+ nation +"/"+ plusInfo +"/"+ extendVar;
// tr_cert = cpId +"/"+ urlCode +"/"+ certNum +"/"+ date +"/"+ certMet +"///////"+ plusInfo +"/"+ extendVar;
enc_tr_cert = seed.getEnc(tr_cert, "");
//03. 1차 암호화 데이터에 대한 위변조 검증값 생성 (HMAC)
@ -87,7 +104,315 @@ public class KmcCertChecker {
return authCertVO;
}
public KmcVO authCertResult(
HttpServletRequest request
, HttpServletResponse response
, ModelMap model
) throws IOException {
//크롬 SameSite정책 방지 - 도메인이 다른 타사로 이동 크롬 정책에 의해 세션 유실이 일어나는 경우가 있는데, 이를 방지하기 위해 samesite 보안을 none처리
response.setHeader("Set-Cookie", "mberSession=mberSession; Secure; SameSite=None");
KmcVO kmcVO = new KmcVO(); //return VO
// 변수 -------------------------------------------------------------------------------------------------------------
String api_token = ""; // 토큰값(암호화)
String api_certNum = ""; // 요청번호(암호화)
String message = ""; // JSON 전문
String result_cd = ""; // JSON 결과코드
String result_msg = ""; // JSON 결과-상세
String strResult = ""; // JSON 결과
String apiRecCert = ""; // JSON 전송 데이터
String apiCertNum = ""; // JSON 전송 데이터
String rec_cert = ""; // 결과수신DATA
String k_certNum = ""; // 파라미터로 수신한 요청번호
String certNum = ""; // 요청번호
String date = ""; // 요청일시
String CI = ""; // 연계정보(CI)
String DI = ""; // 중복가입확인정보(DI)
String phoneNo = ""; // 휴대폰번호
String phoneCorp = ""; // 이동통신사
String birth = ""; // 생년월일
String gender = ""; // 성별
String nation = ""; // 내국인
String name = ""; // 성명
String reserve1 = ""; // 예비필드
String reserve2 = ""; // 예비필드
String reserve3 = ""; // 예비필드
String reserve4 = ""; // 예비필드
String result = ""; // 결과값
String certMet = ""; // 인증방법
String ip = ""; // ip주소
String plusInfo = "";
String encPara = "";
String encMsg1 = "";
String encMsg2 = "";
String msgChk = "";
//-----------------------------------------------------------------------------------------------------------------
try{
// Parameter 수신 --------------------------------------------------------------------
api_token = request.getParameter("apiToken").trim();
api_certNum = request.getParameter("certNum");
// 파라미터 유효성 검증
if( api_token.length() == 0 ){
goErrorPage("토큰값 비정상", request, response);
return kmcVO;
}
if( api_certNum.length() == 0 ){
goErrorPage("요청번호 비정상", request, response);
return kmcVO;
}
//현재시각 세팅(YYYYMMDDHI24MISS)
Calendar today = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
String api_date = sdf.format(today.getTime());
//01. 암호화 모듈 (jar) Loading
com.icert.comm.secu.IcertSecuManager seed = new com.icert.comm.secu.IcertSecuManager();
//api_token, api_certNum 복호화
api_token = seed.getDec(api_token, "");
api_certNum = seed.getDec(api_certNum, "");
// 파라미터 유효성 검증
if( api_token.length() == 0 ){
goErrorPage("토큰값 비정상(복호화 후)", request, response);
return kmcVO;
}
if( api_certNum.length() == 0 ){
goErrorPage("요청번호 비정상(복호화 후)", request, response);
return kmcVO;
}
// 1. URL 설정
String serverURL = "https://www.kmcert.com/kmcis/api/kmcisToken_api.jsp";
// 2. 연결 생성
URL url = new URL(serverURL);
// 3. HttpURLConnection 객체 생성.
HttpURLConnection con = null;
OutputStream wr = null;
BufferedReader bufferedReader = null;
// 4. URL 연결 (웹페이지 URL 연결.)
con = (HttpURLConnection)url.openConnection();
con.setConnectTimeout(20000); // TimeOut 시간 (서버 접속시 연결 시간 - 20초)
con.setReadTimeout(20000); // TimeOut 시간 (Read시 연결 시간 - 20초)
con.setDoOutput(true); // OutputStream으로 POST 데이터를 넘겨주겠다는 옵션.
con.setRequestProperty("Content-Type", "application/json;charset=utf-8"); // 타입설정(application/json) 형식으로 전송 (Request Body 전달시 application/json로 서버에 전달.)
con.setRequestProperty("Accept", "application/json"); // 서버 Response Data를 JSON 형식의 타입으로 요청.
con.setRequestMethod("POST"); // 요청 방식 선택 (POST)
// 5. JSON 전문 구성
JSONObject jsonData = new JSONObject();
jsonData.put("apiToken", api_token);
jsonData.put("apiDate", api_date);
message = jsonData.toString();
// 6. 전송
// Request Body에 Data를 담기위해 OutputStream 객체를 생성.
wr = con.getOutputStream();
// Request Body에 Data 셋팅.(한글깨짐 방지를 위해 utf-8인코딩 처리
wr.write(message.getBytes("utf-8"));
wr.flush();
wr.close();
// 실제 서버로 Request 요청 하는 부분. (응답 코드를 받는다. 200 성공, 나머지 에러)
int responseCode = con.getResponseCode();
// 4. 결과 수신
if(responseCode == 200){
bufferedReader = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
}else{
bufferedReader = new BufferedReader(new InputStreamReader(con.getErrorStream(), "UTF-8"));
}
if(bufferedReader != null){
StringBuilder stringBuilder = new StringBuilder();
String line = "";
while((line = bufferedReader.readLine()) != null){
stringBuilder.append(line);
}
bufferedReader.close();
String stringRet = stringBuilder.toString();
// 5. 넘어온 문자열을 JSON 객체로 변환
JSONParser jsonParser = new JSONParser();
//JSON데이터를 넣어 JSON Object 만들어 준다.
JSONObject jsonObj = (JSONObject)jsonParser.parse(stringRet);
// 6. JSON 객체에서 데이터 가져오기
if(jsonObj.get("result_cd") != null){
result_cd = jsonObj.get("result_cd").toString();
if("APR01".equals(result_cd)){
//통신성공
strResult = "Y";
rec_cert = jsonObj.get("apiRecCert").toString();
k_certNum = jsonObj.get("apiCertNum").toString();
}else if("APR02".equals(result_cd)){
//실패 - Token Expire
strResult = "N";
result_msg = "실패 - Token Expire";
}else if("APR03".equals(result_cd)){
//실패 - Token Not Found
strResult = "N";
result_msg = "실패 - Token Not Found";
}else if("APR04".equals(result_cd)){
//실패 - API 요청일시 길이 오류
strResult = "N";
result_msg = "실패 - API 요청일시 길이 오류";
}else if("APR05".equals(result_cd)){
//실패 - API 토큰 길이 오류
strResult = "N";
result_msg = "실패 - API 토큰 길이 오류";
}else if("APR06".equals(result_cd)){
//실패 - 결과전송 재요청(3회 제한)
strResult = "N";
result_msg = "실패 - 결과전송 재요청(3회 제한)";
}
}else{
//JSON 결과코드 에러
strResult = "F";
}
}else{ //timeout except 처리
strResult = "F";
}
// 파라미터 유효성 검증
if(!strResult.equals("Y")){
goErrorPage("결과값 비정상, 결과코드["+result_cd+"], "+"상세내용["+result_msg+"]", request, response);
return kmcVO;
}
//02. 1차 복호화
rec_cert = seed.getDec(rec_cert, "");
//03. 1차 파싱
int inf1 = rec_cert.indexOf("/",0);
int inf2 = rec_cert.indexOf("/",inf1+1);
encPara = rec_cert.substring(0,inf1); //암호화된 통합 파라미터
encMsg1 = rec_cert.substring(inf1+1,inf2); //암호화된 통합 파라미터의 Hash값
//04. 위변조 검증
encMsg2 = seed.getMsg(encPara);
if(encMsg2.equals(encMsg1)){
msgChk="Y";
}
if(msgChk.equals("N")){
goErrorPage("비정상적인 접근입니다.!!", request, response);
return kmcVO;
}
//05. 2차 복호화
rec_cert = seed.getDec(encPara, "");
//06. 2차 파싱
int info1 = rec_cert.indexOf("/",0);
int info2 = rec_cert.indexOf("/",info1+1);
int info3 = rec_cert.indexOf("/",info2+1);
int info4 = rec_cert.indexOf("/",info3+1);
int info5 = rec_cert.indexOf("/",info4+1);
int info6 = rec_cert.indexOf("/",info5+1);
int info7 = rec_cert.indexOf("/",info6+1);
int info8 = rec_cert.indexOf("/",info7+1);
int info9 = rec_cert.indexOf("/",info8+1);
int info10 = rec_cert.indexOf("/",info9+1);
int info11 = rec_cert.indexOf("/",info10+1);
int info12 = rec_cert.indexOf("/",info11+1);
int info13 = rec_cert.indexOf("/",info12+1);
int info14 = rec_cert.indexOf("/",info13+1);
int info15 = rec_cert.indexOf("/",info14+1);
int info16 = rec_cert.indexOf("/",info15+1);
int info17 = rec_cert.indexOf("/",info16+1);
int info18 = rec_cert.indexOf("/",info17+1);
kmcVO.setCertNum (rec_cert.substring(0,info1));
kmcVO.setDate (rec_cert.substring(info1+1,info2));
//CI 복호화
kmcVO.setCI (seed.getDec(rec_cert.substring(info2+1,info3), ""));
kmcVO.setPhoneNo (rec_cert.substring(info3+1,info4));
kmcVO.setPhoneCorp (rec_cert.substring(info4+1,info5));
kmcVO.setBirthDay (rec_cert.substring(info5+1,info6));
kmcVO.setGender (rec_cert.substring(info6+1,info7));
kmcVO.setNation (rec_cert.substring(info7+1,info8));
kmcVO.setName (rec_cert.substring(info8+1,info9));
kmcVO.setResult (rec_cert.substring(info9+1,info10));
kmcVO.setCertMet (rec_cert.substring(info10+1,info11));
kmcVO.setIp (rec_cert.substring(info11+1,info12));
kmcVO.setReserve1 (rec_cert.substring(info12+1,info13));
kmcVO.setReserve2 (rec_cert.substring(info13+1,info14));
kmcVO.setReserve3 (rec_cert.substring(info14+1,info15));
kmcVO.setReserve4 (rec_cert.substring(info15+1,info16));
kmcVO.setPlusInfo (rec_cert.substring(info16+1,info17));
//DI 복호화
kmcVO.setDI (seed.getDec(rec_cert.substring(info17+1,info18), ""));
//07. CI, DI 복호화
// CI = seed.getDec(CI, "");
// DI = seed.getDec(DI, "");
// ----------------------------------------------------------------------------------
}catch(StringIndexOutOfBoundsException ex){
goErrorPage("StringIndexOutOfBoundsException", request, response);
}catch(NullPointerException ex){
goErrorPage("NullPointerException", request, response);
}catch(NumberFormatException ex){
goErrorPage("NumberFormatException", request, response);
}catch(IllegalStateException ex){
goErrorPage("IllegalStateException", request, response);
}catch(IndexOutOfBoundsException ex){
goErrorPage("IndexOutOfBoundsException", request, response);
} catch (IOException e) {
goErrorPage("IOException", request, response);
} catch (ParseException e) {
goErrorPage("ParseException", request, response);
}
return kmcVO;
}
public AuthCertVO insertCertLog(KmcVO kmcVO, String msg) throws Exception {
//KMC 본인인증 로그 insert
AuthCertVO certVO = new AuthCertVO();
certVO.setMberId(kmcVO.getPlusInfo());
certVO.setCertNum(kmcVO.getCertNum());
certVO.setCertDate(kmcVO.getDate());
certVO.setCertDi(kmcVO.getDI());
certVO.setCertPhone(kmcVO.getPhoneNo());
certVO.setCertNation(kmcVO.getNation());
certVO.setCertName(kmcVO.getName());
certVO.setCertResult(kmcVO.getResult());
certVO.setCertType(msg);
certVO.setCertIpaddr(kmcVO.getIp());
certVO.setBirthDay(kmcVO.getBirthDay());
certVO.setSexdstnCode(kmcVO.getGender());
//디비 테이블에 저장하기
mberManageService.insertCertInfoLog(certVO);
return certVO;
}
private String getDomain(HttpServletRequest request) {
String serverNm = request.getScheme() + "://" + request.getServerName();
@ -144,5 +469,12 @@ public class KmcCertChecker {
return mberCertPhoneVO;
}
private void goErrorPage(String msg, HttpServletRequest request, HttpServletResponse response) throws IOException {
FlashMap flashMap = RequestContextUtils.getOutputFlashMap(request);
flashMap.put("msg", msg);
FlashMapManager flashMapManager = RequestContextUtils.getFlashMapManager(request);
flashMapManager.saveOutputFlashMap(flashMap, request, response);
response.sendRedirect("/web/cert/log/kmcErrorPage.do");
}
}

View File

@ -19,6 +19,8 @@ public class SendLogVO {
/*내용*/
private String contents;
private String sendMsgType;
public String getSendId() {
return sendId;
@ -62,5 +64,13 @@ public class SendLogVO {
public void setContents(String contents) {
this.contents = contents;
}
public String getSendMsgType() {
return sendMsgType;
}
public void setSendMsgType(String sendMsgType) {
this.sendMsgType = sendMsgType;
}
}

View File

@ -28,7 +28,7 @@ Globals.Env = dev
# mysql
Globals.DriverClassName=com.mysql.jdbc.Driver
Globals.Url=jdbc:mysql://192.168.0.60:3308/mjon_advc
Globals.Url=jdbc:mysql://192.168.0.60:3308/mjon_advc?useUnicode=true&connectionCollation=utf8mb4_unicode_ci&serverTimezone=Asia/Seoul
#Globals.Url=jdbc:mysql://139.150.73.12:3306/mjon
Globals.UserName= mjonUr
Globals.Password= mjon!@#$

View File

@ -28,8 +28,10 @@ Globals.Env = local
# mysql
Globals.DriverClassName=com.mysql.jdbc.Driver
Globals.Url=jdbc:mysql://192.168.0.60:3308/mjon_advc
#Globals.Url=jdbc:mysql://192.168.0.60:3308/mjon
#Globals.Url=jdbc:mysql://192.168.0.60:3308/mjon_advc
#Globals.Url=jdbc:mysql://192.168.0.60:3308/mjon_advc?characterEncoding=UTF-8&useUnicode=true&serverTimezone=Asia/Seoul
Globals.Url=jdbc:mysql://192.168.0.60:3308/mjon_advc?useUnicode=true&connectionCollation=utf8mb4_unicode_ci&serverTimezone=Asia/Seoul
Globals.UserName= mjonUr
Globals.Password= mjon!@#$
#Globals.Url=jdbc:mysql://192.168.0.125:3306/mjon

View File

@ -27,7 +27,7 @@ Globals.Env = prod
# mysql
Globals.DriverClassName=com.mysql.jdbc.Driver
Globals.Url=jdbc:mysql://10.12.107.14:3306/mjon_advc
Globals.Url=jdbc:mysql://10.12.107.14:3306/mjon_advc?useUnicode=true&connectionCollation=utf8mb4_unicode_ci&serverTimezone=Asia/Seoul
Globals.UserName= mjonUr
Globals.Password= mjon!@#$

View File

@ -4,7 +4,7 @@
xmlns:security="http://www.springframework.org/schema/security"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-4.2.xsd
http://www.egovframe.go.kr/schema/egov-security http://www.egovframe.go.kr/schema/egov-security/egov-security-3.7.xsd">
http://www.egovframe.go.kr/schema/egov-security http://maven.egovframe.go.kr/schema/egov-security/egov-security-3.7.xsd">
<security:http pattern="/css/**" security="none"/>
<security:http pattern="/html/**" security="none"/>

View File

@ -1409,7 +1409,7 @@
C.YELLOW_ID AS yellowId
FROM MJ_MSG_GROUP_DATA B
INNER JOIN (
select MSG_GROUP_ID, MSG_TYPE, DEL_FLAG, MSG_NOTICETALK_SENDER_KEY, BIZ_KAKAO_RESEND_YN, BIZ_KAKAO_RESEND_DATA
select MSG_GROUP_ID, MSG_TYPE, DEL_FLAG, MSG_NOTICETALK_SENDER_KEY, BIZ_KAKAO_RESEND_YN, BIZ_KAKAO_RESEND_DATA, CALL_TO
from MJ_MSG_DATA
where DEL_FLAG = 'N'
<isNotEmpty property="tabType">
@ -1452,6 +1452,9 @@
<isEqual property="searchCondition" compareValue="3">
AND B.SMS_TXT like CONCAT('%', #searchKeyword#, '%')
</isEqual>
<isEqual property="searchCondition" compareValue="4" >
AND A.CALL_TO LIKE CONCAT('%', #searchKeyword#, '%')
</isEqual>
</isNotEmpty>
GROUP BY B.MSG_GROUP_ID
ORDER BY 1=1

View File

@ -230,7 +230,7 @@
, MMD.BIZ_UMID AS bizUmid
, MMD.MSG_TYPE AS msgType
FROM
MJ_MSG_DATA MMD
MJ_MSG_DATA MMD FORCE index (IDX_MJ_MSG_DATA_13)
INNER JOIN LETTNGNRLMBER MB
ON MMD.USER_ID = MB.MBER_ID
INNER JOIN mj_msg_group_data MMGD

View File

@ -3737,7 +3737,8 @@
RECEIVE,
FRST_SEND_PNTTM,
CHECK_NO,
CONTENTS
CONTENTS,
SEND_MSG_TYPE
)
@ -3750,7 +3751,8 @@
#receive#,
now(),
#checkNo#,
#contents#
#contents#,
#sendMsgType#
)
</insert>
@ -8298,5 +8300,21 @@
</delete>
<select id="mjonMsgDataDAO.selectSysMsgTodaySendYn" parameterClass="SendLogVO" resultClass="boolean">
SELECT
<![CDATA[
COUNT(1) >= 1 AS todaySendYn
]]>
FROM
mj_system_send a
WHERE
RECEIVE = #receive#
<![CDATA[
AND FRST_SEND_PNTTM >= CURDATE()
AND FRST_SEND_PNTTM < CURDATE() + INTERVAL 1 DAY
]]>
AND SEND_MSG_TYPE = '01'
</select>
</sqlMap>

View File

@ -254,6 +254,9 @@
<isEqual property="searchCondition" compareValue="3" >
AND B.SMS_TXT LIKE CONCAT('%', #searchKeyword#, '%')
</isEqual>
<isEqual property="searchCondition" compareValue="4" >
AND A.CALL_TO LIKE CONCAT('%', #searchKeyword#, '%')
</isEqual>
</isNotEmpty>
<isNotEmpty property="searchCondition01">
AND B.RESERVE_YN = #searchCondition01#
@ -473,6 +476,9 @@
<isEqual property="searchCondition" compareValue="3" >
AND B.SMS_TXT LIKE CONCAT('%', #searchKeyword#, '%')
</isEqual>
<isEqual property="searchCondition" compareValue="4" >
AND A.CALL_TO LIKE CONCAT('%', #searchKeyword#, '%')
</isEqual>
</isNotEmpty>
<isNotEmpty property="searchCondition01">
AND B.RESERVE_YN = #searchCondition01#

View File

@ -980,6 +980,7 @@
IFNULL(SLACK_NOTI, 'N') AS slackNoti,
IFNULL(SMISHING_NOTI, 'N') AS smishingNoti,
IFNULL(HOLI_SMISHING_NOTI, 'N') AS holiSmishingNoti,
IFNULL(SMS_NOTI_IF_OVER_FIFTY, 'N') AS smsNotiIfOverFifty,
LAST_UPDUSR_ID AS lasUpdusrId,
LAST_UPDT_PNTTM AS lastUpdtPnttm
FROM MJ_MBER_SETTING

View File

@ -344,6 +344,7 @@
<input type="hidden" name="tr_cert" value = "<%=tr_cert%>">
<input type="hidden" name="tr_url" value = "<%=tr_url%>">
<input type="hidden" name="tr_add" value = "<%=tr_add%>">
<input type="hidden" name="tr_ver" value = "V2">
<input type="submit" value="본인인증서비스 요청" onclick= "javascript:openKMCISWindow();">
</form>
<BR>

View File

@ -904,5 +904,6 @@ function listAddrTransHistAjax(pageNo) {
<input type="hidden" name="tr_url" id="tr_url" value = "${tr_url}">
<input type="hidden" name="tr_add" id="tr_add" value = "${tr_add}">
<input type="hidden" name="mberId" id="mberId" value= "${userId}">
<input type="hidden" name="tr_ver" value = "V2">
</form>

View File

@ -26,7 +26,7 @@ function moveTab(type){
<!-- tab button -->
<ul class="tabType1">
<li class="tab active"><button type="button" onclick="TabType6(this,'1');">네이버 주소록을 이용하여 폰주소록 등록</button></li>
<li class="tab"><button type="button" onclick="TabType6(this,'2');">핸드폰 VCF파일로 변환하여 등록</button></li>
<li class="tab"><button type="button" onclick="TabType6(this,'2');listTab(this,'2');">핸드폰 VCF파일로 변환하여 등록</button></li>
</ul><!--// tab button -->
</div>
<!-- 네이버 주소록을 이용하여 등록 -->
@ -98,7 +98,8 @@ function moveTab(type){
</div><!--// 네이버 주소록을 이용하여 등록 - 안드로이드 -->
<!-- 네이버 주소록을 이용하여 등록 - 안드로이드 -->
<div class="addWrap iphone eleType_cont" id="listTab_2">
<!-- <div class="addWrap iphone eleType_cont" id="listTab_2"> -->
<div class="addWrap iphone eleType_cont">
<ul class="add_and">
<li>
<p class="number">01</p>
@ -140,49 +141,95 @@ function moveTab(type){
</div> <!-- // 네이버 주소록을 이용하여 등록-->
<!-- 핸드폰 VCF파일로 변환하여 등록 -->
<div class="enroll_cont" id="tab6_2">
<div class="addWrap vcf">
<ul class="add_and">
<li>
<p class="number">01</p>
<p class="txt">휴대폰 <strong>연락처 앱</strong> 선택</p>
<img src="/publish/images/content/add_vcf_img01.png"/>
</li>
<li>
<p class="number">02</p>
<p>왼쪽 메뉴 클릭 후<br/><strong>연락처 관리 선택</strong></p>
<img src="/publish/images/content/add_vcf_img02.png"/>
</li>
<li>
<p class="number">03</p>
<p>연락처 관리에서 <strong>연락처</strong><br/><strong>가져오기/내보내기</strong> 선택</p>
<img src="/publish/images/content/add_vcf_img03.png"/>
</li>
<li>
<p class="number">04</p>
<p class="txt"><strong>연락처 내보내기</strong> 선택</p>
<img src="/publish/images/content/add_vcf_img04.png"/>
</li>
<li>
<p class="number">05</p>
<p><strong>내장메모리</strong> 선택 후<br/><strong>핸드폰과 PC 연결</strong></p>
<img src="/publish/images/content/add_vcf_img05.png"/>
</li>
<li>
<p class="number">06</p>
<p><strong>내 PC</strong>에서<br/><strong>본인 핸드폰 기종</strong> 선택</p>
<img src="/publish/images/content/add_vcf_img06.png"/>
</li>
<li>
<p class="number">07</p>
<p><strong>연락처(VCF) 파일</strong> 선택 후<br/>PC 복사(Ctrl+C/Ctrl+V),<br>드래그앤드롭)</p>
<img src="/publish/images/content/add_vcf_img07.png"/>
</li>
</ul>
<div class="btnWrap">
<button type="button" onclick="moveTab('addrApply'); return false;">주소록 입력 무료대행</button>
<button type="button" onclick="moveTab('addr'); return false;">주소록 관리 바로가기</button>
</div>
</div>
<ul class="adr_depth3">
<li class="tab active"><button type="button" onclick="listTab(this,'2');">갤럭시</button></li>
<li class="tab"><button type="button" onclick="listTab(this,'3');">아이폰</button></li>
</ul>
<div class="addWrap list_cont current galexy" id="listTab_2">
<ul class="add_and">
<li>
<p class="number">01</p>
<p class="txt">휴대폰 <strong>연락처 앱</strong> 선택</p>
<img src="/publish/images/content/add_vcf_img01.png" />
</li>
<li>
<p class="number">02</p>
<p>왼쪽 메뉴 클릭 후<br /><strong>연락처 관리 선택</strong></p>
<img src="/publish/images/content/add_vcf_img02.png" />
</li>
<li>
<p class="number">03</p>
<p>연락처 관리에서 <strong>연락처</strong><br /><strong>가져오기/내보내기</strong> 선택</p>
<img src="/publish/images/content/add_vcf_img03.png" />
</li>
<li>
<p class="number">04</p>
<p class="txt"><strong>연락처 내보내기</strong> 선택</p>
<img src="/publish/images/content/add_vcf_img04.png" />
</li>
<li>
<p class="number">05</p>
<p><strong>내장메모리</strong> 선택 후<br /><strong>핸드폰과 PC 연결</strong></p>
<img src="/publish/images/content/add_vcf_img05.png" />
</li>
<li>
<p class="number">06</p>
<p><strong>내 PC</strong>에서<br /><strong>본인 핸드폰 기종</strong> 선택</p>
<img src="/publish/images/content/add_vcf_img06.png" />
</li>
<li>
<p class="number">07</p>
<p><strong>연락처(VCF) 파일</strong> 선택 후<br />PC 복사(Ctrl+C/Ctrl+V),<br>드래그앤드롭)</p>
<img src="/publish/images/content/add_vcf_img07.png" />
</li>
</ul>
<div class="btnWrap">
<button type="button" onclick="moveTab('addrApply'); return false;">주소록 입력 무료대행</button>
<button type="button" onclick="moveTab('addr'); return false;">주소록 관리 바로가기</button>
</div>
</div>
<div class="addWrap list_cont iphone vCard" id="listTab_3">
<ul class="add_and">
<li>
<p class="number">01</p>
<p class="txt">
<strong>iCloud.com</strong> 접속 후<br> <strong>Apple 계정</strong>으로 로그인
</p>
<img src="/publish/images/content/add_vCard_iphone_img01.png" />
</li>
<li>
<p class="number">02</p>
<p><strong>‘연락처’</strong> 앱 선택 및 실행 </p>
<img src="/publish/images/content/add_vCard_iphone_img02.png" />
</li>
<li>
<p class="number">03</p>
<p><strong>모든 연락처</strong> 선택</p>
<img src="/publish/images/content/add_vCard_iphone_img03.png" />
</li>
<li>
<p class="number">04</p>
<p class="txt"><strong>vCard</strong> 내보내기</p>
<img src="/publish/images/content/add_vCard_iphone_img04.png" />
</li>
<li>
<p class="number">05</p>
<p><strong>다운로드 폴더</strong>에<br><strong>iCloud vCards</strong> 파일로 저장</p>
<img src="/publish/images/content/add_vCard_iphone_img05.png" />
</li>
<li>
<p class="number">06</p>
<p><strong>연락처(vCards)</strong>파일 선택 후<br>
<strong>PC 바탕화면</strong>에 <br>
<strong>복사/붙여넣기</strong>(Ctrl+C/Ctrl+V)</p>
<img src="/publish/images/content/add_vCard_iphone_img06.png" />
</li>
</ul>
<div class="btnWrap">
<button type="button" onclick="moveTab('addrApply'); return false;">주소록 입력 무료대행</button>
<button type="button" onclick="moveTab('addr'); return false;">주소록 관리 바로가기</button>
</div>
</div>
</div><!--// 핸드폰 VCF파일로 변환하여 등록 -->
</div><!--// 주소록 관리 - 폰주소록 등록 -->
</div><!--// send top -->

View File

@ -9,7 +9,8 @@ $(document).ready(function(){
$('.download_btn').click(function(){
// click tag에 data-info="" 값 가져옴
var type = $(this).data('info');
var downUrl = "<c:out value='/sample_mjon/type_샘플_예제.zip' />";
// var downUrl = "<c:out value='/sample_mjon/type_샘플_예제.zip' />";
var downUrl = "<c:out value='/sample_mjon/type_샘플_예제_r3.zip' />";
downUrl = downUrl.replace('type', type);
location.href = downUrl;
});
@ -34,8 +35,8 @@ $(document).ready(function(){
<div class="pay_tab_wrap">
<ul class="tabType1">
<li class="tab active"><button type="button" onclick="TabType5(this,'1');TabType3(this,'1');">문자</button></li>
<li class="tab"><button type="button" onclick="TabType5(this,'2');TabType3(this,'7');">카카오톡</button></li>
<li class="tab active"><button type="button" onclick="TabType5(this,'1');listTab3(this,'1');$('.list_tab .tab:first-child').addClass('active').siblings().removeClass('active');">문자</button></li>
<li class="tab"><button type="button" onclick="TabType5(this,'2');listTab3(this,'7');$('.list_tab .tab:first-child').addClass('active').siblings().removeClass('active');">카카오톡</button></li>
</ul>
</div>
@ -97,6 +98,7 @@ $(document).ready(function(){
<th>jsp_example_select_price_r1.jsp</th>
<td>발송가능건수</td>
</tr>
</table>
</div>
</div>
@ -136,6 +138,7 @@ $(document).ready(function(){
<th>php_example_select_price_r1.php</th>
<td>발송가능건수</td>
</tr>
</table>
</div>
</div>
@ -303,10 +306,10 @@ $(document).ready(function(){
</div>
<!--// 예제 다운로드 내용-->
</div>
<div class="api_guide current" id="tab5_2">
<div class="api_guide" id="tab5_2">
<div class="api_download">
<ul class="info">
<li>- 카카오톡아래 예제(JSP, PHP)를 참고하시어 쉽고 편리하게 API를 연동할 수 있습니다.</li>
<li>- 아래 예제(JSP, PHP)를 참고하시어 쉽고 편리하게 API를 연동할 수 있습니다.</li>
<li>- JSP, PHP 외 타 예제는 계속해서 업데이트 될 예정입니다.</li>
</ul>
@ -341,14 +344,22 @@ $(document).ready(function(){
<col style="width:35%;">
<col style="width:65%;">
</colgroup>
<tr>
<th>kakao jsp_example_send_msg_r1.jsp</th>
<td>문자보내기(여러명에게 동일한문자)</td>
</tr>
<tr>
<th>sp_example_send_msgs_r1.jsp</th>
<td>문자보내기(여러명에게 다른문자)</td>
</tr>
<tr>
<th>jsp_example_inqry_chnlid_r1.jsp</th>
<td>카카오채널조회</td>
</tr>
<tr>
<th>jsp_example_inqry_templates_list_r1.jsp</th>
<td>카카오템플릿조회</td>
</tr>
<tr>
<th>jsp_example_send_at_r1.jsp</th>
<td>카카오알림톡발송</td>
</tr>
<!-- <tr>
<th>jsp_example_send_ft_r1.jsp</th>
<td>카카오친구톡발송</td>
</tr> -->
<tr>
<th>jsp_example_hstry_r1.jsp</th>
<td>전송내역조회</td>
@ -365,7 +376,7 @@ $(document).ready(function(){
</div>
</div>
<div class="btn_area">
<button type="button" class="btnType btnType11">JSP용 예제 다운받기</button>
<button type="button" class="btnType btnType11 download_btn" data-info="jsp" onclick="return false;">JSP용 예제 다운받기</button>
</div>
</div>
<!--// JSP 다운로드-->
@ -420,32 +431,41 @@ $(document).ready(function(){
<col style="width:65%;">
</colgroup>
<tbody>
<tr>
<th>php_example_send_msg_r1.php</th>
<td>문자보내기(여러명에게 동일한문자)</td>
</tr>
<tr>
<th>php_example_send_msgs_r1.php</th>
<td>문자보내기(여러명에게 다른문자)</td>
</tr>
<tr>
<th>php_example_hstry_r1.php</th>
<td>전송내역조회</td>
</tr>
<tr>
<th>php_example_hstry_detail_r1.php</th>
<td>상세전송내역조회</td>
</tr>
<tr>
<th>php_example_select_price_r1.php</th>
<td>발송가능건수</td>
</tr>
<tr>
<th>php_example_inqry_chnlid_r1.php</th>
<td>카카오채널조회</td>
</tr>
<tr>
<th>php_example_inqry_templates_list_r1.php</th>
<td>카카오템플릿조회</td>
</tr>
<tr>
<th>php_example_send_at_r1.php</th>
<td>카카오알림톡발송</td>
</tr>
<!-- <tr>
<th>php_example_send_ft_r1.php</th>
<td>카카오친구톡발송</td>
</tr> -->
<tr>
<th>php_example_hstry_r1.php</th>
<td>전송내역조회</td>
</tr>
<tr>
<th>php_example_hstry_detail_r1.php</th>
<td>상세전송내역조회</td>
</tr>
<tr>
<th>php_example_select_price_r1.php</th>
<td>발송가능건수</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="btn_area">
<button type="button" class="btnType btnType11">PHP용 예제 다운받기</button>
<!-- <button type="button" class="btnType btnType11">PHP용 예제 다운받기</button> -->
<button type="button" class="btnType btnType11 download_btn" data-info="php" onclick="return false;">PHP용 예제 다운받기</button>
</div>
</div>
<!--// PHP 다운로드-->

View File

@ -78,6 +78,6 @@ function customPopup(){
<ul class="tabType1">
<li class="tab"><button type="button" class="goSubPage" data-info="<c:url value="/web/api/apiSpec.do" />">문자</button></li>
<li class="tab"><button type="button" class="goSubPage" data-info="<c:url value="/web/api/apiAtSpec.do" />">알림톡</button></li>
<li class="tab"><button type="button" class="goSubPage" data-info="<c:url value="/web/api/apiFtSpec.do" />">친구톡</button></li>
<%-- <li class="tab"><button type="button" class="goSubPage" data-info="<c:url value="/web/api/apiFtSpec.do" />">친구톡</button></li> --%>
</ul>
</div>

View File

@ -1532,7 +1532,7 @@ function actionLogin_end(){
<ul class="menu">
<li>
<dl>
<dt><a href="<c:out value='/web/mjon/msgdata/selectMsgDataView.do'/>">문자송</a></dt>
<dt><a href="<c:out value='/web/mjon/msgdata/selectMsgDataView.do'/>">문자송</a></dt>
<dd>
<ul>
<li><a href="<c:out value='/web/mjon/msgdata/selectMsgDataView.do'/>">단문·장문·그림문자</a></li>
@ -1541,19 +1541,8 @@ function actionLogin_end(){
</ul>
</dd>
</dl>
<c:if test="${userCandidateYn eq 'Y' }">
<dl>
<dt><a href="<c:out value='/web/mjon/msgcampain/selectMsgDataView.do'/>" >선거문자</a></dt>
<dd>
<ul>
<li><a href="<c:out value='/web/mjon/msgcampain/selectMsgDataView.do'/>">단체문자</a></li>
<li><a href="<c:out value='/web/mjon/msgcampain/selectMsgTWDataView.do'/>" >20건 문자</a></li>
</ul>
</dd>
</dl>
</c:if>
<dl>
<dt><a href="<c:out value='/web/mjon/alimtalk/kakaoAlimtalkMsgDataView.do'/>">카톡송</a></dt>
<dt><a href="<c:out value='/web/mjon/alimtalk/kakaoAlimtalkMsgDataView.do'/>">카톡발송</a></dt>
<dd>
<ul>
<li><a href="<c:out value='/web/mjon/alimtalk/kakaoAlimtalkMsgDataView.do'/>">알림톡</a></li>
@ -1564,14 +1553,23 @@ function actionLogin_end(){
</ul>
</dd>
</dl>
<%-- <c:if test="${userCandidateYn eq 'Y' }">
<dl>
<dt><a href="<c:out value='/web/mjon/msgcampain/selectMsgDataView.do'/>" >선거문자</a></dt>
<dd>
<ul>
<li><a href="<c:out value='/web/mjon/msgcampain/selectMsgDataView.do'/>">단체문자</a></li>
<li><a href="<c:out value='/web/mjon/msgcampain/selectMsgTWDataView.do'/>" >20건 문자</a></li>
</ul>
</dd>
</dl>
</c:if> --%>
<dl>
<dt><a href="<c:out value='/web/api/intrdView.do'/>">API 연동</a></dt>
<dt><a href="/web/info/mjonInfo.do" >팩스발송</a></dt>
<dd>
<ul>
<li><a href="<c:out value='/web/api/intrdView.do'/>">연동안내</a></li>
<li><a href="<c:out value='/web/api/apiSpec.do'/>" >개발 가이드</a></li>
<li><a href="<c:out value='/web/api/examDown.do'/>" >예제 다운로드</a></li>
<li><a href="<c:out value='/web/api/appMgmt.do'/>" >신청/관리</a></li>
<li><a href="/web/mjon/fax/faxDataView.do">팩스발송</a></li>
<li><a href="/web/mjon/fax/faxSendList.do" >팩스발송내역</a></li>
</ul>
</dd>
</dl>
@ -1587,27 +1585,6 @@ function actionLogin_end(){
</ul>
</dd>
</dl>
<dl>
<dt><a href="/web/info/mjonInfo.do" >문자온소개</a></dt>
<dd>
<ul>
<li><a href="/web/info/mjonInfo.do" >서비스 소개</a></li>
<li><a href="/web/info/mjonFunc.do" >주요기능</a></li>
<li><a href="/web/mjon/msgdata/selectBestMsgDataView.do" >베스트문자샘플</a></li>
</ul>
</dd>
</dl>
<dl>
<dt><a href="/web/info/mjonInfo.do" >팩스전송</a></dt>
<dd>
<ul>
<li><a href="/web/mjon/fax/faxDataView.do">팩스전송</a></li>
<li><a href="/web/mjon/fax/faxSendList.do" >팩스전송내역</a></li>
</ul>
</dd>
</dl>
</li>
<li>
<dl>
<dt><a href="<c:out value='/web/mjon/addr/selectAddrList.do'/>" >주소록관리</a></dt>
<dd>
@ -1619,8 +1596,6 @@ function actionLogin_end(){
</ul>
</dd>
</dl>
</li>
<li>
<dl>
<dt><a href="<c:out value='/web/mjon/msgsent/selectMsgSentView.do'/>">발송결과</a></dt>
<dd>
@ -1629,14 +1604,33 @@ function actionLogin_end(){
</ul>
</dd>
</dl>
<%-- <dl>
<dt><a href="<c:out value='/web/mjon/reservmsg/selectReservMsgView.do'/>">예약관리</a></dt>
</li>
<li>
<dl>
<dt><a href="<c:out value='/web/member/pay/PayList.do'/>" >결제관리</a></dt>
<dd>
<ul>
<li><a href="<c:out value='/web/mjon/reservmsg/selectReservMsgView.do'/>">예약관리</a></li>
<li><a href="<c:out value='/web/pay/PayGuide.do'/>" >요금안내/견적내기</a></li>
<li><a href="<c:out value='/web/member/pay/PayView.do'/>" >결제하기</a></li>
<li><a href="<c:out value='/web/member/pay/PayList.do'/>" >요금 결제내역</a></li>
<li><a href="<c:out value='/web/member/pay/payUserSWList.do'/>" >요금 사용내역</a></li>
<!-- 현금영수증 자동발행 주석 -->
<%-- <li><a href="<c:out value='/web/member/pay/BillPub.do'/>" >계산서/현금영수증 발행 등록</a></li> --%>
<li><a href="<c:out value='/web/member/pay/BillPub.do'/>" >세금계산서 발행</a></li>
</ul>
</dd>
</dl> --%>
</dl>
<dl>
<dt><a href="<c:out value='/web/api/intrdView.do'/>">API 연동</a></dt>
<dd>
<ul>
<li><a href="<c:out value='/web/api/intrdView.do'/>">연동안내</a></li>
<li><a href="<c:out value='/web/api/apiSpec.do'/>" >개발 가이드</a></li>
<li><a href="<c:out value='/web/api/examDown.do'/>" >예제 다운로드</a></li>
<li><a href="<c:out value='/web/api/appMgmt.do'/>" >신청/관리</a></li>
</ul>
</dd>
</dl>
</li>
<li>
<dl>
@ -1658,23 +1652,21 @@ function actionLogin_end(){
</ul>
</dd>
</dl>
</li>
<li>
<dl>
<dt><a href="<c:out value='/web/member/pay/PayList.do'/>" >결제관리</a></dt>
<dt><a href="/web/info/mjonInfo.do" >문자온소개</a></dt>
<dd>
<ul>
<li><a href="<c:out value='/web/pay/PayGuide.do'/>" >요금안내/견적내기</a></li>
<li><a href="<c:out value='/web/member/pay/PayView.do'/>" >결제하기</a></li>
<li><a href="<c:out value='/web/member/pay/PayList.do'/>" >요금 결제내역</a></li>
<li><a href="<c:out value='/web/member/pay/payUserSWList.do'/>" >요금 사용내역</a></li>
<!-- 현금영수증 자동발행 주석 -->
<%-- <li><a href="<c:out value='/web/member/pay/BillPub.do'/>" >계산서/현금영수증 발행 등록</a></li> --%>
<li><a href="<c:out value='/web/member/pay/BillPub.do'/>" >세금계산서 발행</a></li>
<li><a href="/web/info/mjonInfo.do" >서비스 소개</a></li>
<li><a href="/web/info/mjonFunc.do" >주요기능</a></li>
<li><a href="/web/mjon/msgdata/selectBestMsgDataView.do" >베스트문자샘플</a></li>
</ul>
</dd>
</dl>
</li>
<!-- <li> -->
<!-- <li> -->
<!-- </li> -->
<!-- </li> -->
<li>
<dl>
<dt><a href="<c:out value='/web/cop/bbs/NoticeList.do'/>" >고객센터</a></dt>
@ -1896,6 +1888,7 @@ function actionLogin_end(){
<input type="hidden" name="tr_cert" id="tr_certHeader" value = "">
<input type="hidden" name="tr_url" id="tr_urlHeader" value = "">
<input type="hidden" name="tr_add" id="tr_addHeader" value = "">
<input type="hidden" name="tr_ver" value = "V2">
</form>
<form name="cmpChangeForm" id="cmpChangeForm" method="post" action="#">

View File

@ -90,6 +90,7 @@ function openMberSecessionInfo(key){
<input type="hidden" id="tr_url" name="tr_url" value = "${certVO.tr_url}">
<input type="hidden" id="tr_add" name="tr_add" value = "${certVO.tr_add}">
<input type="hidden" id="tr_cert" name="tr_cert" value = "${certVO.tr_cert}">
<input type="hidden" name="tr_ver" value = "V2">
</form>
<!-- ars 본인인증 Form -->

View File

@ -0,0 +1,22 @@
<%@ page contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<script src="<c:url value='/js/jquery.js' />"></script>
<html>
<head>
<meta name="robots" content="noindex">
<script language=javascript>
$( document ).ready(function() {
alert("${msg}")
self.close();
});
</script>
</head>
<body>
</body>
</html>

View File

@ -5,6 +5,11 @@
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<head>
<style>
.custom_layer .body_cont table tr.custom_put1 td .custom_put1_txt{margin:8px 0 0 0;}
.custom_layer .body_cont table tr.custom_put1 td .custom_put1_txt p{line-height:1.2;}
.custom_layer .body_cont table tr.custom_put1 td .custom_put1_txt p:first-child{margin:0;}
</style>
<script type="text/javascript">
$(document).ready(function(){
$("input:text[numberOnly]").on("keyup", function() {
@ -410,7 +415,8 @@ function customProvisionView(obj){
</div>
<div class="custom_put1_txt">
<p><span class="vMiddle">*</span> <span class="c_e40000">캘리그래피체는 수정이 불가</span>합니다.</p>
<p><span class="vMiddle">*</span> <spanspan class="c_e40000">제작형태와 요청사항이 상이</span>한 경우 <spanspan class="c_e40000">추가로 비용이 발생</span>할 수 있습니다.</p>
<p><span class="vMiddle">*</span> <span class="c_e40000">제작형태와 요청사항이 상이</span>한 경우 <span class="c_e40000">추가로 비용이 발생</span>할 수 있습니다.</p>
<p><span class="vMiddle">*</span> <span class="c_e40000">제작된 이미지는 <span class="c_e40000">알림톡 및 친구톡</span> 발송에는 사용할 수 없습니다.</p>
</div>
</td>
</tr>
@ -418,7 +424,7 @@ function customProvisionView(obj){
<th>제공방법</th>
<td>
<input type="checkbox" id="storage" checked="checked" disabled="disabled"> <label for="storage">내보관함</label>
<input type="checkbox" name="customProvision" id="radio11" value="01"> <label for="radio11">카카오톡</label>
<input type="checkbox" name="customProvision" id="radio11" value="01"> <label for="radio11">문자</label>
<input type="checkbox" name="customProvision" id="radio12" value="02"> <label for="radio12">이메일</label>
<input type="text" class="radio12_input" name="customResultEmail" placeholder="이메일주소를 입력해주세요" onfocus="''" onblur="this.placeholder='이메일주소를 입력해주세요'">
<!-- <span>중복선택 가능(최대2개)</span> -->

View File

@ -821,5 +821,6 @@ function listAddrTransHistAjax(pageNo) {
<input type="hidden" name="tr_url" id="tr_url" value = "${tr_url}">
<input type="hidden" name="tr_add" id="tr_add" value = "${tr_add}">
<input type="hidden" name="mberId" id="mberId" value= "${userId}">
<input type="hidden" name="tr_ver" value = "V2">
</form>

View File

@ -135,30 +135,8 @@ function tokenSend(){
}else{
if(code == '310'){
var infoSize = returnData.delInfoCnt;
if(infoSize > 0){
if(confirm("기존에 삭제된 채널ID가 있습니다. 복구 하시겠습니까?")){
fnUpdateProfileStatus();
}
}else{
alert("이미 등록된 채널ID 입니다. 타 사이트에 등록된 채널ID를 확인해 주세요.");
return false;
}
}else{//인증 토큰 발송에 오류가 있는 경우 카카오의 오류 메세지를 표시
alert("인증번호 받기 처리 중 오류가 발생하였습니다. 오류 코드 : " + msg);
return false;
}
alert(msg);
return false;
}
}else{
@ -172,37 +150,6 @@ function tokenSend(){
});
}
function fnUpdateProfileStatus(){
var data = new FormData(bizForm);
$.ajax({
url : "<c:url value='/web/mjon/kakao/profile/updateKaKaoProfileStatusAjax.do'/>"
, type : 'POST'
, data : data
, dataType:'json'
, async: false
, processData: false
, contentType: false
, cache: false
, success: function (returnData, status) {
if(returnData.result == "success") {//인증번호 발송 완료
alert(returnData.kakaoInfo.bizReturnMsg);
location.reload();
}else{
alert(returnData.kakaoInfo.bizReturnMsg);
return false;
}
}
,error : function(request , status, error){
alert("code:"+request.status+"\n"+"message:"+request.responseText+"\n"+"error:"+error);
}
});
}
function sendProfile(){
var firstSelect = $("select[name='firstCatagoryList']").val();
var secondSelect = $("select[name='secondCatagoryList']").val();
@ -259,23 +206,9 @@ function sendProfile(){
if(returnData.result == "loginFail") {//차단 발신번호인 경우 등록 불가
alert("로그인후 진행");
}else if(returnData.result == "success") {
var code = returnData.kakaoInfo.bizReturnCode
if(code == "200"){
alert(returnData.kakaoInfo.bizReturnMsg);
location.reload();
}else if(code == "310"){//타사이트에 등록되어 있는 경우 알림메세지 표시
alert("이미 등록된 채널ID 입니다. 타 사이트에 등록된 채널ID를 확인해 주세요.");
return false;
}else{
alert(returnData.kakaoInfo.bizReturnMsg);
return false;
}
}else if(returnData.result == "zeroUpdate"){
}else{
alert(returnData.kakaoInfo.bizReturnMsg);
return false;
location.reload();
}
},
beforeSend : function(xmlHttpRequest) {

View File

@ -535,6 +535,7 @@ function fn_sentDetailView(msgGroupId) {
<select name="searchCondition" id="searchCondition" class="selType2">
<%-- <option value="4" <c:if test="${kakaoSentVO.searchCondition == '3'}">selected</c:if> >채널ID</option> --%>
<option value="3" <c:if test="${kakaoSentVO.searchCondition == '3'}">selected</c:if> >내용</option>
<option value="4" <c:if test="${kakaoSentVO.searchCondition == '4'}">selected</c:if> >수신번호</option>
<%-- <option value="3" <c:if test="${kakaoSentVO.searchCondition == '3'}">selected</c:if> >수신번호</option> --%>
</select>
<div class="search">

View File

@ -536,9 +536,9 @@ function addTemplate(){
}
if(!kakaoTemplateEmojiCheck(bizForm.templateContent.value)){
/* if(!kakaoTemplateEmojiCheck(bizForm.templateContent.value)){
return false;
}
} */
var data = new FormData(bizForm);

View File

@ -860,6 +860,7 @@ function fnAddUserView() {
<input type="hidden" name="tr_cert" id="tr_cert" value = "${tr_cert}">
<input type="hidden" name="tr_url" id="tr_url" value = "${tr_url}">
<input type="hidden" name="tr_add" id="tr_add" value = "${tr_add}">
<input type="hidden" name="tr_ver" value = "V2">
<input type="hidden" name="mberNm" id="mberNm" value="">
<input type="hidden" name="moblphonNo" id="moblphonNo" value="">
<input type="hidden" name="mberId" id="mberId" value="">

View File

@ -129,6 +129,7 @@ function fnAddUserView() {
<input type="hidden" name="tr_cert" id="tr_cert" value = "${tr_cert}">
<input type="hidden" name="tr_url" id="tr_url" value = "${tr_url}">
<input type="hidden" name="tr_add" id="tr_add" value = "${tr_add}">
<input type="hidden" name="tr_ver" value = "V2">
<input type="hidden" name="mberNm" id="mberNm" value="">
<input type="hidden" name="moblphonNo" id="moblphonNo" value="">
<input type="hidden" name="mberId" id="mberId" value="">

View File

@ -644,6 +644,7 @@
<input type="hidden" name="tr_cert" id="tr_cert" value = "${tr_cert}">
<input type="hidden" name="tr_url" id="tr_url" value = "${tr_url}">
<input type="hidden" name="tr_add" id="tr_add" value = "${tr_add}">
<input type="hidden" name="tr_ver" value = "V2">
</form>
<form name="arsForm" method="post" action="#">
<input type="hidden" id="phoneNumber" name="phoneNumber" value = "">

View File

@ -634,6 +634,7 @@
<input type="hidden" name="tr_cert" id="tr_cert" value = "${tr_cert}">
<input type="hidden" name="tr_url" id="tr_url" value = "${tr_url}">
<input type="hidden" name="tr_add" id="tr_add" value = "${tr_add}">
<input type="hidden" name="tr_ver" value = "V2">
</form>
<form name="arsForm" method="post" action="#">
<input type="hidden" id="phoneNumber" name="phoneNumber" value = "">

View File

@ -707,6 +707,7 @@
<input type="hidden" name="tr_cert" id="tr_cert" value = "${tr_cert}">
<input type="hidden" name="tr_url" id="tr_url" value = "${tr_url}">
<input type="hidden" name="tr_add" id="tr_add" value = "${tr_add}">
<input type="hidden" name="tr_ver" value = "V2">
</form>
<form name="arsForm" method="post" action="#">
<input type="hidden" id="phoneNumber" name="phoneNumber" value = "">

View File

@ -888,10 +888,11 @@ function subContent(){
<button type="button" class="btnType6" onClick="javascript:fnSearch(1); return false;">조회</button>
</div>
<div class="btn_right">
<label for="searchCondition" class="label">검색 조건: ${mjonMsgSentVO.searchCondition == '2' ? '발신번호' : '문자내용'}</label>
<label for="searchCondition" class="label">검색 조건: ${mjonMsgSentVO.searchCondition == '2' ? '발신번호' : mjonMsgSentVO.searchCondition == '3' ? '문자내용' : '수신번호'}</label>
<select name="searchCondition" id="searchCondition" class="selType2 select_btn">
<option value="2" <c:if test="${mjonMsgSentVO.searchCondition == '2'}">selected</c:if> >발신번호</option>
<option value="3" <c:if test="${mjonMsgSentVO.searchCondition == '3'}">selected</c:if> >문자내용</option>
<option value="4" <c:if test="${mjonMsgSentVO.searchCondition == '4'}">selected</c:if> >수신번호</option>
</select>
<div class="search">
<label for="id" class="label"></label>

View File

@ -196,10 +196,6 @@ function f_print(){
<fmt:formatNumber type="number" maxFractionDigits="3" value="${resultFax.ftSendCount}" var="ftSendCount" />
<c:out value="${ftSendCount}"/>
</td>
<td>
<fmt:formatNumber type="number" maxFractionDigits="3" value="${resultFax.supplyPrice}" var="supplyPrice" />
<c:out value="${supplyPrice}"/>
</td>
<td>
<fmt:formatNumber type="number" maxFractionDigits="3" value="${resultFax.totalPrice}" var="totalPrice" />
<c:out value="${totalPrice}"/>

View File

@ -545,6 +545,37 @@ function getMberGrdChk() {
</table>
<span class="reqTxt4">* 텍스트 용량(Byte)에 대한 안내 : 한글2Byte, 영문·숫자 1Byte를 차지.</span>
<p class="tType1_title"><img src="/publish/images/content/icon_fee2.png" alt="알림톡 아이콘 이미지"> 친구톡</p>
<table class="tType2">
<colgroup>
<col style="width: 20%;">
<col style="width: 60%;">
<col style="width: 20%;">
</colgroup>
<thead>
<tr>
<th>구분</th>
<th>특징</th>
<th>가격</th>
</tr>
</thead>
<tbody>
<tr>
<th>친구톡(텍스트)</th>
<td rowspan="3">카카오톡을 통해 채널 친구 대상으로 발송이 가능한 광고성 메시지<br />(1,000자 이하의 텍스트 및 이미지 발송 가능)</td>
<td><span>13.8</span>원</td>
</tr>
<tr>
<th>친구톡(이미지)</th>
<td><span>19.9</span>원</td>
</tr>
<tr>
<th>친구톡(와이드 이미지)</th>
<td><span>22.9</span>원</td>
</tr>
</tbody>
</table>
<p class="tType1_title"><img src="/publish/images/content/icon_fee_fax.png" alt="팩스 아이콘 이미지"> 팩스</p>
<table class="tType2">
<colgroup>

View File

@ -90,9 +90,10 @@ function payUserListAjax(pageNo){
return;
};
if(!fn_G_limitDateChk("startDate", 3)){
/* 검색 기간 3개월 제한 처리 */
/* if(!fn_G_limitDateChk("startDate", 3)){
return;
};
}; */
document.listForm.pageIndex.value = pageNo;
var sendData= $(document.listForm).serializeArray();

View File

@ -505,6 +505,7 @@ function changeValueWork(obj){
<input type="hidden" name="tr_cert" id="tr_cert" value="">
<input type="hidden" name="tr_url" id="tr_url" value="">
<input type="hidden" name="tr_add" id="tr_add" value="">
<input type="hidden" name="tr_ver" value = "V2">
</form>
<!-- 마이페이지 - 회원정보 변경 -->

View File

@ -218,6 +218,7 @@ function updateUserInfo(){
<input type="hidden" name="tr_cert" id="tr_cert" value="">
<input type="hidden" name="tr_url" id="tr_url" value="">
<input type="hidden" name="tr_add" id="tr_add" value="">
<input type="hidden" name="tr_ver" value = "V2">
</form>
<!-- 마이페이지 - 회원정보 변경 -->

View File

@ -304,6 +304,7 @@ function callTo() {
<input type="hidden" id="tr_url" name="tr_url" value = "${certVO.tr_url}">
<input type="hidden" id="tr_add" name="tr_add" value = "${certVO.tr_add}">
<input type="hidden" id="tr_cert" name="tr_cert" value = "${certVO.tr_cert}">
<input type="hidden" name="tr_ver" value = "V2">
</form>
<form id="levelForm" name="levelForm" method="post">

View File

@ -97,6 +97,7 @@ function openMberSecessionInfo(key){
<input type="hidden" id="tr_url" name="tr_url" value = "${certVO.tr_url}">
<input type="hidden" id="tr_add" name="tr_add" value = "${certVO.tr_add}">
<input type="hidden" id="tr_cert" name="tr_cert" value = "${certVO.tr_cert}">
<input type="hidden" name="tr_ver" value = "V2">
</form>
<!-- ars 본인인증 Form -->

View File

@ -704,6 +704,7 @@ function linkPage(pageNo){
<input type="hidden" id="tr_url" name="tr_url" value = "${certVO.tr_url}">
<input type="hidden" id="tr_add" name="tr_add" value = "${certVO.tr_add}">
<input type="hidden" id="tr_cert" name="tr_cert" value = "${certVO.tr_cert}">
<input type="hidden" name="tr_ver" value = "V2">
</form>
<form name="listForm" action="<c:url value='/web/user/mberSecureLogin.do'/>" method="post">
<input name="pageIndex" type="hidden" value="<c:out value='${mberCertLoginLogVO.pageIndex}'/>"/>

View File

@ -26,7 +26,8 @@
opener.parentVal = resultFlag;
var resultNameChk = '${resultNameChk}';
opener.nameChkVal = resultNameChk;
opener.insertDocumentForm.ownerName.value = "${searchVO.name}";
// opener.insertDocumentForm.ownerName.value = "${searchVO.name}";
opener.insertDocumentForm.ownerName.value = "${name}";
opener.insertDocumentForm.CI.value = "${CI}";
opener.insertDocumentForm.birthDay.value = "${birthDay}";
opener.hpCertChkResult();

View File

@ -27,7 +27,7 @@
</script>
</head>
<body>
<br><br>
<%-- <br><br>
[복호화 후 수신값] <br>
<br>
<table cellpadding=1 cellspacing=1>
@ -120,6 +120,6 @@
rec_cert : ${kmcVO.recCert}<br>
<br>
<br>
<a href="http://www.munjaon.co.kr/publish/kmc/kmcis_web_sample_step01.jsp">[다시 테스트]</a>
<a href="http://www.munjaon.co.kr/publish/kmc/kmcis_web_sample_step01.jsp">[다시 테스트]</a> --%>
</body>
</html>

View File

@ -863,6 +863,7 @@ function nameChk(target){
<input type="hidden" id="tr_url" name="tr_url" value = "${tr_url}">
<input type="hidden" id="tr_add" name="tr_add" value = "${tr_add}">
<input type="hidden" id="tr_cert" name="tr_cert" value = "${tr_cert}">
<input type="hidden" name="tr_ver" value = "V2">
</form>
<!-- ars 본인인증 Form -->

View File

@ -408,6 +408,7 @@ function guideTab(obj){
<input type="hidden" id="tr_url" name="tr_url" value = "${tr_url}">
<input type="hidden" id="tr_add" name="tr_add" value = "${tr_add}">
<input type="hidden" id="tr_cert" name="tr_cert" value = "${tr_cert}">
<input type="hidden" name="tr_ver" value = "V2">
</form>
<!-- ars 본인인증 Form -->

View File

@ -10,22 +10,24 @@
<link rel="stylesheet" href="/publish/css/reset.css">
<link rel="stylesheet" href="/publish/css/jquery.mCustomScrollbar.css">
<link rel="stylesheet" href="/publish/css/common.css">
<link rel="stylesheet" href="/publish/css/style.css">
<link rel="stylesheet" href="/publish/css/button.css">
<link rel="stylesheet" href="/publish/css/content.css">
<link rel="stylesheet" href="/publish/css/adrbook.css">
<link rel="stylesheet" href="/publish/css/font.css">
<link rel="stylesheet" href="/publish/css/popupLayer.css">
<script src="/publish/js/jquery-3.5.0.js"></script>
<script src="/publish/js/jquery.mCustomScrollbar.concat.min.js"></script>
<script src="/publish/js/common.js"></script>
<script src="/publish/js/content.js"></script>
<script src="/publish/js/calendar.js"></script>
<script src="/publish/js/popupLayer.js"></script>
<script src="/publish/js/popupLayer.js"></script>
</head>
<body>
<div class="mask"></div>
<div data-include-path="/publish/layout/_header.html"></div>
@ -36,14 +38,9 @@
<!-- send top -->
<div class="send_top">
<!-- tab button -->
<ul class="tabType4">
<li class="tab"><button type="button" onclick="location.href='/publish/adrbook1.html'">주소록관리</button></li>
<li class="tab"><button type="button" onclick="location.href='/publish/adrbook_fax.html'">팩스 주소록관리</button></li>
<li class="tab"><button type="button" onclick="location.href='/publish/adrbook2.html'">수신거부</button></li>
<li class="tab active"><button type="button" onclick="TabType5(this,'4');">폰주소록 등록</button></li>
<li class="tab"><button type="button" onclick="location.href='/publish/adrbook3.html'">주소록 입력 대행(무료)</button></li>
</ul><!--// tab button -->
<!-- 주소록 관리 - 폰주소록 등록 -->
<!-- <%@include file="/WEB-INF/jsp/web/addr/include/topMenu.jsp" %> -->
<!--// tab button -->
<!-- 주소록 관리 - 폰주소록 등록 -->
<div class="adr_cont current" id="tab5_3">
<div class="heading">
<h2>폰주소록 등록</h2>
@ -53,167 +50,223 @@
<ul class="tabType1">
<li class="tab active"><button type="button" onclick="TabType6(this,'1');">네이버 주소록을 이용하여 폰주소록 등록</button></li>
<li class="tab"><button type="button" onclick="TabType6(this,'2');">핸드폰 VCF파일로 변환하여 등록</button></li>
</ul><!--// tab button -->
</ul>
<!--// tab button -->
</div>
<!-- 네이버 주소록을 이용하여 등록 -->
<div class="enroll_cont current" id="tab6_1">
<!-- tab button 주석처리_240423 -->
<!-- <ul class="adr_depth3">
<li class="tab active"><button type="button" onclick="listTab(this,'1');">안드로이드</button></li>
<li class="tab"><button type="button" onclick="listTab(this,'2');">아이폰</button></li>
</ul> -->
<!--// tab button -->
<!-- 네이버 주소록을 이용하여 등록 - 안드로이드 -->
<div class="addWrap android eleType_cont current" id="listTab_1">
<div class="addWrap android eleType_cont current address" id="listTab_1">
<ul class="add_and">
<li>
<p class="number">01</p>
<p>구글 플레이 스토어 · 애플 앱스토어에서<strong> 네이버</strong> 앱 다운</p>
<img src="/publish/images/content/address_img01.png">
<img src="/publish/images/content/address_img01.png" />
</li>
<li>
<p class="number">02</p>
<p>왼쪽 상단 <strong>메뉴</strong> 선택</p>
<img src="/publish/images/content/address_img02.png">
<img src="/publish/images/content/address_img02.png" />
</li>
<li>
<p class="number">03</p>
<p>하단 스크롤 후 <br><strong>[내도구] → 주소록</strong> 선택</p>
<img src="/publish/images/content/address_img03.png">
<p>하단 스크롤 후 <br /><strong>[내도구] → 주소록</strong> 선택</p>
<img src="/publish/images/content/address_img03.png" />
</li>
<li>
<p class="number">04</p>
<p>오른쪽 상단 <strong>메뉴</strong> 선택</p>
<img src="/publish/images/content/address_img04.png">
<img src="/publish/images/content/address_img04.png" />
</li>
<li>
<p class="number">05</p>
<p>폰 연락처 <strong>업로드</strong> 선택</p>
<img src="/publish/images/content/address_img05.png">
<img src="/publish/images/content/address_img05.png" />
</li>
<li>
<p class="number">06</p>
<p class="txt"><strong>새로고침</strong> 선택</p>
<img src="/publish/images/content/address_img06.png">
<img src="/publish/images/content/address_img06.png" />
</li>
<li>
<p class="number">07</p>
<p>연락처 접근 <strong>허용</strong> 선택</p>
<img src="/publish/images/content/address_img07.png">
<img src="/publish/images/content/address_img07.png" />
</li>
<li>
<p class="number">08</p>
<p><strong>폰 연락처 업로드</strong> 완료</p>
<img src="/publish/images/content/address_img08.png">
<img src="/publish/images/content/address_img08.png" />
</li>
<li class="nine">
<p class="number">09</p>
<p>PC에서 네이버 메일 접속 후 <strong>상단 주소록 아이콘</strong> 선택</p>
<img src="/publish/images/content/address_img09.png">
<img src="/publish/images/content/address_img09.png" />
</li>
<li>
<p class="number">10</p>
<p>연락처 저장 · 내보내기 선택 후 파일 형식(<strong>CSV 또는 XLSX</strong>), 항목, 대상 선택 후 <strong>파일로 저장하기</strong> 클릭</p>
<img src="/publish/images/content/address_img10.png">
<img src="/publish/images/content/address_img10.png" />
</li>
</ul>
<div class="btnWrap">
<button type="button">주소록 입력 무료대행</button>
<button type="button">주소록 관리 바로가기</button>
<button type="button" onclick="moveTab('addrApply'); return false;">주소록 입력 무료대행</button>
<button type="button" onclick="moveTab('addr'); return false;">주소록 관리 바로가기</button>
</div>
</div><!--// 네이버 주소록을 이용하여 등록 - 안드로이드 -->
</div>
<!--// 네이버 주소록을 이용하여 등록 - 안드로이드 -->
<!-- 네이버 주소록을 이용하여 등록 - 안드로이드 -->
<div class="addWrap iphone eleType_cont" id="listTab_2">
<!-- <div class="addWrap iphone eleType_cont" id="listTab_2"> -->
<div class="addWrap iphone eleType_cont">
<ul class="add_and">
<li>
<p class="number">01</p>
<p>애플 앱스토어에서<br/><strong>네이버 주소록</strong> 앱 다운</p>
<img src="/publish/images/content/add_iphone_img01.png"/>
<p>애플 앱스토어에서<br /><strong>네이버 주소록</strong> 앱 다운</p>
<img src="/publish/images/content/add_iphone_img01.png" />
</li>
<li>
<p class="number">02</p>
<p>네이버 주소록 앱 실행 후<br/><strong>주소록 접근 권한 승인 선택</strong></p>
<img src="/publish/images/content/add_iphone_img02.png"/>
<p>네이버 주소록 앱 실행 후<br /><strong>주소록 접근 권한 승인 선택</strong></p>
<img src="/publish/images/content/add_iphone_img02.png" />
</li>
<li>
<p class="number">03</p>
<p><strong>원하는 모드를 선택</strong><br/>
<p><strong>원하는 모드를 선택</strong><br />
주소록 앱 시작하기 선택</p>
<img src="/publish/images/content/add_iphone_img03.png"/>
<img src="/publish/images/content/add_iphone_img03.png" />
</li>
<li>
<p class="number">04</p>
<p><strong>내보내기</strong> 완료 후<br/>반드시 확인 버튼 선택</p>
<img src="/publish/images/content/add_iphone_img04.png"/>
<p><strong>내보내기</strong> 완료 후<br />반드시 확인 버튼 선택</p>
<img src="/publish/images/content/add_iphone_img04.png" />
</li>
<li>
<p class="number">05</p>
<p>PC에서 네이버 주소록 접속 후<br/><strong>연락처 저장·내보내기</strong> 선택</p>
<img src="/publish/images/content/add_iphone_img05.png"/>
<p>PC에서 네이버 주소록 접속 후<br /><strong>연락처 저장·내보내기</strong> 선택</p>
<img src="/publish/images/content/add_iphone_img05.png" />
</li>
<li>
<p class="number">06</p>
<p class="txt">파일 형식(<strong>CSV 또는 XLSX</strong>), 항목, 대상선택 후<strong>파일로 저장</strong>하기 선택</p>
<img src="/publish/images/content/add_iphone_img06.png"/>
<img src="/publish/images/content/add_iphone_img06.png" />
</li>
</ul>
<div class="btnWrap">
<button type="button">주소록 입력 무료대행</button>
<button type="button">주소록 관리 바로가기</button>
<button type="button" onclick="moveTab('addrApply'); return false;">주소록 입력 무료대행</button>
<button type="button" onclick="moveTab('addr'); return false;">주소록 관리 바로가기</button>
</div>
</div>
</div> <!-- // 네이버 주소록을 이용하여 등록-->
<!-- 핸드폰 VCF파일로 변환하여 등록 -->
<div class="enroll_cont" id="tab6_2">
<div class="addWrap vcf">
<ul class="adr_depth3">
<li class="tab active"><button type="button" onclick="listTab(this,'2');">안드로이드</button></li>
<li class="tab"><button type="button" onclick="listTab(this,'3');">아이폰</button></li>
</ul>
<div class="addWrap list_cont current galexy" id="listTab_2">
<ul class="add_and">
<li>
<p class="number">01</p>
<p class="txt">휴대폰 <strong>연락처 앱</strong> 선택</p>
<img src="/publish/images/content/add_vcf_img01.png"/>
<img src="/publish/images/content/add_vcf_img01.png" />
</li>
<li>
<p class="number">02</p>
<p>왼쪽 메뉴 클릭 후<br/><strong>연락처 관리 선택</strong></p>
<img src="/publish/images/content/add_vcf_img02.png"/>
<p>왼쪽 메뉴 클릭 후<br /><strong>연락처 관리 선택</strong></p>
<img src="/publish/images/content/add_vcf_img02.png" />
</li>
<li>
<p class="number">03</p>
<p>연락처 관리에서 <strong>연락처</strong><br/><strong>가져오기/내보내기</strong> 선택</p>
<img src="/publish/images/content/add_vcf_img03.png"/>
<p>연락처 관리에서 <strong>연락처</strong><br /><strong>가져오기/내보내기</strong> 선택</p>
<img src="/publish/images/content/add_vcf_img03.png" />
</li>
<li>
<p class="number">04</p>
<p class="txt"><strong>연락처 내보내기</strong> 선택</p>
<img src="/publish/images/content/add_vcf_img04.png"/>
<img src="/publish/images/content/add_vcf_img04.png" />
</li>
<li>
<p class="number">05</p>
<p><strong>내장메모리</strong> 선택 후<br/><strong>핸드폰과 PC 연결</strong></p>
<img src="/publish/images/content/add_vcf_img05.png"/>
<p><strong>내장메모리</strong> 선택 후<br /><strong>핸드폰과 PC 연결</strong></p>
<img src="/publish/images/content/add_vcf_img05.png" />
</li>
<li>
<p class="number">06</p>
<p><strong>내 PC</strong>에서<br/><strong>본인 핸드폰 기종</strong> 선택</p>
<img src="/publish/images/content/add_vcf_img06.png"/>
<p><strong>내 PC</strong>에서<br /><strong>본인 핸드폰 기종</strong> 선택</p>
<img src="/publish/images/content/add_vcf_img06.png" />
</li>
<li>
<p class="number">07</p>
<p><strong>연락처(VCF) 파일</strong> 선택 후<br/>PC 복사(Ctrl+C/Ctrl+V),<br>드래그앤드롭)</p>
<img src="/publish/images/content/add_vcf_img07.png"/>
<p><strong>연락처(VCF) 파일</strong> 선택 후<br />PC 복사(Ctrl+C/Ctrl+V),<br>드래그앤드롭)</p>
<img src="/publish/images/content/add_vcf_img07.png" />
</li>
</ul>
<div class="btnWrap">
<button type="button">주소록 입력 무료대행</button>
<button type="button">주소록 관리 바로가기</button>
<button type="button" onclick="moveTab('addrApply'); return false;">주소록 입력 무료대행</button>
<button type="button" onclick="moveTab('addr'); return false;">주소록 관리 바로가기</button>
</div>
</div>
</div><!--// 핸드폰 VCF파일로 변환하여 등록 -->
</div><!--// 주소록 관리 - 폰주소록 등록 -->
</div><!--// send top -->
<div class="addWrap list_cont iphone vCard" id="listTab_3">
<ul class="add_and">
<li>
<p class="number">01</p>
<p class="txt">
<strong>iCloud.com</strong> 접속 후<br> <strong>Apple 계정</strong>으로 로그인
</p>
<img src="/publish/images/content/add_vCard_iphone_img01.png" />
</li>
<li>
<p class="number">02</p>
<p><strong>‘연락처’</strong> 앱 선택 및 실행 </p>
<img src="/publish/images/content/add_vCard_iphone_img02.png" />
</li>
<li>
<p class="number">03</p>
<p><strong>모든 연락처</strong> 선택</p>
<img src="/publish/images/content/add_vCard_iphone_img03.png" />
</li>
<li>
<p class="number">04</p>
<p class="txt"><strong>vCard</strong> 내보내기</p>
<img src="/publish/images/content/add_vCard_iphone_img04.png" />
</li>
<li>
<p class="number">05</p>
<p><strong>다운로드 폴더</strong><br><strong>iCloud vCards</strong> 파일로 저장</p>
<img src="/publish/images/content/add_vCard_iphone_img05.png" />
</li>
<li>
<p class="number">06</p>
<p><strong>연락처(vCards)</strong>파일 선택 후<br>
<strong>PC 바탕화면</strong><br>
<strong>복사/붙여넣기</strong>(Ctrl+C/Ctrl+V)</p>
<img src="/publish/images/content/add_vCard_iphone_img06.png" />
</li>
</ul>
<div class="btnWrap">
<button type="button" onclick="moveTab('addrApply'); return false;">주소록 입력 무료대행</button>
<button type="button" onclick="moveTab('addr'); return false;">주소록 관리 바로가기</button>
</div>
</div>
</div>
<!--// 핸드폰 VCF파일로 변환하여 등록 -->
</div>
<!--// 주소록 관리 - 폰주소록 등록 -->
</div>
<!--// send top -->
</div>
</div><!--// content 영역 -->
</div>
<!--// content 영역 -->
<!-- footer -->
<div data-include-path="/publish/layout/_footer.html"></div>
<!--// footer 영역 -->
</body></html>
<div data-include-path="/publish/layout/_footer.html"></div>
<!--// footer 영역 -->
</body>
</html>

View File

@ -180,12 +180,24 @@ button.group_move i {background-image: url(/publish/images/content/adress_inters
.add_and .number {position:absolute;top:-25px;left:50%;transform:translate(-50%, 0);background:url('/publish/images/content/btn_addBg.png') no-repeat 0 0;width:61px;height:61px;background-size: 100%;color:#fff;font-size:16px;text-align: center;line-height:60px;letter-spacing: 0;}
.addWrap.iphone .add_and li:last-child {width: calc(72.5%);margin-right: 0 !important;padding-bottom: 20px;}
.addWrap.vcf {margin-top:40px;}
.addWrap.galaxy {margin-top:40px;}
.addWrap.iphone.vCard{display:none;}
.addWrap .btnWrap {text-align:center;margin: 20px 0;}
.addWrap .btnWrap button {width:220px;height:60px;font-size:20px;border-radius: 5px;transition: 0.3s ease;}
.addWrap .btnWrap button:hover {box-shadow:0px 0px 5px 4px rgb(0 44 154 / 15%);transition: 0.3s ease;}
.addWrap .btnWrap button:nth-child(1) {background-color:#002c9a;color:#fff;margin-right:5px;}
.addWrap .btnWrap button:nth-child(2) {background-color:#fff;color:#002c9a;border:1px solid #002c9a;}
.addWrap.iphone.vCard li{position:relative;width:calc((100%/4) - 32px);height:480px;}
.addWrap.iphone.vCard li:nth-child(n+4){height:440px;}
.addWrap.iphone.vCard img{position:absolute;width:100%;bottom:0;left:0;}
.addWrap.iphone.vCard li:nth-child(2){width:47%;}
.addWrap.iphone.vCard li:nth-child(3)::after{display:none;}
.addWrap.iphone.vCard li:nth-child(4){margin:25px 32px 25px 0;}
.addWrap.iphone.vCard .add_and li:nth-child(4)::after{display:block;background: url(/publish/images/content/icon_arrR.png) no-repeat 0 0;}
.addWrap.iphone.vCard .add_and li:last-child{width:calc((100%/4) - 32px);}
/* 주소록 등록_수정 */
.eleType_cont.current.address{margin:40px 0 0 0;}
.addWrap.android .add_and .nine {width:calc(100%);}
@ -226,6 +238,16 @@ button.group_move i {background-image: url(/publish/images/content/adress_inters
.search_group_bottom2 .btnWrap2::after {display:none;}
.search_group_bottom2 .btnWrap2::before {display:none;}
.search_group_bottom2 .btnWrap2 .selType2 {width:125px;}
/* 폰주소록 등록 */
.addWrap.iphone.vCard li{width:calc((100%/3) - 32px);height:550px}
.addWrap.iphone.vCard li:nth-child(n+4){height:550px;}
.addWrap.iphone.vCard li:nth-child(2){width:63%;}
.addWrap.iphone.vCard li:nth-child(2)::after,.addWrap.iphone.vCard li:nth-child(5)::after{display:none;}
.addWrap.iphone.vCard li:nth-child(3)::after{display:block;}
.addWrap.iphone.vCard li:nth-child(4){margin:25px 32px 25px 0;}
.addWrap.iphone.vCard .add_and li:nth-child(4)::after{display:block;background: url(/publish/images/content/icon_arrR.png) no-repeat 0 0;}
.addWrap.iphone.vCard .add_and li:last-child{width:calc((100%/3) - 32px);}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

View File

@ -825,7 +825,7 @@ function TabType5(obj, tabId) {
function TabType6(obj, tabId) {
var $tab = $(obj).closest("li");
var $tabPrev = $(obj).closest("li").prev("li");
$tab.addClass("active");
$tab.addClass("active").find("button").removeAttr("style");
$tab.find("button").attr("title", "선택됨");
$tab.siblings("li.tab").removeClass("active");
$tab.siblings("li.tab").find("button").removeAttr("title");

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.