Compare commits

...

88 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
hehihoho3@gmail.com
0b384934e5 api 개발가이드 완료 2025-09-16 18:26:24 +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
ac0a3fb907 Merge branch '5419_전화번호거짓표시50건이상' into 4608_kmc암호화모듈 2025-09-10 14:53:45 +09:00
hehihoho3@gmail.com
5d6934e311 Merge branch 'master' into 알림톡api 2025-09-10 14:32:57 +09:00
hehihoho3@gmail.com
d201592372 api 사용가이드 작성중 2025-09-10 14:12:43 +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
JIWOO
f4c137a8c7 Merge branch '알림톡api' of http://dlwldn1024@vcs.iten.co.kr:9999/hylee/mjon_git into 알림톡api 2025-09-09 09:43:59 +09:00
hehihoho3@gmail.com
715ec569d1 Merge branch 'master' into 알림톡api 2025-09-03 15:05:10 +09:00
hehihoho3@gmail.com
c1defb3498 api 친구톡 완료 2025-09-03 11:44:43 +09:00
JIWOO
add6ea80b1 이지우 - API 소개 페이지 작업 중 2025-09-03 09:32:29 +09:00
hehihoho3@gmail.com
054ee00b6d api 친구톡 연동 진행중 2025-09-01 16:52:51 +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
hehihoho3@gmail.com
64818ff86d Merge branch '5102_친구톡_발송속도_개선' 2025-08-25 12:11:36 +09:00
b63aad38d2 기존 jar 삭제 2025-08-25 11:07:42 +09:00
7374d2b65d kmc 본인인증 암호화 모듈 개발중 2025-08-25 11:03:20 +09:00
hehihoho3@gmail.com
3611dc59f0 알림톡 발송 api 진행중 2025-08-21 15:11:03 +09:00
hehihoho3@gmail.com
93cb46a69e 알ㄹ미톡 로그 추가 2025-08-20 12:35:15 +09:00
hehihoho3@gmail.com
314a9421e5 Merge branch 'master' into 알림톡api 2025-08-18 18:55:06 +09:00
hehihoho3@gmail.com
ce5f79fa34 알림톡 api 진행중 2025-08-18 18:45:28 +09:00
hehihoho3@gmail.com
9bb130f3df Merge branch 'master' into 알림톡api 2025-08-04 12:40:45 +09:00
hehihoho3@gmail.com
591dfcbf52 Merge branch 'master' into 알림톡api 2025-08-04 12:39:29 +09:00
hehihoho3@gmail.com
786ddecd14 ignore 커밋 2025-07-29 17:50:26 +09:00
hehihoho3@gmail.com
95707e8965 알림톡 api 진행중 2025-07-29 17:46:53 +09:00
hehihoho3@gmail.com
60602a31bc api 개발가이드 진행중 2025-07-02 11:25:55 +09:00
hehihoho3@gmail.com
f7e96648a8 api 발송 수정 2025-06-30 11:24:23 +09:00
hehihoho3@gmail.com
1a3088e5f5 api 리턴값 수정 2025-06-26 11:39:38 +09:00
hehihoho3@gmail.com
179c22e6a8 api 로직 수정 2025-06-25 12:17:49 +09:00
hehihoho3@gmail.com
1a5ecf869b Merge branch 'master' into 알림톡api 2025-06-24 18:00:25 +09:00
hehihoho3@gmail.com
bc3ded5541 Merge branch 'master' into 알림톡api 2025-06-21 22:11:25 +09:00
hehihoho3@gmail.com
7c5b5889c3 문자발송에 api return값 추가 2025-06-20 18:29:26 +09:00
hehihoho3@gmail.com
141d8146ce 사이트맵 api 추가 및 css 수정 2025-06-04 14:16:52 +09:00
hehihoho3@gmail.com
c8a27be581 개발가이드 퍼블 수정 2025-06-04 12:12:34 +09:00
hehihoho3@gmail.com
8c9d292d56 Merge branch 'master' into 알림톡api 2025-06-04 12:08:32 +09:00
hehihoho3@gmail.com
39add051ec 연동안내 > a 링크 추가 2025-06-04 12:08:17 +09:00
hehihoho3@gmail.com
986fa3b4b9 Merge branch 'master' into 알림톡api 2025-06-04 11:49:40 +09:00
hehihoho3@gmail.com
6fc8b8cd09 api 사용자 화면 수정 2025-06-04 11:48:30 +09:00
hehihoho3@gmail.com
c3c686e918 Merge branch 'master' into 알림톡api 2025-06-02 14:35:47 +09:00
hehihoho3@gmail.com
115630d4fb api> 개발가이드페이지 2025-06-02 14:34:57 +09:00
hehihoho3@gmail.com
fcd1644355 Merge branch '알림톡api' 2025-05-29 15:47:43 +09:00
hehihoho3@gmail.com
1a7d676483 api 진행중 2025-05-14 12:05:27 +09:00
hehihoho3@gmail.com
0e4377908a api 진행중 2025-05-13 11:04:11 +09:00
hehihoho3@gmail.com
a45140a60d 알림톡 api 예제 추가중 2025-05-08 18:00:47 +09:00
121 changed files with 7245 additions and 3065 deletions

1
.claude/.gitignore vendored
View File

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

BIN
.claude/etc1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

BIN
.claude/etc2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

8
.gitignore vendored
View File

@ -201,5 +201,13 @@ fabric.properties
rebel.xml
/mvnw
/mvnw.cmd
/.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

@ -259,7 +259,8 @@ public final class MsgSendUtils {
String value = entry.getValue().apply(sendVO);
if (smsTxt.contains(placeholder)) {
if (StringUtils.isEmpty(value)) {
statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "치환 문구중 " + placeholder + " 데이터가 없습니다.");
// statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "치환 문구중 " + placeholder + " 데이터가 없습니다.");
StatusResponse.statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "치환 문구중 " + placeholder + " 데이터가 없습니다.", "STAT_1040");
return false;
}
smsTxt = smsTxt.replace(placeholder, value);
@ -289,7 +290,8 @@ public final class MsgSendUtils {
if (!hasPerformedMsgType) {
msgTypeResult = getMsgTypeWithByteValidation(sendVO, smsTxt);
if ("INVALID".equals(msgTypeResult)) {
statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "문자 치환 후 전송 문자 길이를 초과하였습니다.");
// statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "문자 치환 후 전송 문자 길이를 초과하였습니다.");
StatusResponse.statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "문자 치환 후 전송 문자 길이를 초과하였습니다.", "STAT_1050");
return false;
}
hasPerformedMsgType = true;
@ -306,7 +308,8 @@ public final class MsgSendUtils {
// 메시지 타입 체크는 매번 수행
msgTypeResult = getMsgTypeWithByteValidation(sendVO, smsTxt);
if ("INVALID".equals(msgTypeResult)) {
statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "문자 치환 후 전송 문자 길이를 초과하였습니다.");
// statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "문자 치환 후 전송 문자 길이를 초과하였습니다.");
StatusResponse.statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "문자 치환 후 전송 문자 길이를 초과하였습니다.", "STAT_1050");
return false;
}
}
@ -539,6 +542,7 @@ public final class MsgSendUtils {
statusResponse.setMessage(msg);
}
public static StatusResponse validateFilesForMessageSending(int fileCount, MjonMsgVO mjonMsgVO) {
if (fileCount > 0) {

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

@ -53,6 +53,7 @@ public class KakaoSendAdvcVO implements Serializable {
private String adFlag; //친구톡 광고성 정보 사용 유무(Y:사용 , N:미사용)
private String sendKind; //문자전송 타입(H:홈페이지, A:API)
// =====
// =====
@ -102,6 +103,7 @@ public class KakaoSendAdvcVO implements Serializable {
"\n , subMsgType=[" + subMsgType + "]" +
"\n , reqDate=[" + reqDate + "]" +
"\n , jsonStr=[" + jsonStr + "]" +
"\n , sendKind=[" + sendKind + "]" +
"\n , ==== MJ_MSG_DATA INSERT DATA END =======" +
"\n " +
"\n , eachPrice=[" + eachPrice + "]" +

View File

@ -112,6 +112,9 @@ public class KakaoSendUtil {
// log.info(" + templateDetail :: [{}]", templateDetail);
// templateDetail.getButtonList().forEach(t->log.info(" + ButtonList :: [{}]", t.toString()));
// API인지 확인하는 Boolean
Boolean isApiData = "A".equals(kakaoVO.getSendKind());
Boolean hasContentReplacement = this.replBooleanStrChecker(templateContent);
Boolean hasTitleReplacement = this.replBooleanStrChecker(templateTitle);
Boolean hasButtonReplacement = this.needsButtonReplacement(templateDetail.getButtonList());
@ -132,8 +135,17 @@ 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());
float kakaoAtPrice = getValidPrice(mberManageVO.getKakaoAtPrice(), sysJoinSetVO.getKakaoAtPrice());
String shortPStr = Float.toString(shortPrice);
String mmsPStr = Float.toString(longPrice);
String kakaoAtPStr = Float.toString(kakaoAtPrice);
/** @MSGID KEY값 */
List<String> idList = mjonCommon.getNextCustomMsgCId(kakaoVO.getVarListMap().size());
@ -149,6 +161,7 @@ public class KakaoSendUtil {
int counter = 0;
/** @Map에 총 갯수가 수신자 갯수와 동일함 */
List<Map<String, String>> varList = kakaoVO.getVarListMap();
for (int i = 0; i < varList.size(); i++) {
// for(Map<String, String> variables : kakaoVO.getVarListMap()) {
// 치환 데이터
@ -157,6 +170,12 @@ public class KakaoSendUtil {
/** @공통 기본값 */
KakaoSendAdvcVO sendVO = createATSendVO(kakaoVO);
// 공통 가격 설정
sendVO.setSmsPrice(shortPStr);
sendVO.setMmsPrice(mmsPStr);
sendVO.setKakaoAtPrice(kakaoAtPStr);
String msgId = idList.get(i);
sendVO.setMsgId(msgId);
@ -171,12 +190,21 @@ public class KakaoSendUtil {
/** @Step1-3: 템플릿 치환데이터 설정 */
String templateContentTemp = templateContent;
String templateTitleTemp = templateTitle;
if (hasContentReplacement) {
templateContentTemp = mjonCommon.ATReplaceTemplateVariables(templateContent, variables);
if(hasTitleReplacement) {
templateTitleTemp = mjonCommon.ATReplaceTemplateVariables(templateTitle, variables);
// api가 아니면
if(!isApiData) {
if (hasContentReplacement) {
templateContentTemp = mjonCommon.ATReplaceTemplateVariables(templateContent, variables);
if(hasTitleReplacement) {
templateTitleTemp = mjonCommon.ATReplaceTemplateVariables(templateTitle, variables);
}
}
}else {
templateContentTemp = variables.get("templateContent");
templateTitleTemp = variables.get("templateTitle");
}
/** @버튼 치환 */ // 버튼 리스트가 있으면 치환 수행, 항상 sendVO에 설정
List<KakaoButtonVO> buttonList = templateDetail.getButtonList();
if(hasButtonReplacement) {
@ -191,44 +219,19 @@ public class KakaoSendUtil {
String subMsgTxtTemp = subMsgTxt;
// Step 1-4: 실패 대체 문자 치환데이터 설정
if("Y".equals(kakaoVO.getSubMsgSendYn())) { // 대체문자가 있나?
if ("Y".equals(kakaoVO.getSubMsgTxtReplYn())) { // 치환데이터가 있나?
subMsgTxtTemp = mjonCommon.ATReplaceTemplateVariables(subMsgTxt, variables);
// api가 아니면
if(!isApiData) {
if ("Y".equals(kakaoVO.getSubMsgTxtReplYn())) { // 치환데이터가 있나?
subMsgTxtTemp = mjonCommon.ATReplaceTemplateVariables(subMsgTxt, variables);
}
}else {
subMsgTxtTemp = variables.get("subMsgTxt");
}
sendVO.setSubMsgTxt(subMsgTxtTemp);// 실패
}
sendVO.setSubMsgSendYn(kakaoVO.getSubMsgSendYn());
/*
log.info("kakaoSendAdvcVO Details: [callTo={}\n, templateContent=\n{}\n, subMsgTxt=\n{}]\n\n\n\n",
kakaoSendAdvcVO.getCallTo(),
kakaoSendAdvcVO.getTemplateContent(),
kakaoSendAdvcVO.getSubMsgTxt()
);
*/
// Step1 END
// step3
// 바이트 체크 금액설정
// 유효한 단가 계산
float shortPrice = getValidPrice(mberManageVO.getShortPrice(), sysJoinSetVO.getShortPrice());
float longPrice = getValidPrice(mberManageVO.getLongPrice(), sysJoinSetVO.getLongPrice());
float kakaoAtPrice = getValidPrice(mberManageVO.getKakaoAtPrice(), sysJoinSetVO.getKakaoAtPrice());
String shortPStr = Float.toString(shortPrice);
String mmsPStr = Float.toString(longPrice);
String kakaoAtPStr = Float.toString(kakaoAtPrice);
// 공통 가격 설정
sendVO.setSmsPrice(shortPStr);
sendVO.setMmsPrice(mmsPStr);
sendVO.setKakaoAtPrice(kakaoAtPStr);
if("Y".equals(kakaoVO.getSubMsgSendYn())) {
int smsTxtByte = mjonCommon.getSmsTxtBytes(sendVO.getSubMsgTxt());
@ -236,7 +239,8 @@ public class KakaoSendUtil {
sendVO.setSubMsgType(sendType);
if ("INVALID".equals(sendType)) {
statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "전송 문자 길이를 초과하였습니다.");return kakaoSendAdvcListVO;
// statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "전송 문자 길이를 초과하였습니다.");return kakaoSendAdvcListVO;
StatusResponse.statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "전송 문자 길이를 초과하였습니다.", "STAT_1080");return kakaoSendAdvcListVO;
}
boolean isMms = "MMS".equals(sendType);
@ -351,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);
@ -828,7 +833,7 @@ public class KakaoSendUtil {
sendVO.setReqDate(DATE_FORMATTER.format(calendar.getTime()));
sendVO.setSenderKey(kakaoVO.getSenderKey());
sendVO.setTemplateCode(kakaoVO.getTemplateCode());
// sendVO.setTemplateCode(kakaoVO.getTemplateCode());
sendVO.setUserId(kakaoVO.getUserId());
sendVO.setCallFrom(kakaoVO.getCallFrom());
sendVO.setSubMsgSendYn(kakaoVO.getSubMsgSendYn());
@ -1882,6 +1887,8 @@ public class KakaoSendUtil {
sendVO.setBefPoint(priceAndPoint.getBefPoint(sendVO.getUserId()));
sendVO.setAdFlag(kakaoVO.getAdFlag());
sendVO.setSendKind(kakaoVO.getSendKind());
Float eachPrice = Float.parseFloat(sendVO.getEachPrice());
Float totPrice = eachPrice * instCnt;

View File

@ -336,29 +336,33 @@ public class KakaoVO extends MjonMsgVO{
public String ftToString() {
StringBuilder sb = new StringBuilder("KakaoFTSendVO[");
sb.append("\n senderKey=[").append(senderKey).append("]");
sb.append("\n sendKind=[").append(getSendKind()).append("]");
sb.append("\n , senderKey=[").append(senderKey).append("]");
sb.append("\n , imageFileName=[").append(imageFileName).append("]");
sb.append("\n , imageType=[").append(imageType).append("]");
sb.append("\n , imgTitle=[").append(imgTitle).append("]");
sb.append("\n , imgLink=[").append(imgLink).append("]");
sb.append("\n , atchFileId=[").append(atchFileId).append("]");
// sb.append("\n , imgTitle=[").append(imgTitle).append("]");
// sb.append("\n , imgLink=[").append(imgLink).append("]");
sb.append("\n , templateContent=[").append(templateContent).append("]");
sb.append("\n , templateImageUrl=[").append(templateImageUrl).append("]");
sb.append("\n , smsTxtArea=[").append(getSubMsgTxt()).append("]");
sb.append("\n , subMsgSendYn=[").append(subMsgSendYn).append("]");
sb.append("\n , subMsgTxtReplYn=[").append(subMsgTxtReplYn).append("]");
sb.append("\n , subMsgType=[").append(subMsgType).append("]");
// sb.append("\n , imgLink=[").append(imgLink).append("]");
// sb.append("\n , smsTxtArea=[").append(getSubMsgTxt()).append("]");
// sb.append("\n , subMsgSendYn=[").append(subMsgSendYn).append("]");
// sb.append("\n , subMsgTxtReplYn=[").append(subMsgTxtReplYn).append("]");
// sb.append("\n , subMsgType=[").append(subMsgType).append("]");
sb.append("\n , subMsgTxt=[").append(subMsgTxt).append("]");
sb.append("\n , subMsgSendYn=[").append(subMsgSendYn).append("]");
sb.append("\n , reserveYn=[").append(getReserveYn()).append("]");
sb.append("\n , menuTopTab=[").append(menuTopTab).append("]");
sb.append("\n , bizJsonYn=[").append(bizJsonYn).append("]");
sb.append("\n , senderKey=[").append(senderKey).append("]");
// sb.append("\n , menuTopTab=[").append(menuTopTab).append("]");
// sb.append("\n , bizJsonYn=[").append(bizJsonYn).append("]");
sb.append("\n , callFrom=[").append(getCallFrom()).append("]");
sb.append("\n , kakaoFtPrice=[").append(getEachPrice()).append("]");
// sb.append("\n , kakaoFtPrice=[").append(getEachPrice()).append("]");
sb.append("\n , reqDate=[").append(getReqDate()).append("]");
sb.append("\n , spamStatus=[").append(getSpamStatus()).append("]");
sb.append("\n , txtReplYn=[").append(getTxtReplYn()).append("]");
sb.append("\n , atSmishingYn=[").append(getAtSmishingYn()).append("]");
sb.append("\n , atDelayYn=[").append(getAtDelayYn()).append("]");
// sb.append("\n , spamStatus=[").append(getSpamStatus()).append("]");
// sb.append("\n , txtReplYn=[").append(getTxtReplYn()).append("]");
// sb.append("\n , atSmishingYn=[").append(getAtSmishingYn()).append("]");
// sb.append("\n , atDelayYn=[").append(getAtDelayYn()).append("]");
// sb.append("\n , filePath1=[").append(getFilePath1()).append("]");
// sb.append("\n , tmpBtnSelect=[").append(getTmpBtnSelect()).append("]");
StringBuilder btnListSb = new StringBuilder("[");
if (buttonVOList != null && !buttonVOList.isEmpty()) {
@ -388,4 +392,7 @@ public class KakaoVO extends MjonMsgVO{
return sb.toString();
}
}

View File

@ -19,6 +19,7 @@ import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.output.ByteArrayOutputStream;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
@ -395,6 +396,7 @@ public class KakaoApiImageUpload {
.addTextBody("senderKey", kakaoVO.getSenderKey())
.addBinaryBody("image", new File(filePath), ContentType.MULTIPART_FORM_DATA, newName + "." + ext)
.build();
;
httpPost.setEntity(httpEntity);
@ -407,7 +409,8 @@ public class KakaoApiImageUpload {
String result = EntityUtils.toString(response.getEntity(), "UTF-8");
JSONParser parser = new JSONParser();
JSONObject object = (JSONObject) parser.parse(result);
log.info("object + :: [{}]", object.toJSONString());
String code = object.get("code").toString();
if ("200".equals(code)) {
Map<String, Object> returnMap = new HashMap<>();

View File

@ -1,6 +1,7 @@
package itn.let.kakao.user.kakaoAt.service.impl;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.time.Instant;
@ -870,7 +871,7 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements
@Override
public StatusResponse insertKakaoAtSandAjax_advc(KakaoVO kakaoVO, HttpServletRequest request) throws Exception {
// log.info(" :: [{}]", kakaoVO.toString());
log.info(" :: [{}]", kakaoVO.toString());
// 측정할 메소드 호출 시간 기록
@ -878,17 +879,25 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements
// KakaoSendAdvcVO
Map<String, Object> returnMap = new HashMap<>();
Map<String, Object> apiReturnMap = new HashMap<>();
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()
? (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser()
: null;
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
String userId = "";
if("A".equals(kakaoVO.getSendKind()))
{
userId = kakaoVO.getMberId();
}else {
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()
? (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser()
: null;
userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
if (userId.equals("")) {
return new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용이 가능합니다.");
}
if (userId.equals("")) {
return new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용이 가능합니다.");
}
kakaoVO.setUserId(userId);
kakaoVO.setUserId(userId);
/**
* 회원 정지된 상태이면 문자 발송이 안되도록 처리함 현재 로그인 세션도 만료 처리함
@ -898,7 +907,7 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements
request.getSession().invalidate();
// UNAUTHORIZED : 인증되지 않은 사용자가 접근하려고
return new StatusResponse(HttpStatus.UNAUTHORIZED,
"현재 고객님께서는 문자온 서비스 이용이 정지된 상태로 알림톡을 발송하실 수 없습니다. 이용정지 해제를 원하시면 고객센터로 연락주시기 바랍니다.");
"현재 고객님께서는 문자온 서비스 이용이 정지된 상태로 알림톡을 발송하실 수 없습니다. 이용정지 해제를 원하시면 고객센터로 연락주시기 바랍니다.", "STAT_1070");
}
@ -923,7 +932,7 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements
/** @전송금액 확인 --------------------------------------------------*/
if (!kakaoSendUtil.isCashSufficient(userId, kakaoSendAdvcListVO)) {
log.error("Insufficient balance for message sending.");
return new StatusResponse(HttpStatus.BAD_REQUEST, "문자 발송에 필요한 보유 잔액이 부족 합니다.");
return new StatusResponse(HttpStatus.BAD_REQUEST, "문자 발송에 필요한 보유 잔액이 부족 합니다.", "STAT_1060");
}
@ -940,6 +949,8 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements
// 임시
List<String> nextMsgGroupIdA = new ArrayList<>();
// 대안: entrySet() 직접 사용
String apiMsgGroupId = "";
String apiMsgType = "";
for (Map.Entry<String, List<KakaoSendAdvcVO>> entry : priceGroupedMessages.entrySet()) {
// entry 사용
@ -949,6 +960,29 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements
groupedMsgList.forEach(t -> t.setMsgGroupId(nextMsgGroupId));
// api 전달
apiMsgGroupId = StringUtils.isNotEmpty(apiMsgGroupId)
? apiMsgGroupId + "," + nextMsgGroupId
: nextMsgGroupId;
apiMsgType = StringUtils.isNotEmpty(apiMsgType)
? apiMsgType + "," + kakaoSendAdvcListVO.get(0).getMsgType()
: kakaoSendAdvcListVO.get(0).getMsgType();
groupedMsgList.stream().forEach(t-> log.info("t.toString() [{}]", t.toString()));
//
// if(1==1) {
//
// // 강제로 예외 발생
// throw new RuntimeException("강제 예외 발생 테스트");
// }
//
//
// 발송 데이터 삽입
int instCnt = kakaoSendUtil.insertKakaoData_advc(groupedMsgList);
// int instCnt = 6;
@ -1006,7 +1040,14 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements
}
apiReturnMap.put("resultSts", instTotalCnt);
// 그룹 ID
apiReturnMap.put("msgGroupId", apiMsgGroupId);
// 메세지 타입
apiReturnMap.put("msgType", apiMsgType);
returnMap.put("resultSts", instTotalCnt);
returnMap.put("reserYn", kakaoVO.getReserveYn());
returnMap.put("groupIds", nextMsgGroupIdA);
@ -1036,10 +1077,12 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements
statusResponse.setStatus(HttpStatus.OK);
statusResponse.setObject(returnMap);
apiReturnMap.put("result", HttpStatus.OK);
apiReturnMap.put("message", "전송이 완료되었습니다.");
statusResponse.setApiReturn(apiReturnMap);
return statusResponse;
}
@Override
public List<KakaoVO> selectKakaoSentRefundListForSingle() throws Exception{
return kakaoAlimTalkDAO.selectKakaoSentRefundList();
@ -1068,26 +1111,150 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements
mjonMsgDAO.updateRefundY(kakaoVO);
}
// // 보유 금액이 충분한지 확인하는 메서드
// private boolean isCashSufficient(String userId, List<KakaoSendAdvcVO> kakaoSendAdvcListVO) throws Exception {
//
//
// String userMoney = priceAndPoint.getBefCash(userId);
// // 쉼표 제거
// userMoney = userMoney.replace(",", "");
//
// // 사용자 보유 금액 BigDecimal 변환 (HALF_EVEN 적용)
// BigDecimal befCash = new BigDecimal(userMoney).setScale(2, RoundingMode.HALF_EVEN);
//
// // 메시지 금액 계산 (HALF_EVEN 적용)
// BigDecimal totalEachPrice = kakaoSendAdvcListVO.stream()
// .map(msg -> new BigDecimal(String.valueOf(msg.getEachPrice()))) // 변환 오류 방지
// .reduce(BigDecimal.ZERO, BigDecimal::add)
// .setScale(2, RoundingMode.HALF_EVEN); // 일관성 유지
//
// // 비교 수행
// return befCash.compareTo(totalEachPrice) >= 0;
// }
private void insertKakaoAtDataJsonInfo_advc(List<KakaoSendAdvcVO> kakaoSendAdvcListVO) {
// TODO Auto-generated method stub
// 측정할 메소드 호출 시간 기록
List<KakaoSendAdvcVO> jsonInfoData = new ArrayList<>(kakaoSendAdvcListVO);
jsonInfoData.removeIf(t -> StringUtils.isBlank(t.getJsonStr()));
log.info(" + jsonInfoData Insert :: [{}]", jsonInfoData.size());
if(jsonInfoData.size() > 0) {
kakaoAlimTalkDAO.insertKakaoAtDataJsonInfo_advc(jsonInfoData);
}
}
private void insertKakaoGroupDataTb_advc(int instCnt, KakaoVO kakaoVO, KakaoSendAdvcVO sendVO) throws Exception {
// TODO Auto-generated method stub
// log.info(" + insertKakaoGroupDataTb_advc kakaoVO :: \n[{}]", kakaoVO.toString());;
// log.info(" + insertKakaoGroupDataTb_advc kakaoSendAdvcVOList :: \n[{}]", sendVO.toString());
sendVO.setMsgGroupCnt(Integer.toString(instCnt));
sendVO.setReserveYn(kakaoVO.getReserveYn());
sendVO.setBefCash(priceAndPoint.getBefCash(sendVO.getUserId()));
sendVO.setBefPoint(priceAndPoint.getBefPoint(sendVO.getUserId()));
Float eachPrice = Float.parseFloat(sendVO.getEachPrice());
Float totPrice = eachPrice * instCnt;
sendVO.setTotPrice(String.format("%.1f", totPrice));
sendVO.setAtDelayYn(StringUtils.isEmpty(kakaoVO.getAtSmishingYn()) ? "N" : kakaoVO.getAtSmishingYn());
sendVO.setSendKind(StringUtils.isEmpty(kakaoVO.getSendKind()) ? "H" : kakaoVO.getSendKind());
sendVO.setBizKakaoResendOrgnlTxt(kakaoVO.getSubMsgTxt());
sendVO.setBizKakaoResendType(sendVO.getSubMsgType());
kakaoAlimTalkDAO.insertKakaoGroupDataTb_advc(sendVO);
}
/**
* @methodName : insertKakaoData_advc
* @author : 이호영
* @date : 2025. 3. 20.
* @description : 카카오 batch 발송 => mj_msg_data
* @return : int
* @param kakaoSendAdvcVOList
* @param parentLoopCount
* @param isJsonNotEmpty
* @param isJsonNameAllSame
* @return
*
*/
private int insertKakaoData_advc(List<KakaoSendAdvcVO> kakaoSendAdvcVOList) {
// 시작 시간 측정
long totalStartTime = System.currentTimeMillis();
int totalSize = kakaoSendAdvcVOList.size(); // 데이터 개수
// Batch 크기 설정 (고정값)
// int batchSize = 10000; 465
int batchSize = 50000; // 9분 18초
log.info("총 데이터 개수 :: [{}] ", totalSize);
log.info("설정된 Batch 크기 :: [{}] ", batchSize);
// insert 카운트
int instCnt = 0;
int batchCount = 0;
// 배치별 실행 시간 기록
List<Double> batchExecutionTimes = new ArrayList<>();
// 번째 배치에서만 삽입했는지 추적하는 플래그
for (int i = 0; i < totalSize; i += batchSize) {
// Batch 시작 시간 측정
long batchStartTime = System.currentTimeMillis();
// Batch 리스트 생성
List<KakaoSendAdvcVO> batchList = kakaoSendAdvcVOList.subList(i, Math.min(i + batchSize, totalSize));
System.out.println("Batch 시작 인덱스: " + i);
// mj_msg_data 테이블 insert
int insertedCount = kakaoAlimTalkDAO.insertKakaoAtDataInfo_advc(batchList);
/** @kakaoSendUtil.populateSendLists
* 하단에서
* getJsonStr 데이터 처리 활용
* */
instCnt += insertedCount;
// Batch 종료 시간 측정 실행 시간 계산
long batchEndTime = System.currentTimeMillis();
double batchExecutionTimeInSeconds = (batchEndTime - batchStartTime) / 1000.0;
// 실행 시간 기록
batchExecutionTimes.add(batchExecutionTimeInSeconds);
batchCount++;
}
// 종료 시간 측정
long totalEndTime = System.currentTimeMillis();
// 실행 시간 계산 (밀리초 -> 초로 변환)
double totalExecutionTimeInSeconds = (totalEndTime - totalStartTime) / 1000.0;
// 실행 시간 출력
log.info("총 배치 실행 횟수 :: [{}] ", batchCount);
log.info("batchSize :: [{}] ", batchSize);
log.info("총 실행 시간 :: [{}] ", totalExecutionTimeInSeconds + "");
log.info("총 삽입 건수 :: [{}] ", instCnt);
// 배치별 실행 시간 출력
for (int k = 0; k < batchExecutionTimes.size(); k++) {
System.out.println("배치 " + (k + 1) + " 실행 시간 :: " + batchExecutionTimes.get(k) + "");
}
return instCnt;
}
// 보유 금액이 충분한지 확인하는 메서드
private boolean isCashSufficient(String userId, List<KakaoSendAdvcVO> kakaoSendAdvcListVO) throws Exception {
String userMoney = priceAndPoint.getBefCash(userId);
// 쉼표 제거
userMoney = userMoney.replace(",", "");
// 사용자 보유 금액 BigDecimal 변환 (HALF_EVEN 적용)
BigDecimal befCash = new BigDecimal(userMoney).setScale(2, RoundingMode.HALF_EVEN);
// 메시지 금액 계산 (HALF_EVEN 적용)
BigDecimal totalEachPrice = kakaoSendAdvcListVO.stream()
.map(msg -> new BigDecimal(String.valueOf(msg.getEachPrice()))) // 변환 오류 방지
.reduce(BigDecimal.ZERO, BigDecimal::add)
.setScale(2, RoundingMode.HALF_EVEN); // 일관성 유지
// 비교 수행
return befCash.compareTo(totalEachPrice) >= 0;
}
@Override
public KakaoReturnVO createKaKaoProfile(KakaoVO kakaoVO) throws Exception {

View File

@ -841,13 +841,13 @@ public class KakaoAlimTalkSendController {
modelAndView.setViewName("jsonView");
try {
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
// LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
// String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
if(userId == "") {
modelAndView.addObject("result", "notLogin");
return modelAndView;
}else {
// if(userId == "") {
// modelAndView.addObject("result", "notLogin");
// return modelAndView;
// }else {
KakaoReturnVO kakaoTemplateTempList = kakaoApiTemplate.selectKakaoApiTemplate(kakaoVO);
@ -863,7 +863,7 @@ public class KakaoAlimTalkSendController {
modelAndView.addObject("kakaoTemplateList", kakaoTemplateTempList);
modelAndView.addObject("result", "success");
}
// }
}catch(Exception ex){
ex.printStackTrace();
modelAndView.addObject("message", egovMessageSource.getMessage("fail.common.select"));

View File

@ -305,6 +305,9 @@ public class KakaoAlimTalkTemplateController {
KakaoReturnVO kakaoTemplateInfo =kakaoApiTemplate.selectKakaoApiTemplateDetail(kakaoVO);
System.out.println("kakaoTemplateInfo :; "+ kakaoTemplateInfo);
String kakaoButtonTypeDs = "";
for(int i=0; i < kakaoTemplateInfo.getButtonList().size(); i++) {
String buttonType = kakaoTemplateInfo.getButtonList().get(i).getLinkType();

View File

@ -11,6 +11,7 @@ import java.util.stream.Collectors;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
@ -75,25 +76,37 @@ public class KakaoFriendsTalkServiceImpl extends EgovAbstractServiceImpl implem
public StatusResponse insertKakaoFtSandAjax_advc(KakaoVO kakaoVO, HttpServletRequest request) throws Exception {
StatusResponse statusResponse = new StatusResponse();
// log.info(" + kakaoVO.toString() :: [{}]", kakaoVO.toString());
log.info(" + kakaoVO.toString() :: [{}]", kakaoVO.toString());
// log.info(" + kakaoVO.toString() :: [{}]", kakaoVO.ftToString());
log.info(" + kakaoVO.toString() :: [{}]", kakaoVO.ftToString());
// if(1==1) {
// throw new RuntimeException("강제로 발생시킨 예외");
// }
// 측정할 메소드 호출 시간 기록
Instant start = Instant.now();
// KakaoSendAdvcVO
Map<String, Object> returnMap = new HashMap<>();
Map<String, Object> apiReturnMap = new HashMap<>();
String userId = "";
if("A".equals(kakaoVO.getSendKind()))
{
userId = kakaoVO.getMberId();
}else {
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()
? (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser()
: null;
userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
if (userId.equals("")) {
return new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용이 가능합니다.");
}
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()
? (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser()
: null;
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
if (userId.equals("")) {
return new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용이 가능합니다.");
}
kakaoVO.setUserId(userId);
@ -106,7 +119,7 @@ public class KakaoFriendsTalkServiceImpl extends EgovAbstractServiceImpl implem
request.getSession().invalidate();
// UNAUTHORIZED : 인증되지 않은 사용자가 접근하려고
return new StatusResponse(HttpStatus.UNAUTHORIZED,
"현재 고객님께서는 문자온 서비스 이용이 정지된 상태로 친구톡을 발송하실 수 없습니다. 이용정지 해제를 원하시면 고객센터로 연락주시기 바랍니다.");
"현재 고객님께서는 문자온 서비스 이용이 정지된 상태로 친구톡을 발송하실 수 없습니다. 이용정지 해제를 원하시면 고객센터로 연락주시기 바랍니다.", "STAT_1070");
}
@ -116,7 +129,7 @@ public class KakaoFriendsTalkServiceImpl extends EgovAbstractServiceImpl implem
if(kakaoSendUtil.isRestrictedFriendTalkTime(kakaoSendUtil.resolveBaseDate(kakaoVO))) {
// UNAUTHORIZED : 인증되지 않은 사용자가 접근하려고
return new StatusResponse(HttpStatus.BAD_REQUEST,
"친구톡은 20시 50분부터 익일 08시까지 발송이 제한됩니다.");
"친구톡은 20시 50분부터 익일 08시까지 발송이 제한됩니다.","STAT_2080");
}
@ -139,12 +152,11 @@ public class KakaoFriendsTalkServiceImpl extends EgovAbstractServiceImpl implem
return statusResponse;
}
/** @전송금액 확인 --------------------------------------------------*/
if (!kakaoSendUtil.isCashSufficient(userId, kakaoSendAdvcListVO)) {
log.error("Insufficient balance for message sending.");
return new StatusResponse(HttpStatus.BAD_REQUEST, "문자 발송에 필요한 보유 잔액이 부족 합니다.");
return new StatusResponse(HttpStatus.BAD_REQUEST, "문자 발송에 필요한 보유 잔액이 부족 합니다.", "STAT_1060");
}
@ -162,6 +174,8 @@ public class KakaoFriendsTalkServiceImpl extends EgovAbstractServiceImpl implem
// 임시
List<String> nextMsgGroupIdA = new ArrayList<>();
// 대안: entrySet() 직접 사용
String apiMsgGroupId = "";
String apiMsgType = "";
for (Map.Entry<String, List<KakaoSendAdvcVO>> entry : priceGroupedMessages.entrySet()) {
// entry 사용
@ -169,7 +183,15 @@ public class KakaoFriendsTalkServiceImpl extends EgovAbstractServiceImpl implem
String nextMsgGroupId = idgenMjonMsgGroupId.getNextStringId();
groupedMsgList.forEach(t -> t.setMsgGroupId(nextMsgGroupId));
// api 전달
apiMsgGroupId = StringUtils.isNotEmpty(apiMsgGroupId)
? apiMsgGroupId + "," + nextMsgGroupId
: nextMsgGroupId;
apiMsgType = StringUtils.isNotEmpty(apiMsgType)
? apiMsgType + "," + kakaoSendAdvcListVO.get(0).getMsgType()
: kakaoSendAdvcListVO.get(0).getMsgType();
// 발송 데이터 삽입
int instCnt = kakaoSendUtil.insertKakaoData_advc(groupedMsgList);
@ -224,6 +246,12 @@ public class KakaoFriendsTalkServiceImpl extends EgovAbstractServiceImpl implem
}
apiReturnMap.put("resultSts", instTotalCnt);
// 그룹 ID
apiReturnMap.put("msgGroupId", apiMsgGroupId);
// 메세지 타입
apiReturnMap.put("msgType", apiMsgType);
returnMap.put("resultSts", instTotalCnt);
returnMap.put("reserYn", kakaoVO.getReserveYn());
returnMap.put("groupIds", nextMsgGroupIdA);
@ -254,6 +282,9 @@ public class KakaoFriendsTalkServiceImpl extends EgovAbstractServiceImpl implem
statusResponse.setStatus(HttpStatus.OK);
statusResponse.setObject(returnMap);
apiReturnMap.put("result", HttpStatus.OK);
apiReturnMap.put("message", "전송이 완료되었습니다.");
statusResponse.setApiReturn(apiReturnMap);
return statusResponse;
}

View File

@ -199,19 +199,23 @@ public class KakaoFriendsTalkTemplateController {
modelAndView.setViewName("jsonView");
try {
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
if(StringUtils.isEmpty(userId)) { //KISA 보안취약점 조치 (2018-12-10, 이정은)
return ResponseEntity.ok(
new StatusResponse(HttpStatus.UNAUTHORIZED
, "로그인을 하셔야 이용 가능합니다."
, LocalDateTime.now()
)
);
if(!"A".equals(kakaoVO.getSendKind())) {
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
if(StringUtils.isEmpty(userId)) {
return ResponseEntity.ok(
new StatusResponse(HttpStatus.UNAUTHORIZED
, "로그인을 하셔야 이용 가능합니다."
, LocalDateTime.now()
)
);
}
}
final Map<String, MultipartFile> files = multiRequest.getFileMap();
/* if (!files.isEmpty()){

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

@ -1,6 +1,8 @@
package itn.let.mail.service;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
import org.springframework.http.HttpStatus;
@ -58,6 +60,8 @@ public class StatusResponse {
private Object object;
private Object apiReturn;
private String messageTemp;
private LocalDateTime timestamp;
@ -92,13 +96,47 @@ public class StatusResponse {
this.message = message;
}
public StatusResponse(HttpStatus status, String message, Object object) {
this.status = status;
this.message = message;
this.object = object;
}
public StatusResponse(HttpStatus status, String message
, Object object
, Object apiReturn
) {
this.status = status;
this.message = message;
this.object = object;
this.apiReturn = apiReturn;
}
/**
* @methodName : statusResponseSet
* @author : 이호영
* @date : 2025. 6. 24.
* @description :
* @return : StatusResponse
* @param statusResponse
* @param httpStatus
* @param msg
* @param statCode - statCode는 API RETURN를 위한 코드
* @return
*
*/
public static StatusResponse statusResponseSet(StatusResponse statusResponse, HttpStatus httpStatus, String msg, String statCode ) {
statusResponse.setStatus(httpStatus);
statusResponse.setMessage(msg);
Map<String, Object> apiReturnMap = new HashMap<>();
apiReturnMap.put("statCode", statCode);
apiReturnMap.put("result", httpStatus.toString());
statusResponse.setApiReturn(apiReturnMap);
return statusResponse;
}

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

@ -28,5 +28,7 @@ public interface ApiCallInfoMngService {
//api key & api info 모두 실제 삭제
void deleteApiKeyInfoReal(ApiKeyVO apiKeyVO) throws Exception;
void udpateApiKeyInfoReal(ApiKeyVO apiKeyVO) throws Exception;
}

View File

@ -43,4 +43,8 @@ public class ApiCallInfoMngDAO extends EgovComAbstractDAO{
public void deleteApiCallInfoAll(ApiKeyVO apiKeyVO) throws Exception{
update("ApiCallInfoMngDAO.deleteApiCallInfoAll", apiKeyVO);
}
public void updateApiCallInfoAll(ApiKeyVO apiKeyVO) throws Exception{
update("ApiCallInfoMngDAO.updateApiCallInfoAll", apiKeyVO);
}
}

View File

@ -65,5 +65,15 @@ public class ApiCallInfoMngServiceImpl extends EgovAbstractServiceImpl implement
apiKeyMngDAO.deleteApiKeyReal(apiKeyVO);
}
@Override
public void udpateApiKeyInfoReal(ApiKeyVO apiKeyVO) throws Exception {
apiKeyVO.setUseYn("N");
apiCallInfoMngDAO.updateApiCallInfoAll(apiKeyVO);
//api key 삭제
apiKeyMngDAO.deleteApiKey(apiKeyVO);
}
}

View File

@ -48,10 +48,6 @@ public class ApiKeyMngDAO extends EgovComAbstractDAO{
return update("ApiKeyMngDAO.insertApiKey", apiKeyVO);
}
public void deleteApiKeyReal(ApiKeyVO apiKeyVO) throws Exception{
update("ApiKeyMngDAO.deleteApiKeyReal", apiKeyVO);
}
public List<ApiKeyVO> selectApiKeyApplyStatus(ApiKeyVO apiKeyVO){
return (List<ApiKeyVO>) list("ApiKeyMngDAO.selectApiKeyApplyStatus", apiKeyVO);
}
@ -60,4 +56,8 @@ public class ApiKeyMngDAO extends EgovComAbstractDAO{
return (int) select("ApiKeyMngDAO.selectMberApiKeyChk", apiKeyVO);
}
public void deleteApiKeyReal(ApiKeyVO apiKeyVO) throws Exception{
update("ApiKeyMngDAO.deleteApiKeyReal", apiKeyVO);
}
}

View File

@ -471,8 +471,10 @@ public class ApiKeyMngController {
ApiKeyVO apiKeyVO = new ApiKeyVO();
apiKeyVO.setMberId(userId);
apiKeyVO.setAccessNo(p_accessNo);
apiCallInfoMngService.deleteApiKeyInfoReal(apiKeyVO);
// 2025.06.02 update로 수정
// apiCallInfoMngService.deleteApiKeyInfoReal(apiKeyVO);
apiCallInfoMngService.udpateApiKeyInfoReal(apiKeyVO);
modelAndView.addObject("message", "삭제 완료되었습니다.");
modelAndView.addObject("result", "success");

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

@ -12,6 +12,7 @@ import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@JsonIgnoreProperties(ignoreUnknown = true)
@Getter
@ -19,6 +20,7 @@ import lombok.Setter;
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class MjonMsgVO extends ComDefaultVO{
private static final long serialVersionUID = 1L;

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

@ -3946,26 +3946,39 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M
@Override
public StatusResponse sendMsgData_advc(MjonMsgVO mjonMsgVO, HttpServletRequest request) throws Exception {
log.info("mjonMsgVO [{}]", mjonMsgVO.getMjonMsgSendVOList().get(0).getPhone());
// log.info("mjonMsgVO [{}]", mjonMsgVO.getMjonMsgSendVOList().get(0).getPhone());
log.info(" :: sendMsgData_advc :: ");
log.info(" + mjonMsgVO.toString() :: [{}]", mjonMsgVO.toString());
StatusResponse statusResponse = new StatusResponse();
Map<String, Object> returnMap = new HashMap<>();
Map<String, Object> apiReturnMap = new HashMap<>();
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()
? (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser()
: null;
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
String userId = "";
if("A".equals(mjonMsgVO.getSendKind()))
{
userId = mjonMsgVO.getMberId();
}else {
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()
? (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser()
: null;
userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
if (userId.equals("")) {
return new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용이 가능합니다.");
}
if (userId.equals("")) {
return new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용이 가능합니다.");
}
mjonMsgVO.setUserId(userId);
mjonMsgVO.setUserId(userId);
// 발신번호가 등록된 유효한 번호인지 확인
int sendCallFromCnt = mjonMsgDAO.selectCallFromNumberChk(mjonMsgVO);
if (sendCallFromCnt < 1) {
return new StatusResponse(HttpStatus.BAD_REQUEST, "등록된 발신번호를 찾을 수 없습니다.");
// return new StatusResponse(HttpStatus.BAD_REQUEST, "등록된 발신번호를 찾을 수 없습니다.");
return StatusResponse.statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "등록된 발신번호를 찾을 수 없습니다.", "STAT_1010");
}
/**
@ -3975,8 +3988,10 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M
if (!mberSttus) {
request.getSession().invalidate();
// UNAUTHORIZED : 인증되지 않은 사용자가 접근하려고
return new StatusResponse(HttpStatus.UNAUTHORIZED,
"현재 고객님께서는 문자온 서비스 이용이 정지된 상태로 문자를 발송하실 수 없습니다. 이용정지 해제를 원하시면 고객센터로 연락주시기 바랍니다.");
// return new StatusResponse(HttpStatus.UNAUTHORIZED,
// "현재 고객님께서는 문자온 서비스 이용이 정지된 상태로 문자를 발송하실 수 없습니다. 이용정지 해제를 원하시면 고객센터로 연락주시기 바랍니다.");
return StatusResponse.statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "현재 고객님께서는 문자온 서비스 이용이 정지된 상태로 문자를 발송하실 수 없습니다. 이용정지 해제를 원하시면 고객센터로 연락주시기 바랍니다."
, "STAT_1070");
}
String smsTxt = mjonMsgVO.getSmsTxtArea();
@ -3990,9 +4005,9 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M
log.debug(" :: smsTxt :: [{}]", smsTxt);
StatusResponse statusResponse = new StatusResponse();
// 화면에서 저장한 이미지 가져오기
// API는 이미지가 없어서 해당 없음
mjonMsgVO = setImagesSetting(mjonMsgVO, statusResponse);
if (mjonMsgVO == null) {
@ -4014,9 +4029,10 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M
int deletedCount = initialSize - finalSize;
// 수신거부 목록
returnMap.put("resultBlockSts", deletedCount);
apiReturnMap.put("resultBlockSts", deletedCount);
if (mjonMsgSendVOList.size() < 1) {
return new StatusResponse(HttpStatus.BAD_REQUEST, "수신거부와 매칭되는 번호 제거 후 \n발송 가능한 수신목록이 존재하지 않습니다.");
return StatusResponse.statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "수신거부와 매칭되는 번호 제거 후 \n발송 가능한 수신목록이 존재하지 않습니다.", "STAT_1021");
}
// 전용 전송사 코드 대표 전송사 조회
@ -4123,7 +4139,7 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M
* */
if (!isCashSufficient(mjonMsgVO, mjonMsgSendVOList)) {
log.error("Insufficient balance for message sending.");
return new StatusResponse(HttpStatus.BAD_REQUEST, "문자 발송에 필요한 보유 잔액이 부족 합니다.");
return new StatusResponse(HttpStatus.BAD_REQUEST, "문자 발송에 필요한 보유 잔액이 부족 합니다.", "STAT_1060");
}
System.out.println("==================== insert 시작 ====================");
@ -4138,13 +4154,24 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M
// instTotalCnt : 화면에서 보여줄 발송건수
int instTotalCnt = 0;
// Step 2: 그룹화 데이터를 그룹별로 insert 처리
String apiMsgGroupId = "";
String apiMsgType = "";
for (Map.Entry<String, List<MjonMsgSendVO>> entry : priceGroupedMessages.entrySet()) {
List<MjonMsgSendVO> groupedMsgList = entry.getValue(); // 해당 가격의 메시지 리스트
// msgGroupId 생성
String nextMsgGroupId = idgenMjonMsgGroupId.getNextStringId();
groupedMsgList.forEach(t -> t.setMsgGroupId(nextMsgGroupId));
// api 전달
apiMsgGroupId = StringUtils.isNotEmpty(apiMsgGroupId)
? apiMsgGroupId + "," + nextMsgGroupId
: nextMsgGroupId;
apiMsgType = StringUtils.isNotEmpty(apiMsgType)
? apiMsgType + "," + mjonMsgSendVOList.get(0).getMsgType()
: mjonMsgSendVOList.get(0).getMsgType();
// 발송 데이터 삽입
int instCnt = this.insertMsgData_advc(groupedMsgList);
@ -4175,17 +4202,38 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M
// returnMap.put("resultSts", instCnt);
log.debug("가격 [{}]의 총 갯수: [{}]", entry.getKey(), groupedMsgList.size());
}
// 그룹 ID
apiReturnMap.put("msgGroupId", apiMsgGroupId);
// 메세지 타입
apiReturnMap.put("msgType", apiMsgType);
// 발송 건수
returnMap.put("resultSts", instTotalCnt);
apiReturnMap.put("resultSts", instTotalCnt);
// db insert 성능 개선중 하나에 방법
// 분할 최대건수가 되면 디비에 입력하기
// 여러시도 했지만 일단 보류
// 무시해도
// int instCnt = mjonMsgDataDAO.insertMsgDataInfo_advc(mjonMsgSendVOList);
// int instCnt = mjonMsgDataDAO.insertMsgDataInfo_jdbc_advc(mjonMsgSendVOList);
// 발송 건수
returnMap.put("resultSts", instTotalCnt);
//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));
@ -4205,6 +4253,10 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M
statusResponse.setStatus(HttpStatus.OK);
statusResponse.setObject(returnMap);
apiReturnMap.put("result", HttpStatus.OK);
apiReturnMap.put("message", "문자 전송이 완료되었습니다.");
statusResponse.setApiReturn(apiReturnMap);
return statusResponse;
}
@ -4352,7 +4404,9 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M
int fileCount = 0;
// 장문 메시지일 경우 + 그림 이미지가 첨부된 경우
//
if (mjonMsgVO.getMsgType().equals("6") && mjonMsgVO.getImgFilePathAdvc() != null
log.info(" + mjonMsgVO.getMsgType() :: [{}]", mjonMsgVO.getMsgType());
log.info(" + mjonMsgVO.getImgFilePathAdvc() :: [{}]", mjonMsgVO.getImgFilePathAdvc());
if ("6".equals(mjonMsgVO.getMsgType()) && mjonMsgVO.getImgFilePathAdvc() != null
&& mjonMsgVO.getImgFileIdAdvc() != null) {
// 그림 이미지가 첨부된 경우
@ -5148,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

@ -198,7 +198,7 @@ public class EgovMypageRESTAPIController{
List<ApiKeyVO> resultList = new ArrayList<ApiKeyVO>();
resultList = apiKeyMngService.selectApiKeyApplyStatus(apiKeyVO);
System.out.println("=============");
if (resultList.size()>0) {
if(StringUtils.isNotEmpty(resultList.get(0).getFrstRegistPnttm()))
{
@ -250,6 +250,31 @@ public class EgovMypageRESTAPIController{
return "web/api/apiSpec";
}
@RequestMapping(value="/web/api/apiAtSpec.do")
public String apiAtSpec(ModelMap model)
throws Exception {
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
if(loginVO == null) {
return "redirect:/web/user/login/login.do";
}
model.addAttribute("loginVO", loginVO);
return "web/api/apiAtSpec";
}
@RequestMapping(value="/web/api/apiFtSpec.do")
public String apiFtSpec(ModelMap model)
throws Exception {
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
if(loginVO == null) {
return "redirect:/web/user/login/login.do";
}
model.addAttribute("loginVO", loginVO);
return "web/api/apiFtSpec";
}
/**
* @param model
* @return

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

@ -1,94 +1,94 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:egov-security="http://www.egovframe.go.kr/schema/egov-security"
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">
<security:http pattern="/css/**" security="none"/>
<security:http pattern="/html/**" security="none"/>
<security:http pattern="/images/**" security="none"/>
<security:http pattern="/js/**" security="none"/>
<security:http pattern="/resource/**" security="none"/>
<security:http pattern="\A/WEB-INF/jsp/.*\Z" request-matcher="regex" security="none"/>
<egov-security:config id="securityConfig"
loginUrl="/uat/uia/actionMain.do"
logoutSuccessUrl="/uat/uia/actionMain.do"
loginFailureUrl="/uat/uia/actionSecurityLogin.do?login_error=1"
accessDeniedUrl="/sec/ram/accessDenied.do"
dataSource="egov.dataSource"
jdbcUsersByUsernameQuery="SELECT USER_ID, ESNTL_ID AS PASSWORD, 1 ENABLED, USER_NM, USER_ZIP,
USER_ADRES, USER_EMAIL, USER_SE, '-' ORGNZT_ID, ESNTL_ID, MBTLNUM AS MOBLPHONNO,
'-' ORGNZT_NM, AUTHOR_CODE AS AUTHORITY, DEPT
FROM COMVNUSERMASTER A
INNER JOIN LETTNEMPLYRSCRTYESTBS B ON A.ESNTL_ID = B.SCRTY_DTRMN_TRGET_ID
WHERE CONCAT(USER_SE, USER_ID) = ?"
jdbcAuthoritiesByUsernameQuery="SELECT A.SCRTY_DTRMN_TRGET_ID USER_ID, A.AUTHOR_CODE AUTHORITY
FROM LETTNEMPLYRSCRTYESTBS A, COMVNUSERMASTER B
WHERE A.SCRTY_DTRMN_TRGET_ID = B.ESNTL_ID AND B.USER_ID = ?"
jdbcMapClass="itn.let.uat.uia.service.impl.EgovSessionMapping"
requestMatcherType="regex"
hash="plaintext"
hashBase64="false"
concurrentMaxSessons="999"
concurrentExpiredUrl="/"
defaultTargetUrl="/uat/uia/actionMain.do"
/>
<!--원 소스 -->
<!-- defaultTargetUrl="/uat/uia/actionMain.do" -->
<!-- sqlHierarchicalRoles="
SELECT a.CHLDRN_ROLE child, a.PARNTS_ROLE parent
FROM LETTNROLES_HIERARCHY a LEFT JOIN LETTNROLES_HIERARCHY b on (a.CHLDRN_ROLE = b.PARNTS_ROLE)" -->
<egov-security:secured-object-config id="securedObjectConfig"
roleHierarchyString="
ROLE_ADMIN > ROLE_USER_MEMBER
ROLE_USER_MEMBER > ROLE_ANONYMOUS"
sqlRolesAndUrl="
SELECT a.ROLE_PTTRN url, b.AUTHOR_CODE authority
FROM LETTNROLEINFO a, LETTNAUTHORROLERELATE b
WHERE a.ROLE_CODE = b.ROLE_CODE AND a.ROLE_TY = 'url'
ORDER BY a.ROLE_SORT"
sqlRolesAndMethod="
SELECT a.ROLE_PTTRN method, b.AUTHOR_CODE authority
FROM LETTNROLEINFO a, LETTNAUTHORROLERELATE b
WHERE a.ROLE_CODE = b.ROLE_CODE AND a.ROLE_TY = 'method'
ORDER BY a.ROLE_SORT"
sqlRolesAndPointcut="
SELECT a.ROLE_PTTRN pointcut, b.AUTHOR_CODE authority
FROM LETTNROLEINFO a, LETTNAUTHORROLERELATE b
WHERE a.ROLE_CODE = b.ROLE_CODE AND a.ROLE_TY = 'pointcut'
ORDER BY a.ROLE_SORT"
sqlRegexMatchedRequestMapping="
SELECT a.resource_pattern uri, b.authority authority
FROM LETTNROLEINFO a, LETTNAUTHORROLERELATE b
WHERE a.ROLE_CODE = b.ROLE_CODE AND a.ROLE_TY = 'regex'
ORDER BY a.ROLE_SORT"
/>
<egov-security:initializer id="initializer" supportMethod="true" supportPointcut="false" />
<!-- URL에 세미콜론(semicolon)허용 여부(기본값/false) -->
<bean id="egovStrictHttpFirewall" class="org.springframework.security.web.firewall.StrictHttpFirewall">
<property name="allowSemicolon" value="true"/>
</bean>
<security:http-firewall ref="egovStrictHttpFirewall"/>
</beans>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:egov-security="http://www.egovframe.go.kr/schema/egov-security"
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://maven.egovframe.go.kr/schema/egov-security/egov-security-3.7.xsd">
<security:http pattern="/css/**" security="none"/>
<security:http pattern="/html/**" security="none"/>
<security:http pattern="/images/**" security="none"/>
<security:http pattern="/js/**" security="none"/>
<security:http pattern="/resource/**" security="none"/>
<security:http pattern="\A/WEB-INF/jsp/.*\Z" request-matcher="regex" security="none"/>
<egov-security:config id="securityConfig"
loginUrl="/uat/uia/actionMain.do"
logoutSuccessUrl="/uat/uia/actionMain.do"
loginFailureUrl="/uat/uia/actionSecurityLogin.do?login_error=1"
accessDeniedUrl="/sec/ram/accessDenied.do"
dataSource="egov.dataSource"
jdbcUsersByUsernameQuery="SELECT USER_ID, ESNTL_ID AS PASSWORD, 1 ENABLED, USER_NM, USER_ZIP,
USER_ADRES, USER_EMAIL, USER_SE, '-' ORGNZT_ID, ESNTL_ID, MBTLNUM AS MOBLPHONNO,
'-' ORGNZT_NM, AUTHOR_CODE AS AUTHORITY, DEPT
FROM COMVNUSERMASTER A
INNER JOIN LETTNEMPLYRSCRTYESTBS B ON A.ESNTL_ID = B.SCRTY_DTRMN_TRGET_ID
WHERE CONCAT(USER_SE, USER_ID) = ?"
jdbcAuthoritiesByUsernameQuery="SELECT A.SCRTY_DTRMN_TRGET_ID USER_ID, A.AUTHOR_CODE AUTHORITY
FROM LETTNEMPLYRSCRTYESTBS A, COMVNUSERMASTER B
WHERE A.SCRTY_DTRMN_TRGET_ID = B.ESNTL_ID AND B.USER_ID = ?"
jdbcMapClass="itn.let.uat.uia.service.impl.EgovSessionMapping"
requestMatcherType="regex"
hash="plaintext"
hashBase64="false"
concurrentMaxSessons="999"
concurrentExpiredUrl="/"
defaultTargetUrl="/uat/uia/actionMain.do"
/>
<!--원 소스 -->
<!-- defaultTargetUrl="/uat/uia/actionMain.do" -->
<!-- sqlHierarchicalRoles="
SELECT a.CHLDRN_ROLE child, a.PARNTS_ROLE parent
FROM LETTNROLES_HIERARCHY a LEFT JOIN LETTNROLES_HIERARCHY b on (a.CHLDRN_ROLE = b.PARNTS_ROLE)" -->
<egov-security:secured-object-config id="securedObjectConfig"
roleHierarchyString="
ROLE_ADMIN > ROLE_USER_MEMBER
ROLE_USER_MEMBER > ROLE_ANONYMOUS"
sqlRolesAndUrl="
SELECT a.ROLE_PTTRN url, b.AUTHOR_CODE authority
FROM LETTNROLEINFO a, LETTNAUTHORROLERELATE b
WHERE a.ROLE_CODE = b.ROLE_CODE AND a.ROLE_TY = 'url'
ORDER BY a.ROLE_SORT"
sqlRolesAndMethod="
SELECT a.ROLE_PTTRN method, b.AUTHOR_CODE authority
FROM LETTNROLEINFO a, LETTNAUTHORROLERELATE b
WHERE a.ROLE_CODE = b.ROLE_CODE AND a.ROLE_TY = 'method'
ORDER BY a.ROLE_SORT"
sqlRolesAndPointcut="
SELECT a.ROLE_PTTRN pointcut, b.AUTHOR_CODE authority
FROM LETTNROLEINFO a, LETTNAUTHORROLERELATE b
WHERE a.ROLE_CODE = b.ROLE_CODE AND a.ROLE_TY = 'pointcut'
ORDER BY a.ROLE_SORT"
sqlRegexMatchedRequestMapping="
SELECT a.resource_pattern uri, b.authority authority
FROM LETTNROLEINFO a, LETTNAUTHORROLERELATE b
WHERE a.ROLE_CODE = b.ROLE_CODE AND a.ROLE_TY = 'regex'
ORDER BY a.ROLE_SORT"
/>
<egov-security:initializer id="initializer" supportMethod="true" supportPointcut="false" />
<!-- URL에 세미콜론(semicolon)허용 여부(기본값/false) -->
<bean id="egovStrictHttpFirewall" class="org.springframework.security.web.firewall.StrictHttpFirewall">
<property name="allowSemicolon" value="true"/>
</bean>
<security:http-firewall ref="egovStrictHttpFirewall"/>
</beans>

View File

@ -85,4 +85,11 @@
DELETE FROM lettngnrlmber_access_call_info
WHERE access_no = #accessNo#
</delete>
<update id="ApiCallInfoMngDAO.updateApiCallInfoAll" parameterClass="apiKeyVO">
UPDATE lettngnrlmber_access_call_info
SET use_yn = #useYn#
WHERE access_no = #accessNo#
</update>
</sqlMap>

View File

@ -208,6 +208,7 @@
)
WHERE 1=1
and a.mber_id=#mberId#
and b.USE_YN != 'N'
LIMIT 1
</select>

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

@ -150,6 +150,7 @@
BEF_POINT,
TOT_PRICE,
SEND_KIND,
AT_DELAY_YN,
BIZ_KAKAO_RESEND_ORGNL_TXT,
@ -174,6 +175,7 @@
#befPoint#,
#totPrice#,
#sendKind#,
#atDelayYn#,
#bizKakaoResendOrgnlTxt#,
@ -228,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

@ -117,17 +117,6 @@
LEFT JOIN MJ_KAKAO_PROFILE_INFO KPI
ON KFT.USER_ID = KPI.USER_ID
AND KFT.SENDER_KEY = KPI.SENDER_KEY
AND KPI.PROFILE_ID = (
SELECT
PROFILE_ID
FROM
MJ_KAKAO_PROFILE_INFO
WHERE
USER_ID = KFT.USER_ID
AND SENDER_KEY = KFT.SENDER_KEY
ORDER BY DELETE_YN ASC, LAST_UPDT_PNTTM DESC
LIMIT 1
)
WHERE KFT.DELETE_YN = 'N'
AND KFT.USER_ID = #userId#
<isNotEmpty property="senderKey">

View File

@ -2327,6 +2327,7 @@
EVENT_YN,
DELAY_YN,
AT_DELAY_YN,
SEND_KIND,
BIZ_KAKAO_RESEND_ORGNL_TXT,
SUBJECT_CHK_YN
)
@ -2354,6 +2355,7 @@
#eventYn#,
#delayYn#,
#atDelayYn#,
#sendKind#,
#kakaoSubMagOrgnlTxt#,
#subjectChkYn#
)
@ -3735,7 +3737,8 @@
RECEIVE,
FRST_SEND_PNTTM,
CHECK_NO,
CONTENTS
CONTENTS,
SEND_MSG_TYPE
)
@ -3748,7 +3751,8 @@
#receive#,
now(),
#checkNo#,
#contents#
#contents#,
#sendMsgType#
)
</insert>
@ -8296,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

@ -36,6 +36,11 @@
<link rel="stylesheet" href="/publish/js/datepicker/classic.css">
<link rel="stylesheet" href="/publish/js/datepicker/classic.date.css">
<link rel="stylesheet" href="/publish/js/highlight/styles/default.min.css">
<link rel="stylesheet" href="/publish/js/highlight/styles/arta.css">
<script type="text/javascript" src="/publish/js/jquery-3.5.0.js"></script>
<script type="text/javascript" src="/publish/js/jquery.mCustomScrollbar.concat.min.js"></script>
<script type="text/javascript" src="/publish/js/common.js?date=202507210001"></script>
@ -80,6 +85,9 @@
<!-- Uncaught TypeError: e.widget is not a function로 인해 가장 마지막에 선언_이준호_220510 -->
<script type="text/javascript" src="/dist/js/tabulator/jquery_wrapper.js"></script>
<script type="text/javascript" src="/publish/js/highlight/highlight.min.js"></script>
<%-- 20240110 matomo 사용 안함으로 인하여 주석처리 함
<c:if test="${fn:contains(pageContext.request.requestURL, 'munjaon.co.kr')}">

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

@ -0,0 +1,164 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<head>
</head>
<script language=javascript>
$(document).ready(function(){
// 현재 url 추출
/* var url = window.location.pathname;
// 현재 url에서 uri만 추출
var lastPart = url.split('/').pop();
$('.tabType4 .tab').each(function(index) {
var $btn = $(this).children("button");
var id = $btn.attr("id");
// 개발가이드 그룹
if (id === 'apiSpec' && /api.*Spec\.do$/.test(lastPart)) {
$(this).addClass('active');
}
// 나머지 기본 처리
else if (lastPart.indexOf(id) > -1) {
$(this).addClass('active');
}
}); */
});
hljs.highlightAll();
</script>
<style>
.padding_add > p
{
padding-left: 30px;
padding-bottom: 8px;
}
.padding_add > div > p
{
padding-left: 60px;
padding-bottom: 8px;
}
</style>
<!-- content 영역 -->
<div class="inner">
<!-- send top -->
<div class="send_top">
<c:import url="./top_tepMenu.jsp" /><!--// tab button -->
<!-- tab button -->
<div class="api_guide_cont current">
<div class="heading">
<h2>REST API 개발 가이드</h2>
</div>
<!--// sub tab button -->
<c:import url="./top_subTepMenu.jsp" />
<!-- REST API 개발 가이드 > 문자 -->
<%-- <div class="api_guide current" id="tab5_1">
<div class="list_tab_wrap2 type3">
<!-- tab button -->
<ul class="list_tab">
<li class="tab active"><button type="button" onclick="TabType1(this,'1')">문자보내기</button></li>
<li class="tab"><button type="button" onclick="TabType1(this,'2')" id="btnEstimate">문자보내기(대량)</button></li>
<li class="tab"><button type="button" onclick="TabType1(this,'3')" id="btnEstimate3">전송내역조회</button></li>
<li class="tab"><button type="button" onclick="TabType1(this,'4')" id="btnEstimate4">전송결과조회(상세)</button></li>
<li class="tab"><button type="button" onclick="TabType1(this,'5')" id="btnEstimate5">발송가능건수</button></li>
</ul><!--// tab button -->
</div>
<!-- 문자보내기 -->
<div class="fee_cont current" id="tab1_1">
<c:import url="./msg/apiSpec_tab1.jsp" />
</div>
<!-- 문자보내기(대량) -->
<div class="fee_cont" id="tab1_2">
<c:import url="./msg/apiSpec_tab2.jsp" />
</div>
<!-- 전송내역조회 -->
<div class="fee_cont" id="tab1_3">
<c:import url="./msg/apiSpec_tab3.jsp" />
</div>
<!-- 전송결과조회(상세) -->
<div class="fee_cont" id="tab1_4">
<c:import url="./msg/apiSpec_tab4.jsp" />
</div>
<!-- 발송가능건수 -->
<div class="fee_cont" id="tab1_5">
<c:import url="./msg/apiSpec_tab5.jsp" />
</div>
</div> --%>
<!-- //REST API 개발 가이드 > 문자 -->
<!-- REST API 개발 가이드 > 알림톡 -->
<div class="api_guide current" id="tab5_1">
<div class="list_tab_wrap2 type3">
<!-- tab button -->
<ul class="list_tab">
<li class="tab active"><button type="button" onclick="TabType1(this,'1');">채널 ID 조회</button></li>
<li class="tab"><button type="button" onclick="TabType1(this,'2');">템플릿 ID 조회</button></li>
<li class="tab"><button type="button" onclick="TabType1(this,'3');">템플릿상세조회</button></li>
<li class="tab"><button type="button" onclick="TabType1(this,'4');">알림톡 보내기</button></li>
<li class="tab"><button type="button" onclick="TabType1(this,'5');">전송내역조회</button></li>
<li class="tab"><button type="button" onclick="TabType1(this,'6');">전송내역조회(상세)</button></li>
<li class="tab"><button type="button" onclick="TabType1(this,'7');">발송가능건수</button></li>
</ul><!--// tab button -->
</div>
<!-- 채널 ID 조회 -->
<div class="fee_cont current" id="tab1_1">
<c:import url="./at/apiSpec_tab1.jsp" />
</div>
<!-- 템플릿 ID 조회 -->
<div class="fee_cont" id="tab1_2">
<c:import url="./at/apiSpec_tab2.jsp" />
</div>
<!-- 템플릿상세조회 -->
<div class="fee_cont" id="tab1_3">
<c:import url="./at/apiSpec_tab3.jsp" />
</div>
<!-- 알림톡 보내기 -->
<div class="fee_cont" id="tab1_4">
<c:import url="./at/apiSpec_tab4.jsp" />
</div>
<!-- 전송내역조회 -->
<div class="fee_cont" id="tab1_5">
<c:import url="./at/apiSpec_tab6.jsp" />
</div>
<!-- 전송내역조회(상세) -->
<div class="fee_cont" id="tab1_6">
<c:import url="./at/apiSpec_tab7.jsp" />
</div>
<!-- 발송가능건수 -->
<div class="fee_cont" id="tab1_7">
<c:import url="./at/apiSpec_tab8.jsp" />
</div>
</div>
<!-- //REST API 개발 가이드 > 알림톡 -->
</div>
</div><!--// send top -->
</div>

View File

@ -0,0 +1,111 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<head>
</head>
<script language=javascript>
$(document).ready(function(){
// 현재 url 추출
/* var url = window.location.pathname;
// 현재 url에서 uri만 추출
var lastPart = url.split('/').pop();
$('.tabType4 .tab').each(function(index) {
var $btn = $(this).children("button");
var id = $btn.attr("id");
// 개발가이드 그룹
if (id === 'apiSpec' && /api.*Spec\.do$/.test(lastPart)) {
$(this).addClass('active');
}
// 나머지 기본 처리
else if (lastPart.indexOf(id) > -1) {
$(this).addClass('active');
}
}); */
});
hljs.highlightAll();
</script>
<style>
.padding_add > p
{
padding-left: 30px;
padding-bottom: 8px;
}
.padding_add > div > p
{
padding-left: 60px;
padding-bottom: 8px;
}
</style>
<!-- content 영역 -->
<div class="inner">
<!-- send top -->
<div class="send_top">
<c:import url="./top_tepMenu.jsp" /><!--// tab button -->
<!-- tab button -->
<div class="api_guide_cont current">
<div class="heading">
<h2>REST API 개발 가이드</h2>
</div>
<!--// sub tab button -->
<c:import url="./top_subTepMenu.jsp" />
<!-- REST API 개발 가이드 > 알림톡 -->
<div class="api_guide current" id="tab5_1">
<div class="list_tab_wrap2 type3">
<!-- tab button -->
<ul class="list_tab">
<li class="tab active"><button type="button" onclick="TabType1(this,'1');">채널 ID 조회</button></li>
<li class="tab"><button type="button" onclick="TabType1(this,'2');">친구톡 보내기</button></li>
<li class="tab"><button type="button" onclick="TabType1(this,'3');">전송내역조회</button></li>
<li class="tab"><button type="button" onclick="TabType1(this,'4');">전송내역조회(상세)</button></li>
<li class="tab"><button type="button" onclick="TabType1(this,'5');">발송가능건수</button></li>
</ul><!--// tab button -->
</div>
<!-- 채널 ID 조회 -->
<div class="fee_cont current" id="tab1_1">
<c:import url="./ft/apiSpec_tab1.jsp" />
</div>
<!-- 알림톡 보내기 -->
<div class="fee_cont" id="tab1_2">
<c:import url="./ft/apiSpec_tab2.jsp" />
</div>
<!-- 전송내역조회 -->
<div class="fee_cont" id="tab1_3">
<c:import url="./ft/apiSpec_tab3.jsp" />
</div>
<!-- 전송내역조회(상세) -->
<div class="fee_cont" id="tab1_4">
<c:import url="./ft/apiSpec_tab4.jsp" />
</div>
<!-- 발송가능건수 -->
<div class="fee_cont" id="tab1_5">
<c:import url="./ft/apiSpec_tab5.jsp" />
</div>
</div>
<!-- //REST API 개발 가이드 > 알림톡 -->
</div>
</div><!--// send top -->
</div>

View File

@ -2,11 +2,21 @@
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<head>
</head>
<script language=javascript>
$(document).ready(function(){
$('.topBtn').click(function(){
location.href=$(this).data('info');
});
});
hljs.highlightAll();
</script>
<style>
@ -25,6 +35,7 @@ $(document).ready(function(){
</style>
<!-- content 영역 -->
<div class="inner">
<!-- send top -->
@ -33,47 +44,54 @@ $(document).ready(function(){
<c:import url="./top_tepMenu.jsp" /><!--// tab button -->
<!-- tab button -->
<div class="api_guide_cont current" id="tab5_1">
<div class="api_guide_cont current">
<div class="heading">
<h2>REST API 설명</h2>
</div>
<div class="pay_tab_wrap">
<!-- tab button -->
<ul class="tabType1">
<li class="tab active"><button type="button" onclick="TabType1(this,'1')">문자보내기</button></li>
<li class="tab"><button type="button" onclick="TabType1(this,'2')" id="btnEstimate">문자보내기(대량)</button></li>
<li class="tab"><button type="button" onclick="TabType1(this,'3')" id="btnEstimate3">전송내역조회</button></li>
<li class="tab"><button type="button" onclick="TabType1(this,'4')" id="btnEstimate4">전송결과조회(상세)</button></li>
<li class="tab"><button type="button" onclick="TabType1(this,'5')" id="btnEstimate5">발송가능건수</button></li>
</ul><!--// tab button -->
</div>
<!-- 문자보내기 -->
<!-- 문자보내기 -->
<!-- 문자보내기 -->
<div class="fee_cont current" id="tab1_1">
<c:import url="./apiSpec_tab1.jsp" />
</div>
<!-- 문자보내기(대량) -->
<!-- 문자보내기(대량) -->
<!-- 문자보내기(대량) -->
<div class="fee_cont" id="tab1_2">
<c:import url="./apiSpec_tab2.jsp" />
<h2>REST API 개발 가이드</h2>
</div>
<!-- 전송내역조회 -->
<div class="fee_cont" id="tab1_3">
<c:import url="./apiSpec_tab3.jsp" />
</div>
<!-- 전송결과조회(상세) -->
<div class="fee_cont" id="tab1_4">
<c:import url="./apiSpec_tab4.jsp" />
</div>
<!-- 발송가능건수 -->
<div class="fee_cont" id="tab1_5">
<c:import url="./apiSpec_tab5.jsp" />
<!--// sub tab button -->
<c:import url="./top_subTepMenu.jsp" />
<!-- REST API 개발 가이드 > 문자 -->
<div class="api_guide current" id="tab5_1">
<div class="list_tab_wrap2 type3">
<!-- tab button -->
<ul class="list_tab">
<li class="tab active"><button type="button" onclick="TabType1(this,'1')">문자보내기</button></li>
<li class="tab"><button type="button" onclick="TabType1(this,'2')" id="btnEstimate">문자보내기(대량)</button></li>
<li class="tab"><button type="button" onclick="TabType1(this,'3')" id="btnEstimate3">전송내역조회</button></li>
<li class="tab"><button type="button" onclick="TabType1(this,'4')" id="btnEstimate4">전송결과조회(상세)</button></li>
<li class="tab"><button type="button" onclick="TabType1(this,'5')" id="btnEstimate5">발송가능건수</button></li>
</ul><!--// tab button -->
</div>
<!-- 문자보내기 -->
<div class="fee_cont current" id="tab1_1">
<c:import url="./msg/apiSpec_tab1.jsp" />
</div>
<!-- 문자보내기(대량) -->
<div class="fee_cont" id="tab1_2">
<c:import url="./msg/apiSpec_tab2.jsp" />
</div>
<!-- 전송내역조회 -->
<div class="fee_cont" id="tab1_3">
<c:import url="./msg/apiSpec_tab3.jsp" />
</div>
<!-- 전송결과조회(상세) -->
<div class="fee_cont" id="tab1_4">
<c:import url="./msg/apiSpec_tab4.jsp" />
</div>
<!-- 발송가능건수 -->
<div class="fee_cont" id="tab1_5">
<c:import url="./msg/apiSpec_tab5.jsp" />
</div>
</div>
<!-- //REST API 개발 가이드 > 문자 -->
<!-- REST API 개발 가이드 > 알림톡 -->
<!-- //REST API 개발 가이드 > 친구톡 -->
</div>
</div><!--// send top -->
</div>

View File

@ -242,7 +242,7 @@ function fn_reg_user_4_apikey(){
var form = document.checkForm;
var data = new FormData(form);
if(confirm("API 신청하시겠습니까?")) {
if(confirm("API 신청하시겠습니까?")) {
$.ajax({
type: "POST",
url: "/uss/ion/apikey/UserAPIInsertAPIKEYAjax.do",
@ -299,6 +299,10 @@ function fn_reg_user_4_apikey(){
<!--신청/관리 내용-->
<!--API 신청 정보 : 신청 전-->
<div class="api_admin">
<ul class="info">
<li>- 서비스 사용 신청 시, 문자 및 카카오톡 연동서비스를 모두 이용하실 수 있습니다.</li>
<li>- 관리자 승인 이후 발송 서버 IP를 등록해 주셔야 합니다.</li>
</ul>
<div class="admin_title">API 신청 정보</div>
<div class="tb_wrap_t1">
<table class="tType4">

View File

@ -0,0 +1,239 @@
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<ul class="info">
<li>- API를 통해서 채널 ID를 조회할 수 있습니다.</li>
<!-- <li>- 발신번호는 문자온 사이트를 통해 사전등록 후 이용하실 수 있습니다.(마이페이지-발신번호 관리 메뉴 이용)</li> -->
<!-- <li>- 문자 내용이 "90byte"를 초과하는 경우 장문(LMS)으로 자동 전환됩니다.</li> -->
</ul>
<div class="re_cont">
<!-- Request -->
<div class="req_title">Request</div>
<div class="box">
<div class="text">
<h4>Request</h4>
<table>
<caption>API Request Http Method, 프로토콜, HOST, Service Port, Endpoint 정보 테이블</caption>
<colgroup>
<col style="width:20%;">
<col style="width:80%;">
</colgroup>
<tr>
<th>Http Method</th>
<td>POST</td>
</tr>
<tr>
<th>프로토콜</th>
<td>HTTPS/1.1</td>
</tr>
<tr>
<th>HOST</th>
<td>api.munjaon.co.kr</td>
</tr>
<tr>
<th>Service Port</th>
<td>443</td>
</tr>
<tr>
<th>Endpoint</th>
<td>/api/kakao/inqry/chnlId</td>
</tr>
</table>
</div>
</div>
<div class="type_table">
<table>
<caption>채널ID 조회 API Request 키 종류 및 설명, 타입, 필수 여부 테이블</caption>
<colgroup>
<col style="width:20%;">
<col style="width:45%;">
<col style="width:25%">
<col style="width:10%">
</colgroup>
<thead>
<tr>
<th>키</th>
<th>설명</th>
<th>타입</th>
<th>필수</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="font_b">mberId</span></td>
<td>사용자 ID</td>
<td>String</td>
<td><span class="select_o">O</span></td>
</tr>
<tr>
<td><span class="font_b">accessKey</span></td>
<td>인증용 API Key</td>
<td>String</td>
<td><span class="select_o">O</span></td>
</tr>
<tr>
<td><span class="font_b">test_yn</span></td>
<td>테스트 데이터 여부 (YS: 성공 테스트, YF: 실패 테스트)</td>
<td>String</td>
<td><span class="select_x">X</span></td>
</tr>
</tbody>
</table>
<div class="table_info">
<p>※ HTTPS 프로토콜을 사용하여 POST로 요청합니다.</p>
<p>※ Content-Type: application/json</p>
</div>
</div>
<div class="box">
<div class="title">[Example]</div>
<div class="code_view">
<pre>
<code class="language-json">
{
"mberId": "홍길동",
"accessKey": "XXXXXXXXXXXXXX414050694b953",
"test_yn": ""
}
</code>
</pre>
</div>
</div>
<!-- // Request -->
<!-- Response -->
<div class="res_title">Response</div>
<div class="type_table">
<table>
<caption>채널ID 조회 API Response 키 종류 및 설명, 타입 테이블</caption>
<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>
<td><span class="font_b">resultCode</span></td>
<td>성공 여부("0" 이외는 실패)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">data</span></td>
<td>조회 결과 목록(성공 시 배열, 실패 시 오류 메시지)</td>
<td>Array | String</td>
</tr>
<tr>
<td><span class="font_b">[data][i].senderKey</span></td>
<td>발신 프로필 SenderKey</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data][i].phoneNumber</span></td>
<td>대표 전화번호</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data][i].yellowId</span></td>
<td>카카오 채널(옐로아이디)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data][i].frstRegistPnttm</span></td>
<td>최초 등록 일시(YYYY-MM-DD HH:mm:ss)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data][i].frstRegisterId</span></td>
<td>최초 등록자 ID</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">localDateTime</span></td>
<td>서버 처리 일시(ISO-8601)</td>
<td>String</td>
</tr>
</tbody>
</table>
<div class="table_info">
<p>※ JSON 객체로 응답합니다.</p>
</div>
</div>
<div class="box">
<div class="title_t1"><span class="ex">[Example]</span><span class="ex_success">O 성공 예시</span></div>
<div class="code_view">
<pre>
<code class="language-json">
{
"resultCode": "0",
"data": [
{
"senderKey": "test_sender_key_001",
"phoneNumber": "02-1234-0000",
"yellowId": "@test_channel_001",
"frstRegistPnttm": "2025-09-09 12:44:21",
"frstRegisterId": "test_id_one"
},
{
"senderKey": "test_sender_key_002",
"phoneNumber": "02-1234-0001",
"yellowId": "@test_channel_002",
"frstRegistPnttm": "2025-09-09 12:44:21",
"frstRegisterId": "test_id_tow"
}
],
"localDateTime": "2025-09-09T12:44:21.624464"
}
</code>
</pre>
</div>
</div>
<div class="box">
<div class="title_t1"><span class="ex">[Example]</span><span class="ex_fail">X 실패 예시</span></div>
<div class="code_view">
<pre><code class="language-json">
{
"resultCode": "2099",
"data": "기타 시스템 오류"
}
</code></pre>
</div>
</div>
<!-- // Response -->
</div>
<!--// Response-->

View File

@ -0,0 +1,271 @@
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<ul class="info">
<li>- 등록된 알림톡 템플릿 목록을 조회할 수 있습니다.</li>
<li>- SenderKey별로 승인된 템플릿만 조회됩니다.</li>
<li>- 템플릿 상태(등록완료, 승인대기 등)를 확인할 수 있습니다.</li>
</ul>
<div class="re_cont">
<!-- Request -->
<div class="req_title">Request</div>
<div class="box">
<div class="text">
<h4>Request</h4>
<table>
<caption>API Request Http Method, 프로토콜, HOST, Service Port, Endpoint 정보 테이블</caption>
<colgroup>
<col style="width:20%;">
<col style="width:80%;">
</colgroup>
<tr>
<th>Http Method</th>
<td>POST</td>
</tr>
<tr>
<th>프로토콜</th>
<td>HTTPS/1.1</td>
</tr>
<tr>
<th>HOST</th>
<td>api.munjaon.co.kr</td>
</tr>
<tr>
<th>Service Port</th>
<td>443</td>
</tr>
<tr>
<th>Endpoint</th>
<td>/api/kakao/inqry/templates/list</td>
</tr>
</table>
</div>
</div>
<div class="type_table">
<table>
<caption>템플릿 목록 조회 API Request 키 종류 및 설명, 타입, 필수 여부 테이블</caption>
<colgroup>
<col style="width:20%;">
<col style="width:45%;">
<col style="width:25%">
<col style="width:10%">
</colgroup>
<thead>
<tr>
<th>키</th>
<th>설명</th>
<th>타입</th>
<th>필수</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="font_b">mberId</span></td>
<td>사용자 ID</td>
<td>String</td>
<td><span class="select_o">O</span></td>
</tr>
<tr>
<td><span class="font_b">accessKey</span></td>
<td>인증용 API Key</td>
<td>String</td>
<td><span class="select_o">O</span></td>
</tr>
<tr>
<td><span class="font_b">senderKey</span></td>
<td>발신 프로필 SenderKey</td>
<td>String</td>
<td><span class="select_o">O</span></td>
</tr>
<tr>
<td><span class="font_b">test_yn</span></td>
<td>테스트 데이터 여부 (YS: 성공 테스트, YF: 실패 테스트)</td>
<td>String</td>
<td><span class="select_x">X</span></td>
</tr>
</tbody>
</table>
<div class="table_info">
<p>※ HTTPS 프로토콜을 사용하여 POST로 요청합니다.</p>
<p>※ Content-Type: application/json</p>
</div>
</div>
<div class="box">
<div class="title">[Example]</div>
<div class="code_view">
<pre>
<code class="language-json">
{
"mberId": "홍길동",
"accessKey": "XXXXXXXXXXXXXX414050694b953",
"senderKey": "XXXXXXXXXXXXXX669143473b1af",
"test_yn": ""
}
</code>
</pre>
</div>
</div>
<!-- // Request -->
<!-- Response -->
<div class="res_title">Response</div>
<div class="type_table">
<table>
<caption>템플릿 목록 조회 API Response 키 종류 및 설명, 타입 테이블</caption>
<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>
<td><span class="font_b">resultCode</span></td>
<td>성공 여부("0" 이외는 실패)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">data</span></td>
<td>조회 결과 목록(성공 시 배열, 실패 시 오류 메시지)</td>
<td>Array | String</td>
</tr>
<tr>
<td><span class="font_b">[data][i].senderKey</span></td>
<td>발신 프로필 SenderKey</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data][i].templateCode</span></td>
<td>템플릿 코드</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data][i].templateName</span></td>
<td>템플릿 명</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data][i].createdAt</span></td>
<td>템플릿 생성 일시</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data][i].modifiedAt</span></td>
<td>템플릿 수정 일시</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data][i].serviceStatus</span></td>
<td>서비스 상태(등록완료, 승인대기 등)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">localDateTime</span></td>
<td>서버 처리 일시(ISO-8601)</td>
<td>String</td>
</tr>
</tbody>
</table>
<div class="table_info">
<p>※ JSON 객체로 응답합니다.</p>
</div>
</div>
<div class="box">
<div class="title_t1"><span class="ex">[Example]</span><span class="ex_success">O 성공 예시</span></div>
<div class="code_view">
<pre>
<code class="language-json">
{
"resultCode": "0",
"data": [
{
"senderKey": "test_sender_key_001",
"templateCode": "TEST_TEMPLATE_001",
"templateName": "테스트 템플릿 001",
"createdAt": "2025-01-01 10:00:00",
"modifiedAt": "2025-01-01 10:00:00",
"serviceStatus": "REG(등록완료)"
},
{
"senderKey": "test_sender_key_001",
"templateCode": "TEST_TEMPLATE_002",
"templateName": "테스트 템플릿 002",
"createdAt": "2025-01-01 11:00:00",
"modifiedAt": "2025-01-01 11:00:00",
"serviceStatus": "REG(등록완료)"
},
{
"senderKey": "test_sender_key_002",
"templateCode": "TEST_TEMPLATE_003",
"templateName": "테스트 템플릿 003",
"createdAt": "2025-01-01 12:00:00",
"modifiedAt": "2025-01-01 12:00:00",
"serviceStatus": "PENDING(승인대기)"
}
],
"localDateTime": "2025-09-09T14:18:38.445175"
}
</code>
</pre>
</div>
</div>
<div class="box">
<div class="title_t1"><span class="ex">[Example]</span><span class="ex_fail">X 실패 예시</span></div>
<div class="code_view">
<pre><code class="language-json">
{
"resultCode": "4010",
"data": "인증 정보가 올바르지 않습니다.(mberId/accessKey)"
}
</code></pre>
</div>
</div>
<!-- // Response -->
</div>
<!--// Response-->

View File

@ -0,0 +1,687 @@
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<ul class="info">
<li>- 문자온 사이트 및 API를 통해 전송된 문자 발송내역을 조회할 수 있습니다.</li>
<li>- 문자 발송내역은 날짜별로 조회되며, 최근 3개월까지만 조회 가능합니다.</li>
<li>- 발신번호별 문자 발송내역 조회 기능은 제공되지 않습니다.</li>
</ul>
<div class="re_cont">
<!--Request-->
<div class="req_title">Request</div>
<div class="box">
<div class="text">
<h4>Request</h4>
<table>
<caption>API Request Http Method, 프로토콜, HOST, Service Port
정보 테이블</caption>
<colgroup>
<col style="width: 20%;">
<col style="width: 80%;">
</colgroup>
<tr>
<th>Http Method</th>
<td>POST</td>
</tr>
<tr>
<th>프로토콜</th>
<td>HTTP/1.1</td>
</tr>
<tr>
<th>HOST</th>
<td>api.munjaon.co.kr</td>
</tr>
<tr>
<th>Service Port</th>
<td>443</td>
</tr>
</table>
</div>
</div>
<div class="type_table">
<table>
<caption>전송결과 조회 API Request 키 종류 및 설명, 타입, 필수 여부 테이블</caption>
<colgroup>
<col style="width: 20%;">
<col style="width: 45%;">
<col style="width: 25%">
<col style="width: 10%">
</colgroup>
<thead>
<tr>
<th>키</th>
<th>설명</th>
<th>타입</th>
<th>필수</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="font_b">mberId</span></td>
<td>사용자 ID</td>
<td>String</td>
<td><span class="select_o">O</span></td>
</tr>
<tr>
<td><span class="font_b">accessKey</span></td>
<td>인증용 API Key</td>
<td>String</td>
<td><span class="select_o">O</span></td>
</tr>
<tr>
<td><span class="font_b">senderKey</span></td>
<td>발신 프로필 Key</td>
<td>String</td>
<td><span class="select_o">O</span></td>
</tr>
<tr>
<td><span class="font_b">templateCode</span></td>
<td>템플릿 코드</td>
<td>String</td>
<td><span class="select_o">O</span></td>
</tr>
</tbody>
</table>
<div class="table_info">
<p>※ HTTPS 프로토콜을 사용하여 POST로 요청합니다.</p>
</div>
</div>
<div class="box">
<div class="title">[Example]</div>
<div class="code_view">
<p>&#65371;</p>
<div class="indent">
<p>
<span>"mberId"</span>:"홍길동"
</p>
<p>
,<span>"accessKey"</span>:"XXXXXXXXXXXXXX414050694b953"
</p>
<p>
,<span>"senderKey"</span>:"XXXXXXXXXXXXXX669143473b1af"
</p>
<p>
,<span>"templateCode"</span>:"bizp_202503141052XXXXXXXXXXXXXX"
</p>
</div>
<p class="l_code">&#65373;</p>
</div>
</div>
<!--// Request-->
<!-- Response-->
<div class="res_title">Response</div>
<div class="type_table">
<table>
<caption>전송결과 조회 API Response 키 종류 및 설명, 타입 테이블</caption>
<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>
<td><span class="font_b">resultCode</span></td>
<td>성공 여부("0" 아니면 실패)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">data</span></td>
<td>템플릿 정보 리스트</td>
<td>Array</td>
</tr>
<tr>
<td><span class="font_b">[data].templateCode</span></td>
<td>템플릿 코드</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].templateName</span></td>
<td>템플릿 이름</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].templateMessageType</span></td>
<td>템플릿 메시지 유형 <br />(BA:기본형(default), EX:부가정보형, AD:광고추가형, MI:복합형)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].templateEmphasizeType</span></td>
<td>템플릿 강조 유형 <br />(NONE: 선택안함, TEXT: 강조표기형, IMAGE: 이미지형,
ITEM_LIST: 아이템리스트형)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].templateContent</span></td>
<td>템플릿 내용</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].templateExtra</span></td>
<td>부가정보</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].templateAd</span></td>
<td>광고성 메시지</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].templateImageName</span></td>
<td>템플릿 이미지 파일명</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].templateImageUrl</span></td>
<td>템플릿 이미지 링크</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].templateTitle</span></td>
<td>템플릿 내용 중 강조 표기할 핵심 정보</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].templateSubtitle</span></td>
<td>강조 표기 보조 문구</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].templateHeader</span></td>
<td>헤더</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].categoryCode</span></td>
<td>템플릿 카테고리 코드</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].securityFlag</span></td>
<td>보안 템플릿 여부 (true:설정)</td>
<td>Boolean</td>
</tr>
<tr>
<td><span class="font_b">[data].inspectionStatus</span></td>
<td>검수 상태 (REG: 등록, REQ: 검수요청, REJ: 반려, APR: 승인)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].createdAt</span></td>
<td>생성일</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].modifiedAt</span></td>
<td>수정일</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].status</span></td>
<td>템플릿 상태(D:중지, A:정상, R:대기(발송전))</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].block</span></td>
<td>템플릿 차단 여부 (true:차단, false: 해제)</td>
<td>Boolean</td>
</tr>
<tr>
<td><span class="font_b">[data].dormant</span></td>
<td>템플릿 휴면 여부 (true:휴면, false: 해제)</td>
<td>Boolean</td>
</tr>
<tr>
<td><span class="font_b">[data].templateItemHighlight</span></td>
<td>아이템 하이라이트</td>
<td>Object</td>
</tr>
<tr>
<td><span class="font_b">[data].templateItemHighlight.title</span></td>
<td>타이틀</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].templateItemHighlight.description</span></td>
<td>상세 설명</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].templateItemHighlight.imageUrl</span></td>
<td>썸네일 이미지 주소</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].templateItem</span></td>
<td>아이템 정보</td>
<td>Object</td>
</tr>
<tr>
<td><span class="font_b">[data].templateItem.list[]</span></td>
<td>아이템 리스트</td>
<td>Array</td>
</tr>
<tr>
<td><span class="font_b">[data].templateItem.list[].title</span></td>
<td>타이틀</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].templateItem.list[].description</span></td>
<td>디스크립션</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].templateItem.summary</span></td>
<td>아이템 요약 정보</td>
<td>Object</td>
</tr>
<tr>
<td><span class="font_b">[data].templateItem.summary.title</span></td>
<td>타이틀</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].templateItem.summary.description</span></td>
<td>디스크립션</td>
<td>String</td>
</tr>
<!-- buttons -->
<tr>
<td><span class="font_b">[data].buttons[]</span></td>
<td>버튼 정보</td>
<td>Array</td>
</tr>
<tr>
<td><span class="font_b">[data].buttons[].name</span></td>
<td>버튼명</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].buttons[].linkType</span></td>
<td>버튼 링크타입 (DS:배송조회, WL:웹링크, AL:앱링크, BK:봇키워드, MD: 메시지전달, AC:
채널추가, BC: 상담톡전환, BT: 봇전환, P1: 이미지 보안전송 플러그인, P2: 개인정보이용 플러그인, P3:
원클릭 결제 플러그인)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].buttons[].linkAnd</span></td>
<td>Android 앱 링크 주소</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].buttons[].linkIos</span></td>
<td>IOS 앱 링크 주소</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].buttons[].linkMo</span></td>
<td>모바일 웹 링크 주소</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].buttons[].linkPc</span></td>
<td>PC 웹 링크 주소</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].buttons[].pluginId</span></td>
<td>플러그인 ID</td>
<td>String</td>
</tr>
<!-- quickReplies -->
<tr>
<td><span class="font_b">[data].quickReplies[]</span></td>
<td>바로연결 정보</td>
<td>Array</td>
</tr>
<tr>
<td><span class="font_b">[data].quickReplies[].name</span></td>
<td>바로연결명</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].quickReplies[].linkType</span></td>
<td>바로연결 링크타입 (WL:웹링크, AL:앱링크, BK:봇키워드, MD: 메시지전달, BC: 상담톡전환,
BT: 봇전환)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].quickReplies[].linkAnd</span></td>
<td>Android 앱 링크 주소</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].quickReplies[].linkIos</span></td>
<td>IOS 앱 링크 주소</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].quickReplies[].linkMo</span></td>
<td>모바일 웹 링크 주소</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].quickReplies[].linkPc</span></td>
<td>PC 웹 링크 주소</td>
<td>String</td>
</tr>
<!-- comments -->
<tr>
<td><span class="font_b">[data].comments[]</span></td>
<td>댓글 목록</td>
<td>Array</td>
</tr>
<tr>
<td><span class="font_b">[data].comments[].content</span></td>
<td>댓글 본문</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].comments[].createdAt</span></td>
<td>댓글 생성일</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].comments[].status</span></td>
<td>댓글 상태 (REQ:등록, INQ:문의, APR:승인, REJ:반려, REP:답변)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].comments[].userName</span></td>
<td>댓글 작성자</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].comments[].attachment</span></td>
<td>첨부파일</td>
<td>Array</td>
</tr>
<!-- attachment 내부 -->
<tr>
<td><span class="font_b">[data].comments[].attachment[]</span></td>
<td>첨부파일</td>
<td>Array</td>
</tr>
<tr>
<td><span class="font_b">[data].comments[].attachment[].originalFileName</span></td>
<td>업로드한 파일 이름</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].comments[].attachment[].filePath</span></td>
<td>파일 다운로드 경로</td>
<td>String</td>
</tr>
</tbody>
</table>
<div class="table_info">
<p>※ JSON 객체로 응답합니다.</p>
</div>
</div>
<div class="box">
<div class="title_t1">
<span class="ex">[Example]</span><span class="ex_success">O 성공
예시</span>
</div>
<div class="code_view">
<p>&#65371;</p>
<div class="indent">
<p>
<span>"resultCode"</span>:"0"
</p>
<p>
,<span>"data"</span>:&#65339;
</p>
<p>&#65371;</p>
<div class="indent_t1">
<p>
<span>"templateCode"</span>: "bizp_20250314105XXXXXXXXXXXXXXX"
</p>
<p>
,<span>"templateName"</span>: "템플릿 명"
</p>
<p>
,<span>"templateMessageType"</span>: "BA"
</p>
<p>
,<span>"templateEmphasizeType"</span>: "TEXT"
</p>
<p>
,<span>"templateContent"</span>: "템플릿 내용 예시"
</p>
<p>
,<span>"templateExtra"</span>: "부가정보"
</p>
<p>
,<span>"templateAd"</span>: "광고성 문구"
</p>
<p>
,<span>"templateImageName"</span>: "template.jpg"
</p>
<p>
,<span>"templateImageUrl"</span>:
"https://cdn.example.com/image.jpg"
</p>
<p>
,<span>"templateTitle"</span>: "강조 제목"
</p>
<p>
,<span>"templateSubtitle"</span>: "보조 문구"
</p>
<p>
,<span>"templateHeader"</span>: "템플릿 헤더"
</p>
<p>
,<span>"categoryCode"</span>: "005001"
</p>
<p>
,<span>"securityFlag"</span>: true
</p>
<p>
,<span>"inspectionStatus"</span>: "REG"
</p>
<p>
,<span>"createdAt"</span>: "2025-06-30 10:30:00"
</p>
<p>
,<span>"modifiedAt"</span>: "2025-07-01 11:00:00"
</p>
<p>
,<span>"status"</span>: "A"
</p>
<p>
,<span>"block"</span>: false
</p>
<p>
,<span>"dormant"</span>: false
</p>
<!-- templateItemHighlight -->
<p>
,<span>"templateItemHighlight"</span>: {
</p>
<div class="indent_t2">
<p>
<span>"title"</span>: "하이라이트 제목"
</p>
<p>
,<span>"description"</span>: "하이라이트 설명"
</p>
<p>
,<span>"imageUrl"</span>: "https://cdn.example.com/thumb.jpg"
</p>
</div>
<p>}</p>
<!-- templateItem -->
<p>
,<span>"templateItem"</span>: {
</p>
<div class="indent_t2">
<p>
<span>"list"</span>: [
</p>
<div class="indent_t3">
<p>&#65371;</p>
<p>
<span>"title"</span>: "아이템 제목"
</p>
<p>
,<span>"description"</span>: "아이템 설명"
</p>
<p>&#65373;</p>
</div>
<p>],</p>
<p>
<span>"summary"</span>: {
</p>
<div class="indent_t3">
<p>
<span>"title"</span>: "요약 제목"
</p>
<p>
,<span>"description"</span>: "요약 설명"
</p>
</div>
<p>}</p>
</div>
<p>}</p>
<!-- buttons -->
<p>
,<span>"buttons"</span>: [
</p>
<div class="indent_t2">
<p>&#65371;</p>
<p>
<span>"name"</span>: "버튼명"
</p>
<p>
,<span>"linkType"</span>: "WL"
</p>
<p>
,<span>"linkAnd"</span>: "https://aos.example.com"
</p>
<p>
,<span>"linkIos"</span>: "https://ios.example.com"
</p>
<p>
,<span>"linkMo"</span>: "https://m.example.com"
</p>
<p>
,<span>"linkPc"</span>: "https://www.example.com"
</p>
<p>
,<span>"pluginId"</span>: "plugin123"
</p>
<p>&#65373;</p>
</div>
<p>]</p>
<!-- quickReplies -->
<p>
,<span>"quickReplies"</span>: [
</p>
<div class="indent_t2">
<p>&#65371;</p>
<p>
<span>"name"</span>: "빠른응답"
</p>
<p>
,<span>"linkType"</span>: "WL"
</p>
<p>
,<span>"linkAnd"</span>: "https://aos.quick.com"
</p>
<p>
,<span>"linkIos"</span>: "https://ios.quick.com"
</p>
<p>
,<span>"linkMo"</span>: "https://m.quick.com"
</p>
<p>
,<span>"linkPc"</span>: "https://www.quick.com"
</p>
<p>&#65373;</p>
</div>
<p>]</p>
<!-- comments -->
<p>
,<span>"comments"</span>: [
</p>
<div class="indent_t2">
<p>&#65371;</p>
<p>
<span>"content"</span>: "댓글 예시입니다."
</p>
<p>
,<span>"createdAt"</span>: "2025-07-01 10:00:00"
</p>
<p>
,<span>"status"</span>: "REQ"
</p>
<p>
,<span>"userName"</span>: "관리자"
</p>
<p>
,<span>"attachment"</span>: [
</p>
<div class="indent_t3">
<p>&#65371;</p>
<p>
<span>"originalFileName"</span>: "example.pdf"
</p>
<p>
,<span>"filePath"</span>: "/download/example.pdf"
</p>
<p>&#65373;</p>
</div>
<p>]</p>
<p>&#65373;</p>
</div>
<p>]</p>
</div>
<p class="l_code_t2">&#65373;</p>
<p>&#65341;</p>
</div>
<p class="l_code">&#65373;</p>
</div>
</div>
<div class="box">
<div class="title_t1">
<span class="ex">[Example]</span><span class="ex_fail">X 실패 예시</span>
</div>
<div class="code_view">
<p>&#65371;</p>
<div class="indent">
<p>
<span>"resultCode"</span>:"4099"
</p>
<p>
,<span>"data"</span>:"기타 시스템 오류"
</p>
</div>
<p class="l_code">&#65373;</p>
</div>
</div>
<!--// Response-->
</div>

View File

@ -0,0 +1,307 @@
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<ul class="info">
<li>- API를 통해서 알림톡을 발송할 수 있습니다.</li>
<li>- 사전에 등록된 SenderKey 및 승인된 템플릿을 사용해야 합니다.</li>
<li>- 대체문자(subMsgTxt) 발송 여부는 subMsgSendYn으로 제어합니다.</li>
</ul>
<div class="re_cont">
<!-- Request -->
<div class="req_title">Request</div>
<div class="box">
<div class="text">
<h4>Request</h4>
<table>
<caption>API Request Http Method, 프로토콜, HOST, Service Port, Endpoint 정보 테이블</caption>
<colgroup>
<col style="width:20%;">
<col style="width:80%;">
</colgroup>
<tr>
<th>Http Method</th>
<td>POST</td>
</tr>
<tr>
<th>프로토콜</th>
<td>HTTPS/1.1</td>
</tr>
<tr>
<th>HOST</th>
<td>api.munjaon.co.kr</td>
</tr>
<tr>
<th>Service Port</th>
<td>443</td>
</tr>
<tr>
<th>Endpoint</th>
<td>/api/kakao/at/sendMsg</td>
</tr>
</table>
</div>
</div>
<div class="type_table">
<table>
<caption>알림톡 발송 API Request 키 종류 및 설명, 타입, 필수 여부 테이블</caption>
<colgroup>
<col style="width:20%;">
<col style="width:45%;">
<col style="width:25%">
<col style="width:10%">
</colgroup>
<thead>
<tr>
<th>키</th>
<th>설명</th>
<th>타입</th>
<th>필수</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="font_b">mberId</span></td>
<td>사용자 ID</td>
<td>String</td>
<td><span class="select_o">O</span></td>
</tr>
<tr>
<td><span class="font_b">accessKey</span></td>
<td>인증용 API Key</td>
<td>String</td>
<td><span class="select_o">O</span></td>
</tr>
<tr>
<td><span class="font_b">senderKey</span></td>
<td>발신 프로필 SenderKey</td>
<td>String</td>
<td><span class="select_o">O</span></td>
</tr>
<tr>
<td><span class="font_b">templateCode</span></td>
<td>알림톡 템플릿 코드</td>
<td>String</td>
<td><span class="select_o">O</span></td>
</tr>
<tr>
<td><span class="font_b">callFrom</span></td>
<td>발신자 번호</td>
<td>String</td>
<td><span class="select_o">O</span></td>
</tr>
<tr>
<td><span class="font_b">callTo_[i]</span></td>
<td>수신자 번호(다건 가능)</td>
<td>String</td>
<td><span class="select_o">O</span></td>
</tr>
<tr>
<td><span class="font_b">templateTitle_[i]</span></td>
<td>치환용 템플릿 타이틀</td>
<td>String</td>
<td><span class="select_x">X</span></td>
</tr>
<tr>
<td><span class="font_b">templateContent_[i]</span></td>
<td>치환용 템플릿 내용</td>
<td>String</td>
<td><span class="select_o">O</span></td>
</tr>
<tr>
<td><span class="font_b">subMsgSendYn</span></td>
<td>대체문자 발송 여부 (Y: 발송, N: 미발송)</td>
<td>String</td>
<td><span class="select_x">X</span></td>
</tr>
<tr>
<td><span class="font_b">subMsgTxt_[i]</span></td>
<td>대체문자 내용</td>
<td>String</td>
<td><span class="select_x">X</span></td>
</tr>
<tr>
<td><span class="font_b">test_yn</span></td>
<td>테스트 데이터 여부 (YS: 성공 테스트, YF: 실패 테스트)</td>
<td>String</td>
<td><span class="select_x">X</span></td>
</tr>
</tbody>
</table>
<div class="table_info">
<p>※ HTTPS 프로토콜을 사용하여 POST로 요청합니다.</p>
<p>※ Content-Type: application/json</p>
</div>
</div>
<div class="box">
<div class="title">[Example]</div>
<div class="code_view">
<pre>
<code class="language-json">
{
"mberId": "홍길동",
"accessKey": "XXXXXXXXXXXXXX414050694b953",
"senderKey": "XXXXXXXXXXXXXX669143473b1af",
"templateCode": "bizp_2025031410525XXXXXXXXXXXXX",
"callFrom": "010-9341-4986",
"callTo_1": "01000000000",
"callTo_2": "01011111111",
"templateTitle_1": "타이틀 테스트2222",
"templateTitle_2": "타이틀 테스트2111",
"templateContent_1": "테스트 홍길동\\n템플릿 내용",
"templateContent_2": "테스트 홍길동2\\n템플릿 내용",
"subMsgSendYn": "Y",
"subMsgTxt_1": "대체문자 발송",
"subMsgTxt_2": "대체문자 발송2",
"test_yn": ""
}
</code>
</pre>
</div>
</div>
<!-- // Request -->
<!-- Response -->
<div class="res_title">Response</div>
<div class="type_table">
<table>
<caption>알림톡 발송 API Response 키 종류 및 설명, 타입 테이블</caption>
<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>
<td><span class="font_b">resultCode</span></td>
<td>성공 여부("0" 이외는 실패)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">data</span></td>
<td>발송 결과 객체</td>
<td>Object</td>
</tr>
<tr>
<td><span class="font_b">[data].resultCode</span></td>
<td>성공 여부("0" 이외는 실패)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].msgGroupId</span></td>
<td>메시지 그룹 ID</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].successCnt</span></td>
<td>성공 건수</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].blockCnt</span></td>
<td>수신거부 건수</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].failCnt</span></td>
<td>전송 실패 건수</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].msgType</span></td>
<td>메시지 타입(AT: 알림톡)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].test_yn</span></td>
<td>테스트 여부</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">localDateTime</span></td>
<td>서버 처리 일시(ISO-8601)</td>
<td>String</td>
</tr>
</tbody>
</table>
<div class="table_info">
<p>※ JSON 객체로 응답합니다.</p>
</div>
</div>
<div class="box">
<div class="title_t1"><span class="ex">[Example]</span><span class="ex_success">O 성공 예시</span></div>
<div class="code_view">
<pre>
<code class="language-json">
{
"resultCode": "0",
"data": {
"resultCode": "0",
"msgGroupId": "MSGGID_AT_1757467849001",
"successCnt": "2",
"blockCnt": "0",
"failCnt": "0",
"msgType": "AT",
"test_yn": ""
},
"localDateTime": "2025-09-10T10:30:49.001636"
}
</code>
</pre>
</div>
</div>
<div class="box">
<div class="title_t1"><span class="ex">[Example]</span><span class="ex_fail">X 실패 예시</span></div>
<div class="code_view">
<pre><code class="language-json">
{
"resultCode": "2080",
"data": "친구톡은 20시 50분부터 익일 08시까지 발송이 제한됩니다."
}
</code></pre>
</div>
</div>
<!-- // Response -->
</div>
<!--// Response-->
</div>

View File

@ -0,0 +1,433 @@
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<ul class="info">
<li>- 문자온 사이트 및 API를 통해 전송된 발송내역을 조회할 수 있습니다.</li>
<li>- 문자 발송내역은 날짜별로 조회되며, 최근 3개월까지만 조회 가능합니다.</li>
<li>- 발신번호별 문자 발송내역 조회 기능은 제공되지 않습니다.</li>
</ul>
<div class="re_cont">
<!--Request-->
<div class="req_title">Request</div>
<div class="box">
<div class="text">
<h4>Request</h4>
<table>
<caption>API Request Http Method, 프로토콜, HOST, Service Port 정보 테이블</caption>
<colgroup>
<col style="width:20%;">
<col style="width:80%;">
</colgroup>
<tr>
<th>Http Method</th>
<td>POST</td>
</tr>
<tr>
<th>프로토콜</th>
<td>HTTPS/1.1</td>
</tr>
<tr>
<th>HOST</th>
<td>api.munjaon.co.kr</td>
</tr>
<tr>
<th>Service Port</th>
<td>443</td>
</tr>
<tr>
<th>Endpoint</th>
<td>/api/inqry/hstry</td>
</tr>
</table>
</div>
</div>
<div class="type_table">
<table>
<caption>전송결과 조회 API Request 키 종류 및 설명, 타입, 필수 여부 테이블</caption>
<colgroup>
<col style="width:20%;">
<col style="width:45%;">
<col style="width:25%">
<col style="width:10%">
</colgroup>
<thead>
<tr>
<th>키</th>
<th>설명</th>
<th>타입</th>
<th>필수</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="font_b">mberId</span></td>
<td>사용자 ID</td>
<td>String</td>
<td><span class="select_o">O</span></td>
</tr>
<tr>
<td><span class="font_b">accessKey</span></td>
<td>인증용 API Key</td>
<td>String</td>
<td><span class="select_o">O</span></td>
</tr>
<tr>
<td><span class="font_b">page</span></td>
<td>페이지 번호(미입력 시 1)</td>
<td>String</td>
<td><span class="select_x">X</span></td>
</tr>
<tr>
<td><span class="font_b">pageSize</span></td>
<td>페이지당 출력 개수(미입력 시 기본값 적용)</td>
<td>String</td>
<td><span class="select_x">X</span></td>
</tr>
<tr>
<td><span class="font_b">startDate</span></td>
<td>시작 일자(yyyyMMdd)</td>
<td>String</td>
<td><span class="select_x">X</span></td>
</tr>
<tr>
<td><span class="font_b">endDate</span></td>
<td>마감 일자(yyyyMMdd)</td>
<td>String</td>
<td><span class="select_x">X</span></td>
</tr>
<tr>
<td><span class="font_b">test_yn</span></td>
<td>테스트 데이터 여부</td>
<td>String</td>
<td><span class="select_x">X</span></td>
</tr>
</tbody>
</table>
<div class="table_info">
<p>※ HTTPS 프로토콜을 사용하여 POST로 요청합니다.</p>
<p>※ Content-Type: application/json</p>
</div>
</div>
<div class="box">
<div class="title">[Example]</div>
<div class="code_view">
<pre>
<code class="language-json">
{
"mberId": "홍길동",
"accessKey": "XXXXXXXXXXXXXX414050694b953",
"page": "",
"pageSize": "",
"startDate": "",
"endDate": "",
"test_yn": ""
}
</code>
</pre>
</div>
</div>
<!--// Request-->
<!-- Response-->
<div class="res_title">Response</div>
<div class="type_table">
<table>
<caption>전송결과 조회 API Response 키 종류 및 설명, 타입 테이블</caption>
<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>
<td><span class="font_b">resultCode</span></td>
<td>성공 여부("0" 아니면 실패)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">data</span></td>
<td>결과값 객체(성공 : 데이터, 실패 : 메시지)</td>
<td>Object | String</td>
</tr>
<tr>
<td><span class="font_b">[data].message</span></td>
<td>메시지(필요 시)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].next_yn</span></td>
<td>다음 페이지 여부(Y/N)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList</span></td>
<td>결과값 목록</td>
<td>Array&lt;Object&gt;</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].msgGroupId</span></td>
<td>메시지 그룹 ID</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].msgId</span></td>
<td>메시지 ID</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].msgTypeName</span></td>
<td>문자 구분명(단문, 장문, 그림)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].msgType</span></td>
<td>메시지 타입(4: 단문, 5: 장문, 6: 그림)</td>
<td>String | Number</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].callFrom</span></td>
<td>발신자 번호</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].callTo</span></td>
<td>수신자 번호</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].msgGroupCnt</span></td>
<td>발송 건수</td>
<td>String | Number</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].scnt</span></td>
<td>성공 건수</td>
<td>String | Number</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].fcnt</span></td>
<td>실패 건수</td>
<td>String | Number</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].wcnt</span></td>
<td>대기 건수</td>
<td>String | Number</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].msgResult</span></td>
<td>발송 결과(성공: S, 실패: F)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].smsTxt</span></td>
<td>문자 내용</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].subject</span></td>
<td>제목</td>
<td>String | null</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].reqdate</span></td>
<td>발송 일자(YYYY-MM-DD HH:mm:ss)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].curState</span></td>
<td>전송 처리 결과값</td>
<td>String | Number</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].userId</span></td>
<td>사용자 ID</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].regdate</span></td>
<td>등록 일자(YYYY-MM-DD HH:mm:ss)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].reserveCYn</span></td>
<td>예약 취소 여부(Y/N)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].ttlCnt</span></td>
<td>전체 요청 수</td>
<td>String | Number</td>
</tr>
<tr>
<td><span class="font_b">[data].remainMsgCnt</span></td>
<td>남은 문자 건수</td>
<td>String | Number</td>
</tr>
<tr>
<td><span class="font_b">[data].totMsgCnt</span></td>
<td>전체 문자 개수</td>
<td>String | Number</td>
</tr>
</tbody>
</table>
<div class="table_info">
<p>※ JSON 객체로 응답합니다.</p>
</div>
</div>
<div class="box">
<div class="title_t1"><span class="ex">[Example]</span><span class="ex_success">O 성공 예시</span></div>
<div class="code_view">
<pre>
<code class="language-json">
{
"resultCode": "0",
"data": {
"resultCode": "0",
"message": null,
"next_yn": "n",
"msgGroupId": "MSGGID_0000000000000",
"objectList": [
{
"msgTypeName": "단문(SMS)",
"msgType": "4",
"callFrom": "01011112222",
"callTo": "01011112223",
"msgGroupCnt": "2",
"msgGroupId": "MSGGID_0000000013340",
"msgId": "MSGID_0000000000001",
"scnt": "2",
"fcnt": "0",
"wcnt": "0",
"msgResult": "S",
"smsTxt": "문자 내용 단문 예제",
"subject": null,
"reqdate": "2023-06-13 17:48:07",
"curState": "3",
"userId": "testuser",
"regdate": "2023-06-13 17:48:07",
"reserveCYn": "N",
"ttlCnt": "1",
"remainMsgCnt": "40",
"totMsgCnt": "70"
},
{
"msgTypeName": "장문(LMS)",
"msgType": "5",
"callFrom": "01011112222",
"callTo": "01011112223",
"msgGroupCnt": "1",
"msgGroupId": "MSGGID_0000000013341",
"msgId": "MSGID_0000000000002",
"scnt": "1",
"fcnt": "0",
"wcnt": "0",
"msgResult": "S",
"smsTxt": "문자 내용 장문 예제",
"subject": null,
"reqdate": "2023-06-02 11:46:50",
"curState": "3",
"userId": "testuser",
"regdate": "2023-06-02 11:46:49",
"reserveCYn": "N",
"ttlCnt": "1",
"remainMsgCnt": "40",
"totMsgCnt": "70"
}
]
}
}
</code>
</pre>
</div>
</div>
<div class="box">
<div class="title_t1"><span class="ex">[Example]</span><span class="ex_fail">X 실패 예시</span></div>
<div class="code_view">
<pre>
<code class="language-json">
{
"resultCode": "3099",
"data": "기타 시스템 오류"
}
</code>
</pre>
</div>
</div>
<!--// Response-->
</div>

View File

@ -0,0 +1,342 @@
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<ul class="info">
<li>- API를 통해서 메시지 그룹 ID 기준의 상세 이력(개별 건) 목록을 조회할 수 있습니다.</li>
</ul>
<div class="re_cont">
<!-- Request -->
<div class="req_title">Request</div>
<div class="box">
<div class="text">
<h4>Request</h4>
<table>
<caption>API Request Http Method, 프로토콜, HOST, Service Port, Endpoint 정보 테이블</caption>
<colgroup>
<col style="width:20%;">
<col style="width:80%;">
</colgroup>
<tr>
<th>Http Method</th>
<td>POST</td>
</tr>
<tr>
<th>프로토콜</th>
<td>HTTPS/1.1</td>
</tr>
<tr>
<th>HOST</th>
<td>api.munjaon.co.kr</td>
</tr>
<tr>
<th>Service Port</th>
<td>443</td>
</tr>
<tr>
<th>Endpoint</th>
<td>/api/inqry/hstryDetail</td>
</tr>
</table>
</div>
</div>
<div class="type_table">
<table>
<caption>히스토리 상세 조회 API Request 키 종류 및 설명, 타입, 필수 여부 테이블</caption>
<colgroup>
<col style="width:20%;">
<col style="width:45%;">
<col style="width:25%">
<col style="width:10%">
</colgroup>
<thead>
<tr>
<th>키</th>
<th>설명</th>
<th>타입</th>
<th>필수</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="font_b">mberId</span></td>
<td>사용자 ID</td>
<td>String</td>
<td><span class="select_o">O</span></td>
</tr>
<tr>
<td><span class="font_b">accessKey</span></td>
<td>인증용 API Key</td>
<td>String</td>
<td><span class="select_o">O</span></td>
</tr>
<tr>
<td><span class="font_b">msgGroupId</span></td>
<td>메시지 그룹 ID</td>
<td>String</td>
<td><span class="select_o">O</span></td>
</tr>
</tbody>
</table>
<div class="table_info">
<p>※ HTTPS 프로토콜을 사용하여 POST로 요청합니다.</p>
<p>※ Content-Type: application/json</p>
</div>
</div>
<div class="box">
<div class="title">[Example]</div>
<div class="code_view">
<pre>
<code class="language-json">
{
"mberId": "홍길동",
"accessKey": "XXXXXXXXXXXXXX414050694b953",
"msgGroupId": "MSGGID_XXXXXXX0000063"
}
</code>
</pre>
</div>
</div>
<!-- // Request -->
<!-- Response -->
<div class="res_title">Response</div>
<div class="type_table">
<table>
<caption>히스토리 상세 조회 API Response 키 종류 및 설명, 타입 테이블</caption>
<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>
<td><span class="font_b">resultCode</span></td>
<td>성공 여부("0" 이외는 실패)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">data</span></td>
<td>조회 결과 객체</td>
<td>Object</td>
</tr>
<tr>
<td><span class="font_b">[data].resultCode</span></td>
<td>내부 처리 결과(0: 성공)</td>
<td>Number | String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList</span></td>
<td>개별 메시지 상세 목록</td>
<td>Array&lt;Object&gt;</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].msgGroupId</span></td>
<td>메시지 그룹 ID</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].msgId</span></td>
<td>개별 메시지 ID</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].totMsgCnt</span></td>
<td>총 발송 건수(그룹 기준)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].msgType</span></td>
<td>메시지 타입 코드(예: 8=AT)</td>
<td>Number</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].msgTypeName</span></td>
<td>메시지 타입명</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].msgResult</span></td>
<td>결과(F: 실패, S: 성공 등)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].msgGroupCnt</span></td>
<td>발송 건수</td>
<td>Number</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].smsTxt</span></td>
<td>메시지 내용</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].callFrom</span></td>
<td>발신 번호</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].callTo</span></td>
<td>수신 번호</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].curState</span></td>
<td>현재 상태 코드</td>
<td>Number</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].remainMsgCnt</span></td>
<td>잔여 처리 건수</td>
<td>Number</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].reqdate</span></td>
<td>요청 일시(YYYY-MM-DD HH:mm:ss)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].regdate</span></td>
<td>등록 일시(YYYY-MM-DD HH:mm:ss)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].reserveCYn</span></td>
<td>예약 취소 여부(Y/N)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">localDateTime</span></td>
<td>서버 처리 일시(ISO-8601)</td>
<td>String</td>
</tr>
</tbody>
</table>
<div class="table_info">
<p>※ JSON 객체로 응답합니다.</p>
</div>
</div>
<div class="box">
<div class="title_t1"><span class="ex">[Example]</span><span class="ex_success">O 성공 예시</span></div>
<div class="code_view">
<pre>
<code class="language-json">
{
"resultCode": "0",
"data": {
"resultCode": 0,
"objectList": [
{
"msgGroupId": "MSGGID_XXXXXXX0000063",
"msgId": "MSGCID_XXXXXXX00001180",
"totMsgCnt": "9",
"msgType": 8,
"msgTypeName": "알림톡(AT)",
"msgResult": "F",
"msgGroupCnt": 1,
"smsTxt": "test",
"callFrom": "01093414986",
"callTo": "01059941669",
"curState": 3,
"remainMsgCnt": 0,
"reqdate": "2025-09-05 11:45:45",
"regdate": "2025-09-05 11:45:45",
"reserveCYn": "N"
},
{
"msgGroupId": "MSGGID_XXXXXXX0000063",
"msgId": "MSGCID_XXXXXXX000001175",
"totMsgCnt": "9",
"msgType": 9,
"msgTypeName": "친구톡(AT)",
"msgResult": "F",
"msgGroupCnt": 1,
"smsTxt": "test",
"callFrom": "01093414986",
"callTo": "01098969885",
"curState": 3,
"remainMsgCnt": 0,
"reqdate": "2025-09-05 11:45:45",
"regdate": "2025-09-05 11:45:45",
"reserveCYn": "N"
},
]
},
"localDateTime": "2025-09-16T10:47:20.4014362"
}
</code>
</pre>
</div>
</div>
<div class="box">
<div class="title_t1"><span class="ex">[Example]</span><span class="ex_fail">X 실패 예시</span></div>
<div class="code_view">
<pre><code class="language-json">
{
"resultCode": "4099",
"data": "기타 시스템 오류"
}
</code></pre>
</div>
</div>
<!-- // Response -->
</div>
<!--// Response-->

View File

@ -0,0 +1,303 @@
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<ul class="info">
<li>- 보유캐시로 발송 가능한 문자의 건수를 단문(SMS), 장문(LMS), 그림(MMS), 알림톡(AT), 친구톡(FT)별로 각각 확인할 수 있습니다.</li>
<!-- <li>- 위 문자유형별 발송 가능건수는 개인별로 적용된 단가를 기준으로 산출되며, "첫 결제 이벤트"는 적용되지 않습니다.</li> -->
</ul>
<div class="re_cont">
<!-- Request -->
<div class="req_title">Request</div>
<div class="box">
<div class="text">
<h4>Request</h4>
<table>
<caption>API Request Http Method, 프로토콜, HOST, Service Port, Endpoint 정보 테이블</caption>
<colgroup>
<col style="width:20%;">
<col style="width:80%;">
</colgroup>
<tr>
<th>Http Method</th>
<td>POST</td>
</tr>
<tr>
<th>프로토콜</th>
<td>HTTPS/1.1</td>
</tr>
<tr>
<th>HOST</th>
<td>api.munjaon.co.kr</td>
</tr>
<tr>
<th>Service Port</th>
<td>443</td>
</tr>
<tr>
<th>Endpoint</th>
<td>/api/inqry/price</td>
</tr>
</table>
</div>
</div>
<div class="type_table">
<table>
<caption>가격/가능건수 조회 API Request 키 종류 및 설명, 타입, 필수 여부 테이블</caption>
<colgroup>
<col style="width:20%;">
<col style="width:45%;">
<col style="width:25%">
<col style="width:10%">
</colgroup>
<thead>
<tr>
<th>키</th>
<th>설명</th>
<th>타입</th>
<th>필수</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="font_b">mberId</span></td>
<td>사용자 ID</td>
<td>String</td>
<td><span class="select_o">O</span></td>
</tr>
<tr>
<td><span class="font_b">accessKey</span></td>
<td>인증용 API Key</td>
<td>String</td>
<td><span class="select_o">O</span></td>
</tr>
</tbody>
</table>
<div class="table_info">
<p>※ HTTPS 프로토콜을 사용하여 POST로 요청합니다.</p>
<p>※ Content-Type: application/json</p>
</div>
</div>
<div class="box">
<div class="title">[Example]</div>
<div class="code_view">
<pre>
<code class="language-json">
{
"mberId": "홍길동",
"accessKey": "XXXXXXXXXXXXXX414050694b953"
}
</code>
</pre>
</div>
</div>
<!-- // Request -->
<!-- Response -->
<div class="res_title">Response</div>
<div class="type_table">
<table>
<caption>가격/가능건수 조회 API Response 키 종류 및 설명, 타입 테이블</caption>
<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>
<td><span class="font_b">resultCode</span></td>
<td>성공 여부("0" 이외는 실패)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">data</span></td>
<td>조회 결과 객체(성공 시 가격/가능건수 정보)</td>
<td>Object | String</td>
</tr>
<tr>
<td><span class="font_b">[data].resultCode</span></td>
<td>내부 처리 결과("0": 성공)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].message</span></td>
<td>메시지(필요 시)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].localDateTime</span></td>
<td>서버 처리 일시(ISO-8601)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].shortPrice</span></td>
<td>단문(SMS) 단가</td>
<td>Number</td>
</tr>
<tr>
<td><span class="font_b">[data].longPrice</span></td>
<td>장문(LMS) 단가</td>
<td>Number</td>
</tr>
<tr>
<td><span class="font_b">[data].picturePrice</span></td>
<td>사진(MMS) 단가</td>
<td>Number</td>
</tr>
<tr>
<td><span class="font_b">[data].kakaoAtPrice</span></td>
<td>카카오 알림톡 단가</td>
<td>Number</td>
</tr>
<tr>
<td><span class="font_b">[data].kakaoFtPrice</span></td>
<td>카카오 친구톡(텍스트) 단가</td>
<td>Number</td>
</tr>
<tr>
<td><span class="font_b">[data].kakaoFtImgPrice</span></td>
<td>카카오 친구톡(이미지) 단가</td>
<td>Number</td>
</tr>
<tr>
<td><span class="font_b">[data].kakaoFtWideImgPrice</span></td>
<td>카카오 친구톡(와이드 이미지) 단가</td>
<td>Number</td>
</tr>
<tr>
<td><span class="font_b">[data].mberMoney</span></td>
<td>회원 보유 금액</td>
<td>Number</td>
</tr>
<tr>
<td><span class="font_b">[data].shortSendPsbltEa</span></td>
<td>단문 발송 가능 건수</td>
<td>Number</td>
</tr>
<tr>
<td><span class="font_b">[data].longSendPsbltEa</span></td>
<td>장문 발송 가능 건수</td>
<td>Number</td>
</tr>
<tr>
<td><span class="font_b">[data].pictureSendPsbltEa</span></td>
<td>사진 발송 가능 건수</td>
<td>Number</td>
</tr>
<tr>
<td><span class="font_b">[data].kakaoAtSendPsbltEa</span></td>
<td>알림톡 발송 가능 건수</td>
<td>Number</td>
</tr>
<tr>
<td><span class="font_b">[data].kakaoFtSendPsbltEa</span></td>
<td>친구톡(텍스트) 발송 가능 건수</td>
<td>Number</td>
</tr>
<tr>
<td><span class="font_b">[data].kakaoFtImgSendPsbltEa</span></td>
<td>친구톡(이미지) 발송 가능 건수</td>
<td>Number</td>
</tr>
<tr>
<td><span class="font_b">[data].kakaoFtWideImgSendPsbltEa</span></td>
<td>친구톡(와이드 이미지) 발송 가능 건수</td>
<td>Number</td>
</tr>
<tr>
<td><span class="font_b">localDateTime</span></td>
<td>서버 처리 일시(ISO-8601)</td>
<td>String</td>
</tr>
</tbody>
</table>
<div class="table_info">
<p>※ JSON 객체로 응답합니다.</p>
</div>
</div>
<div class="box">
<div class="title_t1"><span class="ex">[Example]</span><span class="ex_success">O 성공 예시</span></div>
<div class="code_view">
<pre>
<code class="language-json">
{
"resultCode": "0",
"data": {
"resultCode": "0",
"message": "",
"localDateTime": "2025-09-16T11:06:40.2556646",
"shortPrice": 18.0,
"longPrice": 50.0,
"picturePrice": 90.0,
"kakaoAtPrice": 6.9,
"kakaoFtPrice": 13.8,
"kakaoFtImgPrice": 19.9,
"kakaoFtWideImgPrice": 22.9,
"mberMoney": 6549661.26,
"shortSendPsbltEa": 363870,
"longSendPsbltEa": 130993,
"pictureSendPsbltEa": 72774,
"kakaoAtSendPsbltEa": 949226,
"kakaoFtSendPsbltEa": 474613,
"kakaoFtImgSendPsbltEa": 329128,
"kakaoFtWideImgSendPsbltEa": 286011
},
"localDateTime": "2025-09-16T11:06:40.2556646"
}
</code>
</pre>
</div>
</div>
<div class="box">
<div class="title_t1"><span class="ex">[Example]</span><span class="ex_fail">X 실패 예시</span></div>
<div class="code_view">
<pre><code class="language-json">
{
"resultCode": "3099",
"data": "기타 시스템 오류"
}
</code></pre>
</div>
</div>
<!-- // Response -->
</div>
<!--// Response-->

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;
});
@ -31,268 +32,562 @@ $(document).ready(function(){
<h2>예제 다운로드</h2>
</div>
<!--예제 다운로드 내용-->
<div class="api_download">
<ul class="info">
<li>- 아래 예제(JSP, PHP)를 참고하시어 쉽고 편리하게 API를 연동할 수 있습니다.</li>
<li>- JSP, PHP 외 타 예제는 계속해서 업데이트 될 예정입니다.</li>
<div class="pay_tab_wrap">
<ul class="tabType1">
<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 class="list_tab_wrap2 type2">
<!-- tab button -->
<ul class="list_tab">
<li class="tab active"><button type="button" onclick="listTab3(this,'1');">JSP</button>
</li>
<li class="tab"><button type="button" onclick="listTab3(this,'2');">PHP</button>
</li><!--
<li class="tab"><button type="button" onclick="listTab3(this,'3');">ASP</button>
</li>
<li class="tab"><button type="button" onclick="listTab3(this,'4');">.NET</button>
</li>
<li class="tab"><button type="button" onclick="listTab3(this,'5');">AOS</button>
</li>
<li class="tab"><button type="button" onclick="listTab3(this,'6');">IOS</button>
</li>-->
</ul>
<!--// tab button -->
</div>
<!-- JSP 다운로드-->
<div class="download_cont current" id="listTab3_1">
<div class="box">
<div class="text">
<h4>JSP Example</h4>
<table>
<caption>JSP 샘플 파일 설명 테이블</caption>
<colgroup>
<col style="width:35%;">
<col style="width:65%;">
</colgroup>
<tr>
<th>jsp_example_send_msg_r1.jsp</th>
<td>문자보내기(여러명에게 동일한문자)</td>
</tr>
<tr>
<th>jsp_example_send_msgs_r1.jsp</th>
<td>문자보내기(여러명에게 다른문자)</td>
</tr>
<tr>
<th>jsp_example_hstry_r1.jsp</th>
<td>전송내역조회</td>
</tr>
<tr>
<th>jsp_example_hstry_detail_r1.jsp</th>
<td>상세전송내역조회</td>
</tr>
<tr>
<th>jsp_example_select_price_r1.jsp</th>
<td>발송가능건수</td>
</tr>
</table>
</div>
</div>
<div class="btn_area">
<button type="button" class="btnType btnType11 download_btn" data-info="jsp" onclick="return false;">JSP용 예제 다운받기</button>
</div>
</div>
<!--// JSP 다운로드-->
<!--PHP 다운로드-->
<div class="download_cont" id="listTab3_2">
<div class="box">
<div class="text">
<h4>PHP Example</h4>
<table>
<caption>PHP 샘플 파일 설명 테이블</caption>
<colgroup>
<col style="width:35%;">
<col style="width:65%;">
</colgroup>
<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>
</table>
</div>
</div>
<div class="btn_area">
<button type="button" class="btnType btnType11 download_btn" data-info="php" onclick="return false;">PHP용 예제 다운받기</button>
</div>
</div>
<!--// PHP 다운로드-->
<!--ASP 다운로드-->
<div class="download_cont" id="listTab3_3">
<div class="box">
<div class="text">
<h4>ASP Example</h4>
<table>
<caption>ASP 샘플 파일 설명 테이블</caption>
<colgroup>
<col style="width:35%;">
<col style="width:65%;">
</colgroup>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
</table>
</div>
</div>
<div class="btn_area">
<button type="button" class="btnType btnType11">ASP용 예제 다운받기</button>
</div>
</div>
<!--// ASP 다운로드-->
<!--.NET 다운로드-->
<div class="download_cont" id="listTab3_4">
<div class="box">
<div class="text">
<h4>.NET Example</h4>
<table>
<caption>.NET 샘플 파일 설명 테이블</caption>
<colgroup>
<col style="width:35%;">
<col style="width:65%;">
</colgroup>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
</table>
</div>
</div>
<div class="btn_area">
<button type="button" class="btnType btnType11">.NET용 예제 다운받기</button>
</div>
</div>
<!--// .NET 다운로드-->
<!--AOS 다운로드-->
<div class="download_cont" id="listTab3_5">
<div class="box">
<div class="text">
<h4>AOS Example</h4>
<table>
<caption>AOS 샘플 파일 설명 테이블</caption>
<colgroup>
<col style="width:35%;">
<col style="width:65%;">
</colgroup>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
</table>
</div>
</div>
<div class="btn_area">
<button type="button" class="btnType btnType11">AOS용 예제 다운받기</button>
</div>
</div>
<!--// AOS 다운로드-->
<!--IOS 다운로드-->
<div class="download_cont" id="listTab3_6">
<div class="box">
<div class="text">
<h4>IOS Example</h4>
<table>
<caption>IOS 샘플 파일 설명 테이블</caption>
<colgroup>
<col style="width:35%;">
<col style="width:65%;">
</colgroup>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
</table>
</div>
</div>
<div class="btn_area">
<button type="button" class="btnType btnType11">IOS용 예제 다운받기</button>
</div>
</div>
<!--// IOS 다운로드-->
</div>
<!--예제 다운로드 내용-->
<div class="api_guide current" id="tab5_1">
<div class="api_download">
<ul class="info">
<li>- 아래 예제(JSP, PHP)를 참고하시어 쉽고 편리하게 API를 연동할 수 있습니다.</li>
<li>- JSP, PHP 외 타 예제는 계속해서 업데이트 될 예정입니다.</li>
</ul>
<div class="list_tab_wrap2 type2">
<!-- tab button -->
<ul class="list_tab">
<li class="tab active"><button type="button" onclick="listTab3(this,'1');">JSP</button>
</li>
<li class="tab"><button type="button" onclick="listTab3(this,'2');">PHP</button>
</li><!--
<li class="tab"><button type="button" onclick="listTab3(this,'3');">ASP</button>
</li>
<li class="tab"><button type="button" onclick="listTab3(this,'4');">.NET</button>
</li>
<li class="tab"><button type="button" onclick="listTab3(this,'5');">AOS</button>
</li>
<li class="tab"><button type="button" onclick="listTab3(this,'6');">IOS</button>
</li>-->
</ul>
<!--// tab button -->
</div>
<!-- JSP 다운로드-->
<div class="download_cont current" id="listTab3_1">
<div class="box">
<div class="text">
<h4>JSP Example</h4>
<table>
<caption>JSP 샘플 파일 설명 테이블</caption>
<colgroup>
<col style="width:35%;">
<col style="width:65%;">
</colgroup>
<tr>
<th>jsp_example_send_msg_r1.jsp</th>
<td>문자보내기(여러명에게 동일한문자)</td>
</tr>
<tr>
<th>jsp_example_send_msgs_r1.jsp</th>
<td>문자보내기(여러명에게 다른문자)</td>
</tr>
<tr>
<th>jsp_example_hstry_r1.jsp</th>
<td>전송내역조회</td>
</tr>
<tr>
<th>jsp_example_hstry_detail_r1.jsp</th>
<td>상세전송내역조회</td>
</tr>
<tr>
<th>jsp_example_select_price_r1.jsp</th>
<td>발송가능건수</td>
</tr>
</table>
</div>
</div>
<div class="btn_area">
<button type="button" class="btnType btnType11 download_btn" data-info="jsp" onclick="return false;">JSP용 예제 다운받기</button>
</div>
</div>
<!--// JSP 다운로드-->
<!--PHP 다운로드-->
<div class="download_cont" id="listTab3_2">
<div class="box">
<div class="text">
<h4>PHP Example</h4>
<table>
<caption>PHP 샘플 파일 설명 테이블</caption>
<colgroup>
<col style="width:35%;">
<col style="width:65%;">
</colgroup>
<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>
</table>
</div>
</div>
<div class="btn_area">
<button type="button" class="btnType btnType11 download_btn" data-info="php" onclick="return false;">PHP용 예제 다운받기</button>
</div>
</div>
<!--// PHP 다운로드-->
<!--ASP 다운로드-->
<div class="download_cont" id="listTab3_3">
<div class="box">
<div class="text">
<h4>ASP Example</h4>
<table>
<caption>ASP 샘플 파일 설명 테이블</caption>
<colgroup>
<col style="width:35%;">
<col style="width:65%;">
</colgroup>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
</table>
</div>
</div>
<div class="btn_area">
<button type="button" class="btnType btnType11">ASP용 예제 다운받기</button>
</div>
</div>
<!--// ASP 다운로드-->
<!--.NET 다운로드-->
<div class="download_cont" id="listTab3_4">
<div class="box">
<div class="text">
<h4>.NET Example</h4>
<table>
<caption>.NET 샘플 파일 설명 테이블</caption>
<colgroup>
<col style="width:35%;">
<col style="width:65%;">
</colgroup>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
</table>
</div>
</div>
<div class="btn_area">
<button type="button" class="btnType btnType11">.NET용 예제 다운받기</button>
</div>
</div>
<!--// .NET 다운로드-->
<!--AOS 다운로드-->
<div class="download_cont" id="listTab3_5">
<div class="box">
<div class="text">
<h4>AOS Example</h4>
<table>
<caption>AOS 샘플 파일 설명 테이블</caption>
<colgroup>
<col style="width:35%;">
<col style="width:65%;">
</colgroup>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
</table>
</div>
</div>
<div class="btn_area">
<button type="button" class="btnType btnType11">AOS용 예제 다운받기</button>
</div>
</div>
<!--// AOS 다운로드-->
<!--IOS 다운로드-->
<div class="download_cont" id="listTab3_6">
<div class="box">
<div class="text">
<h4>IOS Example</h4>
<table>
<caption>IOS 샘플 파일 설명 테이블</caption>
<colgroup>
<col style="width:35%;">
<col style="width:65%;">
</colgroup>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
</table>
</div>
</div>
<div class="btn_area">
<button type="button" class="btnType btnType11">IOS용 예제 다운받기</button>
</div>
</div>
<!--// IOS 다운로드-->
</div>
<!--// 예제 다운로드 내용-->
</div>
<div class="api_guide" id="tab5_2">
<div class="api_download">
<ul class="info">
<li>- 아래 예제(JSP, PHP)를 참고하시어 쉽고 편리하게 API를 연동할 수 있습니다.</li>
<li>- JSP, PHP 외 타 예제는 계속해서 업데이트 될 예정입니다.</li>
</ul>
<div class="list_tab_wrap2 type2">
<!-- tab button -->
<ul class="list_tab">
<li class="tab active"><button type="button" onclick="listTab3(this,'7');">JSP</button>
</li>
<!-- <li class="tab"><button type="button" onclick="listTab3(this,'8');">ASP</button>
</li> -->
<li class="tab"><button type="button" onclick="listTab3(this,'9');">PHP</button>
</li>
<!--<li class="tab"><button type="button" onclick="listTab3(this,'10');">.NET</button>
</li>
<li class="tab"><button type="button" onclick="listTab3(this,'11');">AOS</button>
</li>
<li class="tab"><button type="button" onclick="listTab3(this,'12');">IOS</button>
</li>-->
</ul>
<!--// tab button -->
</div>
<!-- JSP 다운로드-->
<div class="download_cont current" id="listTab3_7">
<div class="box">
<div class="text">
<h4>JSP Example</h4>
<table>
<caption>JSP 샘플 파일 설명 테이블</caption>
<colgroup>
<col style="width:35%;">
<col style="width:65%;">
</colgroup>
<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>
</tr>
<tr>
<th>jsp_example_hstry_detail_r1.jsp</th>
<td>상세전송내역조회</td>
</tr>
<tr>
<th>jsp_example_select_price_r1.jsp</th>
<td>발송가능건수</td>
</tr>
</table>
</div>
</div>
<div class="btn_area">
<button type="button" class="btnType btnType11 download_btn" data-info="jsp" onclick="return false;">JSP용 예제 다운받기</button>
</div>
</div>
<!--// JSP 다운로드-->
<!--ASP 다운로드-->
<div class="download_cont" id="listTab3_8">
<div class="box">
<div class="text">
<h4>ASP Example</h4>
<table>
<caption>ASP 샘플 파일 설명 테이블</caption>
<colgroup>
<col style="width:35%;">
<col style="width:65%;">
</colgroup>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
</table>
</div>
</div>
<div class="btn_area">
<button type="button" class="btnType btnType11">ASP용 예제 다운받기</button>
</div>
</div>
<!--// ASP 다운로드-->
<!--PHP 다운로드-->
<div class="download_cont" id="listTab3_9">
<div class="box">
<div class="text">
<h4>PHP Example</h4>
<table>
<caption>PHP 샘플 파일 설명 테이블</caption>
<colgroup>
<col style="width:35%;">
<col style="width:65%;">
</colgroup>
<tbody>
<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 download_btn" data-info="php" onclick="return false;">PHP용 예제 다운받기</button>
</div>
</div>
<!--// PHP 다운로드-->
<!--.NET 다운로드-->
<div class="download_cont" id="listTab3_10">
<div class="box">
<div class="text">
<h4>.NET Example</h4>
<table>
<caption>.NET 샘플 파일 설명 테이블</caption>
<colgroup>
<col style="width:35%;">
<col style="width:65%;">
</colgroup>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
</table>
</div>
</div>
<div class="btn_area">
<button type="button" class="btnType btnType11">.NET용 예제 다운받기</button>
</div>
</div>
<!--// .NET 다운로드-->
<!--AOS 다운로드-->
<div class="download_cont" id="listTab3_11">
<div class="box">
<div class="text">
<h4>AOS Example</h4>
<table>
<caption>AOS 샘플 파일 설명 테이블</caption>
<colgroup>
<col style="width:35%;">
<col style="width:65%;">
</colgroup>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
</table>
</div>
</div>
<div class="btn_area">
<button type="button" class="btnType btnType11">AOS용 예제 다운받기</button>
</div>
</div>
<!--// AOS 다운로드-->
<!--IOS 다운로드-->
<div class="download_cont" id="listTab3_12">
<div class="box">
<div class="text">
<h4>IOS Example</h4>
<table>
<caption>IOS 샘플 파일 설명 테이블</caption>
<colgroup>
<col style="width:35%;">
<col style="width:65%;">
</colgroup>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
<tr>
<th>파일명</th>
<td>파일 설명</td>
</tr>
</table>
</div>
</div>
<div class="btn_area">
<button type="button" class="btnType btnType11">IOS용 예제 다운받기</button>
</div>
</div>
<!--// IOS 다운로드-->
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,239 @@
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<ul class="info">
<li>- API를 통해서 채널 ID를 조회할 수 있습니다.</li>
<!-- <li>- 발신번호는 문자온 사이트를 통해 사전등록 후 이용하실 수 있습니다.(마이페이지-발신번호 관리 메뉴 이용)</li> -->
<!-- <li>- 문자 내용이 "90byte"를 초과하는 경우 장문(LMS)으로 자동 전환됩니다.</li> -->
</ul>
<div class="re_cont">
<!-- Request -->
<div class="req_title">Request</div>
<div class="box">
<div class="text">
<h4>Request</h4>
<table>
<caption>API Request Http Method, 프로토콜, HOST, Service Port, Endpoint 정보 테이블</caption>
<colgroup>
<col style="width:20%;">
<col style="width:80%;">
</colgroup>
<tr>
<th>Http Method</th>
<td>POST</td>
</tr>
<tr>
<th>프로토콜</th>
<td>HTTPS/1.1</td>
</tr>
<tr>
<th>HOST</th>
<td>api.munjaon.co.kr</td>
</tr>
<tr>
<th>Service Port</th>
<td>443</td>
</tr>
<tr>
<th>Endpoint</th>
<td>/api/kakao/inqry/chnlId</td>
</tr>
</table>
</div>
</div>
<div class="type_table">
<table>
<caption>채널ID 조회 API Request 키 종류 및 설명, 타입, 필수 여부 테이블</caption>
<colgroup>
<col style="width:20%;">
<col style="width:45%;">
<col style="width:25%">
<col style="width:10%">
</colgroup>
<thead>
<tr>
<th>키</th>
<th>설명</th>
<th>타입</th>
<th>필수</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="font_b">mberId</span></td>
<td>사용자 ID</td>
<td>String</td>
<td><span class="select_o">O</span></td>
</tr>
<tr>
<td><span class="font_b">accessKey</span></td>
<td>인증용 API Key</td>
<td>String</td>
<td><span class="select_o">O</span></td>
</tr>
<tr>
<td><span class="font_b">test_yn</span></td>
<td>테스트 데이터 여부 (YS: 성공 테스트, YF: 실패 테스트)</td>
<td>String</td>
<td><span class="select_x">X</span></td>
</tr>
</tbody>
</table>
<div class="table_info">
<p>※ HTTPS 프로토콜을 사용하여 POST로 요청합니다.</p>
<p>※ Content-Type: application/json</p>
</div>
</div>
<div class="box">
<div class="title">[Example]</div>
<div class="code_view">
<pre>
<code class="language-json">
{
"mberId": "홍길동",
"accessKey": "XXXXXXXXXXXXXX414050694b953",
"test_yn": ""
}
</code>
</pre>
</div>
</div>
<!-- // Request -->
<!-- Response -->
<div class="res_title">Response</div>
<div class="type_table">
<table>
<caption>채널ID 조회 API Response 키 종류 및 설명, 타입 테이블</caption>
<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>
<td><span class="font_b">resultCode</span></td>
<td>성공 여부("0" 이외는 실패)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">data</span></td>
<td>조회 결과 목록(성공 시 배열, 실패 시 오류 메시지)</td>
<td>Array | String</td>
</tr>
<tr>
<td><span class="font_b">[data][i].senderKey</span></td>
<td>발신 프로필 SenderKey</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data][i].phoneNumber</span></td>
<td>대표 전화번호</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data][i].yellowId</span></td>
<td>카카오 채널(옐로아이디)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data][i].frstRegistPnttm</span></td>
<td>최초 등록 일시(YYYY-MM-DD HH:mm:ss)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data][i].frstRegisterId</span></td>
<td>최초 등록자 ID</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">localDateTime</span></td>
<td>서버 처리 일시(ISO-8601)</td>
<td>String</td>
</tr>
</tbody>
</table>
<div class="table_info">
<p>※ JSON 객체로 응답합니다.</p>
</div>
</div>
<div class="box">
<div class="title_t1"><span class="ex">[Example]</span><span class="ex_success">O 성공 예시</span></div>
<div class="code_view">
<pre>
<code class="language-json">
{
"resultCode": "0",
"data": [
{
"senderKey": "test_sender_key_001",
"phoneNumber": "02-1234-0000",
"yellowId": "@test_channel_001",
"frstRegistPnttm": "2025-09-09 12:44:21",
"frstRegisterId": "test_id_one"
},
{
"senderKey": "test_sender_key_002",
"phoneNumber": "02-1234-0001",
"yellowId": "@test_channel_002",
"frstRegistPnttm": "2025-09-09 12:44:21",
"frstRegisterId": "test_id_tow"
}
],
"localDateTime": "2025-09-09T12:44:21.624464"
}
</code>
</pre>
</div>
</div>
<div class="box">
<div class="title_t1"><span class="ex">[Example]</span><span class="ex_fail">X 실패 예시</span></div>
<div class="code_view">
<pre><code class="language-json">
{
"resultCode": "2099",
"data": "기타 시스템 오류"
}
</code></pre>
</div>
</div>
<!-- // Response -->
</div>
<!--// Response-->

View File

@ -0,0 +1,326 @@
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<ul class="info">
<li>- API를 통해서 카카오 친구톡(FT)을 발송할 수 있습니다.</li>
<li>- 버튼 타입은 <b>WL(웹링크), AL(앱링크)</b>만 지원합니다.</li>
<li>- 대체문자(subMsgTxt) 발송 여부는 subMsgSendYn으로 제어합니다.</li>
</ul>
<div class="re_cont">
<!-- Request -->
<div class="req_title">Request</div>
<div class="box">
<div class="text">
<h4>Request</h4>
<table>
<caption>API Request Http Method, 프로토콜, HOST, Service Port, Endpoint 정보 테이블</caption>
<colgroup>
<col style="width:20%;">
<col style="width:80%;">
</colgroup>
<tr>
<th>Http Method</th>
<td>POST</td>
</tr>
<tr>
<th>프로토콜</th>
<td>HTTPS/1.1</td>
</tr>
<tr>
<th>HOST</th>
<td>api.munjaon.co.kr</td>
</tr>
<tr>
<th>Service Port</th>
<td>443</td>
</tr>
<tr>
<th>Endpoint</th>
<td>/api/kakao/ft/sendMsg</td>
</tr>
</table>
</div>
</div>
<div class="type_table">
<table>
<caption>친구톡 발송 API Request 키 종류 및 설명, 타입, 필수 여부 테이블</caption>
<colgroup>
<col style="width:20%;">
<col style="width:45%;">
<col style="width:25%">
<col style="width:10%">
</colgroup>
<thead>
<tr>
<th>키</th>
<th>설명</th>
<th>타입</th>
<th>필수</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="font_b">mberId</span></td>
<td>사용자 ID</td>
<td>String</td>
<td><span class="select_o">O</span></td>
</tr>
<tr>
<td><span class="font_b">accessKey</span></td>
<td>인증용 API Key</td>
<td>String</td>
<td><span class="select_o">O</span></td>
</tr>
<tr>
<td><span class="font_b">senderKey</span></td>
<td>발신 프로필 SenderKey</td>
<td>String</td>
<td><span class="select_o">O</span></td>
</tr>
<tr>
<td><span class="font_b">adFlag</span></td>
<td>광고 여부 (Y/N)</td>
<td>String</td>
<td><span class="select_o">O</span></td>
</tr>
<tr>
<td><span class="font_b">subMsgSendYn</span></td>
<td>대체문자 발송 여부 (Y/N)</td>
<td>String</td>
<td><span class="select_x">X</span></td>
</tr>
<tr>
<td><span class="font_b">callFrom</span></td>
<td>발신자 번호</td>
<td>String</td>
<td><span class="select_o">O</span></td>
</tr>
<tr>
<td><span class="font_b">callTo_[i]</span></td>
<td>수신자 번호</td>
<td>String</td>
<td><span class="select_o">O</span></td>
</tr>
<tr>
<td><span class="font_b">templateContent_[i]</span></td>
<td>친구톡 본문</td>
<td>String</td>
<td><span class="select_o">O</span></td>
</tr>
<tr>
<td><span class="font_b">templateImage</span></td>
<td>친구톡 이미지(PNG,JPG)</td>
<td>File</td>
<td><span class="select_x">X</span></td>
</tr>
<tr>
<td><span class="font_b">subMsgTxt_[i]</span></td>
<td>대체문자 내용</td>
<td>String</td>
<td><span class="select_x">X</span></td>
</tr>
<tr>
<td><span class="font_b">button</span></td>
<td>버튼 JSON 문자열(AL:앱링크, WL:웹링크 지원)</td>
<td>String(JSON)</td>
<td><span class="select_x">X</span></td>
</tr>
<tr>
<td><span class="font_b">test_yn</span></td>
<td>테스트 데이터 여부 (YS: 성공 테스트, YF: 실패 테스트)</td>
<td>String</td>
<td><span class="select_x">X</span></td>
</tr>
</tbody>
</table>
<div class="table_info">
<p>※ HTTPS 프로토콜을 사용하여 POST로 요청합니다.</p>
<p>※ Content-Type: application/json</p>
</div>
</div>
<div class="box">
<div class="title">[Example]</div>
<div class="code_view">
<pre>
<code class="language-json">
{
"mberId": "dudgusw",
"accessKey": "3429312e6a2c732188d4cc7d15d8a1baa01d8d91",
"senderKey": "e42e34ee013147720711b4add6d181adbe4ce45f",
"adFlag": "N",
"subMsgSendYn": "Y",
"callFrom": "010-9341-4986",
"callTo_1": "01083584250",
"callTo_2": "01083584251",
"templateContent_1": "친구톡 본문 1",
"templateContent_2": "친구톡 본문 2",
"subMsgTxt_1": "대체문자 발송1",
"subMsgTxt_2": "대체문자 발송2",
"{ button": [
{
"name": "주문조회",
"linkType": "WL",
"linkPc": "PC 링크",
"linkMo": "모바일 링크"
},
{
"name": "앱 열기",
"linkType": "AL",
"linkIos": "ios링크",
"linkAnd": "Android 링크"
}
]}"
}
</code>
</pre>
</div>
</div>
<!-- // Request -->
<!-- Response -->
<div class="res_title">Response</div>
<div class="type_table">
<table>
<caption>친구톡 발송 API Response 키 종류 및 설명, 타입 테이블</caption>
<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>
<td><span class="font_b">resultCode</span></td>
<td>성공 여부("0" 이외는 실패)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">data</span></td>
<td>발송 결과 객체</td>
<td>Object</td>
</tr>
<tr>
<td><span class="font_b">[data].resultCode</span></td>
<td>내부 처리 결과("0": 성공)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].msgType</span></td>
<td>메시지 타입(FT: 친구톡)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].msgGroupIdList</span></td>
<td>발송된 메시지 그룹 ID 목록</td>
<td>Array&lt;String&gt;</td>
</tr>
<tr>
<td><span class="font_b">[data].successCnt</span></td>
<td>성공 건수</td>
<td>String | Number</td>
</tr>
<tr>
<td><span class="font_b">[data].failCnt</span></td>
<td>실패 건수</td>
<td>String | Number</td>
</tr>
<tr>
<td><span class="font_b">localDateTime</span></td>
<td>서버 처리 일시(ISO-8601)</td>
<td>String</td>
</tr>
</tbody>
</table>
<div class="table_info">
<p>※ JSON 객체로 응답합니다.</p>
</div>
</div>
<div class="box">
<div class="title_t1"><span class="ex">[Example]</span><span class="ex_success">O 성공 예시</span></div>
<div class="code_view">
<pre>
<code class="language-json">
{
"resultCode": "0",
"data": {
"resultCode": "0",
"msgType": "FT",
"msgGroupIdList": [
"MSGGID_1758008282543",
"MSGGID_1758008282543"
],
"successCnt": "2",
"failCnt": "0"
},
"localDateTime": "2025-09-16T16:38:02.5436925"
}
</code>
</pre>
</div>
</div>
<div class="box">
<div class="title_t1"><span class="ex">[Example]</span><span class="ex_fail">X 실패 예시</span></div>
<div class="code_view">
<pre><code class="language-json">
{
"resultCode": "4420",
"data": "버튼 타입은 WL/AL만 지원합니다.(button.linkType)"
}
</code></pre>
</div>
</div>
<!-- // Response -->
</div>
<!--// Response-->
</div>

View File

@ -0,0 +1,433 @@
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<ul class="info">
<li>- 문자온 사이트 및 API를 통해 전송된 발송내역을 조회할 수 있습니다.</li>
<li>- 문자 발송내역은 날짜별로 조회되며, 최근 3개월까지만 조회 가능합니다.</li>
<li>- 발신번호별 문자 발송내역 조회 기능은 제공되지 않습니다.</li>
</ul>
<div class="re_cont">
<!--Request-->
<div class="req_title">Request</div>
<div class="box">
<div class="text">
<h4>Request</h4>
<table>
<caption>API Request Http Method, 프로토콜, HOST, Service Port 정보 테이블</caption>
<colgroup>
<col style="width:20%;">
<col style="width:80%;">
</colgroup>
<tr>
<th>Http Method</th>
<td>POST</td>
</tr>
<tr>
<th>프로토콜</th>
<td>HTTPS/1.1</td>
</tr>
<tr>
<th>HOST</th>
<td>api.munjaon.co.kr</td>
</tr>
<tr>
<th>Service Port</th>
<td>443</td>
</tr>
<tr>
<th>Endpoint</th>
<td>/api/inqry/hstry</td>
</tr>
</table>
</div>
</div>
<div class="type_table">
<table>
<caption>전송결과 조회 API Request 키 종류 및 설명, 타입, 필수 여부 테이블</caption>
<colgroup>
<col style="width:20%;">
<col style="width:45%;">
<col style="width:25%">
<col style="width:10%">
</colgroup>
<thead>
<tr>
<th>키</th>
<th>설명</th>
<th>타입</th>
<th>필수</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="font_b">mberId</span></td>
<td>사용자 ID</td>
<td>String</td>
<td><span class="select_o">O</span></td>
</tr>
<tr>
<td><span class="font_b">accessKey</span></td>
<td>인증용 API Key</td>
<td>String</td>
<td><span class="select_o">O</span></td>
</tr>
<tr>
<td><span class="font_b">page</span></td>
<td>페이지 번호(미입력 시 1)</td>
<td>String</td>
<td><span class="select_x">X</span></td>
</tr>
<tr>
<td><span class="font_b">pageSize</span></td>
<td>페이지당 출력 개수(미입력 시 기본값 적용)</td>
<td>String</td>
<td><span class="select_x">X</span></td>
</tr>
<tr>
<td><span class="font_b">startDate</span></td>
<td>시작 일자(yyyyMMdd)</td>
<td>String</td>
<td><span class="select_x">X</span></td>
</tr>
<tr>
<td><span class="font_b">endDate</span></td>
<td>마감 일자(yyyyMMdd)</td>
<td>String</td>
<td><span class="select_x">X</span></td>
</tr>
<tr>
<td><span class="font_b">test_yn</span></td>
<td>테스트 데이터 여부</td>
<td>String</td>
<td><span class="select_x">X</span></td>
</tr>
</tbody>
</table>
<div class="table_info">
<p>※ HTTPS 프로토콜을 사용하여 POST로 요청합니다.</p>
<p>※ Content-Type: application/json</p>
</div>
</div>
<div class="box">
<div class="title">[Example]</div>
<div class="code_view">
<pre>
<code class="language-json">
{
"mberId": "홍길동",
"accessKey": "XXXXXXXXXXXXXX414050694b953",
"page": "",
"pageSize": "",
"startDate": "",
"endDate": "",
"test_yn": ""
}
</code>
</pre>
</div>
</div>
<!--// Request-->
<!-- Response-->
<div class="res_title">Response</div>
<div class="type_table">
<table>
<caption>전송결과 조회 API Response 키 종류 및 설명, 타입 테이블</caption>
<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>
<td><span class="font_b">resultCode</span></td>
<td>성공 여부("0" 아니면 실패)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">data</span></td>
<td>결과값 객체(성공 : 데이터, 실패 : 메시지)</td>
<td>Object | String</td>
</tr>
<tr>
<td><span class="font_b">[data].message</span></td>
<td>메시지(필요 시)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].next_yn</span></td>
<td>다음 페이지 여부(Y/N)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList</span></td>
<td>결과값 목록</td>
<td>Array&lt;Object&gt;</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].msgGroupId</span></td>
<td>메시지 그룹 ID</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].msgId</span></td>
<td>메시지 ID</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].msgTypeName</span></td>
<td>문자 구분명(단문, 장문, 그림)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].msgType</span></td>
<td>메시지 타입(4: 단문, 5: 장문, 6: 그림)</td>
<td>String | Number</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].callFrom</span></td>
<td>발신자 번호</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].callTo</span></td>
<td>수신자 번호</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].msgGroupCnt</span></td>
<td>발송 건수</td>
<td>String | Number</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].scnt</span></td>
<td>성공 건수</td>
<td>String | Number</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].fcnt</span></td>
<td>실패 건수</td>
<td>String | Number</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].wcnt</span></td>
<td>대기 건수</td>
<td>String | Number</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].msgResult</span></td>
<td>발송 결과(성공: S, 실패: F)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].smsTxt</span></td>
<td>문자 내용</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].subject</span></td>
<td>제목</td>
<td>String | null</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].reqdate</span></td>
<td>발송 일자(YYYY-MM-DD HH:mm:ss)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].curState</span></td>
<td>전송 처리 결과값</td>
<td>String | Number</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].userId</span></td>
<td>사용자 ID</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].regdate</span></td>
<td>등록 일자(YYYY-MM-DD HH:mm:ss)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].reserveCYn</span></td>
<td>예약 취소 여부(Y/N)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].ttlCnt</span></td>
<td>전체 요청 수</td>
<td>String | Number</td>
</tr>
<tr>
<td><span class="font_b">[data].remainMsgCnt</span></td>
<td>남은 문자 건수</td>
<td>String | Number</td>
</tr>
<tr>
<td><span class="font_b">[data].totMsgCnt</span></td>
<td>전체 문자 개수</td>
<td>String | Number</td>
</tr>
</tbody>
</table>
<div class="table_info">
<p>※ JSON 객체로 응답합니다.</p>
</div>
</div>
<div class="box">
<div class="title_t1"><span class="ex">[Example]</span><span class="ex_success">O 성공 예시</span></div>
<div class="code_view">
<pre>
<code class="language-json">
{
"resultCode": "0",
"data": {
"resultCode": "0",
"message": null,
"next_yn": "n",
"msgGroupId": "MSGGID_0000000000000",
"objectList": [
{
"msgTypeName": "단문(SMS)",
"msgType": "4",
"callFrom": "01011112222",
"callTo": "01011112223",
"msgGroupCnt": "2",
"msgGroupId": "MSGGID_0000000013340",
"msgId": "MSGID_0000000000001",
"scnt": "2",
"fcnt": "0",
"wcnt": "0",
"msgResult": "S",
"smsTxt": "문자 내용 단문 예제",
"subject": null,
"reqdate": "2023-06-13 17:48:07",
"curState": "3",
"userId": "testuser",
"regdate": "2023-06-13 17:48:07",
"reserveCYn": "N",
"ttlCnt": "1",
"remainMsgCnt": "40",
"totMsgCnt": "70"
},
{
"msgTypeName": "장문(LMS)",
"msgType": "5",
"callFrom": "01011112222",
"callTo": "01011112223",
"msgGroupCnt": "1",
"msgGroupId": "MSGGID_0000000013341",
"msgId": "MSGID_0000000000002",
"scnt": "1",
"fcnt": "0",
"wcnt": "0",
"msgResult": "S",
"smsTxt": "문자 내용 장문 예제",
"subject": null,
"reqdate": "2023-06-02 11:46:50",
"curState": "3",
"userId": "testuser",
"regdate": "2023-06-02 11:46:49",
"reserveCYn": "N",
"ttlCnt": "1",
"remainMsgCnt": "40",
"totMsgCnt": "70"
}
]
}
}
</code>
</pre>
</div>
</div>
<div class="box">
<div class="title_t1"><span class="ex">[Example]</span><span class="ex_fail">X 실패 예시</span></div>
<div class="code_view">
<pre>
<code class="language-json">
{
"resultCode": "3099",
"data": "기타 시스템 오류"
}
</code>
</pre>
</div>
</div>
<!--// Response-->
</div>

View File

@ -0,0 +1,342 @@
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<ul class="info">
<li>- API를 통해서 메시지 그룹 ID 기준의 상세 이력(개별 건) 목록을 조회할 수 있습니다.</li>
</ul>
<div class="re_cont">
<!-- Request -->
<div class="req_title">Request</div>
<div class="box">
<div class="text">
<h4>Request</h4>
<table>
<caption>API Request Http Method, 프로토콜, HOST, Service Port, Endpoint 정보 테이블</caption>
<colgroup>
<col style="width:20%;">
<col style="width:80%;">
</colgroup>
<tr>
<th>Http Method</th>
<td>POST</td>
</tr>
<tr>
<th>프로토콜</th>
<td>HTTPS/1.1</td>
</tr>
<tr>
<th>HOST</th>
<td>api.munjaon.co.kr</td>
</tr>
<tr>
<th>Service Port</th>
<td>443</td>
</tr>
<tr>
<th>Endpoint</th>
<td>/api/inqry/hstryDetail</td>
</tr>
</table>
</div>
</div>
<div class="type_table">
<table>
<caption>히스토리 상세 조회 API Request 키 종류 및 설명, 타입, 필수 여부 테이블</caption>
<colgroup>
<col style="width:20%;">
<col style="width:45%;">
<col style="width:25%">
<col style="width:10%">
</colgroup>
<thead>
<tr>
<th>키</th>
<th>설명</th>
<th>타입</th>
<th>필수</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="font_b">mberId</span></td>
<td>사용자 ID</td>
<td>String</td>
<td><span class="select_o">O</span></td>
</tr>
<tr>
<td><span class="font_b">accessKey</span></td>
<td>인증용 API Key</td>
<td>String</td>
<td><span class="select_o">O</span></td>
</tr>
<tr>
<td><span class="font_b">msgGroupId</span></td>
<td>메시지 그룹 ID</td>
<td>String</td>
<td><span class="select_o">O</span></td>
</tr>
</tbody>
</table>
<div class="table_info">
<p>※ HTTPS 프로토콜을 사용하여 POST로 요청합니다.</p>
<p>※ Content-Type: application/json</p>
</div>
</div>
<div class="box">
<div class="title">[Example]</div>
<div class="code_view">
<pre>
<code class="language-json">
{
"mberId": "홍길동",
"accessKey": "XXXXXXXXXXXXXX414050694b953",
"msgGroupId": "MSGGID_XXXXXXX0000063"
}
</code>
</pre>
</div>
</div>
<!-- // Request -->
<!-- Response -->
<div class="res_title">Response</div>
<div class="type_table">
<table>
<caption>히스토리 상세 조회 API Response 키 종류 및 설명, 타입 테이블</caption>
<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>
<td><span class="font_b">resultCode</span></td>
<td>성공 여부("0" 이외는 실패)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">data</span></td>
<td>조회 결과 객체</td>
<td>Object</td>
</tr>
<tr>
<td><span class="font_b">[data].resultCode</span></td>
<td>내부 처리 결과(0: 성공)</td>
<td>Number | String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList</span></td>
<td>개별 메시지 상세 목록</td>
<td>Array&lt;Object&gt;</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].msgGroupId</span></td>
<td>메시지 그룹 ID</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].msgId</span></td>
<td>개별 메시지 ID</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].totMsgCnt</span></td>
<td>총 발송 건수(그룹 기준)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].msgType</span></td>
<td>메시지 타입 코드(예: 8=AT)</td>
<td>Number</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].msgTypeName</span></td>
<td>메시지 타입명</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].msgResult</span></td>
<td>결과(F: 실패, S: 성공 등)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].msgGroupCnt</span></td>
<td>발송 건수</td>
<td>Number</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].smsTxt</span></td>
<td>메시지 내용</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].callFrom</span></td>
<td>발신 번호</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].callTo</span></td>
<td>수신 번호</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].curState</span></td>
<td>현재 상태 코드</td>
<td>Number</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].remainMsgCnt</span></td>
<td>잔여 처리 건수</td>
<td>Number</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].reqdate</span></td>
<td>요청 일시(YYYY-MM-DD HH:mm:ss)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].regdate</span></td>
<td>등록 일시(YYYY-MM-DD HH:mm:ss)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].objectList[i].reserveCYn</span></td>
<td>예약 취소 여부(Y/N)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">localDateTime</span></td>
<td>서버 처리 일시(ISO-8601)</td>
<td>String</td>
</tr>
</tbody>
</table>
<div class="table_info">
<p>※ JSON 객체로 응답합니다.</p>
</div>
</div>
<div class="box">
<div class="title_t1"><span class="ex">[Example]</span><span class="ex_success">O 성공 예시</span></div>
<div class="code_view">
<pre>
<code class="language-json">
{
"resultCode": "0",
"data": {
"resultCode": 0,
"objectList": [
{
"msgGroupId": "MSGGID_XXXXXXX0000063",
"msgId": "MSGCID_XXXXXXX00001180",
"totMsgCnt": "9",
"msgType": 8,
"msgTypeName": "알림톡(AT)",
"msgResult": "F",
"msgGroupCnt": 1,
"smsTxt": "test",
"callFrom": "01093414986",
"callTo": "01059941669",
"curState": 3,
"remainMsgCnt": 0,
"reqdate": "2025-09-05 11:45:45",
"regdate": "2025-09-05 11:45:45",
"reserveCYn": "N"
},
{
"msgGroupId": "MSGGID_XXXXXXX0000063",
"msgId": "MSGCID_XXXXXXX000001175",
"totMsgCnt": "9",
"msgType": 9,
"msgTypeName": "친구톡(AT)",
"msgResult": "F",
"msgGroupCnt": 1,
"smsTxt": "test",
"callFrom": "01093414986",
"callTo": "01098969885",
"curState": 3,
"remainMsgCnt": 0,
"reqdate": "2025-09-05 11:45:45",
"regdate": "2025-09-05 11:45:45",
"reserveCYn": "N"
},
]
},
"localDateTime": "2025-09-16T10:47:20.4014362"
}
</code>
</pre>
</div>
</div>
<div class="box">
<div class="title_t1"><span class="ex">[Example]</span><span class="ex_fail">X 실패 예시</span></div>
<div class="code_view">
<pre><code class="language-json">
{
"resultCode": "4099",
"data": "기타 시스템 오류"
}
</code></pre>
</div>
</div>
<!-- // Response -->
</div>
<!--// Response-->

View File

@ -0,0 +1,303 @@
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<ul class="info">
<li>- 보유캐시로 발송 가능한 문자의 건수를 단문(SMS), 장문(LMS), 그림(MMS), 알림톡(AT), 친구톡(FT)별로 각각 확인할 수 있습니다.</li>
<!-- <li>- 위 문자유형별 발송 가능건수는 개인별로 적용된 단가를 기준으로 산출되며, "첫 결제 이벤트"는 적용되지 않습니다.</li> -->
</ul>
<div class="re_cont">
<!-- Request -->
<div class="req_title">Request</div>
<div class="box">
<div class="text">
<h4>Request</h4>
<table>
<caption>API Request Http Method, 프로토콜, HOST, Service Port, Endpoint 정보 테이블</caption>
<colgroup>
<col style="width:20%;">
<col style="width:80%;">
</colgroup>
<tr>
<th>Http Method</th>
<td>POST</td>
</tr>
<tr>
<th>프로토콜</th>
<td>HTTPS/1.1</td>
</tr>
<tr>
<th>HOST</th>
<td>api.munjaon.co.kr</td>
</tr>
<tr>
<th>Service Port</th>
<td>443</td>
</tr>
<tr>
<th>Endpoint</th>
<td>/api/inqry/price</td>
</tr>
</table>
</div>
</div>
<div class="type_table">
<table>
<caption>가격/가능건수 조회 API Request 키 종류 및 설명, 타입, 필수 여부 테이블</caption>
<colgroup>
<col style="width:20%;">
<col style="width:45%;">
<col style="width:25%">
<col style="width:10%">
</colgroup>
<thead>
<tr>
<th>키</th>
<th>설명</th>
<th>타입</th>
<th>필수</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="font_b">mberId</span></td>
<td>사용자 ID</td>
<td>String</td>
<td><span class="select_o">O</span></td>
</tr>
<tr>
<td><span class="font_b">accessKey</span></td>
<td>인증용 API Key</td>
<td>String</td>
<td><span class="select_o">O</span></td>
</tr>
</tbody>
</table>
<div class="table_info">
<p>※ HTTPS 프로토콜을 사용하여 POST로 요청합니다.</p>
<p>※ Content-Type: application/json</p>
</div>
</div>
<div class="box">
<div class="title">[Example]</div>
<div class="code_view">
<pre>
<code class="language-json">
{
"mberId": "홍길동",
"accessKey": "XXXXXXXXXXXXXX414050694b953"
}
</code>
</pre>
</div>
</div>
<!-- // Request -->
<!-- Response -->
<div class="res_title">Response</div>
<div class="type_table">
<table>
<caption>가격/가능건수 조회 API Response 키 종류 및 설명, 타입 테이블</caption>
<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>
<td><span class="font_b">resultCode</span></td>
<td>성공 여부("0" 이외는 실패)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">data</span></td>
<td>조회 결과 객체(성공 시 가격/가능건수 정보)</td>
<td>Object | String</td>
</tr>
<tr>
<td><span class="font_b">[data].resultCode</span></td>
<td>내부 처리 결과("0": 성공)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].message</span></td>
<td>메시지(필요 시)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].localDateTime</span></td>
<td>서버 처리 일시(ISO-8601)</td>
<td>String</td>
</tr>
<tr>
<td><span class="font_b">[data].shortPrice</span></td>
<td>단문(SMS) 단가</td>
<td>Number</td>
</tr>
<tr>
<td><span class="font_b">[data].longPrice</span></td>
<td>장문(LMS) 단가</td>
<td>Number</td>
</tr>
<tr>
<td><span class="font_b">[data].picturePrice</span></td>
<td>사진(MMS) 단가</td>
<td>Number</td>
</tr>
<tr>
<td><span class="font_b">[data].kakaoAtPrice</span></td>
<td>카카오 알림톡 단가</td>
<td>Number</td>
</tr>
<tr>
<td><span class="font_b">[data].kakaoFtPrice</span></td>
<td>카카오 친구톡(텍스트) 단가</td>
<td>Number</td>
</tr>
<tr>
<td><span class="font_b">[data].kakaoFtImgPrice</span></td>
<td>카카오 친구톡(이미지) 단가</td>
<td>Number</td>
</tr>
<tr>
<td><span class="font_b">[data].kakaoFtWideImgPrice</span></td>
<td>카카오 친구톡(와이드 이미지) 단가</td>
<td>Number</td>
</tr>
<tr>
<td><span class="font_b">[data].mberMoney</span></td>
<td>회원 보유 금액</td>
<td>Number</td>
</tr>
<tr>
<td><span class="font_b">[data].shortSendPsbltEa</span></td>
<td>단문 발송 가능 건수</td>
<td>Number</td>
</tr>
<tr>
<td><span class="font_b">[data].longSendPsbltEa</span></td>
<td>장문 발송 가능 건수</td>
<td>Number</td>
</tr>
<tr>
<td><span class="font_b">[data].pictureSendPsbltEa</span></td>
<td>사진 발송 가능 건수</td>
<td>Number</td>
</tr>
<tr>
<td><span class="font_b">[data].kakaoAtSendPsbltEa</span></td>
<td>알림톡 발송 가능 건수</td>
<td>Number</td>
</tr>
<tr>
<td><span class="font_b">[data].kakaoFtSendPsbltEa</span></td>
<td>친구톡(텍스트) 발송 가능 건수</td>
<td>Number</td>
</tr>
<tr>
<td><span class="font_b">[data].kakaoFtImgSendPsbltEa</span></td>
<td>친구톡(이미지) 발송 가능 건수</td>
<td>Number</td>
</tr>
<tr>
<td><span class="font_b">[data].kakaoFtWideImgSendPsbltEa</span></td>
<td>친구톡(와이드 이미지) 발송 가능 건수</td>
<td>Number</td>
</tr>
<tr>
<td><span class="font_b">localDateTime</span></td>
<td>서버 처리 일시(ISO-8601)</td>
<td>String</td>
</tr>
</tbody>
</table>
<div class="table_info">
<p>※ JSON 객체로 응답합니다.</p>
</div>
</div>
<div class="box">
<div class="title_t1"><span class="ex">[Example]</span><span class="ex_success">O 성공 예시</span></div>
<div class="code_view">
<pre>
<code class="language-json">
{
"resultCode": "0",
"data": {
"resultCode": "0",
"message": "",
"localDateTime": "2025-09-16T11:06:40.2556646",
"shortPrice": 18.0,
"longPrice": 50.0,
"picturePrice": 90.0,
"kakaoAtPrice": 6.9,
"kakaoFtPrice": 13.8,
"kakaoFtImgPrice": 19.9,
"kakaoFtWideImgPrice": 22.9,
"mberMoney": 6549661.26,
"shortSendPsbltEa": 363870,
"longSendPsbltEa": 130993,
"pictureSendPsbltEa": 72774,
"kakaoAtSendPsbltEa": 949226,
"kakaoFtSendPsbltEa": 474613,
"kakaoFtImgSendPsbltEa": 329128,
"kakaoFtWideImgSendPsbltEa": 286011
},
"localDateTime": "2025-09-16T11:06:40.2556646"
}
</code>
</pre>
</div>
</div>
<div class="box">
<div class="title_t1"><span class="ex">[Example]</span><span class="ex_fail">X 실패 예시</span></div>
<div class="code_view">
<pre><code class="language-json">
{
"resultCode": "3099",
"data": "기타 시스템 오류"
}
</code></pre>
</div>
</div>
<!-- // Response -->
</div>
<!--// Response-->

View File

@ -1,94 +1,253 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<script language=javascript>
$(document).ready(function(){
});
$(document).ready(function() {
});
</script>
<!-- content 영역 -->
<div class="inner">
<!-- send top -->
<div class="send_top">
<c:import url="./top_tepMenu.jsp" />
<!-- tab button -->
<div class="api_guide_cont current">
<div class="heading">
<h2>문자연동(API) 소개</h2>
</div>
<div class="heading">
<h2>연동 서비스 안내</h2>
</div>
<!--소개 내용-->
<div class="api_visual_image">
<img src="<c:url value='/publish/images/api_intro_cont/api_intro_visual.jpg' />" alt="문자연동(API)도 이제 '문자온!'' 별도의 프로그램 설치 없이 누구나 쉽고 편리하게 문자를 발송할 수 있습니다." usemap="#image-map">
<map name="image-map">
<area target="_self" alt="문자연동(API)신청하기" title="문자연동(API)신청하기" href="<c:out value='/web/api/appMgmt.do' />" coords="338,266,88,216" shape="rect">
</map>
</div>
<!--사용 절차 설명 -->
<div class="api_intro">
<div class="title">
<h3>문자연동(API) 사용 절차</h3>
</div>
<!--소개 내용-->
<div class="api_visual_image">
<img
src="<c:url value='/publish/images/api_intro_cont/api_intro_visual.jpg' />"
alt="문자연동(API)도 이제 '문자온!'' 별도의 프로그램 설치 없이 누구나 쉽고 편리하게 문자를 발송할 수 있습니다."
usemap="#image-map">
<map name="image-map">
<area target="_self" alt="문자연동(API)신청하기" title="문자연동(API)신청하기"
href="<c:out value='/web/api/appMgmt.do' />"
coords="338,266,88,216" shape="rect">
</map>
</div>
<div class="pay_tab_wrap">
<ul class="tabType1">
<li class="tab active"><button type="button"
onclick="TabType5(this,'1');">문자</button></li>
<li class="tab"><button type="button"
onclick="TabType5(this,'2');">카카오톡</button></li>
</ul>
</div>
<!--사용 절차 설명 -->
<div class="api_intro api_guide current" id="tab5_1">
<div class="title">
<h3>문자 API 사용 절차</h3>
</div>
<div class="title-line">
<div class="left-line"></div>
<div class="right-line"></div>
</div>
<div class="con">
<ul class="api_process_guide">
<li class="guide">
<a href="/web/user/sendNumberManage.do">
<p class="step_title">
STEP <span>01</span>
</p>
<div class="step_con">
<div class="icon">
<img src="/publish/images/api_intro_cont/api_guide_00.png"
alt="문자 API 신청 아이콘">
</div>
<dl>
<dt>발신번호 사전 등록</dt>
<dd>
발송에 필요한 발신번호<br>등록 필요
</dd>
</dl>
</div>
</a>
</li>
<li class="guide">
<p class="step_title">
STEP <span>02</span>
</p>
<div class="step_con">
<div class="icon">
<img src="/publish/images/api_intro_cont/api_guide_01.jpg"
alt="관리자 승인 아이콘">
</div>
<dl>
<dt>문자 연동 API 신청</dt>
<dd>관리자 승인 후 사용 가능</dd>
</dl>
</div>
</li>
<li class="guide">
<p class="step_title">
STEP <span>03</span>
</p>
<div class="step_con">
<div class="icon">
<img src="/publish/images/api_intro_cont/api_guide_02.jpg"
alt="아이피(IP) 등록 아이콘">
</div>
<dl>
<dt>관리자 승인</dt>
<dd>승인 완료 시 문자 안내</dd>
</dl>
</div>
</li>
<li class="guide">
<p class="step_title">
STEP <span>04</span>
</p>
<div class="step_con">
<div class="icon">
<img src="/publish/images/api_intro_cont/api_guide_03.jpg"
alt="API 연동 아이콘">
</div>
<dl>
<dt>아이피(IP) 등록</dt>
<dd>
문자 API를 통해<br>문자 발송 서버 IP 등록
</dd>
</dt>
</div>
</li>
<li class="guide">
<p class="step_title">
STEP <span>05</span>
</p>
<div class="step_con">
<div class="icon">
<img src="/publish/images/api_intro_cont/api_guide_04.jpg"
alt="API 연동 아이콘">
</div>
<dl>
<dt>API 연동</dt>
<dd>
API 사용 매뉴얼 및 샘플링을<br>통해 누구나 손쉽게 연동 가능
</dd>
</dt>
</div>
</li>
</ul>
</div>
</div>
<!--// 사용 절차 설명-->
<div class="api_intro api_guide kakao_intro" id="tab5_2">
<div class="title">
<h3>카카오톡 연동(API) 사용 절차</h3>
</div>
<div class="title-line">
<div class="left-line"></div>
<div class="right-line"></div>
</div>
<div class="con">
<ul class="api_process_guide">
<li class="guide">
<a href="/web/user/sendNumberManage.do">
<p class="step_title">
STEP <span>01</span>
</p>
<div class="step_con">
<div class="icon">
<img src="/publish/images/api_intro_cont/api_guide_00.png"
alt="문자 API 신청 아이콘">
</div>
<dl>
<dt>발신프로필 사전 등록</dt>
<dd>
발송에 필요한 발신프로필<br>등록 필요
</dd>
</dl>
</div>
</a>
</li>
<li class="guide">
<p class="step_title">
STEP <span>02</span>
</p>
<div class="step_con">
<div class="icon">
<img src="/publish/images/api_intro_cont/api_guide_01.jpg"
alt="관리자 승인 아이콘">
</div>
<dl>
<dt>
카카오톡 연동<br>API 신청
</dt>
<dd>관리자 승인 후 사용 가능</dd>
</dl>
</div>
</li>
<li class="guide">
<p class="step_title">
STEP <span>03</span>
</p>
<div class="step_con">
<div class="icon">
<img src="/publish/images/api_intro_cont/api_guide_02.jpg"
alt="아이피(IP) 등록 아이콘">
</div>
<dl>
<dt>관리자 승인</dt>
<dd>승인 완료 시 문자 안내</dd>
</dl>
</div>
</li>
<li class="guide">
<p class="step_title">
STEP <span>04</span>
</p>
<div class="step_con">
<div class="icon">
<img src="/publish/images/api_intro_cont/api_guide_03.jpg"
alt="API 연동 아이콘">
</div>
<dl>
<dt>아이피(IP) 등록</dt>
<dd>
카카오톡 API를 통해<br>문자 발송 서버 IP 등록
</dd>
</dt>
</div>
</li>
<li class="guide">
<p class="step_title">
STEP <span>05</span>
</p>
<div class="step_con">
<div class="icon">
<img src="/publish/images/api_intro_cont/api_guide_04.jpg"
alt="API 연동 아이콘">
</div>
<dl>
<dt>API 연동</dt>
<dd>
API 사용 매뉴얼 및 샘플링을<br>통해 누구나 손쉽게 연동 가능
</dd>
</dt>
</div>
</li>
</ul>
</div>
</div>
<!--// 소개 내용-->
</div>
<div class="title-line">
<div class="left-line"></div>
<div class="right-line"></div>
</div>
<div class="con">
<ul class="api_process_guide">
<li class="guide">
<p class="step_title">STEP <span>01</span></p>
<div class="step_con">
<div class="icon"><img src="<c:url value='/publish/images/api_intro_cont/api_guide_01.jpg' />" alt="문자 API 신청 아이콘"></div>
<dl>
<dt>문자연동(API) 신청</dt>
<dd>관리자 승인 후 사용 가능</dd>
</dl>
</div>
</li>
<li class="guide">
<p class="step_title">STEP <span>02</span></p>
<div class="step_con">
<div class="icon"><img src="<c:url value='/publish/images/api_intro_cont/api_guide_02.jpg' />" alt="관리자 승인 아이콘"></div>
<dl>
<dt>관리자 승인</dt>
<dd>승인 완료 시 문자 안내</dd>
</dl>
</div>
</li>
<li class="guide">
<p class="step_title">STEP <span>03</span></p>
<div class="step_con">
<div class="icon"><img src="<c:url value='/publish/images/api_intro_cont/api_guide_03.jpg' />" alt="아이피(IP) 등록 아이콘"></div>
<dl>
<!-- <dt>아이피<span>(IP)</span> 등록</dt> -->
<dt>아이피(IP) 등록</dt>
<dd>문자연동(API)를 통해 문자 발송 서버 IP 등록</dd>
</dl>
</div>
</li>
<li class="guide">
<p class="step_title">STEP <span>04</span></p>
<div class="step_con">
<div class="icon"><img src="<c:url value='/publish/images/api_intro_cont/api_guide_04.jpg' />" alt="API 연동 아이콘"></div>
<dl>
<dt>API 연동</dt>
<dd>API 사용 매뉴얼 및 샘플링을 통해 누구나 손쉽게 연동 가능</dd>
</dt>
</div>
</li>
</ul>
</div>
</div>
<!--// 사용 절차 설명-->
<!--// 소개 내용-->
</div>
</div>
</div>

View File

@ -1,7 +1,7 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<ul class="info">
<li>- 문자온 사이트 및 API를 통해 전송된 문자 발송내역을 조회할 수 있습니다.</li>
<li>- 문자온 사이트 및 API를 통해 전송된 발송내역을 조회할 수 있습니다.</li>
<li>- 문자 발송내역은 날짜별로 조회되며, 최근 3개월까지만 조회 가능합니다.</li>
<li>- 발신번호별 문자 발송내역 조회 기능은 제공되지 않습니다.</li>
</ul>

View File

@ -0,0 +1,83 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<script type="text/javascript">
$(document).ready(function(){
// 현재 url 추출
var url = window.location.pathname;
// 현재 url에서 uri만 추출
var lastPart = url.split('/').pop();
console.log('lastPart : ', lastPart);
/*
* top 메뉴중 onclick에 있는 uri을 가져와
* 현재 호출된 페이지와 uri와 비교해서 맞다면
* active로 활성화 시킴
*/
$('.tabType1 .tab').each(function(index) {
var $btn = $(this).children("button");
var info = $btn.attr("data-info");
console.log('info : ', info);
console.log('lastPart : ', lastPart);
if (info.indexOf(lastPart) > -1) {
$(this).addClass('active');
}
});
// 페이지 이동 이벤트
$('.goSubPage').click(function(){
location.href=$(this).data('info');
});
});
// 기업회원 체크
function usrDeptChk(){
var usrDept = '${LoginVO.dept}';
return true;
/* 2023.09.25 JSPark 개인, 기업 모두 허용
// 기업회원 전용체크
if(usrDept != 'c'){
//기업회원 전용 메세지 팝업 띄워주기
$('#btnDeptPop').click();
return false;
}else{
return true;
}
*/
}
// 튤팁에서 취소 클릭 시 이벤트
function customPopup(){
// 현재 url 추출
var url = window.location.pathname;
// 현재 url에서 uri만 추출
var lastPart = url.split('/').pop();
// URL을 치고 들어왔을 경우 '문자 API소개' 페이지로 이동
if('appMgmt.do'.indexOf(lastPart) > -1){
location.href='<c:url value="/web/api/intrdView.do" />';
}
}
</script>
<!--사용안내 내용-->
<div class="pay_tab_wrap">
<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> --%>
</ul>
</div>

View File

@ -17,12 +17,17 @@ $(document).ready(function(){
* active로 활성화 시킴
*/
$('.tabType4 .tab').each(function(index) {
var idAttr = $(this).children("button").attr("id");
idAttr += '.do';
var $btn = $(this).children("button");
var id = $btn.attr("id");
if(idAttr.indexOf(lastPart) > -1){
$(this).addClass('active');
}
// 개발가이드 그룹
if (id === 'apiSpec' && /api.*Spec\.do$/.test(lastPart)) {
$(this).addClass('active');
}
// 나머지 기본 처리
else if (lastPart.indexOf(id) > -1) {
$(this).addClass('active');
}
});
// 페이지 이동 이벤트
@ -97,8 +102,8 @@ function customPopup(){
<button type="button" id="btnDeptPop" data-tooltip="popup01" style="display: none;"></button>
<ul class="tabType4">
<li class="tab"><button type="button" class="goPage" id="intrdView" data-info="<c:url value="/web/api/intrdView.do" />">문자연동(API)소개</button></li>
<li class="tab"><button type="button" class="goPage" id="apiSpec" data-info="<c:url value="/web/api/apiSpec.do" />">API 사용안내</button></li>
<li class="tab"><button type="button" class="goPage" id="intrdView" data-info="<c:url value="/web/api/intrdView.do" />">연동 안내</button></li>
<li class="tab"><button type="button" class="goPage" id="apiSpec" data-info="<c:url value="/web/api/apiSpec.do" />">개발 가이드</button></li>
<li class="tab"><button type="button" class="goPage" id="examDown" data-info="<c:url value="/web/api/examDown.do" />">예제 다운로드</button></li>
<li class="tab"><button type="button" class="goPage" id="appMgmt" data-info="<c:url value="/web/api/appMgmt.do" />" >신청/관리</button></li>
</ul>

View File

@ -1532,16 +1532,28 @@ 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>
<li><a href="<c:out value='/web/mjon/msgdata/excel/selectMsgExcelDataView.do'/>">대량문자</a></li>
<li><a href="<c:out value='/web/api/intrdView.do'/>">문자연동(API)</a></li>
<%-- <li><a href="<c:out value='/web/api/intrdView.do'/>">문자연동(API)</a></li> --%>
</ul>
</dd>
</dl>
<c:if test="${userCandidateYn eq 'Y' }">
<dl>
<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>
<li><a href="<c:out value='/web/mjon/kakao/friendstalk/kakaoFriendsTalkMsgDataView.do'/>">친구톡</a></li>
<li><a href="<c:out value='/web/mjon/kakao/stepinfo/selectKaKaoStepInfo.do'/>" >카카오톡 설정</a></li>
<%-- <li><a href="<c:out value='/web/mjon/kakao/alimtalk/kakaoAlimtalkIntrdView.do'/>" >알림톡 소개</a></li> --%>
<li><a href="<c:out value='/web/mjon/kakao/alimtalk/kakaotalkIntrdView.do'/>" >카카오톡 소개</a></li>
</ul>
</dd>
</dl>
<%-- <c:if test="${userCandidateYn eq 'Y' }">
<dl>
<dt><a href="<c:out value='/web/mjon/msgcampain/selectMsgDataView.do'/>" >선거문자</a></dt>
<dd>
@ -1551,16 +1563,13 @@ function actionLogin_end(){
</ul>
</dd>
</dl>
</c:if>
</c:if> --%>
<dl>
<dt><a href="<c:out value='/web/mjon/alimtalk/kakaoAlimtalkMsgDataView.do'/>">카톡전송</a></dt>
<dt><a href="/web/info/mjonInfo.do" >팩스발송</a></dt>
<dd>
<ul>
<li><a href="<c:out value='/web/mjon/alimtalk/kakaoAlimtalkMsgDataView.do'/>">알림톡</a></li>
<li><a href="<c:out value='/web/mjon/kakao/friendstalk/kakaoFriendsTalkMsgDataView.do'/>">친구톡</a></li>
<li><a href="<c:out value='/web/mjon/kakao/stepinfo/selectKaKaoStepInfo.do'/>" >카카오톡 설정</a></li>
<%-- <li><a href="<c:out value='/web/mjon/kakao/alimtalk/kakaoAlimtalkIntrdView.do'/>" >알림톡 소개</a></li> --%>
<li><a href="<c:out value='/web/mjon/kakao/alimtalk/kakaotalkIntrdView.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>
@ -1576,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>
@ -1608,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>
@ -1618,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>
@ -1647,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>
@ -1885,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

@ -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

@ -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">

Some files were not shown because too many files have changed in this diff Show More