From 6d5eae5670f1387ddc5464a391147f64d8c2b4c3 Mon Sep 17 00:00:00 2001 From: wyh Date: Mon, 31 Mar 2025 12:22:16 +0900 Subject: [PATCH] =?UTF-8?q?=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EA=B2=B0?= =?UTF-8?q?=EC=A0=9C=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/itn/com/cmm/util/KgmPayUtil.java | 1160 +++++++++++++++++ .../java/itn/com/cmm/util/MjonPayUtil.java | 231 ++++ .../java/itn/com/cmm/util/NicePayUtil.java | 515 ++++++++ .../mjo/event/service/MjonEventService.java | 17 +- .../service/impl/MjonEventServiceImpl.java | 125 ++ .../event/web/MjonEventPayV2Controller.java | 311 ++++- .../itn/let/mjo/pay/service/MjonKgmVO.java | 103 ++ .../itn/let/mjo/pay/service/MjonPayVO.java | 4 +- .../jsp/web/cop/nicepay/payRequestMber.jsp | 4 +- .../jsp/web/event/pay/EventPayView.jsp | 273 ++-- 10 files changed, 2591 insertions(+), 152 deletions(-) create mode 100644 src/main/java/itn/com/cmm/util/KgmPayUtil.java create mode 100644 src/main/java/itn/com/cmm/util/MjonPayUtil.java create mode 100644 src/main/java/itn/com/cmm/util/NicePayUtil.java create mode 100644 src/main/java/itn/let/mjo/pay/service/MjonKgmVO.java diff --git a/src/main/java/itn/com/cmm/util/KgmPayUtil.java b/src/main/java/itn/com/cmm/util/KgmPayUtil.java new file mode 100644 index 00000000..609d2331 --- /dev/null +++ b/src/main/java/itn/com/cmm/util/KgmPayUtil.java @@ -0,0 +1,1160 @@ +package itn.com.cmm.util; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.Random; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import egovframework.rte.fdl.idgnr.EgovIdGnrService; +import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper; +import itn.com.cmm.LoginVO; +import itn.com.utl.fcc.service.EgovStringUtil; +import itn.let.mjo.mjocommon.MjonCommon; +import itn.let.mjo.msgdata.service.MjonMsgDataService; +import itn.let.mjo.pay.service.MjonKgmVO; +import itn.let.mjo.pay.service.MjonPayService; +import itn.let.mjo.pay.service.MjonPayVO; +import itn.let.sym.site.service.EgovSiteManagerService; +import itn.let.sym.site.service.JoinSettingVO; +import itn.let.uss.umt.service.EgovUserManageService; +import itn.let.uss.umt.service.MberManageVO; +import itn.let.uss.umt.service.UserManageVO; +import itn.let.utl.user.service.MjonNoticeSendUtil; +import mup.mcash.module.common.McashCipher.McashCipher; + +@Component("kgmPayUtil") +public class KgmPayUtil { + + /** KG 모빌리언스 설정 */ + // CARD + @Value("#{globalSettings['Globals.pay.kgm.card.cnSvcid']}") + private String globalCnSvcid; + @Value("#{globalSettings['Globals.pay.kgm.card.payMode']}") + private String globalCnPayMode; + + // BANK + @Value("#{globalSettings['Globals.pay.kgm.bank.raSvcid']}") + private String globalRaSvcid; + @Value("#{globalSettings['Globals.pay.kgm.bank.payMode']}") + private String globalRaPayMode; + + // MOBILE + @Value("#{globalSettings['Globals.pay.kgm.mobile.mcSvcid']}") + private String globalMcSvcid; + @Value("#{globalSettings['Globals.pay.kgm.mobile.payMode']}") + private String globalMcPayMode; + + @Resource(name = "egovPgMoidGnrService") + private EgovIdGnrService idgenPgMoid; + + @Resource(name = "egovMjonCashIdGnrService") + private EgovIdGnrService idgenMjonCashId; + + @Resource(name = "egovMjonPointIdGnrService") + private EgovIdGnrService idgenMjonPointId; + + @Resource(name="MjonCommon") + private MjonCommon mjonCommon; + + @Resource(name = "mjonPayService") + private MjonPayService mjonPayService; + + @Resource(name = "userManageService") + private EgovUserManageService userManageService; + + @Resource(name = "MjonMsgDataService") + private MjonMsgDataService mjonMsgDataService; + + /** 사이트 설정 */ + @Resource(name = "egovSiteManagerService") + private EgovSiteManagerService egovSiteManagerService; + + /** 알림전송 Util */ + @Resource(name = "mjonNoticeSendUtil") + private MjonNoticeSendUtil mjonNoticeSendUtil; + + @Resource(name = "mjonPayUtil") + MjonPayUtil mjonPayUtil; + + public MjonKgmVO kgmCardEncode(HttpServletRequest request, String okUrl, String notiurl) { + + LoginVO loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser(); + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + + // Get Server Info + String kgmServerName = request.getServerName(); + String kgmPath = ""; + kgmPath = getKgServerPath(request); + + // Unique한 거래번호를 위한 값 추출 (밀리세컨드까지 조회) + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmssSSSS"); + String appr_dtm = dateFormat.format(new Date()); + + /*****************************************************************************************/ + String CASH_GB = "CN"; //[ 2byte 고정] 결제수단구분. "RA" 고정값. 수정불가! + + /***************************************************************************************** + - 필수 입력 항목 + *****************************************************************************************/ + String VER = "ALL_NEW"; //ALL_NEW : 버전설정 고정 + String CN_SVCID = globalCnSvcid.trim(); //서비스아이디 + String PAY_MODE = globalCnPayMode.trim(); //[ 2byte 고정] 연동시 테스트/실결제 구분 (00: 테스트결제-비과금, 10: 실거래결제-과금) + String Prdtprice = request.getParameter("Prdtprice");; //결제요청금액. + String Prdtnm = "캐시충전"; //상품명 ( 50byte 이내 ) + String Siteurl = kgmServerName; //가맹점도메인 + String Tradeid = CN_SVCID + "_" + appr_dtm + "_" + numberGen(6,1); //가맹점거래번호 //결제 요청 시 마다 unique한 값을 세팅해야 함. + String Okurl = kgmPath + okUrl; //성공화면처리URL : 결제완료통보페이지 full Url (예:http://www.mcash.co.kr/okurl.jsp ) + String Notiurl = kgmPath + notiurl; //결제처리URL : 결제 완료 후, 가맹점측 과금 등 처리할 가맹점측 URL + + /***************************************************************************************** + - 선택 입력 항목 + *****************************************************************************************/ + String Userid = userId; //가맹점결제자ID + String Failurl = ""; //[ 128byte 이하] 결제 실패 시 사용자에게 보여질 가맹점 측 실패 페이지. 결제처리에 대한 실패처리 안내를 가맹점에서 제어해야 할 경우만 사용. + + + /***************************************************************************************** + - 암호화 처리 (암호화 사용 시) + Cryptstring 항목은 금액변조에 대한 확인용으로 반드시 아래와 같이 문자열을 생성하여야 합니다. + + 주) 암호화 스트링은 가맹점에서 전달하는 거래번호로 부터 추출되어 사용되므로 + 암호화에 이용한 거래번호가 변조되어 전달될 경우 복호화 실패로 결제 진행이 불가합니다. + *****************************************************************************************/ + String Cryptyn = "Y"; //Y: 암호화 사용, N: 암호화 미사용 + String Cryptstring = ""; //암호화 사용 시 암호화된 스트링 + + if ("Y".equals(Cryptyn)) { + Cryptstring = Prdtprice + Okurl; //금액변조확인 (결제요청금액 + Okurl) + Okurl = McashCipher.encodeString(Okurl, Tradeid); + Failurl = McashCipher.encodeString(Failurl, Tradeid); + Notiurl = McashCipher.encodeString(Notiurl, Tradeid); + Prdtprice = McashCipher.encodeString(Prdtprice, Tradeid); + Cryptstring = McashCipher.encodeString(Cryptstring, Tradeid); + } + + MjonKgmVO mjonKgmVO = new MjonKgmVO(); + // 필수 + mjonKgmVO.setCash_gb(CASH_GB); + mjonKgmVO.setRa_svcid(CN_SVCID); + mjonKgmVO.setPay_mode(PAY_MODE); + mjonKgmVO.setPrdtnm(Prdtnm); + mjonKgmVO.setSiteurl(Siteurl); + mjonKgmVO.setTradeid(Tradeid); + + mjonKgmVO.setPrdtprice(Prdtprice); + mjonKgmVO.setUserid(Userid); + mjonKgmVO.setOkurl(Okurl); + mjonKgmVO.setNotiurl(Notiurl); + mjonKgmVO.setCryptstring(Cryptstring); + + return mjonKgmVO; + } + + public MjonPayVO kgmCardNotiUrl(HttpServletResponse response, HttpServletRequest request) { + //크롬 SameSite정책 방지 - 도메인이 다른 타사로 이동 시 크롬 정책에 의해 세션 유실이 일어나는 경우가 있는데, 이를 방지하기 위해 samesite 보안을 none처리 + response.setHeader("Set-Cookie", "mberSession=mberSession; Secure; SameSite=None"); + + /*****************************************************************************************/ + MjonPayVO mjonPayVO = new MjonPayVO(); + String rtnMsg = ""; + String CASH_GB = request.getParameter("CASH_GB"); // 결제수단(CN) + String Svcid = request.getParameter("Svcid"); // 서비스ID + String Mobilid = request.getParameter("Mobilid"); // 모빌리언스 거래번호 + String Signdate = request.getParameter("Signdate"); // 결제일자 + String Tradeid = request.getParameter("Tradeid"); // 상점거래번호 + String Mrchid = request.getParameter("Mrchid"); // 상점ID + String Prdtnm = request.getParameter("Prdtnm"); // 상품명 + String Prdtprice = request.getParameter("Prdtprice"); // 상품가격 + String Userid = request.getParameter("Userid"); // 사용자ID + String Resultcd = request.getParameter("Resultcd"); // 결과코드 + String Resultmsg = request.getParameter("Resultmsg"); // 결과메세지 + String Payeremail = request.getParameter("Payeremail"); /* 결제자 이메일 */ + + String Cardcode = request.getParameter("Cardcode"); /* 결제 카드코드 */ + String Cardname = request.getParameter("Cardname"); /* 결제 카드사명 */ + String chkValue = request.getParameter("chkValue"); /* 결과값 검증 hash데이터 */ + String spayMethod = request.getParameter("Paymethod"); /* 지불방법 (간편결제 시에만 응답) */ + String MSTR = request.getParameter("MSTR"); //[2000byte 이하] 가맹점 전달 콜백변수 + + + System.out.println("#############################################################"); + System.out.println("KG MOBILIANS NotiUrl - CARD Tradeid : " + Tradeid); + System.out.println("KG MOBILIANS NotiUrl - CARD MSTR : " + MSTR); + System.out.println("KG MOBILIANS NotiUrl - CARD SpayMethod : " + spayMethod); + + String cpChkValue = ""; + cpChkValue = "Mobilid="+ Mobilid + + "&Mrchid=null"+ + "&Svcid="+ Svcid + + "&Tradeid="+ Tradeid + + "&Signdate="+ Signdate + + "&Prdtprice="+ Prdtprice; + String encChkValue = McashCipher.encodeString(cpChkValue, Tradeid); + System.out.println("KG MOBILIANS NotiUrl - CARD chkValue : " + chkValue); + System.out.println("KG MOBILIANS NotiUrl - CARD encChkValue : " + encChkValue); + System.out.println("KG MOBILIANS NotiUrl - CARD getIsKgmServerIp : " + getIsKgmServerIp(request)); // Kgm Ip Check + + try { + // Step 1. Tid로 존재여부 체크 + int tidCnt = mjonPayService.selectPayCountByTid(Tradeid); + if (tidCnt > 0) { + // 저장된 데이터 있을경우 + rtnMsg = "SUCCESS"; + + System.out.println("#############################################################"); + System.out.println("KG MOBILIANS NotiUrl - BANK Tradeid : " + Tradeid); + System.out.println("KG MOBILIANS NotiUrl - BANK returnMsg2 : " + rtnMsg); + } else if (tidCnt == 0) { + // Check1. KG모빌리언스 호출아이피 체크 + if (!getIsKgmServerIp(request)) { + System.out.println("#############################################################"); + System.out.println("KG MOBILIANS NotiUrl - MOBILE : NotiUrl 호출 IP가 KG모빌리언스 결제서버군이 아니어서 결제오류 처리"); + + Resultcd = "9998"; + Resultmsg = "NotiUrl 호출 IP가 KG모빌리언스 결제서버군이 아니어서 결제오류 처리. KG모빌리언스 정상결제 여부 확인후, 고객님께 안내후 결제취소해주세요."; + + try { + // 법인폰 알람여부 체크 + JoinSettingVO joinSettingVO = new JoinSettingVO(); + joinSettingVO = egovSiteManagerService.selectAdminNotiDetail(); + // SMS 체크 + if (joinSettingVO != null && joinSettingVO.getSmsNoti().equals("Y")) { + // 스미싱의심 SMS 알림전송 + mjonNoticeSendUtil.smishingSmsNoticeSend("NotiUrl 호출 IP가 KG모빌리언스 결제서버군이 아니어서 결제오류 처리", Userid, ""); + } + + // SLACK 체크 + if (joinSettingVO != null && joinSettingVO.getSlackNoti().equals("Y")) { + // Slack 메시지 발송(단순본문) + String msg = "[문자온] " + Userid + "님 결제건 알림 => NotiUrl 호출 IP가 KG모빌리언스 결제서버군이 아니어서 결제오류 처리했습니다. KG모빌리언스 에는 정상결제 됐을수 있습니다. https://cp.mcash.co.kr/mcht 에서 정상결제 확인후, 고객님께 안내후, 결제취소해주세요."; + mjonCommon.sendSimpleSlackMsg(msg); + } + } catch (Exception e) { + System.out.println("#############################################################"); + System.out.println("KG MOBILIANS NotiUrl - MOBILE : NotiUrl 호출 IP가 KG모빌리언스 결제서버군이 아니어서 결제오류 처리 => SMS, 슬랙 알림 오류"); + } + } + // 저장 Start + // 사용자 정보 + String mberNm = ""; + String moblphonNo = ""; + String mberEmailAdres = ""; + MberManageVO mberManageVO = new MberManageVO(); + mberManageVO.setMberId(Userid); + MberManageVO userInfo = userManageService.selectUserInfo(mberManageVO); + if (userInfo != null) { + mberNm = userInfo.getMberNm(); + moblphonNo = userInfo.getMoblphonNo(); + mberEmailAdres = userInfo.getMberEmailAdres(); + } + + mjonPayVO.setResultCd(Resultcd); + mjonPayVO.setResultMsg(Resultmsg); + mjonPayVO.setAutoBillKey(""); + mjonPayVO.setCashGb(CASH_GB); + mjonPayVO.setAutoYn(""); + mjonPayVO.setCommId(""); + mjonPayVO.setMobileId(Mobilid); + mjonPayVO.setMrchId(Mrchid); + mjonPayVO.setPno(""); + mjonPayVO.setPrdtNm(Prdtnm); + mjonPayVO.setPrdtPrice(Prdtprice); + mjonPayVO.setSignDate(Signdate); + mjonPayVO.setSvcId(Svcid); + mjonPayVO.setTradeId(Tradeid); + mjonPayVO.setUserId(Userid); + mjonPayVO.setUserKey(""); + mjonPayVO.setMcEzKey(""); + + // 추가정보(mj_pg) + String pgStatus = ""; + if("0000".equals(Resultcd)) { + pgStatus = "1"; // 1:결제완료 + }else { + pgStatus = "4"; // 4.결제오류 + } + mjonPayVO.setPgStatus(pgStatus); // 결제 상태 - 0:입금대기, 1:결제완료, 4.결제오류, 9:취소완료 + mjonPayVO.setRcptType("9"); // 현금영수증 유형-0:미발행, 1:소득공제, 2:지출증빙, 9:세금계산서[PG에 없는 값] + mjonPayVO.setResultCode(Resultcd); + mjonPayVO.setResultMsg(Resultmsg); + mjonPayVO.setAmt(Prdtprice); // 결제금액 + mjonPayVO.setPayMethod("BANK"); // 결제방법 + mjonPayVO.setSpayMethod(""); // 간편결제 결제방법 + mjonPayVO.setSpayDiv(""); // 간편결제분류 + + mjonPayVO.setPgCode("KGM"); // + mjonPayVO.setGoodsName(Prdtnm); // + mjonPayVO.setPhone(""); // 모바일 + mjonPayVO.setMobile(""); // 모바일 + mjonPayVO.setPayerEmail(Payeremail); + mjonPayVO.setTid(Tradeid); // Tid + mjonPayVO.setMid(Svcid); // Mid = Svcid + + // 회원정보 + mjonPayVO.setBuyerName(mberNm); + mjonPayVO.setBuyerTel(moblphonNo); + mjonPayVO.setBuyerEmail(mberEmailAdres); + mjonPayVO.setEmail(mberEmailAdres); // 이메일(회원정보) + + // 추가 + + + // 상점 주문번호 결제 완료 후 생성 + mjonPayVO.setMoid(idgenPgMoid.getNextStringId()); + + //세금 값 넣기 + mjonPayVO = this.setKgmTexV2VO(mjonPayVO); + + //cash 값 넣기 + mjonPayVO = this.setKgmCashVO(mjonPayVO); + + //point 값 넣기 + mjonPayVO = this.setKgmPointVO(mjonPayVO); + + rtnMsg = "SUCCESS"; + } + }catch(Exception e) { + rtnMsg = "FAIL"; + + System.out.println("#############################################################"); + System.out.println("KG MOBILIANS NotiUrl - BANK Tradeid : " + Tradeid); + System.out.println("KG MOBILIANS NotiUrl - BANK returnMsg : " + rtnMsg); + System.out.println("KG MOBILIANS NotiUrl - BANK e.getMessage() : " + e.getMessage()); + } + + mjonPayVO.setRtnMsg(rtnMsg); + + return mjonPayVO; + } + + public MjonKgmVO kgmBankEncode(HttpServletRequest request, String okUrl, String notiurl) { + + LoginVO loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser(); + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + + // Get Server Info + String kgmServerName = request.getServerName(); + String kgmPath = ""; + kgmPath = getKgServerPath(request); + + // Unique한 거래번호를 위한 값 추출 (밀리세컨드까지 조회) + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmssSSSS"); + String appr_dtm = dateFormat.format(new Date()); + + /*****************************************************************************************/ + String CASH_GB = "RA"; //[ 2byte 고정] 결제수단구분. "RA" 고정값. 수정불가! + + /***************************************************************************************** + - 필수 입력 항목 + *****************************************************************************************/ + String RA_SVCID = globalRaSvcid.trim(); //서비스아이디 + String PAY_MODE = globalRaPayMode.trim(); //[ 2byte 고정] 연동시 테스트/실결제 구분 (00: 테스트결제-비과금, 10: 실거래결제-과금) + String Prdtprice = request.getParameter("Prdtprice");; //결제요청금액. + String Prdtnm = "캐시충전"; //상품명 ( 50byte 이내 ) + String Siteurl = kgmServerName; //가맹점도메인 + String Tradeid = RA_SVCID + "_" + appr_dtm + "_" + numberGen(6,1); //가맹점거래번호 //결제 요청 시 마다 unique한 값을 세팅해야 함. + String Okurl = kgmPath + okUrl; //성공화면처리URL : 결제완료통보페이지 full Url (예:http://www.mcash.co.kr/okurl.jsp ) + String Notiurl = kgmPath + notiurl; //결제처리URL : 결제 완료 후, 가맹점측 과금 등 처리할 가맹점측 URL + + /***************************************************************************************** + - 선택 입력 항목 + *****************************************************************************************/ + String Userid = userId; //가맹점결제자ID + String Failurl = ""; //[ 128byte 이하] 결제 실패 시 사용자에게 보여질 가맹점 측 실패 페이지. 결제처리에 대한 실패처리 안내를 가맹점에서 제어해야 할 경우만 사용. + + + /***************************************************************************************** + - 암호화 처리 (암호화 사용 시) + Cryptstring 항목은 금액변조에 대한 확인용으로 반드시 아래와 같이 문자열을 생성하여야 합니다. + + 주) 암호화 스트링은 가맹점에서 전달하는 거래번호로 부터 추출되어 사용되므로 + 암호화에 이용한 거래번호가 변조되어 전달될 경우 복호화 실패로 결제 진행이 불가합니다. + *****************************************************************************************/ + String Cryptyn = "Y"; //Y: 암호화 사용, N: 암호화 미사용 + String Cryptstring = ""; //암호화 사용 시 암호화된 스트링 + + if ("Y".equals(Cryptyn)) { + Cryptstring = Prdtprice + Okurl; //금액변조확인 (결제요청금액 + Okurl) + Okurl = McashCipher.encodeString(Okurl, Tradeid); + Failurl = McashCipher.encodeString(Failurl, Tradeid); + Notiurl = McashCipher.encodeString(Notiurl, Tradeid); + Prdtprice = McashCipher.encodeString(Prdtprice, Tradeid); + Cryptstring = McashCipher.encodeString(Cryptstring, Tradeid); + } + + MjonKgmVO mjonKgmVO = new MjonKgmVO(); + // 필수 + mjonKgmVO.setCash_gb(CASH_GB); + mjonKgmVO.setRa_svcid(RA_SVCID); + mjonKgmVO.setPay_mode(PAY_MODE); + mjonKgmVO.setPrdtnm(Prdtnm); + mjonKgmVO.setSiteurl(Siteurl); + mjonKgmVO.setTradeid(Tradeid); + + mjonKgmVO.setPrdtprice(Prdtprice); + mjonKgmVO.setUserid(Userid); + mjonKgmVO.setOkurl(Okurl); + mjonKgmVO.setNotiurl(Notiurl); + mjonKgmVO.setCryptstring(Cryptstring); + + return mjonKgmVO; + } + + public MjonPayVO kgmBankNotiUrl(HttpServletResponse response, HttpServletRequest request) { + //크롬 SameSite정책 방지 - 도메인이 다른 타사로 이동 시 크롬 정책에 의해 세션 유실이 일어나는 경우가 있는데, 이를 방지하기 위해 samesite 보안을 none처리 + response.setHeader("Set-Cookie", "mberSession=mberSession; Secure; SameSite=None"); + + /*****************************************************************************************/ + MjonPayVO mjonPayVO = new MjonPayVO(); + String rtnMsg = ""; + String CASH_GB = "RA"; //[ 2byte 고정] 결제수단구분. "RA" 고정값. 수정불가! + String Svcid = request.getParameter("Svcid"); //[ 12byte 고정] 서비스ID + String Mobilid = request.getParameter("Mobilid"); //[ 15byte 이하] 모빌리언스 거래번호 + String Signdate = request.getParameter("Signdate"); //[ 14byte 이하] 결제일자 + String Tradeid = request.getParameter("Tradeid"); //[ 40byte 이하] 상점거래번호 + String Mrchid = request.getParameter("Mrchid"); // 상점ID + String Prdtnm = request.getParameter("Prdtnm"); //[ 50byte 이하] 상품명 + String Prdtprice = request.getParameter("Prdtprice"); //[ 10byte 이하] 상품가격 + String Userid = request.getParameter("Userid"); //[ 20byte 이하] 사용자ID + String Resultcd = request.getParameter("Resultcd"); //[ 4byte 고정] 결과코드 + String Resultmsg = request.getParameter("Resultmsg"); //[ 100byte 이하] 결과메세지 + String Payeremail = request.getParameter("Payeremail"); /* 결제자 이메일 */ + + String Banknm = request.getParameter("Banknm"); /* 은행명 */ + + System.out.println("#############################################################"); + System.out.println("KG MOBILIANS NotiUrl - BANK Tradeid : " + Tradeid); + System.out.println("KG MOBILIANS NotiUrl - BANK Banknm : " + Banknm); + System.out.println("KG MOBILIANS NotiUrl - BANK getIsKgmServerIp : " + getIsKgmServerIp(request)); // Kgm Ip Check + + try { + // Step 1. Tid로 존재여부 체크 + int tidCnt = mjonPayService.selectPayCountByTid(Tradeid); + if (tidCnt > 0) { + // 저장된 데이터 있을경우 + rtnMsg = "SUCCESS"; + + System.out.println("#############################################################"); + System.out.println("KG MOBILIANS NotiUrl - BANK Tradeid : " + Tradeid); + System.out.println("KG MOBILIANS NotiUrl - BANK returnMsg2 : " + rtnMsg); + } else if (tidCnt == 0) { + // Check1. KG모빌리언스 호출아이피 체크 + if (!getIsKgmServerIp(request)) { + System.out.println("#############################################################"); + System.out.println("KG MOBILIANS NotiUrl - MOBILE : NotiUrl 호출 IP가 KG모빌리언스 결제서버군이 아니어서 결제오류 처리"); + + Resultcd = "9998"; + Resultmsg = "NotiUrl 호출 IP가 KG모빌리언스 결제서버군이 아니어서 결제오류 처리. KG모빌리언스 정상결제 여부 확인후, 고객님께 안내후 결제취소해주세요."; + + try { + // 법인폰 알람여부 체크 + JoinSettingVO joinSettingVO = new JoinSettingVO(); + joinSettingVO = egovSiteManagerService.selectAdminNotiDetail(); + // SMS 체크 + if (joinSettingVO != null && joinSettingVO.getSmsNoti().equals("Y")) { + // 스미싱의심 SMS 알림전송 + mjonNoticeSendUtil.smishingSmsNoticeSend("NotiUrl 호출 IP가 KG모빌리언스 결제서버군이 아니어서 결제오류 처리", Userid, ""); + } + + // SLACK 체크 + if (joinSettingVO != null && joinSettingVO.getSlackNoti().equals("Y")) { + // Slack 메시지 발송(단순본문) + String msg = "[문자온] " + Userid + "님 결제건 알림 => NotiUrl 호출 IP가 KG모빌리언스 결제서버군이 아니어서 결제오류 처리했습니다. KG모빌리언스 에는 정상결제 됐을수 있습니다. https://cp.mcash.co.kr/mcht 에서 정상결제 확인후, 고객님께 안내후, 결제취소해주세요."; + mjonCommon.sendSimpleSlackMsg(msg); + } + } catch (Exception e) { + System.out.println("#############################################################"); + System.out.println("KG MOBILIANS NotiUrl - MOBILE : NotiUrl 호출 IP가 KG모빌리언스 결제서버군이 아니어서 결제오류 처리 => SMS, 슬랙 알림 오류"); + } + } + // 저장 Start + // 사용자 정보 + String mberNm = ""; + String moblphonNo = ""; + String mberEmailAdres = ""; + MberManageVO mberManageVO = new MberManageVO(); + mberManageVO.setMberId(Userid); + MberManageVO userInfo = userManageService.selectUserInfo(mberManageVO); + if (userInfo != null) { + mberNm = userInfo.getMberNm(); + moblphonNo = userInfo.getMoblphonNo(); + mberEmailAdres = userInfo.getMberEmailAdres(); + } + + mjonPayVO.setResultCd(Resultcd); + mjonPayVO.setResultMsg(Resultmsg); + mjonPayVO.setAutoBillKey(""); + mjonPayVO.setCashGb(CASH_GB); + mjonPayVO.setAutoYn(""); + mjonPayVO.setCommId(""); + mjonPayVO.setMobileId(Mobilid); + mjonPayVO.setMrchId(Mrchid); + mjonPayVO.setPno(""); + mjonPayVO.setPrdtNm(Prdtnm); + mjonPayVO.setPrdtPrice(Prdtprice); + mjonPayVO.setSignDate(Signdate); + mjonPayVO.setSvcId(Svcid); + mjonPayVO.setTradeId(Tradeid); + mjonPayVO.setUserId(Userid); + mjonPayVO.setUserKey(""); + mjonPayVO.setMcEzKey(""); + + // 추가정보(mj_pg) + String pgStatus = ""; + if("0000".equals(Resultcd)) { + pgStatus = "1"; // 1:결제완료 + }else { + pgStatus = "4"; // 4.결제오류 + } + mjonPayVO.setPgStatus(pgStatus); // 결제 상태 - 0:입금대기, 1:결제완료, 4.결제오류, 9:취소완료 + mjonPayVO.setRcptType("9"); // 현금영수증 유형-0:미발행, 1:소득공제, 2:지출증빙, 9:세금계산서[PG에 없는 값] + mjonPayVO.setResultCode(Resultcd); + mjonPayVO.setResultMsg(Resultmsg); + mjonPayVO.setAmt(Prdtprice); // 결제금액 + mjonPayVO.setPayMethod("BANK"); // 결제방법 + mjonPayVO.setSpayMethod(""); // 간편결제 결제방법 + mjonPayVO.setSpayDiv(""); // 간편결제분류 + + mjonPayVO.setPgCode("KGM"); // + mjonPayVO.setGoodsName(Prdtnm); // + mjonPayVO.setPhone(""); // 모바일 + mjonPayVO.setMobile(""); // 모바일 + mjonPayVO.setPayerEmail(Payeremail); + mjonPayVO.setTid(Tradeid); // Tid + mjonPayVO.setMid(Svcid); // Mid = Svcid + + // 회원정보 + mjonPayVO.setBuyerName(mberNm); + mjonPayVO.setBuyerTel(moblphonNo); + mjonPayVO.setBuyerEmail(mberEmailAdres); + mjonPayVO.setEmail(mberEmailAdres); // 이메일(회원정보) + + // 추가 + mjonPayVO.setBankName(Banknm); // 은행명 + + + // 상점 주문번호 결제 완료 후 생성 + mjonPayVO.setMoid(idgenPgMoid.getNextStringId()); + + //세금 값 넣기 + mjonPayVO = this.setKgmTexV2VO(mjonPayVO); + + //cash 값 넣기 + mjonPayVO = this.setKgmCashVO(mjonPayVO); + + //point 값 넣기 + mjonPayVO = this.setKgmPointVO(mjonPayVO); + + rtnMsg = "SUCCESS"; + } + }catch(Exception e) { + rtnMsg = "FAIL"; + + System.out.println("#############################################################"); + System.out.println("KG MOBILIANS NotiUrl - BANK Tradeid : " + Tradeid); + System.out.println("KG MOBILIANS NotiUrl - BANK returnMsg : " + rtnMsg); + System.out.println("KG MOBILIANS NotiUrl - BANK e.getMessage() : " + e.getMessage()); + } + + mjonPayVO.setRtnMsg(rtnMsg); + + return mjonPayVO; + } + + + public MjonKgmVO kgmMobileEncode(HttpServletRequest request + , String okUrl + , String notiurl) { + + LoginVO loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser(); + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + + // Get Server Info + String kgmServerName = request.getServerName(); + String kgmPath = ""; + kgmPath = getKgServerPath(request); + + // Unique한 거래번호를 위한 값 추출 (밀리세컨드까지 조회) + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmssSSSS"); + String appr_dtm = dateFormat.format(new Date()); + + /*****************************************************************************************/ + String CASH_GB = "MC"; //[ 2byte 고정] 결제수단구분. "RA" 고정값. 수정불가! + + /***************************************************************************************** + - 필수 입력 항목 + *****************************************************************************************/ + String MC_SVCID = globalMcSvcid.trim(); //[ 12byte 고정] 모빌리언스에서 부여한 서비스ID (12byte 숫자 형식) + String PAY_MODE = globalMcPayMode.trim(); //[ 2byte 고정] 연동시 테스트/실결제 구분 (00: 테스트결제-비과금, 10: 실거래결제-과금) + String Prdtprice = request.getParameter("Prdtprice"); //결제요청금액. + String Prdtnm = "캐시충전"; //상품명 ( 50byte 이내 ) + String Siteurl = kgmServerName; //가맹점도메인 + String Tradeid = MC_SVCID + "_" + appr_dtm + "_" + numberGen(6,1); //[4byte 이상, 40byte 이하] 가맹점거래번호. 결제 요청 시 마다 unique한 값을 세팅해야 함. //해당 샘플에는 테스트를 위해 {가맹점 서비스ID + 요청일시} 형식으로 세팅하였음. + String Okurl = kgmPath + okUrl; //성공화면처리URL : 결제완료통보페이지 full Url (예:http://www.mcash.co.kr/okurl.jsp ) + String Notiurl = kgmPath + notiurl; //결제처리URL : 결제 완료 후, 가맹점측 과금 등 처리할 가맹점측 URL + + /***************************************************************************************** + - 선택 입력 항목 + *****************************************************************************************/ + String Userid = userId; //가맹점결제자ID + String Failurl = ""; //[ 128byte 이하] 결제 실패 시 사용자에게 보여질 가맹점 측 실패 페이지. 결제처리에 대한 실패처리 안내를 가맹점에서 제어해야 할 경우만 사용. + + + /***************************************************************************************** + - 암호화 처리 (암호화 사용 시) + Cryptstring 항목은 금액변조에 대한 확인용으로 반드시 아래와 같이 문자열을 생성하여야 합니다. + + 주) 암호화 스트링은 가맹점에서 전달하는 거래번호로 부터 추출되어 사용되므로 + 암호화에 이용한 거래번호가 변조되어 전달될 경우 복호화 실패로 결제 진행이 불가합니다. + *****************************************************************************************/ + String Cryptyn = "Y"; //Y: 암호화 사용, N: 암호화 미사용 + String Cryptstring = ""; //암호화 사용 시 암호화된 스트링 + + if ("Y".equals(Cryptyn)) { + Cryptstring = Prdtprice + Okurl; //금액변조확인 (결제요청금액 + Okurl) + Okurl = McashCipher.encodeString(Okurl, Tradeid); + Failurl = McashCipher.encodeString(Failurl, Tradeid); + Notiurl = McashCipher.encodeString(Notiurl, Tradeid); + Prdtprice = McashCipher.encodeString(Prdtprice, Tradeid); + Cryptstring = McashCipher.encodeString(Cryptstring, Tradeid); + } + + MjonKgmVO mjonKgmVO = new MjonKgmVO(); + // 필수 + mjonKgmVO.setCash_gb(CASH_GB); + mjonKgmVO.setMc_svcid(MC_SVCID); + mjonKgmVO.setPay_mode(PAY_MODE); + mjonKgmVO.setPrdtnm(Prdtnm); + mjonKgmVO.setSiteurl(Siteurl); + mjonKgmVO.setTradeid(Tradeid); + + mjonKgmVO.setUserid(Userid); + mjonKgmVO.setOkurl(Okurl); + mjonKgmVO.setNotiurl(Notiurl); + mjonKgmVO.setPrdtprice(Prdtprice); + mjonKgmVO.setCryptstring(Cryptstring); + + return mjonKgmVO; + } + + public MjonPayVO kgmMobileNotiUrl(HttpServletResponse response + , HttpServletRequest request + ) throws Exception { + //크롬 SameSite정책 방지 - 도메인이 다른 타사로 이동 시 크롬 정책에 의해 세션 유실이 일어나는 경우가 있는데, 이를 방지하기 위해 samesite 보안을 none처리 + response.setHeader("Set-Cookie", "mberSession=mberSession; Secure; SameSite=None"); + + /*****************************************************************************************/ + MjonPayVO mjonPayVO = new MjonPayVO(); + String rtnMsg = ""; + String CASH_GB = "MC"; //[ 2byte 고정] 결제수단구분. "MC" 고정값. 수정불가! + String Svcid = request.getParameter("Svcid"); /* 서비스아이디 */ + String Mobilid = request.getParameter("Mobilid"); /* 모빌리언스 거래번호 */ + String Signdate = request.getParameter("Signdate"); /* 결제일자 */ + String Tradeid = request.getParameter("Tradeid"); /* 상점거래번호 */ + String Mrchid = request.getParameter("Mrchid"); //[ 8byte 고정] 상점ID + String Prdtnm = request.getParameter("Prdtnm"); /* 상품명 */ + String Prdtprice = request.getParameter("Prdtprice"); /* 상품가격 */ + String Userid = request.getParameter("Userid"); /* 사용자아이디*/ + String Resultcd = request.getParameter("Resultcd"); /* 결과코드 */ + String Resultmsg = request.getParameter("Resultmsg"); //[ 100byte 이하] 결과메세지 + String Payeremail = request.getParameter("Payeremail"); /* 결제자 이메일 */ + + String MSTR = request.getParameter("MSTR"); //[2000byte 이하] 가맹점 전달 콜백변수 + String Commid = request.getParameter("Commid"); //[ 3byte 고정] 이통사 + String chkValue = request.getParameter("chkValue"); /* 결과값 검증 hash데이터 */ + String AutoBillKey = request.getParameter("AutoBillKey"); //[ 15byte 이하] 자동결제 최초등록키 + String No = request.getParameter("No"); //[ 11byte 이하] 폰번호 + String USERKEY = request.getParameter("USERKEY"); //[ 15byte 이하] 휴대폰정보(이통사, 휴대폰번호, 주민번호) 대체용 USERKEY + String MC_EZ_KEY = request.getParameter("Ezkey"); //[ 20byte 고정] 간소화결제 사용자키 + + System.out.println("#############################################################"); + System.out.println("KG MOBILIANS NotiUrl - MOBILE Tradeid : " + Tradeid); + System.out.println("KG MOBILIANS NotiUrl - MOBILE getIsKgmServerIp : " + getIsKgmServerIp(request)); // Kgm Ip Check + try { + // Step 1. Tid로 존재여부 체크 + int tidCnt = mjonPayService.selectPayCountByTid(Tradeid); + if (tidCnt > 0) { + // 저장된 데이터 있을경우 + rtnMsg = "SUCCESS"; + + System.out.println("#############################################################"); + System.out.println("KG MOBILIANS NotiUrl - MOBILE Tradeid : " + Tradeid); + System.out.println("KG MOBILIANS NotiUrl - MOBILE returnMsg2 : " + rtnMsg); + }else if (tidCnt == 0) { + // Check1. KG모빌리언스 호출아이피 체크 + if (!getIsKgmServerIp(request)) { + System.out.println("#############################################################"); + System.out.println("KG MOBILIANS NotiUrl - MOBILE : NotiUrl 호출 IP가 KG모빌리언스 결제서버군이 아니어서 결제오류 처리"); + + Resultcd = "9998"; + Resultmsg = "NotiUrl 호출 IP가 KG모빌리언스 결제서버군이 아니어서 결제오류 처리. KG모빌리언스 정상결제 여부 확인후, 고객님께 안내후 결제취소해주세요."; + + try { + // 법인폰 알람여부 체크 + JoinSettingVO joinSettingVO = new JoinSettingVO(); + joinSettingVO = egovSiteManagerService.selectAdminNotiDetail(); + // SMS 체크 + if (joinSettingVO != null && joinSettingVO.getSmsNoti().equals("Y")) { + // 스미싱의심 SMS 알림전송 + mjonNoticeSendUtil.smishingSmsNoticeSend("NotiUrl 호출 IP가 KG모빌리언스 결제서버군이 아니어서 결제오류 처리", Userid, ""); + } + + // SLACK 체크 + if (joinSettingVO != null && joinSettingVO.getSlackNoti().equals("Y")) { + // Slack 메시지 발송(단순본문) + String msg = "[문자온] " + Userid + "님 결제건 알림 => NotiUrl 호출 IP가 KG모빌리언스 결제서버군이 아니어서 결제오류 처리했습니다. KG모빌리언스 에는 정상결제 됐을수 있습니다. https://cp.mcash.co.kr/mcht 에서 정상결제 확인후, 고객님께 안내후, 결제취소해주세요."; + mjonCommon.sendSimpleSlackMsg(msg); + } + } catch (Exception e) { + System.out.println("#############################################################"); + System.out.println("KG MOBILIANS NotiUrl - MOBILE : NotiUrl 호출 IP가 KG모빌리언스 결제서버군이 아니어서 결제오류 처리 => SMS, 슬랙 알림 오류"); + } + } + + // 저장 Start + // 사용자 정보 + String mberNm = ""; + String moblphonNo = ""; + String mberEmailAdres = ""; + MberManageVO mberManageVO = new MberManageVO(); + mberManageVO.setMberId(Userid); + MberManageVO userInfo = userManageService.selectUserInfo(mberManageVO); + if (userInfo != null) { + mberNm = userInfo.getMberNm(); + moblphonNo = userInfo.getMoblphonNo(); + mberEmailAdres = userInfo.getMberEmailAdres(); + } + + mjonPayVO.setResultCd(Resultcd); + mjonPayVO.setResultMsg(Resultmsg); + mjonPayVO.setAutoBillKey(AutoBillKey); + mjonPayVO.setCashGb(CASH_GB); + mjonPayVO.setAutoYn(""); + mjonPayVO.setCommId(Commid); + mjonPayVO.setMobileId(Mobilid); + mjonPayVO.setMrchId(Mrchid); + mjonPayVO.setPno(No); + mjonPayVO.setPrdtNm(Prdtnm); + mjonPayVO.setPrdtPrice(Prdtprice); + mjonPayVO.setSignDate(Signdate); + mjonPayVO.setSvcId(Svcid); + mjonPayVO.setTradeId(Tradeid); + mjonPayVO.setUserId(Userid); + mjonPayVO.setUserKey(USERKEY); + mjonPayVO.setMcEzKey(MC_EZ_KEY); + + // 추가정보(mj_pg) + String pgStatus = ""; + if("0000".equals(Resultcd)) { + pgStatus = "1"; // 1:결제완료 + }else { + pgStatus = "4"; // 4.결제오류 + } + mjonPayVO.setPgStatus(pgStatus); // 결제 상태 - 0:입금대기, 1:결제완료, 4.결제오류, 9:취소완료 + mjonPayVO.setRcptType("9"); // 현금영수증 유형-0:미발행, 1:소득공제, 2:지출증빙, 9:세금계산서[PG에 없는 값] + mjonPayVO.setResultCode(Resultcd); + mjonPayVO.setResultMsg(Resultmsg); + mjonPayVO.setAmt(Prdtprice); // 결제금액 + mjonPayVO.setPayMethod("CELLPHONE"); // 결제방법 + mjonPayVO.setSpayMethod(""); // 간편결제 결제방법 + mjonPayVO.setSpayDiv(""); // 간편결제분류 + + mjonPayVO.setPgCode("KGM"); // + mjonPayVO.setGoodsName(Prdtnm); // + mjonPayVO.setPhone(""); // 모바일 + mjonPayVO.setMobile(""); // 모바일 + mjonPayVO.setPayerEmail(Payeremail); + mjonPayVO.setTid(Tradeid); // Tid + mjonPayVO.setMid(Svcid); // Mid = Svcid + + // 회원정보 + mjonPayVO.setBuyerName(mberNm); + mjonPayVO.setBuyerTel(moblphonNo); + mjonPayVO.setBuyerEmail(mberEmailAdres); + mjonPayVO.setEmail(mberEmailAdres); // 이메일(회원정보) + + // 상점 주문번호 결제 완료 후 생성 + mjonPayVO.setMoid(idgenPgMoid.getNextStringId()); + + //세금 값 넣기 + mjonPayVO = this.setKgmTexV2VO(mjonPayVO); + + //cash 값 넣기 + mjonPayVO = this.setKgmCashVO(mjonPayVO); + + //point 값 넣기 + mjonPayVO = this.setKgmPointVO(mjonPayVO); + + rtnMsg = "SUCCESS"; + } + }catch(Exception e) { + rtnMsg = "FAIL"; + + System.out.println("#############################################################"); + System.out.println("KG MOBILIANS NotiUrl - MOBILE Tradeid : " + Tradeid); + System.out.println("KG MOBILIANS NotiUrl - MOBILE returnMsg : " + rtnMsg); + System.out.println("KG MOBILIANS NotiUrl - MOBILE e.getMessage() : " + e.getMessage()); + } + + mjonPayVO.setRtnMsg(rtnMsg); + + return mjonPayVO; + } + + public String slackKgPay(MjonPayVO mjonPayVO) { + + String userId = mjonPayVO.getUserId(); + String mberNm = mjonPayVO.getMberNm(); + String tradeId = mjonPayVO.getTradeId(); + String rtnMsg = ""; + try { + // 휴대폰 15만원결제 => 법인폰 알림 + if (mjonPayVO.getAmt().equals("165000")) { + // 법인폰 알람여부 체크 + JoinSettingVO joinSettingVO = new JoinSettingVO(); + joinSettingVO = egovSiteManagerService.selectAdminNotiDetail(); + // SMS 체크 + if (joinSettingVO != null && joinSettingVO.getSmsNoti().equals("Y")) { + // 스미싱의심 SMS 알림전송 + mjonNoticeSendUtil.smishingSmsNoticeSend("스미싱의심/휴대폰 15만원 결제", userId, mberNm); + } + + // SLACK 체크 + if (joinSettingVO != null && joinSettingVO.getSlackNoti().equals("Y")) { + // Slack 메시지 발송(단순본문) + String msg = "[문자온] 스미싱의심/휴대폰 15만원 결제 - " + mberNm +"("+ userId + ")"; + mjonCommon.sendSimpleSlackMsg(msg); + } + + // 스미싱 의심회원으로 변경 + UserManageVO userManageVO = new UserManageVO(); + userManageVO.setSmishingYn("Y"); + userManageVO.setMberId(userId); + userManageService.updateOneUserSmishingYnNotAlert(userManageVO); + } else { + + String sandTxt = ""; + if(mjonPayVO.getPayMethod().equals("CELLPHONE")) { + sandTxt = "스미싱의심/휴대폰 첫결제"; + }else if(mjonPayVO.getPayMethod().equals("BANK")) { + sandTxt = "스미싱의심/즉시이체 첫결제"; + }else if(mjonPayVO.getPayMethod().equals("SPAY")) { + sandTxt = "스미싱의심/간편결제 첫결제"; + } + + // 대상 : 휴대폰결제, 즉시이체, 전용계좌 + // Step 1. 스미싱의심 지정 여부 + JoinSettingVO joinSettingVO = new JoinSettingVO(); + joinSettingVO = egovSiteManagerService.selectAdminNotiDetail(); + if (joinSettingVO != null && joinSettingVO.getSmishingNoti().equals("Y")) { + // Step 1. 개인회원 여부 체크 + int isPersnalMemberCnt = egovSiteManagerService.selectPersnalMemberCnt(userId); + if (isPersnalMemberCnt == 1) { + // Step 2. 첫결제 여부 체크 + int isFirstPayCnt = egovSiteManagerService.selectFirstPayCnt(userId); + if (isFirstPayCnt == 1) { + // SMS 체크 + if (joinSettingVO != null && joinSettingVO.getSmsNoti().equals("Y")) { + // 스미싱의심 SMS 알림전송 + mjonNoticeSendUtil.smishingSmsNoticeSend(sandTxt, userId, mberNm); + } + + // SLACK 체크 + if (joinSettingVO != null && joinSettingVO.getSlackNoti().equals("Y")) { + // Slack 메시지 발송(단순본문) + String msg = "[문자온] "+sandTxt+" - " + mberNm +"("+ userId + ")"; + mjonCommon.sendSimpleSlackMsg(msg); + } + + // 스미싱 의심회원으로 변경 + UserManageVO userManageVO = new UserManageVO(); + userManageVO.setSmishingYn("Y"); + userManageVO.setMberId(userId); + userManageService.updateOneUserSmishingYnNotAlert(userManageVO); + } + } + } + } + }catch (Exception e) { + System.out.println("#############################################################"); + System.out.println("KG MOBILIANS NotiUrl - MOBILE 슬랙알림 & 스미싱의심 처리 Error"); + System.out.println("KG MOBILIANS NotiUrl - MOBILE Tradeid : " + tradeId); + System.out.println("KG MOBILIANS NotiUrl - MOBILE e.getMessage() : " + e.getMessage()); + } + + System.out.println("#############################################################"); + System.out.println("KG MOBILIANS NotiUrl - MOBILE Tradeid : " + tradeId); + System.out.println("KG MOBILIANS NotiUrl - MOBILE returnMsg : " + rtnMsg); + return rtnMsg; + } + + + // Get Server Path + public static String getKgServerPath(HttpServletRequest request) { + String kgmPath = request.getScheme() + "://" + request.getServerName() +":" + request.getServerPort(); + if (request.getServerPort() == 80) { + kgmPath = request.getScheme() + "://" + request.getServerName(); + } + + // 테스트서버 정보 변환 + if(kgmPath.indexOf("192.168.0.125") > -1){ + kgmPath = "https://test.munjaon.co.kr:9998"; + } + + System.out.println("#############################################################"); + System.out.println("KG MOBILIANS kgServerPath : " + kgmPath); + + return kgmPath; + } + + /** + * 전달된 파라미터에 맞게 난수를 생성한다 + * @param len : 생성할 난수의 길이 + * @param dupCd : 중복 허용 여부 (1: 중복허용, 2:중복제거) + */ + public static String numberGen(int len, int dupCd ) { + Random rand = new Random(); + String numStr = ""; //난수가 저장될 변수 + + for(int i=0;i strList = new ArrayList<>(Arrays.asList(kgmServerIpArray)); + + // List Contains + if(strList.contains(getClientIP(request))) { + rtnVal = true; // 해당아이피 strArray에 존재 + } + + return rtnVal; + } + + // Get Ip + public static String getClientIP(HttpServletRequest request) { + String ip = request.getHeader("X-Forwarded-For") == null ? request.getHeader("X-Forwarded-For") : request.getHeader("X-Forwarded-For").replaceAll("10.12.107.11", "").replaceAll(",", "").trim(); + String ipMethod = "X-Forwarded-For"; + + if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + ipMethod = "Proxy-Client-IP"; + } + if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + ipMethod = "WL-Proxy-Client-IP"; + } + if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("HTTP_CLIENT_IP"); + ipMethod = "HTTP_CLIENT_IP"; + } + if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("HTTP_X_FORWARDED_FOR"); + ipMethod = "HTTP_X_FORWARDED_FOR"; + } + if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + ipMethod = "getRemoteAddr"; + } + + System.out.println("#############################################################"); + System.out.println("KG MOBILIANS NotiUrl - getClientIP : " + ipMethod); + System.out.println("KG MOBILIANS NotiUrl - getClientIP : " + ip); + + return ip; + } + + /** + * @param mjonPayVO + * @return + * @throws Exception + * tex 값 넣기 + */ + private MjonPayVO setKgmTexV2VO(MjonPayVO mjonPayVO) throws Exception{ + + //PG Tax테이블 변수 생성 + mjonPayVO.setRcptType("9"); //PG결제는 세금계산서 '발행유형-[PG결제-현금영수증 유형과 동일] 1:소득공제, 2:지출증빙, 9:세금계산서', (확인필요) + + mjonPayVO.setRegNo(mjonPayVO.getBuyerTel()); // '사업자번호/전화번호', + mjonPayVO.setMobile(mjonPayVO.getBuyerTel()); // '사업자번호/전화번호', + mjonPayVO.setPhone(mjonPayVO.getBuyerTel()); //연락처 + mjonPayVO.setEmail(mjonPayVO.getBuyerEmail()); //이메일 + mjonPayVO.setRepName(mjonPayVO.getBuyerName()); //'대표자명', + mjonPayVO.setConfirmYn("Y"); //'완료여부', + + return mjonPayVO; + } + + /** + * @param mjonPayVO + * @return + * @throws Exception + * cash table 값 넣기 + * 2022.04.12 JSP => mjonPayVO.getMoid() => userId 사용 제거 (휴대폰결제에서만 사용) + */ + private MjonPayVO setKgmCashVO(MjonPayVO mjonPayVO) throws Exception{ + String amt = mjonPayVO.getAmt(); + // 부가세별도 충전금액 + amt = setCashVatNotIncluded(amt); + + //캐쉬 테이블 변수 생성 + mjonPayVO.setCashId(idgenMjonCashId.getNextStringId()) ; + mjonPayVO.setPointId(idgenMjonPointId.getNextStringId()) ; + mjonPayVO.setCash(Float.parseFloat(amt)); //'사용 캐쉬-양수:지급, 음수:소모', + mjonPayVO.setOrderId(mjonPayVO.getMoid()); //'주문번호-주문번호가 없으면 관리자 임의 지급', + mjonPayVO.setUserId(mjonPayVO.getUserId()); + mjonPayVO.setFrstRegisterId(mjonPayVO.getUserId()); + String s_paymethod = mjonPayVO.getPayMethod(); + String spaydiv = mjonPayVO.getSpayDiv(); + + if(s_paymethod.equals("CARD")){ + s_paymethod = "신용카드" ; // 신용카드(정상 결과코드:3001) + }else if(s_paymethod.equals("SPAY")){ + s_paymethod = "간편결제" ; // 간편결제 + if(spaydiv.equals("NAV")){ + s_paymethod = "간편결제(네이버페이)" ; + } + else if(spaydiv.equals("KKO")){ + s_paymethod = "간편결제(카카오페이)" ; + } + else if(spaydiv.equals("TOS")){ + s_paymethod = "간편결제(토스페이)" ; + } + else if(spaydiv.equals("PYC")){ + s_paymethod = "간편결제(페이코)" ; + } + }else if(s_paymethod.equals("BANK")){ + s_paymethod = "계좌이체" ; // 계좌이체(정상 결과코드:4000) + }else if(s_paymethod.equals("CELLPHONE")){ + s_paymethod = "휴대폰" ; // 휴대폰(정상 결과코드:A000) + }else if(s_paymethod.equals("VBANK")){ + s_paymethod = "가상계좌" ; // 가상계좌(정상 결과코드:4100) + }else if(s_paymethod.equals("SSG_BANK")){ + s_paymethod = "SSG은행계좌" ; // SSG은행계좌(정상 결과코드:0000) + }else if(s_paymethod.equals("CMS_BANK")){ + s_paymethod = "계좌간편결제" ; // 계좌간편결제(정상 결과코드:0000) + }else { + s_paymethod = ""; + } + + String memo = s_paymethod + " " + amt + "원 충전" ; + mjonPayVO.setMemo(memo); //캐쉬메모 + + return mjonPayVO; + } + + /** + * @param mjonPayVO + * @return + * @throws Exception + * point table 값 넣기 + */ + private MjonPayVO setKgmPointVO(MjonPayVO mjonPayVO) throws Exception{ + + String s_paymethod = mjonPayVO.getPayMethod(); + String spaydiv = mjonPayVO.getSpayDiv(); + + if(s_paymethod.equals("CARD")){ + s_paymethod = "신용카드" ; // 신용카드(정상 결과코드:3001) + }else if(s_paymethod.equals("SPAY")){ + s_paymethod = "간편결제" ; // 간편결제 + if(spaydiv.equals("NAV")){ + s_paymethod = "간편결제(네이버페이)" ; + } + else if(spaydiv.equals("KKO")){ + s_paymethod = "간편결제(카카오페이)" ; + } + else if(spaydiv.equals("TOS")){ + s_paymethod = "간편결제(토스페이)" ; + } + else if(spaydiv.equals("PYC")){ + s_paymethod = "간편결제(페이코)" ; + } + }else if(s_paymethod.equals("BANK")){ + s_paymethod = "계좌이체" ; // 계좌이체(정상 결과코드:4000) + }else if(s_paymethod.equals("CELLPHONE")){ + s_paymethod = "휴대폰" ; // 휴대폰(정상 결과코드:A000) + }else if(s_paymethod.equals("VBANK")){ + s_paymethod = "가상계좌" ; // 가상계좌(정상 결과코드:4100) + }else if(s_paymethod.equals("SSG_BANK")){ + s_paymethod = "SSG은행계좌" ; // SSG은행계좌(정상 결과코드:0000) + }else if(s_paymethod.equals("CMS_BANK")){ + s_paymethod = "계좌간편결제" ; // 계좌간편결제(정상 결과코드:0000) + }else { + s_paymethod = ""; + } + + String s_amt = mjonPayVO.getAmt(); + // 부가세별도 충전금액 + s_amt = setCashVatNotIncluded(s_amt); + + //포인트 테이블 변수설정 + JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo(); + //int point = Math.round( (Float.parseFloat(s_amt)*2/100) ) ; + float p_i_re_point = 0; + if (sysJoinSetVO != null) { + p_i_re_point = sysJoinSetVO.getPointPer(); + } + int point = Math.round((Float.parseFloat(s_amt)*p_i_re_point/100)) ; + + mjonPayVO.setPoint(point); + + String pointMemo = s_paymethod; //포인트 메모 + pointMemo = pointMemo + " " + point + " 충전" ; + + mjonPayVO.setPointMemo(pointMemo); + + return mjonPayVO; + } + + // 부가세별도 충전금액 + private String setCashVatNotIncluded(String val) { + String rtnVal = ""; + + // 공급대가 = 공급가액(공급대가/11*10) + 부가세(공급대가/11) + // 11000 = (11000/11*10 ) + 11000/11 + // 공급가액 계산로직 + rtnVal = Math.round(Float.parseFloat(val) / 11 * 10) + ""; + + return rtnVal; + } +} diff --git a/src/main/java/itn/com/cmm/util/MjonPayUtil.java b/src/main/java/itn/com/cmm/util/MjonPayUtil.java new file mode 100644 index 00000000..86116061 --- /dev/null +++ b/src/main/java/itn/com/cmm/util/MjonPayUtil.java @@ -0,0 +1,231 @@ +package itn.com.cmm.util; + +import javax.annotation.Resource; + +import org.springframework.stereotype.Component; + +import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper; +import itn.com.cmm.LoginVO; +import itn.com.utl.fcc.service.EgovStringUtil; +import itn.let.mjo.event.service.MjonEventVO; +import itn.let.mjo.event.service.impl.MjonEventDAO; +import itn.let.mjo.pay.service.MjonPayVO; +import itn.let.mjo.pay.service.impl.MjonPayDAO; +import itn.let.mjo.tax.service.TaxVO; +import itn.let.mjo.tax.service.impl.TaxDAO; +import itn.let.sym.grd.service.MberGrdService; +import itn.let.sym.grd.service.MberGrdVO; +import itn.let.uat.uia.service.impl.MberManageDAO; +import itn.let.uss.umt.service.MberManageVO; + +@Component("mjonPayUtil") +public class MjonPayUtil { + + @Resource(name="MjonEventDAO") + private MjonEventDAO mjonEventDAO; + + @Resource(name="mberManageDAO") + private MberManageDAO mberManageDAO; + + @Resource(name="mjonPayDAO") + private MjonPayDAO mjonPayDAO; + + @Resource(name="taxDAO") + private TaxDAO taxDAO; + + /* 등급제 */ + @Resource(name = "mberGrdService") + MberGrdService mberGrdService; + + /** + * @param mjonPayVO + * @throws Exception + */ + public void insertPayUtil(MjonPayVO mjonPayVO) throws Exception { + + + if("anonymousUser".equals(EgovUserDetailsHelper.getAuthenticatedUser() )) { + + }else { + // 기존 mjonPayVO의 userId 값에 moid 값이 들어가게 되어서 세션에서 아이디를 받아와서 다시 입력하도록 수정함 20220330 우영두 + LoginVO loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser(); + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + String buyerName = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getName()); + String email = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getEmail()); + String mobile = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getMoblphonNo()); + mjonPayVO.setUserId(userId); + mjonPayVO.setFrstRegisterId(userId); + mjonPayVO.setBuyerName(buyerName); + mjonPayVO.setEmail(email); + mjonPayVO.setPhone(mobile); + mjonPayVO.setMobile(mobile); + } + + + + //PG, PGTXT, CASH , 포인트 insert / 회원정보 캐시,포인트 update + mjonPayDAO.insertMjPg(mjonPayVO); + + //세금계산서,현금영수증 자동발행 체크 / 자동발행 'N'이며 10만원 이상 결제시 현금영수증 의무발행 + MberManageVO mberManageVO = mberManageDAO.selectMber(mjonPayVO.getUserId()); //멤버ID에서 유니크ID로 수정 필요 + + // 세금계산서 자동발행이고,카드결제가 아닐경우에만 자동발행 + if(("B".equals(mberManageVO.getTaxbillAuto()) || "C".equals(mberManageVO.getTaxbillAuto())) && !"CARD".equals(mjonPayVO.getPayMethod())) { + TaxVO taxVO = new TaxVO(); + + /*발행타입 1:소득공제 현금영수증 2:지출증빙 현금영수증 9:세금계산서*/ + String rcptType; + String regNo=""; + + if("B".equals(mberManageVO.getTaxbillAuto())) { //세금계산서 기업 자동발행 + rcptType = "9"; + taxVO.setTaxTrgt("B"); + + regNo = mberManageVO.getTaxBizNo(); //사업자등록번호 + + taxVO.setCompanyName(mberManageVO.getTaxBzNm());//회사명 + taxVO.setRepName(mberManageVO.getTaxChrmNm());//대표자명 + taxVO.setAddr(mberManageVO.getTaxAddr());//세금계산서 주소 + + }else if("C".equals(mberManageVO.getTaxbillAuto())) { //세금계산서 개인 자동발행 + rcptType = "9"; + taxVO.setTaxTrgt("C"); + regNo = mberManageVO.getTaxCIhidNum(); // 세금계산서 개인 주민등록번호 + taxVO.setRepName(mberManageVO.getTaxCNm()); //세금계산서 개인 성명 + taxVO.setAddr(mberManageVO.getTaxCAddr()); //세금계산서 개인 주소 + + } else { //현금영수증 자동발행 + rcptType = mberManageVO.getCashbillType(); + } + taxVO.setMoid(mjonPayVO.getMoid()); //주문ID + taxVO.setRcptType(rcptType);//발행타입 + /*발행번호 개인세금계산서:주민등록번호 / 기업세금계산서:사업자번호 / 소득공제현금영수증:휴대폰번호 / 지출증빙현금영수증:사업자번호*/ + taxVO.setRegNo(regNo); + taxVO.setEmail(mberManageVO.getTaxMngEmail());//담당자이메일 + taxVO.setPhone(mberManageVO.getTaxMngPhoneNum());//담당자 휴대폰번호 + taxVO.setConfirmYn("N"); //완료여부 + taxVO.setFrstRegisterId(mberManageVO.getMberId()); + + // JSPark 2022.07.01 => 휴대폰결제는 MJ_TAX 테이블에 인서트 안함 + if(!"CELLPHONE".equals(mjonPayVO.getPayMethod())) { + taxDAO.insertCashBill(taxVO); + } + } + //세금계산서 자동발행 설정이 아니면서, 결제금액이 10만원 이상인 경우 현금영수증 의무발행 데이터 등록 필요 + if("N".equals(mberManageVO.getTaxbillAuto()) && Integer.parseInt(mjonPayVO.getAmt()) >= 100000 && !"CARD".equals(mjonPayVO.getPayMethod())) { + //결제금액이 10만원 넘는 경우 : 현금영수증 의무발행 요청 등록 + TaxVO taxVO = new TaxVO(); + + taxVO.setRcptType("3");//발행타입 : 3, 의무발행 + taxVO.setMoid(mjonPayVO.getMoid()); + taxVO.setRegNo("0100001234"); //의무발행번호 + taxVO.setEmail(mberManageVO.getTaxMngEmail());//담당자이메일 + taxVO.setPhone(mberManageVO.getTaxMngPhoneNum());//담당자 휴대폰번호 + taxVO.setConfirmYn("N"); //완료여부 + taxVO.setFrstRegisterId(mberManageVO.getMberId()); + + // JSPark 2022.07.01 => 휴대폰결제는 MJ_TAX 테이블에 인서트 안함 + if(!"CELLPHONE".equals(mjonPayVO.getPayMethod())) { + taxDAO.insertCashBill(taxVO); + } + } + + //CASH 테이블 + mjonPayDAO.insertCash(mjonPayVO); + + //회원정보 CASH 업데이트 + mjonPayDAO.updateMemberCash(mjonPayVO); + + // 회원별 등급 적용 + MberGrdVO mberGrdVO = new MberGrdVO(); + mberGrdVO.setMberId(mjonPayVO.getUserId()); + mberGrdVO.setAmt(mjonPayVO.getAmt()); + mberGrdVO.setMoid(mjonPayVO.getMoid()); + mberGrdService.mberGrdSaveByUser(mberGrdVO); + } + + /** + * 일반 포인트 등록 Utile + * @param mjonPayVO + * @throws Exception + */ + public void updatePointUtile(MjonPayVO mjonPayVO) throws Exception { + mjonPayDAO.insertPoint(mjonPayVO); //POINT 테이블 + mjonPayDAO.updateMemberPoint(mjonPayVO); //회원정보 업데이트 + } + + + /** + * 첫 결제 이벤트 포인트 등록 Utile + * @param mjonPayVO + * @throws Exception + */ + public void updateFirstEventPointUtile(MjonPayVO mjonPayVO) throws Exception { + + /** + * 이벤트 페이지에서 넘어온 경우에만 이벤트 결제로 취급 + * 이벤트 대상자인 경우 이벤트 회원 정보에 결제 금액 및 이벤트 시작일/종료일, 상태값 변경 + * + * */ + + int payCash = (int) mjonPayVO.getCash(); + int limitCash = 500000; //이벤트 참여 최대 금액 50만원으로 설정 + + //이벤트 대상자인 경우에는 포인트를 무조건 지급하지 않는다. + //차후에 민원이 제가되면 해당 민원인만 관리자가 포인트를 별도 지급하도록 하기로 함. + mjonPayVO.setPoint(0); + mjonPayVO.setPointMemo("첫 결제 이벤트로 인한 포인트 미지급 0원으로 지급처리함."); + mjonPayDAO.insertPoint(mjonPayVO); //POINT 테이블 + mjonPayDAO.updateMemberPoint(mjonPayVO); //회원정보 업데이트 + + if(payCash >= limitCash) { + //결제금액이 50만원을 넘었기 때문에 50만원만 이벤트 캐시로 충전한다. + //포인트는 미지급 한다. + payCash = 500000; + } + + //이벤트 회원 테이블 정보 업데이트 + int resultCnt = updateEventMberInfo(mjonPayVO, payCash); + System.out.println(resultCnt); + + } + + /** + * 첫 결제 이벤트 회원 테이블 정보 업데이트 + * 이벤트 시작일, 종료일, 상태정보, 결제 금액, 잔여금액 등 정보 업데이트 + * + * */ + public int updateEventMberInfo(MjonPayVO mjonPayVO, int payCash) throws Exception { + + int resultCnt = 0; + try { + + //이벤트 회원 정보 업데이트 + MjonEventVO updtEventVO = new MjonEventVO(); + updtEventVO.setMberId(mjonPayVO.getUserId()); + updtEventVO.setEventFrstCash(payCash); //결제 Cash(부가세 뺀 금액) + updtEventVO.setEventRemainCash(payCash); //초기 금액을 결제 Cash(부가세 뺀 금액)로 설정 + updtEventVO.setEventPgMoid(mjonPayVO.getMoid()); //결제 Moid 번호 + + /** + * 이벤트 시작일 및 종료일 셋팅 + * 현재일로 부터 2개월 설정 + * DB -> datetime + * + * */ + + String nowDate = MJUtil.getRealTime(); + String eventEndDate = MJUtil.getAfterTimerMonth(2); + + updtEventVO.setEventStartDate(nowDate);//이벤트 시작일자 설정 + updtEventVO.setEventEndDate(eventEndDate);//이벤트 종료일자 설정 + updtEventVO.setEventStatus("Y");//이벤트 상태를 진행 중으로 변경 + + resultCnt = mjonEventDAO.updateEventMberStatusInfo(updtEventVO); + + } catch (Exception e) { + System.out.println("+++++++++++++ updateEventMberInfo ServiceImple Error !!! "+e); + } + return resultCnt; + } +} diff --git a/src/main/java/itn/com/cmm/util/NicePayUtil.java b/src/main/java/itn/com/cmm/util/NicePayUtil.java new file mode 100644 index 00000000..a4a583e6 --- /dev/null +++ b/src/main/java/itn/com/cmm/util/NicePayUtil.java @@ -0,0 +1,515 @@ +package itn.com.cmm.util; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.net.HttpURLConnection; +import java.net.URL; +import java.security.MessageDigest; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; + +import org.apache.commons.codec.binary.Hex; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.springframework.stereotype.Component; + +import egovframework.rte.fdl.idgnr.EgovIdGnrService; +import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper; +import itn.com.cmm.LoginVO; +import itn.com.cmm.util.MJUtil; +import itn.com.utl.fcc.service.EgovStringUtil; +import itn.let.mjo.event.service.MjonEventVO; +import itn.let.mjo.event.service.impl.MjonEventDAO; +import itn.let.mjo.msgdata.service.MjonMsgDataService; +import itn.let.mjo.pay.service.MjonPayVO; +import itn.let.mjo.pay.service.impl.MjonPayDAO; +import itn.let.mjo.tax.service.TaxVO; +import itn.let.mjo.tax.service.impl.TaxDAO; +import itn.let.sym.site.service.JoinSettingVO; +import itn.let.uat.uia.service.impl.MberManageDAO; +import itn.let.uss.umt.service.MberManageVO; + +@Component("nicePayUtil") +public class NicePayUtil { + + @Resource(name = "egovMjonCashIdGnrService") + private EgovIdGnrService idgenMjonCashId; + + @Resource(name = "egovMjonPointIdGnrService") + private EgovIdGnrService idgenMjonPointId; + + @Resource(name = "MjonMsgDataService") + private MjonMsgDataService mjonMsgDataService; + + /** + * @param mjonPayVO + * @param request + * @return + * @throws Exception + * //nicepay 정상 결제 여부 확인 + */ + public boolean pgAuth(MjonPayVO mjonPayVO , HttpServletRequest request) throws Exception { + + //Pg 결제 정상여부 체크 + boolean paySuccess = false; + + /* + **************************************************************************************** + * <인증 결과 파라미터> + **************************************************************************************** + */ + String authResultCode = (String)request.getParameter("AuthResultCode"); // 인증결과 : 0000(성공) + String authResultMsg = (String)request.getParameter("AuthResultMsg"); // 인증결과 메시지 + String nextAppURL = (String)request.getParameter("NextAppURL"); // 승인 요청 URL + String txTid = (String)request.getParameter("TxTid"); // 거래 ID + String authToken = (String)request.getParameter("AuthToken"); // 인증 TOKEN + String payMethod = (String)request.getParameter("PayMethod"); // 결제수단 + String mid = (String)request.getParameter("MID"); // 상점 아이디 + String moid = (String)request.getParameter("Moid"); // 상점 주문번호 + String amt = (String)request.getParameter("Amt"); // 결제 금액 + String reqReserved = (String)request.getParameter("ReqReserved"); // 상점 예약필드 + String netCancelURL = (String)request.getParameter("NetCancelURL"); // 망취소 요청 URL + /* + **************************************************************************************** + * <승인 결과 파라미터 정의> + * 샘플페이지에서는 승인 결과 파라미터 중 일부만 예시되어 있으며, + * 추가적으로 사용하실 파라미터는 연동메뉴얼을 참고하세요. + **************************************************************************************** + */ + String ResultCode = ""; String ResultMsg = ""; String PayMethod = ""; + String GoodsName = ""; String Amt = ""; String TID = ""; + String cardCode = ""; // 결제카드사코드 + String cardName = ""; // 결제카드사명 + String bankCode = ""; // 결제은행코드 + String bankName = ""; // 결제은행명 + + /* + **************************************************************************************** + * <인증 결과 성공시 승인 진행> + **************************************************************************************** + */ + + String resultJsonStr = ""; + if(authResultCode.equals("0000")){ + /* + **************************************************************************************** + * <해쉬암호화> (수정하지 마세요) + * SHA-256 해쉬암호화는 거래 위변조를 막기위한 방법입니다. + **************************************************************************************** + */ + DataEncrypt sha256Enc = new DataEncrypt(); + String merchantKey = "7wnkxZbHvIA7FoCc6jF8IcXU+Wd3sn5BcMHuWJROe53AjRKnC6CistVdVZwrUKCCdaF+dAx230bwHSQ/E29RWA=="; // 운영상점키 + //String merchantKey = "EYzu8jGGMfqaDEp76gSckuvnaHHu+bC4opsSN6lHv3b2lurNYkVXrZ7Z1AoqQnXI3eLuaUFyoRNC6FkrzVjceg=="; // 테스트 상점키 + String ediDate = getyyyyMMddHHmmss(); + String signData = sha256Enc.encrypt(authToken + mid + amt + ediDate + merchantKey); + + /* + **************************************************************************************** + * <승인 요청> + * 승인에 필요한 데이터 생성 후 server to server 통신을 통해 승인 처리 합니다. + **************************************************************************************** + */ + StringBuffer requestData = new StringBuffer(); + requestData.append("TID=").append(txTid).append("&"); + requestData.append("AuthToken=").append(authToken).append("&"); + requestData.append("MID=").append(mid).append("&"); + requestData.append("Amt=").append(amt).append("&"); + requestData.append("EdiDate=").append(ediDate).append("&"); + requestData.append("SignData=").append(signData); + + try { + resultJsonStr = connectToServer(requestData.toString(), nextAppURL); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + HashMap resultData = new HashMap(); + + if("9999".equals(resultJsonStr)){ + /* + ************************************************************************************* + * <망취소 요청> + * 승인 통신중에 Exception 발생시 망취소 처리를 권고합니다. + ************************************************************************************* + */ + StringBuffer netCancelData = new StringBuffer(); + requestData.append("&").append("NetCancel=").append("1"); + String cancelResultJsonStr = connectToServer(requestData.toString(), netCancelURL); + + HashMap cancelResultData = jsonStringToHashMap(cancelResultJsonStr); + ResultCode = (String)cancelResultData.get("ResultCode"); + ResultMsg = (String)cancelResultData.get("ResultMsg"); + }else{ + resultData = jsonStringToHashMap(resultJsonStr); + ResultCode = (String)resultData.get("ResultCode"); // 결과코드 (정상 결과코드:3001) + ResultMsg = (String)resultData.get("ResultMsg"); // 결과메시지 + PayMethod = (String)resultData.get("PayMethod"); // 결제수단 + GoodsName = (String)resultData.get("GoodsName"); // 상품명 + Amt = (String)resultData.get("Amt"); // 결제 금액 + TID = (String)resultData.get("TID"); // 거래번호 + cardCode = (String)resultData.get("CardCode"); // 결제카드사코드 + cardName = (String)resultData.get("CardName"); // 결제카드사명 + bankCode = (String)resultData.get("BankCode"); // 결제은행코드 + bankName = (String)resultData.get("BankName"); // 결제은행명 + /* + ************************************************************************************* + * <결제 성공 여부 확인> + ************************************************************************************* + */ + if(PayMethod != null){ + if(PayMethod.equals("CARD")){ + if(ResultCode.equals("3001")) paySuccess = true; // 신용카드(정상 결과코드:3001) + }else if(PayMethod.equals("BANK")){ + if(ResultCode.equals("4000")) paySuccess = true; // 계좌이체(정상 결과코드:4000) + }else if(PayMethod.equals("CELLPHONE")){ + if(ResultCode.equals("A000")) paySuccess = true; // 휴대폰(정상 결과코드:A000) + }else if(PayMethod.equals("VBANK")){ + if(ResultCode.equals("4100")) paySuccess = true; // 가상계좌(정상 결과코드:4100) + }else if(PayMethod.equals("SSG_BANK")){ + if(ResultCode.equals("0000")) paySuccess = true; // SSG은행계좌(정상 결과코드:0000) + }else if(PayMethod.equals("CMS_BANK")){ + if(ResultCode.equals("0000")) paySuccess = true; // 계좌간편결제(정상 결과코드:0000) + } + } + } + }else{ + ResultCode = authResultCode; + ResultMsg = authResultMsg; + } + + //PG테이블 변수설정 오류시에도 PG테이블에 값 insert + mjonPayVO.setPgStatus("4"); //결제오류 + mjonPayVO.setResultCode(authResultCode); + mjonPayVO.setResultMsg(ResultMsg); //'결과메시지', + mjonPayVO.setTid(txTid); // 거래 ID + mjonPayVO.setPayMethod(payMethod); // 결제수단 + mjonPayVO.setMid(mid); // 상점 아이디 + mjonPayVO.setAmt(amt); // 결제 금액 + mjonPayVO.setPgCode("INNOPAY"); //이노페이(강제세팅) + LoginVO loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser(); + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); +// userId = mjonPayVO.getMoid() ; //테스트시 화면에서 전송한 고객사 ID +// mjonPayVO.setMoid(idgenPgMoid.getNextStringId()); // 상점 주문번호 결제 완료 후 생성 + mjonPayVO.setRegNo(mjonPayVO.getBuyerTel()); // '사업자번호/전화번호', + mjonPayVO.setMobile(mjonPayVO.getBuyerTel()); // '사업자번호/전화번호', + mjonPayVO.setPhone(mjonPayVO.getBuyerTel()); //연락처 + mjonPayVO.setEmail(mjonPayVO.getBuyerEmail()); //이메일 + mjonPayVO.setRepName(mjonPayVO.getBuyerName()); //'대표자명', + mjonPayVO.setConfirmYn("N"); //'완료여부', + mjonPayVO.setUserId(userId); + mjonPayVO.setFrstRegisterId(userId); + mjonPayVO.setCardCode(cardCode); //결제카드사코드 + mjonPayVO.setCardName(cardName); //결제카드사명 + mjonPayVO.setBankCode(bankCode); //결제은행코드 + mjonPayVO.setBankName(bankName); //결제은행사명 + + if(!paySuccess) { + return false; + } + + //PG테이블 변수 설정-------------------------------------------------------------------------------- + if("0000".equals(authResultCode)) { // 인증결과 : 0000(성공) + mjonPayVO.setPgStatus("1"); //'결제 상태 - 0:입금대기, 1:결제완료, 4:결제오류, 9:취소완료' + mjonPayVO.setResultCode(authResultCode); //결과코드 + } + + return paySuccess ; + } + + //server to server 통신 + public String connectToServer(String data, String reqUrl) throws Exception{ + HttpURLConnection conn = null; + BufferedReader resultReader = null; + PrintWriter pw = null; + URL url = null; + + int statusCode = 0; + StringBuffer recvBuffer = new StringBuffer(); + try{ + url = new URL(reqUrl); + conn = (HttpURLConnection) url.openConnection(); + conn.setRequestMethod("POST"); + conn.setConnectTimeout(3000); + conn.setReadTimeout(5000); + conn.setDoOutput(true); + + pw = new PrintWriter(conn.getOutputStream()); + pw.write(data); + pw.flush(); + + statusCode = conn.getResponseCode(); + resultReader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "euc-kr")); + for(String temp; (temp = resultReader.readLine()) != null;){ + recvBuffer.append(temp).append("\n"); + } + + if(!(statusCode == HttpURLConnection.HTTP_OK)){ + throw new Exception(); + } + + return recvBuffer.toString().trim(); + }catch (Exception e){ + return "9999"; + }finally{ + recvBuffer.setLength(0); + + try{ + if(resultReader != null){ + resultReader.close(); + } + }catch(Exception ex){ + resultReader = null; + } + + try{ + if(pw != null) { + pw.close(); + } + }catch(Exception ex){ + pw = null; + } + + try{ + if(conn != null) { + conn.disconnect(); + } + }catch(Exception ex){ + conn = null; + } + } + } + + //JSON String -> HashMap 변환 + public static HashMap jsonStringToHashMap(String str) throws Exception{ + HashMap dataMap = new HashMap(); + JSONParser parser = new JSONParser(); + try{ + Object obj = parser.parse(str); + JSONObject jsonObject = (JSONObject)obj; + + Iterator keyStr = jsonObject.keySet().iterator(); + while(keyStr.hasNext()){ + String key = keyStr.next(); + Object value = jsonObject.get(key); + + dataMap.put(key, value); + } + }catch(Exception e){ + + } + return dataMap; + } + + public final synchronized String getyyyyMMddHHmmss(){ + SimpleDateFormat yyyyMMddHHmmss = new SimpleDateFormat("yyyyMMddHHmmss"); + return yyyyMMddHHmmss.format(new Date()); + } + + // SHA-256 형식으로 암호화 + public class DataEncrypt{ + MessageDigest md; + String strSRCData = ""; + String strENCData = ""; + String strOUTData = ""; + + public DataEncrypt(){ } + public String encrypt(String strData){ + String passACL = null; + MessageDigest md = null; + try{ + md = MessageDigest.getInstance("SHA-256"); + md.reset(); + md.update(strData.getBytes()); + byte[] raw = md.digest(); + passACL = encodeHex(raw); + }catch(Exception e){ + System.out.print("암호화 에러" + e.toString()); + } + return passACL; + } + + public String encodeHex(byte [] b){ + char [] c = Hex.encodeHex(b); + return new String(c); + } + } + + // 세금 값 넣기 + public MjonPayVO setTexVO(MjonPayVO mjonPayVO) throws Exception{ + /* + * amt = mjonPayVO.setAmt(amt); // 결제 금액 + * userId = mjonPayVO.getMoid() ; //테스트시 화면에서 전송한 고객사 ID + * mjonPayVO.setPayMethod(payMethod); // 결제수단 + */ + + String s_amt = mjonPayVO.getAmt(); + // 부가세별도 충전금액 + s_amt = setCashVatNotIncluded(s_amt); + + String s_user_id = mjonPayVO.getMoid(); + + //PG Tax테이블 변수 생성 + mjonPayVO.setRcptType("9"); //PG결제는 세금계산서 '발행유형-[PG결제-현금영수증 유형과 동일] 1:소득공제, 2:지출증빙, 9:세금계산서', (확인필요) + + mjonPayVO.setRegNo(mjonPayVO.getBuyerTel()); // '사업자번호/전화번호', + mjonPayVO.setMobile(mjonPayVO.getBuyerTel()); // '사업자번호/전화번호', + mjonPayVO.setPhone(mjonPayVO.getBuyerTel()); //연락처 + mjonPayVO.setEmail(mjonPayVO.getBuyerEmail()); //이메일 + mjonPayVO.setRepName(mjonPayVO.getBuyerName()); //'대표자명', + mjonPayVO.setConfirmYn("Y"); //'완료여부', + + //캐쉬 테이블 변수 생성 + mjonPayVO.setCashId(idgenMjonCashId.getNextStringId()) ; + mjonPayVO.setPointId(idgenMjonPointId.getNextStringId()) ; + mjonPayVO.setCash(Float.parseFloat(s_amt)); //'사용 캐쉬-양수:지급, 음수:소모', + + mjonPayVO.setOrderId(mjonPayVO.getMoid()); //'주문번호-주문번호가 없으면 관리자 임의 지급', + + mjonPayVO.setUserId(s_user_id); + mjonPayVO.setFrstRegisterId(s_user_id); + + return mjonPayVO; + } + + // 부가세별도 충전금액 + private String setCashVatNotIncluded(String val) { + String rtnVal = ""; + + // 공급대가 = 공급가액(공급대가/11*10) + 부가세(공급대가/11) + // 11000 = (11000/11*10 ) + 11000/11 + // 공급가액 계산로직 + rtnVal = Math.round(Float.parseFloat(val) / 11 * 10) + ""; + + return rtnVal; + } + + //cash 값 넣기 + /** + * @param mjonPayVO + * @return + * @throws Exception + * cash table 값 넣기 + */ + public MjonPayVO setCashVO(MjonPayVO mjonPayVO) throws Exception{ + /* + * amt = mjonPayVO.setAmt(amt); // 결제 금액 + * userId = mjonPayVO.getMoid() ; //테스트시 화면에서 전송한 고객사 ID + * mjonPayVO.setPayMethod(payMethod); // 결제수단 + */ + + String s_amt = mjonPayVO.getAmt(); + // 부가세별도 충전금액 + s_amt = setCashVatNotIncluded(s_amt); + + String s_user_id = mjonPayVO.getMoid(); + + //캐쉬 테이블 변수 생성 + mjonPayVO.setCashId(idgenMjonCashId.getNextStringId()) ; + mjonPayVO.setPointId(idgenMjonPointId.getNextStringId()) ; + mjonPayVO.setCash(Float.parseFloat(s_amt)); //'사용 캐쉬-양수:지급, 음수:소모', + + mjonPayVO.setOrderId(mjonPayVO.getMoid()); //'주문번호-주문번호가 없으면 관리자 임의 지급', + + mjonPayVO.setUserId(s_user_id); + mjonPayVO.setFrstRegisterId(s_user_id); + + + String s_paymethod = mjonPayVO.getPayMethod(); + + if(s_paymethod.equals("CARD")){ + s_paymethod = "신용카드" ; // 신용카드(정상 결과코드:3001) + }else if(s_paymethod.equals("BANK")){ + s_paymethod = "계좌이체" ; // 계좌이체(정상 결과코드:4000) + }else if(s_paymethod.equals("CELLPHONE")){ + s_paymethod = "휴대폰" ; // 휴대폰(정상 결과코드:A000) + }else if(s_paymethod.equals("VBANK")){ + s_paymethod = "가상계좌" ; // 가상계좌(정상 결과코드:4100) + }else if(s_paymethod.equals("SSG_BANK")){ + s_paymethod = "SSG은행계좌" ; // SSG은행계좌(정상 결과코드:0000) + }else if(s_paymethod.equals("CMS_BANK")){ + s_paymethod = "계좌간편결제" ; // 계좌간편결제(정상 결과코드:0000) + }else { + s_paymethod = ""; + } + + String memo = s_paymethod + " " + s_amt + " 충전" ; + mjonPayVO.setMemo(memo); //캐쉬메모 + + return mjonPayVO; + } + + //point 값 넣기 + /** + * @param mjonPayVO + * @return + * @throws Exception + * point table 값 넣기 + */ + public MjonPayVO setPointVO(MjonPayVO mjonPayVO) throws Exception{ + + String s_paymethod = mjonPayVO.getPayMethod(); + if(s_paymethod.equals("CARD")){ + s_paymethod = "신용카드" ; // 신용카드(정상 결과코드:3001) + }else if(s_paymethod.equals("SPAY")){ + s_paymethod = "간편결제" ; // 간편결제 + }else if(s_paymethod.equals("BANK")){ + s_paymethod = "계좌이체" ; // 계좌이체(정상 결과코드:4000) + }else if(s_paymethod.equals("CELLPHONE")){ + s_paymethod = "휴대폰" ; // 휴대폰(정상 결과코드:A000) + }else if(s_paymethod.equals("VBANK")){ + s_paymethod = "가상계좌" ; // 가상계좌(정상 결과코드:4100) + }else if(s_paymethod.equals("SSG_BANK")){ + s_paymethod = "SSG은행계좌" ; // SSG은행계좌(정상 결과코드:0000) + }else if(s_paymethod.equals("CMS_BANK")){ + s_paymethod = "계좌간편결제" ; // 계좌간편결제(정상 결과코드:0000) + }else { + s_paymethod = ""; + } + + String s_amt = mjonPayVO.getAmt(); + // 부가세별도 충전금액 + s_amt = setCashVatNotIncluded(s_amt); + + //포인트 테이블 변수설정 + JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo(); + //int point = Math.round( (Float.parseFloat(s_amt)*2/100) ) ; + float p_i_re_point = 0; + if (sysJoinSetVO != null) { + p_i_re_point = sysJoinSetVO.getPointPer(); + } + int point = Math.round((Float.parseFloat(s_amt)*p_i_re_point/100)) ; + + mjonPayVO.setPoint(point); + + String pointMemo = s_paymethod; //포인트 메모 + pointMemo = pointMemo + " " + point + " 충전" ; + + mjonPayVO.setPointMemo(pointMemo); + + return mjonPayVO; + } + + public MjonPayVO setPayInfo(HttpServletRequest request, MjonPayVO mjonPayVO) throws Exception{ + + if(!this.pgAuth(mjonPayVO , request)) { + mjonPayVO.setPaySuccess(false); + return mjonPayVO; + } + + //세금 값 넣기 + mjonPayVO = this.setTexVO(mjonPayVO); + //cash 값 넣기 + mjonPayVO = this.setCashVO(mjonPayVO); + //point 값 넣기 + mjonPayVO = this.setPointVO(mjonPayVO); + + return mjonPayVO; + } +} diff --git a/src/main/java/itn/let/mjo/event/service/MjonEventService.java b/src/main/java/itn/let/mjo/event/service/MjonEventService.java index b2a98ed9..052ea456 100644 --- a/src/main/java/itn/let/mjo/event/service/MjonEventService.java +++ b/src/main/java/itn/let/mjo/event/service/MjonEventService.java @@ -1,6 +1,10 @@ package itn.let.mjo.event.service; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + import itn.let.cop.bbs.service.BoardVO; +import itn.let.mjo.pay.service.MjonPayVO; import itn.let.uss.umt.service.MberManageVO; public interface MjonEventService { @@ -35,9 +39,20 @@ public interface MjonEventService { //이벤트 정보 신규 추가(관리자가 강제로 입력) int insertEventFrstInfoByAdm(MjonEventVO mjonEventVO) throws Exception; - //현재 진행중 이벤트 상태 정보 불러오기 MjonEventCheckVO selectEventStatus(MjonEventCheckVO p_MjonEventCheckVO) throws Exception; MjonEventVO selectEventMsgMberDefaultInfo_advc(String userId) throws Exception; + + //이벤트 나이스페이 결제 + MjonPayVO insertFirstEventNicePay_advc(MjonPayVO mjonPayVO, HttpServletRequest request, String p_payment_comp) throws Exception; + + //이벤트 kg모빌런스 모바일 결제 + String insertFirstEventKgPayMobile_advc(MjonPayVO mjonPayVO, HttpServletResponse response, HttpServletRequest request) throws Exception; + + //이벤트 kg모빌런스 즉시이체 결제 + String insertFirstEventKgPayBank_advc(MjonPayVO mjonPayVO, HttpServletResponse response, HttpServletRequest request) throws Exception; + + //이벤트 kg모빌런스 즉시이체 결제 + String insertFirstEventKgPayCard_advc(MjonPayVO mjonPayVO, HttpServletResponse response, HttpServletRequest request) throws Exception; } diff --git a/src/main/java/itn/let/mjo/event/service/impl/MjonEventServiceImpl.java b/src/main/java/itn/let/mjo/event/service/impl/MjonEventServiceImpl.java index f2e87b3d..ad28c63e 100644 --- a/src/main/java/itn/let/mjo/event/service/impl/MjonEventServiceImpl.java +++ b/src/main/java/itn/let/mjo/event/service/impl/MjonEventServiceImpl.java @@ -1,11 +1,16 @@ package itn.let.mjo.event.service.impl; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Service; import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl; import egovframework.rte.fdl.idgnr.EgovIdGnrService; +import itn.com.cmm.util.KgmPayUtil; +import itn.com.cmm.util.MjonPayUtil; +import itn.com.cmm.util.NicePayUtil; import itn.let.cop.bbs.service.BoardVO; import itn.let.mjo.event.service.MjonEventCheckVO; import itn.let.mjo.event.service.MjonEventService; @@ -35,6 +40,18 @@ public class MjonEventServiceImpl extends EgovAbstractServiceImpl implements Mjo @Resource(name = "egovMjonPointIdGnrService") private EgovIdGnrService idgenMjonPointId; + /* 결제 */ + @Resource(name = "mjonPayUtil") + MjonPayUtil mjonPayUtil; + + /* nicePay */ + @Resource(name = "nicePayUtil") + NicePayUtil nicePayUtil; + + /* kg */ + @Resource(name = "kgmPayUtil") + KgmPayUtil kgmPayUtil; + @Override public BoardVO selectEventInfoByNttSj(BoardVO boardVO) throws Exception{ return mjonEventDAO.selectEventInfoByNttSj(boardVO); @@ -160,4 +177,112 @@ public class MjonEventServiceImpl extends EgovAbstractServiceImpl implements Mjo public MjonEventCheckVO selectEventStatus(MjonEventCheckVO p_MjonEventCheckVO) throws Exception{ return mjonEventDAO.selectEventStatus(p_MjonEventCheckVO); } + + @Override + public MjonPayVO insertFirstEventNicePay_advc( + MjonPayVO mjonPayVO + , HttpServletRequest request + , String p_payment_comp) throws Exception { + + System.out.println("START 이벤트 나이스페이결제"); + //PG인증이 완료되야 테이블 insert + //업체에 따라서 인증 방식이 다르다. + if ("nice".equals(p_payment_comp)) {//신용카드, 즉시이제 결제 처리 + if(!nicePayUtil.pgAuth(mjonPayVO , request)){ + mjonPayVO.setPaySuccess(false); + mjonPayDAO.insertMjPg(mjonPayVO); //오류시에도 db insert + return mjonPayVO; + } + }else { + mjonPayVO.setPaySuccess(false); + return mjonPayVO; + } + + //세금 값 넣기 + mjonPayVO = nicePayUtil.setTexVO(mjonPayVO); + + //cash 값 넣기 + mjonPayVO = nicePayUtil.setCashVO(mjonPayVO); + + //point 값 넣기 + mjonPayVO = nicePayUtil.setPointVO(mjonPayVO); + + // 결제 및 세금계산서 발행, 등급제 적용 + mjonPayUtil.insertPayUtil(mjonPayVO); + + // 포인트 발행 + mjonPayUtil.updateFirstEventPointUtile(mjonPayVO); + + System.out.println("END 카드결제"); + + mjonPayVO.setPaySuccess(true); + return mjonPayVO; + } + + @Override + public String insertFirstEventKgPayMobile_advc( + MjonPayVO mjonPayVO + , HttpServletResponse response + , HttpServletRequest request) + throws Exception { + + mjonPayVO = kgmPayUtil.kgmMobileNotiUrl(response, request); + + String rtnMsg = mjonPayVO.getRtnMsg(); + String pgStatus = mjonPayVO.getPgStatus(); + if(rtnMsg.equals("SUCCESS") && pgStatus.equals("1")) { + // 결제 및 세금계산서 발행, 등급제 적용 + mjonPayUtil.insertPayUtil(mjonPayVO); + // 포인트 발행 + mjonPayUtil.updateFirstEventPointUtile(mjonPayVO); + // 슬랙 전송 + kgmPayUtil.slackKgPay(mjonPayVO); + } + return rtnMsg; + } + + @Override + public String insertFirstEventKgPayBank_advc( + MjonPayVO mjonPayVO + , HttpServletResponse response + , HttpServletRequest request) throws Exception { + + mjonPayVO = kgmPayUtil.kgmBankNotiUrl(response, request); + + String rtnMsg = mjonPayVO.getRtnMsg(); + String pgStatus = mjonPayVO.getPgStatus(); + if(rtnMsg.equals("SUCCESS") && pgStatus.equals("1")) { + // 결제 및 세금계산서 발행, 등급제 적용 + mjonPayUtil.insertPayUtil(mjonPayVO); + // 포인트 발행 + mjonPayUtil.updateFirstEventPointUtile(mjonPayVO); + // 슬랙 전송 + kgmPayUtil.slackKgPay(mjonPayVO); + } + + return rtnMsg; + } + + @Override + public String insertFirstEventKgPayCard_advc( + MjonPayVO mjonPayVO + , HttpServletResponse response + , HttpServletRequest request) throws Exception { + + + mjonPayVO = kgmPayUtil.kgmCardNotiUrl(response, request); + + String rtnMsg = mjonPayVO.getRtnMsg(); + String pgStatus = mjonPayVO.getPgStatus(); + if(rtnMsg.equals("SUCCESS") && pgStatus.equals("1")) { + // 결제 및 세금계산서 발행, 등급제 적용 + mjonPayUtil.insertPayUtil(mjonPayVO); + // 포인트 발행 + mjonPayUtil.updateFirstEventPointUtile(mjonPayVO); + // 슬랙 전송 + kgmPayUtil.slackKgPay(mjonPayVO); + } + + return rtnMsg; + } } diff --git a/src/main/java/itn/let/mjo/event/web/MjonEventPayV2Controller.java b/src/main/java/itn/let/mjo/event/web/MjonEventPayV2Controller.java index d7482370..61b92618 100644 --- a/src/main/java/itn/let/mjo/event/web/MjonEventPayV2Controller.java +++ b/src/main/java/itn/let/mjo/event/web/MjonEventPayV2Controller.java @@ -3,34 +3,49 @@ package itn.let.mjo.event.web; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; +import java.util.Map; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.HandlerMapping; +import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.support.RedirectAttributes; +import egovframework.rte.fdl.idgnr.EgovIdGnrService; import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper; import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo; import itn.com.cmm.LoginVO; +import itn.com.cmm.util.KgmPayUtil; import itn.com.cmm.util.StringUtil; import itn.com.utl.fcc.service.EgovStringUtil; import itn.let.cop.bbs.service.BoardVO; +import itn.let.mail.service.StatusResponse; import itn.let.mjo.event.service.MjonEventService; import itn.let.mjo.event.service.MjonEventVO; import itn.let.mjo.msgcampain.service.MjonCandidateService; import itn.let.mjo.msgcampain.service.MjonCandidateVO; +import itn.let.mjo.pay.service.MjonKgmVO; import itn.let.mjo.pay.service.MjonPayService; import itn.let.mjo.pay.service.MjonPayVO; import itn.let.mjo.pay.service.MjonVaMsgLogVO; import itn.let.mjo.payva.service.VacsVactService; import itn.let.mjo.payva.service.VacsVactVO; +import itn.let.sym.site.service.JoinSettingVO; import itn.let.uss.umt.service.EgovMberManageService; import itn.let.uss.umt.service.MberManageVO; +import itn.let.uss.umt.service.UserManageVO; @Controller public class MjonEventPayV2Controller { @@ -50,6 +65,12 @@ public class MjonEventPayV2Controller { @Resource(name = "mjonPayService") private MjonPayService mjonPayService; + @Resource(name = "egovPgMoidGnrService") + private EgovIdGnrService idgenPgMoid; + + @Resource(name = "kgmPayUtil") + KgmPayUtil kgmPayUtil; + /** * 이벤트 결제하기 화면 @@ -76,15 +97,6 @@ public class MjonEventPayV2Controller { return "redirect:/web/user/login/login.do"; } - // 하드코딩 - //if(!userId.equals("nobledeco")) { - // if(!userId.equals("nobledeco2")) { - // if(!userId.equals("nopay")) { - // return "redirect:/web/main/mainPage.do"; - // } - // } - //} - //기존 결제 내역이 있는 회원인지 확인 int payCnt = 0; if(StringUtil.isNotEmpty(userId)) { @@ -250,4 +262,285 @@ public class MjonEventPayV2Controller { return eventMberInfo; } + // 나이스페이 + @RequestMapping(value= {"/web/event/member/pay/firstEventPayActionAjax.do"}) + public String firstEventPayAction( + @ModelAttribute("mjonPayVO") MjonPayVO mjonPayVO + , HttpServletRequest request + , ModelMap model) throws Exception{ + + String pattern = (String) request.getAttribute( + HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE) ; + + mjonPayVO.setReturnURL(request.getRequestURL().toString().split("pay")[0] + "pay/firstPayResultAjax.do") ; + LoginVO loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser(); + //테스트 + mjonPayVO.setBuyerName(loginVO.getName()); //구매자 이름 + mjonPayVO.setBuyerEmail(loginVO.getEmail()); //구매자 이메일 + mjonPayVO.setBuyerTel(loginVO.getMoblphonNo()); //구매자 휴대폰 번호 + //moid 생성 위치 변경 + mjonPayVO.setMoid(idgenPgMoid.getNextStringId()); + + //결제 페이지 + mjonPayVO.setReturnURL("/web/event/member/pay/firstEventPayResultAjax.do"); + + model.addAttribute("mjonPayVO", mjonPayVO); + return "web/cop/nicepay/payRequestMber"; + } + + @RequestMapping( value = {"/web/event/member/pay/firstEventPayResultAjax.do"}) + public String firstEventPayResult(HttpServletRequest request, + ModelMap model , @RequestParam Map commandMap, + @ModelAttribute("searchVO") MjonPayVO mjonPayVO) throws Exception { + + String pattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE) ; + + //mjonPayVO.setReturnURL(request.getRequestURL().toString().split("nice")[0] + "payResult.do") ; + MjonPayVO returnMjonPayVO = new MjonPayVO(); + mjonPayVO.setPageType("event"); + + // returnMjonPayVO = mjonPayService.insertPay(mjonPayVO , request, "nice" ); //PG, PGTXT, CASH , 포인트 insert / 회원정보 캐시,포인트 update + returnMjonPayVO = mjonEventService.insertFirstEventNicePay_advc(mjonPayVO , request, "nice" ); //PG, PGTXT, CASH , 포인트 insert / 회원정보 캐시,포인트 update + + model.addAttribute("mjonPayVO", returnMjonPayVO); + if(pattern.equals("/web/member/pay/payResultAjax.do")){ + model.addAttribute("userPage", true); + } + + return "web/cop/nicepay/payResultAjax"; + } + + + // KG모빌런스 + ///////////////////////////////////////////////////////////////////////////////////////// + // + // Mobile Start + // + /** + * KGM 정보 Encode + * @param MjonPayVO + * @param modelAndView + * @return /web/event/member/pay/firstEventKgmMobileEncodeAjax.do + * @throws Exception + */ + @RequestMapping(value = "/web/event/member/pay/firstEventKgmMobileEncodeAjax.do") + public ResponseEntity firstEventKgmMobileEncodeAjax( + MjonPayVO mjonPayVO + , HttpServletRequest request ) throws Exception { + + LoginVO loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser(); + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + + if(StringUtils.isEmpty(userId)) { + return ResponseEntity.ok().body(new StatusResponse(HttpStatus.OK, "", "")); + } + + MjonKgmVO mjonKgmVO = kgmPayUtil.kgmMobileEncode(request + , "/web/event/member/pay/firstEventOkUrlMobileAjax.do" + , "/web/event/member/pay/firstEventNotiUrlMobileAjax.do"); + return ResponseEntity.ok().body(new StatusResponse(HttpStatus.OK, "", mjonKgmVO)); + } + + @RequestMapping(value= {"/web/event/member/pay/firstEventOkUrlMobileAjax.do"}) + public String firstEventOkUrlMobileAjax( + HttpServletRequest request + , HttpSession session + , HttpServletResponse response + , ModelMap model + ) throws Exception{ + + //크롬 SameSite정책 방지 - 도메인이 다른 타사로 이동 시 크롬 정책에 의해 세션 유실이 일어나는 경우가 있는데, 이를 방지하기 위해 samesite 보안을 none처리 + response.setHeader("Set-Cookie", "mberSession=mberSession; Secure; SameSite=None"); + + String rstMsg = ""; + if("0000".equals(request.getParameter("Resultcd"))) { + rstMsg = "휴대폰결제가 정상적으로 완료되었습니다."; + } + else { + rstMsg = "휴대폰결제가 실패했습니다."; + } + + model.addAttribute("Resultcd", request.getParameter("Resultcd")); + model.addAttribute("Resultmsg", rstMsg); + + System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"); + System.out.println("KG MOBILIANS OkUrl - MOBILE ResultCd : " + request.getParameter("Resultcd")); + System.out.println("KG MOBILIANS OkUrl - MOBILE ResultMsg : " + rstMsg); + + return "web/cop/kgmV2/mobileOkUrl"; + } + + @RequestMapping(value= {"/web/event/member/pay/firstEventNotiUrlMobileAjax.do"}) + public String firstEventNotiUrlMobileAjax(HttpServletRequest request, HttpServletResponse response + , @ModelAttribute("searchVO") MjonPayVO mjonPayVO + , ModelMap model) throws Exception{ + + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("jsonView"); + + //크롬 SameSite정책 방지 - 도메인이 다른 타사로 이동 시 크롬 정책에 의해 세션 유실이 일어나는 경우가 있는데, 이를 방지하기 위해 samesite 보안을 none처리 + response.setHeader("Set-Cookie", "mberSession=mberSession; Secure; SameSite=None"); + + String rtnMsg = mjonEventService.insertFirstEventKgPayMobile_advc(mjonPayVO, response, request); + + model.addAttribute("returnMsg", rtnMsg); + + return "web/cop/kgmV2/mobileNotiUrl"; + } + + ///////////////////////////////////////////////////////////////////////////////////////// + // + // BANK Start + // + /** + * KGM 정보 Encode + * @param MjonPayVO + * @param modelAndView + * @return /web/event/member/pay/kgmEncodeAjax.do + * @throws Exception + */ + @RequestMapping(value = "/web/event/member/pay/firstEventKgmBankEncodeAjax.do") + public ResponseEntity firstEventKgmBankEncodeAjax( + MjonPayVO mjonPayVO + , HttpServletRequest request ) throws Exception { + + LoginVO loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser(); + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + + if(StringUtils.isEmpty(userId)) { + return ResponseEntity.ok().body(new StatusResponse(HttpStatus.OK, "", "")); + } + + MjonKgmVO mjonKgmVO = kgmPayUtil.kgmBankEncode(request + , "/web/event/member/pay/firstEventOkUrlBankAjax.do" + , "/web/event/member/pay/firstEventNotiUrlBankAjax.do"); + return ResponseEntity.ok().body(new StatusResponse(HttpStatus.OK, "", mjonKgmVO)); + } + + @RequestMapping(value= {"/web/event/member/pay/firstEventOkUrlBankAjax.do"}) + public String okUrlBankAjax( + HttpServletRequest request + , HttpSession session + , HttpServletResponse response + , ModelMap model + ) throws Exception{ + + //크롬 SameSite정책 방지 - 도메인이 다른 타사로 이동 시 크롬 정책에 의해 세션 유실이 일어나는 경우가 있는데, 이를 방지하기 위해 samesite 보안을 none처리 + response.setHeader("Set-Cookie", "mberSession=mberSession; Secure; SameSite=None"); + + String rstMsg = ""; + if("0000".equals(request.getParameter("Resultcd"))) { + rstMsg = "즉시이체가 정상적으로 완료되었습니다."; + } + else { + rstMsg = "즉시이체가 실패했습니다."; + } + + model.addAttribute("Resultcd", request.getParameter("Resultcd")); + model.addAttribute("Resultmsg", rstMsg); + + System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"); + System.out.println("KG MOBILIANS OkUrl - BANK ResultCd : " + request.getParameter("Resultcd")); + System.out.println("KG MOBILIANS OkUrl - BANK ResultMsg : " + rstMsg); + + return "web/cop/kgmV2/bankOkUrl"; + } + /** + * KGM Bank 결제notiUrl 페이지 + * @param searchVO + * @param model + * @throws Exception + */ + @RequestMapping(value= {"/web/event/member/pay/firstEventNotiUrlBankAjax.do"}) + public String notiUrlBankAjax(HttpServletRequest request, HttpServletResponse response + , @ModelAttribute("searchVO") MjonPayVO mjonPayVO + , ModelMap model) throws Exception{ + + //크롬 SameSite정책 방지 - 도메인이 다른 타사로 이동 시 크롬 정책에 의해 세션 유실이 일어나는 경우가 있는데, 이를 방지하기 위해 samesite 보안을 none처리 + response.setHeader("Set-Cookie", "mberSession=mberSession; Secure; SameSite=None"); + + String rtnMsg = mjonEventService.insertFirstEventKgPayBank_advc(mjonPayVO, response, request); + + model.addAttribute("returnMsg", rtnMsg); + + return "web/cop/kgmV2/bankNotiUrl"; + } + + ///////////////////////////////////////////////////////////////////////////////////////// + // + // card Start + // + /** + * KGM 정보 Encode + * @param MjonPayVO + * @param modelAndView + * @return /web/event/member/pay/firstEventKgmCardEncodeAjax.do + * @throws Exception + */ + @RequestMapping(value = "/web/event/member/pay/firstEventKgmCardEncodeAjax.do") + public ResponseEntity firstEventKgmCardEncodeAjax( + MjonPayVO mjonPayVO + , HttpServletRequest request ) throws Exception { + + LoginVO loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser(); + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + + if(StringUtils.isEmpty(userId)) { + return ResponseEntity.ok().body(new StatusResponse(HttpStatus.OK, "", "")); + } + + MjonKgmVO mjonKgmVO = kgmPayUtil.kgmCardEncode(request + , "/web/event/member/pay/firstEventOkUrlCardAjax.do" + , "/web/event/member/pay/firstEventNotiUrlCardAjax.do"); + return ResponseEntity.ok().body(new StatusResponse(HttpStatus.OK, "", mjonKgmVO)); + } + + @RequestMapping(value= {"/web/event/member/pay/firstEventOkUrlCardAjax.do"}) + public String firstEventOkUrlCardAjax( + HttpServletRequest request + , HttpSession session + , HttpServletResponse response + , ModelMap model + ) throws Exception{ + + //크롬 SameSite정책 방지 - 도메인이 다른 타사로 이동 시 크롬 정책에 의해 세션 유실이 일어나는 경우가 있는데, 이를 방지하기 위해 samesite 보안을 none처리 + response.setHeader("Set-Cookie", "mberSession=mberSession; Secure; SameSite=None"); + + String rstMsg = ""; + if("0000".equals(request.getParameter("Resultcd"))) { + rstMsg = "즉시이체가 정상적으로 완료되었습니다."; + } + else { + rstMsg = "즉시이체가 실패했습니다."; + } + + model.addAttribute("Resultcd", request.getParameter("Resultcd")); + model.addAttribute("Resultmsg", rstMsg); + + System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"); + System.out.println("KG MOBILIANS OkUrl - CARD ResultCd : " + request.getParameter("Resultcd")); + System.out.println("KG MOBILIANS OkUrl - CARD ResultMsg : " + rstMsg); + + return "web/cop/kgmV2/cardOkUrl"; + } + /** + * KGM card 결제notiUrl 페이지 + * @param searchVO + * @param model + * @throws Exception + */ + @RequestMapping(value= {"/web/event/member/pay/firstEventNotiUrlCardAjax.do"}) + public String firstEventNotiUrlCardAjax(HttpServletRequest request, HttpServletResponse response + , @ModelAttribute("searchVO") MjonPayVO mjonPayVO + , ModelMap model) throws Exception{ + + //크롬 SameSite정책 방지 - 도메인이 다른 타사로 이동 시 크롬 정책에 의해 세션 유실이 일어나는 경우가 있는데, 이를 방지하기 위해 samesite 보안을 none처리 + response.setHeader("Set-Cookie", "mberSession=mberSession; Secure; SameSite=None"); + + String rtnMsg = mjonEventService.insertFirstEventKgPayBank_advc(mjonPayVO, response, request); + + model.addAttribute("returnMsg", rtnMsg); + + return "web/cop/kgmV2/cardNotiUrl"; + } } diff --git a/src/main/java/itn/let/mjo/pay/service/MjonKgmVO.java b/src/main/java/itn/let/mjo/pay/service/MjonKgmVO.java new file mode 100644 index 00000000..297f45d7 --- /dev/null +++ b/src/main/java/itn/let/mjo/pay/service/MjonKgmVO.java @@ -0,0 +1,103 @@ +package itn.let.mjo.pay.service; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class MjonKgmVO{ + + /*****************************************************************************************/ + String cash_gb = ""; // 대표결제수단 + + /***************************************************************************************** + - 필수 입력 항목 + *****************************************************************************************/ + String ver = ""; //ALL_NEW : 버전설정 고정 + String cn_svcid = ""; //서비스아이디 : CN + String mc_svcid = ""; //서비스아이디 : MC + String ra_svcid = ""; //서비스아이디 : RA + + String pay_mode = ""; //연동시 테스트/실결제 구분 (00: 테스트결제-비과금, 10: 실거래결제-과금) + String prdtprice = ""; //결제요청금액. + String prdtnm = "캐시충전"; //상품명 ( 50byte 이내 ) + String siteurl = ""; //가맹점도메인 + String tradeid = ""; //가맹점거래번호 //결제 요청 시 마다 unique한 값을 세팅해야 함. + String okurl = ""; //성공화면처리URL : 결제완료통보페이지 full Url (예:http://www.mcash.co.kr/okurl.jsp ) + String notiurl = ""; //결제처리URL : 결제 완료 후, 가맹점측 과금 등 처리할 가맹점측 URL + + /***************************************************************************************** + - 디자인 관련 필수항목 + *****************************************************************************************/ + String logo_yn = "N"; //가맹점 로고 사용 여부 (N: 모빌리언스 로고-default, Y: 가맹점 로고 (사전에 모빌리언스에 가맹점 로고 이미지를 등록해야함)) + String call_type = "P"; //결제창 호출 방식 (P: 팝업-default, SELF: 페이지전환, I: 아이프레임) + + /***************************************************************************************** + - 디자인 관련 선택항목 (향후 변경될 수 있습니다.) + *****************************************************************************************/ + String iframe_name = ""; //결제창을 iframe으로 호출 할 경우 iframe 명칭 세팅 + String infoarea_yn = ""; //결제창 안내문 표시여부 (Y: 표시-default, N: 미표시) + String footer_yn = ""; //결제창 하단 안내 표시여부 (Y: 표시-default, N: 미표시) + String height = ""; //결제창 높이 (px단위: iframe 등 사용시 결제창 높이 조절, 팝업창 등 호출시 "" 로 세팅) + String prdt_hidden = ""; //iframe 사용시 상품명 숨김 여부 (가맹점 디자인 결제창으로 결제 입력 사항만 iframe에서 사용시) + String email_hidden = ""; //결제자 e-mail 입력창 숨김 여부 (N: 표시-default, Y: 미표시) + String contract_hidden = ""; //이용약관 숨김 여부 (Y: 표시-default, N: 미표시) + + /***************************************************************************************** + - 선택 입력 항목 + *****************************************************************************************/ + String userid = ""; //가맹점결제자ID + String username = ""; //결제자명 + String payeremail = ""; //결제자email + String notiemail = ""; //알림 e-mail: 결제 완료 후 당사와 가맹점간의 Noti 연동이 실패한 경우 알람 메일을 받을 가맹점 담당자 이메일주소 + String item = ""; //아이템코드. 미사용 시 반드시 공백으로 세팅. + String prdtcd = ""; //상품코드. 자동결제인 경우 상품코드별 SMS문구를 별도 세팅할 때 사용하며 사전에 모빌리언스에 등록이 필요함. + String closeurl = ""; //닫기버튼 클릭 시 호출되는 가맹점 측 페이지. CALL_TYPE = ‘I’ 또는 ‘SELF’ 셋팅 시 필수 + String failurl = ""; //결제 실패 시 사용자에게 보여질 가맹점 측 실패 페이지 + String mstr = ""; //가맹점콜백변수 //가맹점에서 추가적으로 파라미터가 필요한 경우 사용하며 &,%,?,^ 는 사용불가 ( 예 : MSTR="a=1|b=2|c=3" ) + String deposit = ""; //일회용컵보증금 + + + /***************************************************************************************** + - 간편결제 : CN + *****************************************************************************************/ + String termregno = ""; //하위가맹점사업자번호 + String app_scheme = ""; //APP SCHEME + String cn_billtype = ""; //매출전표 출력 시 과세/비과세 구분 + String cn_taxfree = ""; //비과세 + String cn_tax = ""; //부과세 - 전체금액의 10%이하로 설정 + String cn_freeinterest = ""; //무이자할부정보 + String cn_point = ""; //카드사포인트사용여부 + String cn_install = ""; //할부개월 + String cn_fixcardcd = ""; //카드사 선택노출 '결제창에 노출할 카드사 코드 셋팅 + String cn_direct = ""; //카드사 직접호출 ( 예 : KBC:00:N ) + + /***************************************************************************************** + - 휴대폰결제 : MC + *****************************************************************************************/ + String mc_authpay = ""; //하이브리드 방식 사용시 "Y" 로 설정 (휴대폰 SMS인증 후 일반 소켓모듈 결제 연동시 사용) (N: 미사용-default, Y: 사용) + String mc_autopay = ""; //자동결제를 위한 최초 일반결제 시 "Y" 세팅. 결제 완료 후 휴대폰정보 대체용 USERKEY 발급 및 자동결제용 AutoBillKey 발급 (N: 미사용-default, Y: 사용) + String mc_partpay = ""; //부분취소를 위한 일반결제 시 "Y" 세팅. 결제 완료 후 자동결제 USERKEY 발급 (N: 미사용-default, Y: 사용) + String mc_no = ""; //사용자 폰번호 (결제창 호출시 세팅할 폰번호) + String mc_fixno = ""; //사용자 폰번호 수정불가 여부(N: 수정가능-default, Y: 수정불가) + String mc_defaultcommid = ""; //통신사 기본 선택 값. SKT, KTF, LGT 3개의 값 중 원하는 통신사 세팅 시 해당 통신사가 미리 선택되어짐. + String mc_fixcommid = ""; //통신사 고정 선택 값. SKT, KTF, LGT 3개의 값 중 원하는 통신사 세팅 시 해당 통신사만 결제창에 보여짐. + String mc_cpcode = ""; //리셀러하위상점key. 리셀러 업체인 경우에만 세팅. + String mc_ez_yn = "Y"; //간소화결제여부. 간소화결제 사용시 "Y" 로 설정 (N: 미사용-default, Y: 사용) + String mc_ez_key = ""; //간소화결제 사용자키 + + /***************************************************************************************** + - 즉시이체 : RA + *****************************************************************************************/ + + + /***************************************************************************************** + - 암호화 처리 (암호화 사용 시) + Cryptstring 항목은 금액변조에 대한 확인용으로 반드시 아래와 같이 문자열을 생성하여야 합니다. + + 주) 암호화 스트링은 가맹점에서 전달하는 거래번호로 부터 추출되어 사용되므로 + 암호화에 이용한 거래번호가 변조되어 전달될 경우 복호화 실패로 결제 진행이 불가합니다. + *****************************************************************************************/ + String cryptyn = "Y"; //Y: 암호화 사용, N: 암호화 미사용 + String cryptstring = ""; //암호화 사용 시 암호화된 스트링 +} diff --git a/src/main/java/itn/let/mjo/pay/service/MjonPayVO.java b/src/main/java/itn/let/mjo/pay/service/MjonPayVO.java index a1de761d..cbde25ed 100644 --- a/src/main/java/itn/let/mjo/pay/service/MjonPayVO.java +++ b/src/main/java/itn/let/mjo/pay/service/MjonPayVO.java @@ -236,8 +236,8 @@ public class MjonPayVO extends ComDefaultVO{ private int remainPoint; - + private String payType; // 결제분류 private String totChgPay; // 간편결제분류 - + private String rtnMsg; } diff --git a/src/main/webapp/WEB-INF/jsp/web/cop/nicepay/payRequestMber.jsp b/src/main/webapp/WEB-INF/jsp/web/cop/nicepay/payRequestMber.jsp index 85cc4850..4ad36761 100644 --- a/src/main/webapp/WEB-INF/jsp/web/cop/nicepay/payRequestMber.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/cop/nicepay/payRequestMber.jsp @@ -119,7 +119,9 @@ html,body {overflow:hidden;} -
+ + +
- - -

이벤트 결제하기

@@ -953,7 +947,8 @@ function TabTypePay(obj, tabId) {
  • -
  • + +