File name
Commit message
Commit date
2024-11-05
File name
Commit message
Commit date
2024-11-05
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
2024-09-10
File name
Commit message
Commit date
File name
Commit message
Commit date
2024-11-05
2024-07-22
package itn.let.mjo.pay.web;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
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 javax.servlet.http.HttpSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
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.servlet.HandlerMapping;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
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.utl.fcc.service.EgovStringUtil;
import itn.let.mjo.mjocommon.MjonCommon;
import itn.let.mjo.msgcampain.service.MjonCandidateService;
import itn.let.mjo.msgcampain.service.MjonCandidateVO;
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.grd.service.MberGrdService;
import itn.let.sym.grd.service.MberGrdVO;
import itn.let.sym.site.service.EgovSiteManagerService;
import itn.let.sym.site.service.JoinSettingVO;
import itn.let.uss.umt.service.EgovMberManageService;
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;
@Controller
public class MjonPayV2Controller {
private static final Logger LOGGER = LoggerFactory.getLogger(MjonPayController.class);
@Resource(name = "mjonPayService")
private MjonPayService mjonPayService;
@Resource(name = "mberManageService")
private EgovMberManageService mberManageService;
@Resource(name = "mjonCandidateService")
private MjonCandidateService mjonCandidateService;
//전용계좌 서비스
@Resource(name = "vacsVactService")
private VacsVactService vacsVactService;
/** userManageService */
@Resource(name = "userManageService")
private EgovUserManageService userManageService;
/** 사이트 설정 */
@Resource(name = "egovSiteManagerService")
EgovSiteManagerService egovSiteManagerService;
/** 알림전송 Util */
@Resource(name = "mjonNoticeSendUtil")
private MjonNoticeSendUtil mjonNoticeSendUtil;
@Resource(name="MjonCommon")
private MjonCommon mjonCommon;
@Resource(name = "mberGrdService")
MberGrdService mberGrdService;
/** 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;
/**
* 결제하기
* @param searchVO
* @param model
* @return "/web/pay/PayView.do"
* @throws Exception
*/
@RequestMapping(value= {"/web/member/pay/PayView.do"})
public String PayViewV2(@ModelAttribute("mjonPayVO") MjonPayVO mjonPayVO,
HttpServletRequest request, RedirectAttributes redirectAttributes,
ModelMap model) throws Exception{
String pattern = (String) request.getAttribute(
HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE) ;
//로그인 정보 획득
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
if(loginVO == null) {
return "redirect:/web/user/login/login.do";
}
// 하드코딩
// Itm Member Id Check
//if(!getItnMemberId(userId)) {
// return "redirect:/web/main/mainPage.do";
//}
MberManageVO mberManageVO = mberManageService.selectMber(loginVO.getId());
model.addAttribute("mberManageVO", mberManageVO);
MjonCandidateVO mjonCandidateVO = new MjonCandidateVO();
if(userId != "") {
mjonCandidateVO = mjonCandidateService.selectCandidateDataInfo(userId);
model.addAttribute("mjonCandidateVO",mjonCandidateVO);
}
mjonPayVO.setReturnURL(request.getRequestURL().toString().split("pay")[0] + "nicepay/payResultAjax.do") ;
/** pageing */
PaginationInfo paginationInfo = new PaginationInfo();
paginationInfo.setCurrentPageNo(mjonPayVO.getPageIndex());
paginationInfo.setRecordCountPerPage(mjonPayVO.getPageUnit());
paginationInfo.setPageSize(mjonPayVO.getPageSize());
mjonPayVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
mjonPayVO.setLastIndex(paginationInfo.getLastRecordIndex());
mjonPayVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
if("".equals(mjonPayVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
mjonPayVO.setSearchSortCnd("moid");
mjonPayVO.setSearchSortOrd("desc");
}
mjonPayVO.setUserId(loginVO.getId());
//대상 리스트 가져오기
VacsVactVO vacsVactVO = new VacsVactVO();
vacsVactVO.setMberId(loginVO.getId());
List<?> bankList = vacsVactService.selectBankAcctAllList(vacsVactVO); //할당 가능한 계좌 수량 리스트 받아오기
List<?> myBankList = vacsVactService.selectMyBankAcctList(vacsVactVO); //내가 할당받은 전용계좌 리스트 받아오기
MjonVaMsgLogVO vaMsgLogVO = new MjonVaMsgLogVO();
vaMsgLogVO.setMberId(loginVO.getId());
Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String date = sdf.format(now);
vaMsgLogVO.setSendDate(date);
MjonVaMsgLogVO resultMsgInfo = mjonPayService.selectMyAcctSendCnt(vaMsgLogVO);
//대상 리스트, 페이징 정보 전달
model.addAttribute("resultList", bankList);
model.addAttribute("resultMyList", myBankList);
model.addAttribute("resultMsgInfo", resultMsgInfo);
model.addAttribute("mjonPayVO", mjonPayVO);
// 탭이동
String tabType = "1";
if(request.getParameter("tabType") != null) {
tabType = request.getParameter("tabType");
}
model.addAttribute("tabType", tabType);
MberGrdVO mberGrdVO = new MberGrdVO();
List<MberGrdVO> mberGrdSettingList = mberGrdService.selectMberGrdSettingList(mberGrdVO);
model.addAttribute("mberGrdSettingList", mberGrdSettingList);
return "/web/pay/PayView";
}
/**
* 결제하기
* @param searchVO
* @param model
* @return "/web/pay/PayView.do"
* @throws Exception
*/
@RequestMapping(value= {"/web/member/pay/selectVaViewPrintPopupAjax.do"})
public String selectVaViewPrintPopupAjax(@ModelAttribute("mjonPayVO") MjonPayVO mjonPayVO,
HttpServletRequest request, RedirectAttributes redirectAttributes,
ModelMap model) throws Exception{
String pattern = (String) request.getAttribute(
HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE) ;
//로그인 정보 획득
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
String userNm = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getName());
if(loginVO == null) {
return "redirect:/web/user/login/login.do";
}
// 하드코딩
// Itm Member Id Check
//if(!getItnMemberId(userId)) {
// return "redirect:/web/main/mainPage.do";
//}
MberManageVO mberManageVO = mberManageService.selectMber(loginVO.getId());
model.addAttribute("mberManageVO", mberManageVO);
//회원 전용계좌 정보 리스트 가져오기
VacsVactVO vacsVactVO = new VacsVactVO();
vacsVactVO.setMberId(loginVO.getId());
List<?> myBankList = vacsVactService.selectMyBankAcctList(vacsVactVO); //내가 할당받은 전용계좌 리스트 받아오기
//대상 리스트, 페이징 정보 전달
model.addAttribute("resultMyList", myBankList);
//사용자 정보
model.addAttribute("userId", userId);
model.addAttribute("userNm", userNm);
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH) + 1;
int day = cal.get(Calendar.DAY_OF_MONTH);
model.addAttribute("year", year);
model.addAttribute("month", month);
model.addAttribute("day", day);
return "/web/pay/PayVaViewPrintPopup";
}
/**
* 다음 결제시 결제수단 SELECT
* @throws Exception
*/
@RequestMapping(value = "/web/member/pay/selectNextPayMethodAjax.do")
public ModelAndView selectNextPayMethodAjax(MjonPayVO mjonPayVO,
HttpServletRequest request ) throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("jsonView");
boolean isSuccess = true;
String msg = "";
String nextPayMethod = "";
LoginVO loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
if(userId == null) {
isSuccess = false;
msg = "로그인이 필요합니다.";
}
try {
// 다음 결제시 결제수단 SELECT
nextPayMethod = userManageService.selectNextPayMethod(userId);
}
catch(Exception e) {
isSuccess = false;
msg = e.getMessage();
}
modelAndView.addObject("isSuccess", isSuccess);
modelAndView.addObject("msg", msg);
modelAndView.addObject("nextPayMethod", nextPayMethod);
return modelAndView;
}
/**
* 다음 결제시 결제수단 UPDATE
* @throws Exception
*/
@RequestMapping(value = "/web/member/pay/updateNextPayMethodAjax.do")
public ModelAndView updateNextPayMethodAjax(UserManageVO userManageVO,
HttpServletRequest request ) throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("jsonView");
boolean isSuccess = true;
String msg = "";
LoginVO loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
if(userId == null) {
isSuccess = false;
msg = "로그인이 필요합니다.";
}
try {
// 다음 결제시 결제수단 SELECT
userManageVO.setMberId(userId);
userManageService.updateNextPayMethod(userManageVO);
}
catch(Exception e) {
isSuccess = false;
msg = e.getMessage();
}
modelAndView.addObject("isSuccess", isSuccess);
modelAndView.addObject("msg", msg);
return modelAndView;
}
/////////////////////////////////////////////////////////////////////////////////////////
//
//
// CARD
//
//
/**
* KGM 간편결제 정보 Encode
* @param MjonPayVO
* @param modelAndView
* @return /web/member/pay/kgmCardEncodeAjax.do
* @throws Exception
*/
@RequestMapping(value = "/web/member/pay/kgmCardEncodeAjax.do")
public ModelAndView kgmCardEncodeAjax(MjonPayVO mjonPayVO,
HttpServletRequest request ) throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("jsonView");
boolean isSuccess = true;
String msg = "";
LoginVO loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
String userNm = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getName());
if(userId == null) {
isSuccess = false;
msg = "로그인이 필요합니다.";
}
try {
// 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"; // 대표결제수단. 고정
/*****************************************************************************************
- 필수 입력 항목
*****************************************************************************************/
String VER = "ALL_NEW"; //ALL_NEW : 버전설정 고정
String CN_SVCID = globalCnSvcid; //서비스아이디
String PAY_MODE = globalCnPayMode; //10 : 실거래결제 고정
String Prdtprice = request.getParameter("Prdtprice");; //결제요청금액.
String Prdtnm = "캐시충전"; //상품명 ( 50byte 이내 )
String Siteurl = kgmServerName; //가맹점도메인
String Okurl = kgmPath + "/web/kgm/pay/okUrlCardAjax.do"; //성공화면처리URL : 결제완료통보페이지 full Url (예:http://www.mcash.co.kr/okurl.jsp )
String Tradeid = CN_SVCID + "_" + appr_dtm + "_" + numberGen(6,1); //가맹점거래번호 //결제 요청 시 마다 unique한 값을 세팅해야 함.
/*****************************************************************************************
- 선택 입력 항목
*****************************************************************************************/
String Notiurl = kgmPath + "/web/kgm/pay/notiUrlCardAjax.do"; //결제처리URL : 결제 완료 후, 가맹점측 과금 등 처리할 가맹점측 URL
String Userid = userId; //가맹점결제자ID
String Username = userNm; //결제자명
String CALL_TYPE = "P"; //결제창 호출방식
String Failurl = ""; //결제 실패 시 사용자에게 보여질 가맹점 측 실패 페이지
String Closeurl = ""; //닫기버튼 클릭 시 호출되는 가맹점 측 페이지. CALL_TYPE = ‘I’ 또는 ‘SELF’ 셋팅 시 필수
String MSTR = ""; //가맹점콜백변수 //가맹점에서 추가적으로 파라미터가 필요한 경우 사용하며 &,%,?,^ 는 사용불가 ( 예 : MSTR="a=1|b=2|c=3" )
String Payeremail = ""; //결제자email
String CN_BILLTYPE = ""; //매출전표 출력 시 과세/비과세 구분
String CN_TAXFREE = ""; //비과세
String CN_TAX = ""; //부과세 - 전체금액의 10%이하로 설정
String CN_FREEINTEREST = ""; //무이자할부정보
String CN_POINT = ""; //카드사포인트사용여부
String Termregno = ""; //하위가맹점사업자번호
String APP_SCHEME = ""; //APP SCHEME
String CN_INSTALL = ""; //할부개월
String CN_FIXCARDCD = ""; //카드사 선택노출 '결제창에 노출할 카드사 코드 셋팅
String CN_DIRECT = ""; //카드사 직접호출 ( 예 : KBC:00:N )
String Deposit = ""; //일회용컵보증금
/*****************************************************************************************
- 암호화 처리 (암호화 사용 시)
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);
}
// 필수
modelAndView.addObject("CASH_GB", CASH_GB);
modelAndView.addObject("VER", VER);
modelAndView.addObject("CN_SVCID", CN_SVCID);
modelAndView.addObject("PAY_MODE", PAY_MODE);
modelAndView.addObject("Prdtnm", Prdtnm);
modelAndView.addObject("Siteurl", Siteurl);
modelAndView.addObject("Tradeid", Tradeid);
// 선택
modelAndView.addObject("CALL_TYPE", CALL_TYPE);
modelAndView.addObject("Closeurl", Closeurl);
modelAndView.addObject("MSTR", MSTR);
modelAndView.addObject("Payeremail", Payeremail);
modelAndView.addObject("Userid", Userid);
modelAndView.addObject("Username", Username);
modelAndView.addObject("CN_BILLTYPE", CN_BILLTYPE);
modelAndView.addObject("CN_TAXFREE", CN_TAXFREE);
modelAndView.addObject("CN_TAXFREE", CN_TAXFREE);
modelAndView.addObject("CN_TAX", CN_TAX);
modelAndView.addObject("CN_FREEINTEREST", CN_FREEINTEREST);
modelAndView.addObject("CN_POINT", CN_POINT);
modelAndView.addObject("Termregno", Termregno);
modelAndView.addObject("APP_SCHEME", APP_SCHEME);
modelAndView.addObject("CN_INSTALL", CN_INSTALL);
modelAndView.addObject("CN_FIXCARDCD", CN_FIXCARDCD);
modelAndView.addObject("CN_DIRECT", CN_DIRECT);
modelAndView.addObject("Deposit", Deposit);
// 변환
modelAndView.addObject("Cryptyn", Cryptyn);
modelAndView.addObject("Okurl", Okurl);
modelAndView.addObject("Failurl", Failurl);
modelAndView.addObject("Notiurl", Notiurl);
modelAndView.addObject("Prdtprice", Prdtprice);
modelAndView.addObject("Cryptstring", Cryptstring);
}
catch(Exception e) {
isSuccess = false;
msg = e.getMessage();
}
modelAndView.addObject("isSuccess", isSuccess);
modelAndView.addObject("msg", msg);
return modelAndView;
}
/**
* KGM Card 결제 notiUrl 페이지
* @param searchVO
* @param model
* @throws Exception
*/
@RequestMapping(value= {"/web/kgm/pay/notiUrlCardAjax.do"})
public String notiUrlCardAjax(
HttpServletRequest request
, HttpServletResponse response
, ModelMap model
) throws Exception{
//크롬 SameSite정책 방지 - 도메인이 다른 타사로 이동 시 크롬 정책에 의해 세션 유실이 일어나는 경우가 있는데, 이를 방지하기 위해 samesite 보안을 none처리
response.setHeader("Set-Cookie", "mberSession=mberSession; Secure; SameSite=None");
String rtnMsg = "";
String CASH_GB = request.getParameter("CASH_GB"); /* 결제수단(CN)*/
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"); // 상점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"); /* 결과메세지 */
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);
//chkValue = "ZZZZZ";
//encChkValue = chkValue;
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 - CARD Tradeid : " + Tradeid);
System.out.println("KG MOBILIANS NotiUrl - CARD returnMsg2 : " + rtnMsg);
}
else if (tidCnt == 0) {
// Check0. 데이터 위·변조 체크
if (!encChkValue.equals(chkValue)) {
System.out.println("#############################################################");
System.out.println("KG MOBILIANS NotiUrl - CARD : 데이터 위·변조 가능성 높으니 결제오류 처리 => " + cpChkValue);
Resultcd = "9999";
Resultmsg = "데이터 위·변조 가능성이 있어 결제오류 처리했습니다. KG모빌리언스 정상결제 여부 확인후, 고객님께 안내후 결제취소해주세요.";
try {
// 법인폰 알람여부 체크
JoinSettingVO joinSettingVO = new JoinSettingVO();
joinSettingVO = egovSiteManagerService.selectAdminNotiDetail();
// SMS 체크
if (joinSettingVO != null && joinSettingVO.getSmsNoti().equals("Y")) {
// 스미싱의심 SMS 알림전송
mjonNoticeSendUtil.smishingSmsNoticeSend("간편결제 데이터 위·변조 가능성 결제오류 처리", Userid, "");
}
// SLACK 체크
if (joinSettingVO != null && joinSettingVO.getSlackNoti().equals("Y")) {
// Slack 메시지 발송(단순본문)
String msg = "[문자온] " + Userid + "님 결제건 알림 => 데이터 위·변조 가능성이 있어 결제오류 처리했습니다. KG모빌리언스 에는 정상결제 됐을수 있습니다. https://cp.mcash.co.kr/mcht 에서 정상결제 확인후, 고객님께 안내후, 결제취소해주세요.";
mjonCommon.sendSimpleSlackMsg(msg);
}
}
catch (Exception e) {
System.out.println("#############################################################");
System.out.println("KG MOBILIANS NotiUrl - CARD : 데이터 위·변조 가능성 높으니 결제오류 처리 => SMS, 슬랙 알림 오류");
}
}
// Check1. KG모빌리언스 호출아이피 체크
if (!getIsKgmServerIp(request)) {
System.out.println("#############################################################");
System.out.println("KG MOBILIANS NotiUrl - CARD : 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 - CARD : 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
MjonPayVO mjonPayVO = new MjonPayVO();
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("SPAY"); // 결제방법
mjonPayVO.setSpayMethod(spayMethod); // 간편결제 결제방법
mjonPayVO.setSpayDiv(MSTR); // 간편결제분류
mjonPayVO.setPgCode("KGM"); //
mjonPayVO.setGoodsName(Prdtnm); //
mjonPayVO.setPhone(""); // 모바일
mjonPayVO.setMobile(""); // 모바일
mjonPayVO.setEmail(mberEmailAdres); // 이메일(회원정보)
mjonPayVO.setPayerEmail(Payeremail);
mjonPayVO.setTid(Tradeid); // Tid
mjonPayVO.setMid(Svcid); // Mid = Svcid
// 회원정보
mjonPayVO.setBuyerName(mberNm);
mjonPayVO.setBuyerTel(moblphonNo);
mjonPayVO.setBuyerEmail(mberEmailAdres);
// 추가
mjonPayVO.setCardCode(Cardcode);
mjonPayVO.setCardName(Cardname);
// 인서트
mjonPayService.insertKgmAllV2(mjonPayVO);
rtnMsg = "SUCCESS";
try {
// 대상 : 휴대폰결제, 즉시이체, 전용계좌
// 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("스미싱의심/간편결제 첫결제", Userid, mberNm);
}
// SLACK 체크
if (joinSettingVO != null && joinSettingVO.getSlackNoti().equals("Y")) {
// Slack 메시지 발송(단순본문)
String msg = "[문자온] 스미싱의심/간편결제 첫결제 - " + 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 - CARD 슬랙알림 & 스미싱의심 처리 Error");
System.out.println("KG MOBILIANS NotiUrl - CARD Tradeid : " + Tradeid);
System.out.println("KG MOBILIANS NotiUrl - CARD e.getMessage() : " + e.getMessage());
}
System.out.println("#############################################################");
System.out.println("KG MOBILIANS NotiUrl - CARD Tradeid : " + Tradeid);
System.out.println("KG MOBILIANS NotiUrl - CARD returnMsg : " + rtnMsg);
}
}
catch(Exception e) {
rtnMsg = "FAIL";
System.out.println("#############################################################");
System.out.println("KG MOBILIANS NotiUrl - CARD Tradeid : " + Tradeid);
System.out.println("KG MOBILIANS NotiUrl - CARD returnMsg : " + rtnMsg);
System.out.println("KG MOBILIANS NotiUrl - CARD e.getMessage() : " + e.getMessage());
}
model.addAttribute("returnMsg", rtnMsg);
return "web/cop/kgmV2/cardNotiUrl";
}
/**
* KGM Card 결제 okUrl 페이지
* @param searchVO
* @param model
* @throws Exception
*/
@RequestMapping(value= {"/web/kgm/pay/okUrlCardAjax.do"})
public String okUrlCardAjax(
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";
}
/////////////////////////////////////////////////////////////////////////////////////////
//
//
// MOBILE
//
//
/**
* KGM 모바일 정보 Encode
* @param MjonPayVO
* @param modelAndView
* @return /web/member/pay/kgmMobileEncodeAjax.do
* @throws Exception
*/
@RequestMapping(value = "/web/member/pay/kgmMobileEncodeAjax.do")
public ModelAndView kgmMobileEncodeAjax(MjonPayVO mjonPayVO,
HttpServletRequest request ) throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("jsonView");
boolean isSuccess = true;
String msg = "";
LoginVO loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
if(userId == null) {
isSuccess = false;
msg = "로그인이 필요합니다.";
}
try {
// 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 고정] 결제수단구분. "MC" 고정값. 수정불가!
/*****************************************************************************************
- 필수 입력 항목
*****************************************************************************************/
String MC_SVCID = globalMcSvcid; //C //[ 12byte 고정] 모빌리언스에서 부여한 서비스ID (12byte 숫자 형식)
String PAY_MODE = globalMcPayMode; //C //[ 2byte 고정] 연동시 테스트/실결제 구분 (00: 테스트결제-비과금, 10: 실거래결제-과금)
String Prdtprice = request.getParameter("Prdtprice");; //결제요청금액.
String Okurl = kgmPath + "/web/kgm/pay/okUrlMobileAjax.do"; //성공화면처리URL : 결제완료통보페이지 full Url (예:http://www.mcash.co.kr/okurl.jsp )
String Prdtnm = "캐시충전"; //C //[ 50byte 이하] 상품명
String Siteurl = kgmServerName; // localhost [ 20byte 이하] 가맹점도메인 (예: www.mcash.co.kr)
String Tradeid = MC_SVCID + "_" + appr_dtm + "_" + numberGen(6,1); //[4byte 이상, 40byte 이하] 가맹점거래번호. 결제 요청 시 마다 unique한 값을 세팅해야 함. //해당 샘플에는 테스트를 위해 {가맹점 서비스ID + 요청일시} 형식으로 세팅하였음.
String Notiurl = kgmPath + "/web/kgm/pay/notiUrlMobileAjax.do";
/*****************************************************************************************
- 디자인 관련 필수항목
*****************************************************************************************/
String LOGO_YN = "N"; //[ 1byte 고정] 가맹점 로고 사용 여부 (N: 모빌리언스 로고-default, Y: 가맹점 로고 (사전에 모빌리언스에 가맹점 로고 이미지를 등록해야함))
String CALL_TYPE = "P"; //[ 4byte 이하] 결제창 호출 방식 (P: 팝업-default, SELF: 페이지전환, I: 아이프레임)
/*****************************************************************************************
- 선택 입력 항목
*****************************************************************************************/
String MC_AUTHPAY = ""; //[ 1byte 고정] 하이브리드 방식 사용시 "Y" 로 설정 (휴대폰 SMS인증 후 일반 소켓모듈 결제 연동시 사용) (N: 미사용-default, Y: 사용)
String MC_AUTOPAY = ""; //[ 1byte 고정] 자동결제를 위한 최초 일반결제 시 "Y" 세팅. 결제 완료 후 휴대폰정보 대체용 USERKEY 발급 및 자동결제용 AutoBillKey 발급 (N: 미사용-default, Y: 사용)
String MC_PARTPAY = ""; //[ 1byte 고정] 부분취소를 위한 일반결제 시 "Y" 세팅. 결제 완료 후 자동결제 USERKEY 발급 (N: 미사용-default, Y: 사용)
String MC_No = ""; //[ 11byte 이하] 사용자 폰번호 (결제창 호출시 세팅할 폰번호)
String MC_FIXNO = ""; //[ 1byte 고정] 사용자 폰번호 수정불가 여부(N: 수정가능-default, Y: 수정불가)
String MC_DEFAULTCOMMID = ""; //[ 3byte 고정] 통신사 기본 선택 값. SKT, KTF, LGT 3개의 값 중 원하는 통신사 세팅 시 해당 통신사가 미리 선택되어짐.
String MC_FIXCOMMID = ""; //[ 1byte 고정] 통신사 고정 선택 값. SKT, KTF, LGT 3개의 값 중 원하는 통신사 세팅 시 해당 통신사만 결제창에 보여짐.
String Payeremail = ""; //[ 30byte 이하] 결제자 e-mail
String Userid = userId; //[ 50byte 이하] 가맹점 결제자ID
String Item = ""; //[ 8byte 이하] 아이템코드. 미사용 시 반드시 공백으로 세팅.
String Prdtcd = ""; //[ 40byte 이하] 상품코드. 자동결제인 경우 상품코드별 SMS문구를 별도 세팅할 때 사용하며 사전에 모빌리언스에 등록이 필요함.
String MC_Cpcode = ""; //[ 20byte 이하] 리셀러하위상점key. 리셀러 업체인 경우에만 세팅.
String Notiemail = ""; //[ 30byte 이하] 알림 e-mail: 결제 완료 후 당사와 가맹점간의 Noti 연동이 실패한 경우 알람 메일을 받을 가맹점 담당자 이메일주소
String Closeurl = ""; //[ 128byte 이하] 결제창 취소버튼, 닫기버튼 클릭 시 호출되는 가맹점 측 페이지. iframe 호출 시 필수! (예: http://www.mcash.co.kr/closeurl.jsp)
String Failurl = ""; //[ 128byte 이하] 결제 실패 시 사용자에게 보여질 가맹점 측 실패 페이지. 결제처리에 대한 실패처리 안내를 가맹점에서 제어해야 할 경우만 사용.
String MSTR = ""; //[2000byte 이하] 가맹점 콜백 변수. 가맹점에서 추가적으로 파라미터가 필요한 경우 사용하며 &, % 는 사용불가 (예: MSTR="a=1|b=2|c=3")
String MC_EZ_YN = "Y"; //[ 1byte 고정] 간소화결제여부. 간소화결제 사용시 "Y" 로 설정 (N: 미사용-default, Y: 사용)
String MC_EZ_KEY = ""; //[ 20byte 고정] 간소화결제 사용자키
/*****************************************************************************************
- 오픈마켓의 경우 아래의 정보를 입력해야 합니다.
장바구니 결제의 경우 대표 판매자 외 n명, 대표 판매자 연락처를 입력하세요.
예) Sellernm = "홍길동외 2명";
Sellertel = "0212345678";
*****************************************************************************************/
String Sellernm = ""; //[ 50byte 이하] 실판매자 이름 (오픈마켓의 경우 실 판매자 정보 필수)
String Sellertel = ""; //[ 15byte 이하] 실판매자 전화번호 (오픈마켓의 경우 실 판매자 정보 필수)
/*****************************************************************************************
- 디자인 관련 선택항목 (향후 변경될 수 있습니다.)
*****************************************************************************************/
String IFRAME_NAME = ""; //[ 1byte 고정] 결제창을 iframe으로 호출 할 경우 iframe 명칭 세팅
String INFOAREA_YN = ""; //[ 1byte 고정] 결제창 안내문 표시여부 (Y: 표시-default, N: 미표시)
String FOOTER_YN = ""; //[ 1byte 고정] 결제창 하단 안내 표시여부 (Y: 표시-default, N: 미표시)
String HEIGHT = ""; //[ 4byte 이하] 결제창 높이 (px단위: iframe 등 사용시 결제창 높이 조절, 팝업창 등 호출시 "" 로 세팅)
String PRDT_HIDDEN = ""; //[ 1byte 고정] iframe 사용시 상품명 숨김 여부 (가맹점 디자인 결제창으로 결제 입력 사항만 iframe에서 사용시)
String EMAIL_HIDDEN = ""; //[ 1byte 고정] 결제자 e-mail 입력창 숨김 여부 (N: 표시-default, Y: 미표시)
String CONTRACT_HIDDEN = ""; //[ 1byte 고정] 이용약관 숨김 여부 (Y: 표시-default, N: 미표시)
/*****************************************************************************************
- 암호화 처리 (암호화 사용 시)
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);
}
// 필수
modelAndView.addObject("CASH_GB", CASH_GB);
modelAndView.addObject("MC_SVCID", MC_SVCID);
modelAndView.addObject("PAY_MODE", PAY_MODE);
modelAndView.addObject("Prdtnm", Prdtnm);
modelAndView.addObject("Siteurl", Siteurl);
modelAndView.addObject("Tradeid", Tradeid);
// 선택
modelAndView.addObject("LOGO_YN", LOGO_YN);
modelAndView.addObject("MC_AUTHPAY", MC_AUTHPAY);
modelAndView.addObject("MC_AUTOPAY", MC_AUTOPAY);
modelAndView.addObject("MC_PARTPAY", MC_PARTPAY);
modelAndView.addObject("MC_No", MC_No);
modelAndView.addObject("MC_FIXNO", MC_FIXNO);
modelAndView.addObject("MC_DEFAULTCOMMID", MC_DEFAULTCOMMID);
modelAndView.addObject("MC_DEFAULTCOMMID", MC_DEFAULTCOMMID);
modelAndView.addObject("MC_FIXCOMMID", MC_FIXCOMMID);
modelAndView.addObject("MC_FIXCOMMID", MC_FIXCOMMID);
modelAndView.addObject("Item", Item);
modelAndView.addObject("Prdtcd", Prdtcd);
modelAndView.addObject("MC_Cpcode", MC_Cpcode);
modelAndView.addObject("Notiemail", Notiemail);
modelAndView.addObject("MC_EZ_YN", MC_EZ_YN);
modelAndView.addObject("MC_EZ_KEY", MC_EZ_KEY);
modelAndView.addObject("Sellernm", Sellernm);
modelAndView.addObject("Sellertel", Sellertel);
modelAndView.addObject("IFRAME_NAME", IFRAME_NAME);
modelAndView.addObject("INFOAREA_YN", INFOAREA_YN);
modelAndView.addObject("FOOTER_YN", FOOTER_YN);
modelAndView.addObject("HEIGHT", HEIGHT);
modelAndView.addObject("PRDT_HIDDEN", PRDT_HIDDEN);
modelAndView.addObject("EMAIL_HIDDEN", EMAIL_HIDDEN);
modelAndView.addObject("CONTRACT_HIDDEN", CONTRACT_HIDDEN);
modelAndView.addObject("CALL_TYPE", CALL_TYPE);
modelAndView.addObject("Closeurl", Closeurl);
modelAndView.addObject("MSTR", MSTR);
modelAndView.addObject("Payeremail", Payeremail);
modelAndView.addObject("Userid", Userid);
// 변환
modelAndView.addObject("Cryptyn", Cryptyn);
modelAndView.addObject("Okurl", Okurl);
modelAndView.addObject("Failurl", Failurl);
modelAndView.addObject("Notiurl", Notiurl);
modelAndView.addObject("Prdtprice", Prdtprice);
modelAndView.addObject("Cryptstring", Cryptstring);
}
catch(Exception e) {
isSuccess = false;
msg = e.getMessage();
}
modelAndView.addObject("isSuccess", isSuccess);
modelAndView.addObject("msg", msg);
return modelAndView;
}
/**
* KGM Mobile 결제 notiUrl 페이지
* @param searchVO
* @param model
* @throws Exception
*/
@RequestMapping(value= {"/web/kgm/pay/notiUrlMobileAjax.do"})
public String notiUrlMobileAjax(
HttpServletRequest request
, HttpServletResponse response
, ModelMap model
) throws Exception{
//크롬 SameSite정책 방지 - 도메인이 다른 타사로 이동 시 크롬 정책에 의해 세션 유실이 일어나는 경우가 있는데, 이를 방지하기 위해 samesite 보안을 none처리
response.setHeader("Set-Cookie", "mberSession=mberSession; Secure; SameSite=None");
response.setContentType("text/xml; charset=euc-kr");
request.setCharacterEncoding("euc-kr");
/*****************************************************************************************/
String CASH_GB = "MC"; //[ 2byte 고정] 결제수단구분. "MC" 고정값. 수정불가!
String rtnMsg = "";
String Svcid = request.getParameter("Svcid"); /* 서비스아이디 */
String Mobilid = request.getParameter("Mobilid"); /* 모빌리언스 거래번호 */
String Signdate = request.getParameter("Signdate"); /* 결제일자 */
String Tradeid = request.getParameter("Tradeid"); /* 상점거래번호 */
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 chkValue = request.getParameter("chkValue"); /* 결과값 검증 hash데이터 */
String AutoBillKey = request.getParameter("AutoBillKey"); //[ 15byte 이하] 자동결제 최초등록키
String Commid = request.getParameter("Commid"); //[ 3byte 고정] 이통사
String Mrchid = request.getParameter("Mrchid"); //[ 8byte 고정] 상점ID
String MSTR = request.getParameter("MSTR"); //[2000byte 이하] 가맹점 전달 콜백변수
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
MjonPayVO mjonPayVO = new MjonPayVO();
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.setEmail(mberEmailAdres); // 이메일(회원정보)
mjonPayVO.setPayerEmail(Payeremail);
mjonPayVO.setTid(Tradeid); // Tid
mjonPayVO.setMid(Svcid); // Mid = Svcid
// 회원정보
mjonPayVO.setBuyerName(mberNm);
mjonPayVO.setBuyerTel(moblphonNo);
mjonPayVO.setBuyerEmail(mberEmailAdres);
// 인서트
mjonPayService.insertKgmAllV2(mjonPayVO);
rtnMsg = "SUCCESS";
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 {
// 대상 : 휴대폰결제, 즉시이체, 전용계좌
// 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("스미싱의심/휴대폰 첫결제", Userid, mberNm);
}
// SLACK 체크
if (joinSettingVO != null && joinSettingVO.getSlackNoti().equals("Y")) {
// Slack 메시지 발송(단순본문)
String msg = "[문자온] 스미싱의심/휴대폰 첫결제 - " + 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);
}
}
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());
}
model.addAttribute("returnMsg", rtnMsg);
return "web/cop/kgmV2/mobileNotiUrl";
}
/**
* KGM Mobile 결제 okUrl 페이지
* @param searchVO
* @param model
* @throws Exception
*/
@RequestMapping(value= {"/web/kgm/pay/okUrlMobileAjax.do"})
public String okUrlMobileAjax(
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";
}
/////////////////////////////////////////////////////////////////////////////////////////
//
//
// BANK
//
//
/**
* KGM 즉시이체 정보 Encode
* @param MjonPayVO
* @param modelAndView
* @return /web/member/pay/kgmBankEncodeAjax.do
* @throws Exception
*/
@RequestMapping(value = "/web/member/pay/kgmBankEncodeAjax.do")
public ModelAndView kgmBankEncodeAjax(MjonPayVO mjonPayVO,
HttpServletRequest request ) throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("jsonView");
boolean isSuccess = true;
String msg = "";
LoginVO loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
if(userId == null) {
isSuccess = false;
msg = "로그인이 필요합니다.";
}
try {
// 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; //서비스아이디
String PAY_MODE = globalRaPayMode; //[ 2byte 고정] 연동시 테스트/실결제 구분 (00: 테스트결제-비과금, 10: 실거래결제-과금)
String Prdtprice = request.getParameter("Prdtprice");; //결제요청금액.
String Prdtnm = "캐시충전"; //상품명 ( 50byte 이내 )
String Siteurl = kgmServerName; //가맹점도메인
String Okurl = kgmPath + "/web/kgm/pay/okUrlBankAjax.do"; //성공화면처리URL : 결제완료통보페이지 full Url (예:http://www.mcash.co.kr/okurl.jsp )
String Tradeid = RA_SVCID + "_" + appr_dtm + "_" + numberGen(6,1); //가맹점거래번호 //결제 요청 시 마다 unique한 값을 세팅해야 함.
/*****************************************************************************************
- 선택 입력 항목
*****************************************************************************************/
String Notiurl = kgmPath + "/web/kgm/pay/notiUrlBankAjax.do"; //결제처리URL : 결제 완료 후, 가맹점측 과금 등 처리할 가맹점측 URL
String Userid = userId; //가맹점결제자ID
String Payeremail = ""; //[ 30byte 이하] 결제자 e-mail
String Item = ""; //[ 8byte 이하] 아이템코드. 미사용 시 반드시 공백으로 세팅.
String Prdtcd = ""; //[ 30byte 이하] 상품코드. 사전에 모빌리언스에 등록이 필요함.
String Notiemail = ""; //[ 30byte 이하] 알림 e-mail: 결제 완료 후 당사와 가맹점간의 Noti 연동이 실패한 경우 알람 메일을 받을 가맹점 담당자 이메일주소
String Closeurl = ""; //[ 128byte 이하] 결제창 취소버튼, 닫기버튼 클릭 시 호출되는 가맹점 측 페이지. iframe 호출 시 필수! (예: http://www.mcash.co.kr/closeurl.jsp)
String Failurl = ""; //[ 128byte 이하] 결제 실패 시 사용자에게 보여질 가맹점 측 실패 페이지. 결제처리에 대한 실패처리 안내를 가맹점에서 제어해야 할 경우만 사용.
String MSTR = ""; //[2000byte 이하] 가맹점 콜백 변수. 가맹점에서 추가적으로 파라미터가 필요한 경우 사용하며 &, % 는 사용불가 (예: MSTR="a=1|b=2|c=3")
String Deposit = ""; //[ 10byte 이하] 1회용컵 보증금 변수
/*****************************************************************************************
- 디자인 관련 필수항목
*****************************************************************************************/
String LOGO_YN = "N"; //[ 1byte 고정] 가맹점 로고 사용 여부 (N: 모빌리언스 로고-default, Y: 가맹점 로고 (사전에 모빌리언스에 가맹점 로고 이미지를 등록해야함))
String CALL_TYPE = "P"; //[ 4byte 이하] 결제창 호출 방식 (P: 팝업-default, SELF: 페이지전환, I: 아이프레임)
/*****************************************************************************************
- 디자인 관련 선택항목 (향후 변경될 수 있습니다.)
*****************************************************************************************/
String IFRAME_NAME = ""; //[ 1byte 고정] 결제창을 iframe으로 호출 할 경우 iframe 명칭 세팅
String INFOAREA_YN = ""; //[ 1byte 고정] 결제창 안내문 표시여부 (Y: 표시-default, N: 미표시)
String FOOTER_YN = ""; //[ 1byte 고정] 결제창 하단 안내 표시여부 (Y: 표시-default, N: 미표시)
String HEIGHT = ""; //[ 4byte 이하] 결제창 높이 (px단위: iframe 등 사용시 결제창 높이 조절, 팝업창 등 호출시 "" 로 세팅)
String PRDT_HIDDEN = ""; //[ 1byte 고정] iframe 사용시 상품명 숨김 여부 (가맹점 디자인 결제창으로 결제 입력 사항만 iframe에서 사용시)
String EMAIL_HIDDEN = ""; //[ 1byte 고정] 결제자 e-mail 입력창 숨김 여부 (N: 표시-default, Y: 미표시)
String CONTRACT_HIDDEN = ""; //[ 1byte 고정] 이용약관 숨김 여부 (Y: 표시-default, N: 미표시)
/*****************************************************************************************
- 암호화 처리 (암호화 사용 시)
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);
}
// 필수
modelAndView.addObject("CASH_GB", CASH_GB);
modelAndView.addObject("RA_SVCID", RA_SVCID);
modelAndView.addObject("PAY_MODE", PAY_MODE);
modelAndView.addObject("Prdtnm", Prdtnm);
modelAndView.addObject("Siteurl", Siteurl);
modelAndView.addObject("Tradeid", Tradeid);
// 선택
modelAndView.addObject("Closeurl", Closeurl);
modelAndView.addObject("MSTR", MSTR);
modelAndView.addObject("Payeremail", Payeremail);
modelAndView.addObject("Userid", Userid);
modelAndView.addObject("Deposit", Deposit);
modelAndView.addObject("Item", Item);
modelAndView.addObject("Prdtcd", Prdtcd);
modelAndView.addObject("Notiemail", Notiemail);
modelAndView.addObject("IFRAME_NAME", IFRAME_NAME);
modelAndView.addObject("INFOAREA_YN", INFOAREA_YN);
modelAndView.addObject("FOOTER_YN", FOOTER_YN);
modelAndView.addObject("HEIGHT", HEIGHT);
modelAndView.addObject("PRDT_HIDDEN", PRDT_HIDDEN);
modelAndView.addObject("EMAIL_HIDDEN", EMAIL_HIDDEN);
modelAndView.addObject("CONTRACT_HIDDEN", CONTRACT_HIDDEN);
modelAndView.addObject("LOGO_YN", LOGO_YN);
modelAndView.addObject("CALL_TYPE", CALL_TYPE);
// 변환
modelAndView.addObject("Cryptyn", Cryptyn);
modelAndView.addObject("Okurl", Okurl);
modelAndView.addObject("Failurl", Failurl);
modelAndView.addObject("Notiurl", Notiurl);
modelAndView.addObject("Prdtprice", Prdtprice);
modelAndView.addObject("Cryptstring", Cryptstring);
}
catch(Exception e) {
isSuccess = false;
msg = e.getMessage();
}
modelAndView.addObject("isSuccess", isSuccess);
modelAndView.addObject("msg", msg);
return modelAndView;
}
/**
* KGM Bank 결제notiUrl 페이지
* @param searchVO
* @param model
* @throws Exception
*/
@RequestMapping(value= {"/web/kgm/pay/notiUrlBankAjax.do"})
public String notiUrlBankAjax(
HttpServletRequest request
, HttpServletResponse response
, ModelMap model
) throws Exception{
//크롬 SameSite정책 방지 - 도메인이 다른 타사로 이동 시 크롬 정책에 의해 세션 유실이 일어나는 경우가 있는데, 이를 방지하기 위해 samesite 보안을 none처리
response.setHeader("Set-Cookie", "mberSession=mberSession; Secure; SameSite=None");
/*****************************************************************************************/
String CASH_GB = "RA"; //[ 2byte 고정] 결제수단구분. "RA" 고정값. 수정불가!
String rtnMsg = "";
String Resultcd = request.getParameter("Resultcd"); //[ 4byte 고정] 결과코드
String Resultmsg = request.getParameter("Resultmsg"); //[ 100byte 이하] 결과메세지
String Mobilid = request.getParameter("Mobilid"); //[ 15byte 이하] 모빌리언스 거래번호
String Mrchid = request.getParameter("Mrchid"); // 상점ID
String Prdtnm = request.getParameter("Prdtnm"); //[ 50byte 이하] 상품명
String Prdtprice = request.getParameter("Prdtprice"); //[ 10byte 이하] 상품가격
String Signdate = request.getParameter("Signdate"); //[ 14byte 이하] 결제일자
String Svcid = request.getParameter("Svcid"); //[ 12byte 고정] 서비스ID
String Tradeid = request.getParameter("Tradeid"); //[ 40byte 이하] 상점거래번호
String Userid = request.getParameter("Userid"); //[ 20byte 이하] 사용자ID
// 추가
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 - BANK : 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 - BANK : 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
MjonPayVO mjonPayVO = new MjonPayVO();
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.setEmail(mberEmailAdres); // 이메일(회원정보)
mjonPayVO.setPayerEmail(Payeremail);
mjonPayVO.setTid(Tradeid); // Tid
mjonPayVO.setMid(Svcid); // Mid = Svcid
// 회원정보
mjonPayVO.setBuyerName(mberNm);
mjonPayVO.setBuyerTel(moblphonNo);
mjonPayVO.setBuyerEmail(mberEmailAdres);
// 추가
mjonPayVO.setBankName(Banknm);
// 인서트
mjonPayService.insertKgmAllV2(mjonPayVO);
rtnMsg = "SUCCESS";
try {
// 대상 : 휴대폰결제, 즉시이체, 전용계좌
// 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("스미싱의심/즉시이체 첫결제", Userid, mberNm);
}
// SLACK 체크
if (joinSettingVO != null && joinSettingVO.getSlackNoti().equals("Y")) {
// Slack 메시지 발송(단순본문)
String msg = "[문자온] 스미싱의심/즉시이체 첫결제 - " + 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 - BANK 슬랙알림 & 스미싱의심 처리 Error");
System.out.println("KG MOBILIANS NotiUrl - BANK Tradeid : " + Tradeid);
System.out.println("KG MOBILIANS NotiUrl - BANK e.getMessage() : " + e.getMessage());
}
System.out.println("#############################################################");
System.out.println("KG MOBILIANS NotiUrl - BANK Tradeid : " + Tradeid);
System.out.println("KG MOBILIANS NotiUrl - BANK returnMsg : " + rtnMsg);
}
}
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());
}
model.addAttribute("returnMsg", rtnMsg);
return "web/cop/kgmV2/bankNotiUrl";
}
/**
* KGM Bank 결제 okUrl 페이지
* @param searchVO
* @param model
* @throws Exception
*/
@RequestMapping(value= {"/web/kgm/pay/okUrlBankAjax.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";
}
// 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;
}
// 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;
}
// Kgm Ip Check
public boolean getIsKgmServerIp(HttpServletRequest request) {
boolean rtnVal = false;
String[] kgmServerIpArray = {
"175.158.12.133"
, "175.158.12.140"
, "175.158.12.1"
, "116.127.121.151"
, "218.50.55.107"
, "116.127.121.132"};
// List 로 변환
List<String> strList = new ArrayList<>(Arrays.asList(kgmServerIpArray));
// List Contains
if(strList.contains(getClientIP(request))) {
rtnVal = true; // 해당아이피 strArray에 존재
}
return rtnVal;
}
/**
* 전달된 파라미터에 맞게 난수를 생성한다
* @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<len;i++) {
//0~9 까지 난수 생성
String ran = Integer.toString(rand.nextInt(10));
if(dupCd==1) {
//중복 허용시 numStr에 append
numStr += ran;
}else if(dupCd==2) {
//중복을 허용하지 않을시 중복된 값이 있는지 검사한다
if(!numStr.contains(ran)) {
//중복된 값이 없으면 numStr에 append
numStr += ran;
}else {
//생성된 난수가 중복되면 루틴을 다시 실행한다
i-=1;
}
}
}
return numStr;
}
// Itm Member Id Check
public boolean getItnMemberId(String userId) {
boolean rtnVal = false;
String[] idArray = {
"nobledeco"
, "nopay"
, "dlwldn"
, "afterpay"
, "anjooyoung"
, "antelope3"
, "cashmove"
, "cashmove2"
, "cindy9907"
, "company1"
, "company2"
, "company4"
, "dlwldn"
, "dlwnsgh"
, "dudgusw"
, "goodgkdus"
, "itn1t0est"
, "itntest1"
, "itntest10"
, "itntest11"
, "itntest12"
, "itntest13"
, "itntest14"
, "itntest15"
, "itntest16"
, "itntest17"
, "itntest18"
, "itntest19"
, "itntest2"
, "itntest20"
, "itntest3"
, "itntest4"
, "itntest5"
, "itntest6"
, "itntest7"
, "itntest8"
, "itntest9"
, "itntst194"
, "kakaotest1"
, "kakaotest10"
, "kakaotest11"
, "kakaotest12"
, "kakaotest13"
, "kakaotest14"
, "kakaotest15"
, "kakaotest2"
, "kakaotest3"
, "kakaotest4"
, "kakaotest5"
, "kakaotest6"
, "kakaotest7"
, "kakaotest8"
, "kakaotest9"
, "kangjiwoo123"
, "kerinet2"
, "kerinet3"
, "LJHtest"
, "LJHtest900"
, "LJHtest997"
, "LJHtest998"
, "LJHtest999"
, "nobledeco"
, "nobledeco2"
, "nopay"
, "rosewiper"
, "rosewiper2"
, "rosewiper3"
, "rosewiper4"
, "rosewiper5"
, "rosewiper6"
, "rosewiper7"
, "subsub8729"
, "whtkdgml3627"
};
// List 로 변환
List<String> strList = new ArrayList<>(Arrays.asList(idArray));
// List Contains
if(strList.contains(userId)) {
rtnVal = true; // 해당아이피 strArray에 존재
}
return rtnVal;
}
}