이준호 전자조정시스템 고도화 커밋

- 기록열람 결제
 - 송달정보 조회 원복
This commit is contained in:
LJH 2022-11-07 18:23:17 +09:00
parent e0acf86c7f
commit aba564faa7
21 changed files with 14304 additions and 5 deletions

View File

@ -4,6 +4,7 @@ import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
@ -24,6 +25,7 @@ import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import com.fasterxml.jackson.core.io.JsonStringEncoder;
import com.inicis.std.util.SignatureUtil;
import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo;
@ -40,8 +42,12 @@ import kcc.kccadr.accdnt.ars.service.AdjstReqStatusService;
import kcc.kccadr.accdnt.ars.service.AdjstReqStatusVO;
import kcc.kccadr.adjPgrMgr.cmm.service.PgrCmmService;
import kcc.kccadr.adjPgrMgr.cmm.service.PgrCmmVO;
import kcc.kccadr.adjPgrMgr.dlvinfo.service.DlvinfoService;
import kcc.kccadr.adjPgrMgr.dlvinfo.service.DlvinfoVO;
import kcc.kccadr.adjPgrMgr.exmp.app.service.ExmpAppManageService;
import kcc.kccadr.adjPgrMgr.exmp.cmm.ExmpManageVO;
import kcc.kccadr.adjRppl.service.AdjRpplService;
import kcc.kccadr.adjRppl.service.AdjRpplVO;
import kcc.kccadr.adjclsmgr.service.AdjClsMgrService;
import kcc.kccadr.adjclsmgr.service.AdjClsMgrVO;
import kcc.kccadr.advc.service.AdrHstryMgrService;
@ -114,6 +120,24 @@ public class AdjstReqStatusController {
// eGov 공통 메세지
@Resource(name = "egovMessageSource")
EgovMessageSource egovMessageSource;
@Resource(name = "dlvinfoService")
private DlvinfoService dlvinfoService;
@Resource(name = "adjRpplService")
private AdjRpplService adjRpplService;
@Value("#{globalSettings['Globals.pay.mid']}")
private String global_mid;
@Value("#{globalSettings['Globals.pay.signKey']}")
private String global_signKey;
@Value("#{globalSettings['Globals.pay.siteDomain']}")
private String global_siteDomain;
/**
* 조정진행 상태 관리 목록 화면
*/
@ -303,6 +327,29 @@ public class AdjstReqStatusController {
model.addAttribute("list_mgr" , adrHstryMgrService.selectList(adrHstryMgrVO));
//이력값 -
/*
* 송달정보조회
* select
* */
DlvinfoVO dlvinfoVO = new DlvinfoVO();
dlvinfoVO.setAdrSeq(adjstReqStatusVO.getAdrSeq());
//로그인한 사용자 이름으로 등록된 송달 리스트 조회
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated() ? (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser() : null;
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getUniqId());
String rpplNm = "";
if(!"".equals(userId)) {
AdjRpplVO adjRpplVO = new AdjRpplVO();
adjRpplVO.setAdrSeq(adjstReqStatusVO.getAdrSeq());
adjRpplVO.setRpplId(userId);
adjRpplVO = adjRpplService.selectAdjRpplInfo(adjRpplVO);
rpplNm = egovCryptoUtil.decrypt(adjRpplVO.getRpplNm());
dlvinfoVO.setRpplNm(rpplNm);
}
List<DlvinfoVO> dlvinfoList = dlvinfoService.selectAdjustDlvryList(dlvinfoVO);
model.addAttribute("dlvinfoList", dlvinfoList);
return "/web/kccadr/accdnt/ars/tab/adjstReqStatusTabDetail";
}
@ -520,6 +567,40 @@ public class AdjstReqStatusController {
}
model.addAttribute("list", list);
// ======================결제 시작===================
String mid = global_mid; // 상점아이디
String signKey = global_signKey; // 결제 signkey
String mKey = SignatureUtil.hash(signKey, "SHA-256");
String timestamp = SignatureUtil.getTimestamp(); // util에 의해서 자동생성
String orderNumber = mid+"_"+SignatureUtil.getTimestamp(); // 가맹점 주문번호(가맹점에서 직접 설정)
String price = "10"; // 상품가격(특수기호 제외, 가맹점에서 직접 설정)
Map<String, String> signParam = new HashMap<String, String>();
signParam.put("oid", orderNumber);
signParam.put("price", price);
signParam.put("timestamp", timestamp);
String signature = SignatureUtil.makeSignature(signParam);
/* 기타 */
String siteDomain = global_siteDomain; //가맹점 도메인 입력
model.addAttribute("mid", mid);
model.addAttribute("signKey", signKey);
model.addAttribute("mKey", mKey);
model.addAttribute("timestamp", timestamp);
model.addAttribute("orderNumber", orderNumber);
model.addAttribute("price", price);
model.addAttribute("signature", signature);
model.addAttribute("siteDomain", siteDomain);
// ======================결제 ===================
return "/web/kccadr/accdnt/ars/tab/docIssReqList";
}

View File

@ -0,0 +1,33 @@
package kcc.kccadr.adjst.service;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import kcc.kccadr.cmm.RestResponse;
/**
* 결제를 위한 서비스
* @author 이준호
* @since 2022.11.3
* @version 1.0
* @see
*
* <pre>
* << 개정이력(Modification Information) >>
*
* 수정일 수정자 수정내용
* ------- -------- ---------------------------
* 2022.11.3 이준호 최초 생성
*
* </pre>
*/
public interface PayService {
// 결제 결과 insert(map - 결제모듈 결과, tableNm - 사용테이블, tablePk1 - 사용테이블 pk1, tablePk2 - 사용테이블 pk2)
public int insertPayLog(Map<String,String> map, String tableNm, String tablePk1, String tablePk2, String userId) throws Exception;
}

View File

@ -0,0 +1,270 @@
package kcc.kccadr.adjst.service;
import java.io.Serializable;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import kcc.com.cmm.ComDefaultVO;
@SuppressWarnings("serial")
@JsonIgnoreProperties(ignoreUnknown = true)
public class PayVO extends ComDefaultVO implements Serializable {
private String paySeq; //결재일련번호
private String asctnTable; //연관테이블
private String asctnTablePk1; //연관테이블 pk1
private String asctnTablePk2; //연관테이블 pk2
private String resultcode = "" ; //결과코드:0000(성공), 이외 오류
private String resultmsg = "" ; //결과메세지
private String tid = "" ; //거래번호
private String moid = "" ; //주문번호
private String totprice = "" ; //결제금액
private String goodname = "" ; //상품명
private String paymethod = "" ; //지불수단
private String appldate = "" ; //승인일자-YYYYMMDD
private String appltime = "" ; //승인시간-hh24miss
private String eventcode = "" ; //이벤트 코드, 카드 할부 행사 적용 코드0
private String buyername = "" ; //구매자명
private String buyertel = "" ; //구매자 휴대폰번호
private String buyeremail = "" ; //구매자 이메일주소
private String custemail = "" ; //최종 이메일주소
private String applnum = "" ; //승인번호
private String cardNum = "" ; //신용카드번호
private String cardInterest = "" ; //상점부담 무이자 할부여부-1:상점부담 무이자
private String cardQuota = "" ; //카드 할부기간
private String cardCode = "" ; //카드사 코드
private String cardCorpflag = "" ; //카드구분-0:개인카드, 1:법인카드, 9:구분불가
private String cardCheckflag = "" ; //카드종류-0:신용카드, 1:체크카드, 2:기프트카드
private String cardPrtccode = "" ; //부분취소 가능여부-1:가능, 0:불가능
private String cardBankcode = "" ; //카드발급사(은행) 코드
private String cardSrccode = "" ; //간편()결제구분
private String cardPoint = "" ; //카드포인트 사용여부-빈값:카드 포인트 사용안함, 1:카드 포인트 사용
private String cardUsepoint = "" ; //포인트 사용금액
private String currency = "" ; //통화코드
private String orgprice = "" ; //달러 환전금액
private String frstRegistPnttm = "" ; //등록일시
private String frstRegisterId = "" ; //등록자
private String lastUpdtPnttm = "" ; //수정일시
private String lastUpdusrId = "" ; //수정자
public String getPaySeq() {
return paySeq;
}
public void setPaySeq(String paySeq) {
this.paySeq = paySeq;
}
public String getAsctnTable() {
return asctnTable;
}
public void setAsctnTable(String asctnTable) {
this.asctnTable = asctnTable;
}
public String getAsctnTablePk1() {
return asctnTablePk1;
}
public void setAsctnTablePk1(String asctnTablePk1) {
this.asctnTablePk1 = asctnTablePk1;
}
public String getAsctnTablePk2() {
return asctnTablePk2;
}
public void setAsctnTablePk2(String asctnTablePk2) {
this.asctnTablePk2 = asctnTablePk2;
}
public String getResultcode() {
return resultcode;
}
public void setResultcode(String resultcode) {
this.resultcode = resultcode;
}
public String getResultmsg() {
return resultmsg;
}
public void setResultmsg(String resultmsg) {
this.resultmsg = resultmsg;
}
public String getTid() {
return tid;
}
public void setTid(String tid) {
this.tid = tid;
}
public String getMoid() {
return moid;
}
public void setMoid(String moid) {
this.moid = moid;
}
public String getTotprice() {
return totprice;
}
public void setTotprice(String totprice) {
this.totprice = totprice;
}
public String getGoodname() {
return goodname;
}
public void setGoodname(String goodname) {
this.goodname = goodname;
}
public String getPaymethod() {
return paymethod;
}
public void setPaymethod(String paymethod) {
this.paymethod = paymethod;
}
public String getAppldate() {
return appldate;
}
public void setAppldate(String appldate) {
this.appldate = appldate;
}
public String getAppltime() {
return appltime;
}
public void setAppltime(String appltime) {
this.appltime = appltime;
}
public String getEventcode() {
return eventcode;
}
public void setEventcode(String eventcode) {
this.eventcode = eventcode;
}
public String getBuyername() {
return buyername;
}
public void setBuyername(String buyername) {
this.buyername = buyername;
}
public String getBuyertel() {
return buyertel;
}
public void setBuyertel(String buyertel) {
this.buyertel = buyertel;
}
public String getBuyeremail() {
return buyeremail;
}
public void setBuyeremail(String buyeremail) {
this.buyeremail = buyeremail;
}
public String getCustemail() {
return custemail;
}
public void setCustemail(String custemail) {
this.custemail = custemail;
}
public String getApplnum() {
return applnum;
}
public void setApplnum(String applnum) {
this.applnum = applnum;
}
public String getCardNum() {
return cardNum;
}
public void setCardNum(String cardNum) {
this.cardNum = cardNum;
}
public String getCardInterest() {
return cardInterest;
}
public void setCardInterest(String cardInterest) {
this.cardInterest = cardInterest;
}
public String getCardQuota() {
return cardQuota;
}
public void setCardQuota(String cardQuota) {
this.cardQuota = cardQuota;
}
public String getCardCode() {
return cardCode;
}
public void setCardCode(String cardCode) {
this.cardCode = cardCode;
}
public String getCardCorpflag() {
return cardCorpflag;
}
public void setCardCorpflag(String cardCorpflag) {
this.cardCorpflag = cardCorpflag;
}
public String getCardCheckflag() {
return cardCheckflag;
}
public void setCardCheckflag(String cardCheckflag) {
this.cardCheckflag = cardCheckflag;
}
public String getCardPrtccode() {
return cardPrtccode;
}
public void setCardPrtccode(String cardPrtccode) {
this.cardPrtccode = cardPrtccode;
}
public String getCardBankcode() {
return cardBankcode;
}
public void setCardBankcode(String cardBankcode) {
this.cardBankcode = cardBankcode;
}
public String getCardSrccode() {
return cardSrccode;
}
public void setCardSrccode(String cardSrccode) {
this.cardSrccode = cardSrccode;
}
public String getCardPoint() {
return cardPoint;
}
public void setCardPoint(String cardPoint) {
this.cardPoint = cardPoint;
}
public String getCardUsepoint() {
return cardUsepoint;
}
public void setCardUsepoint(String cardUsepoint) {
this.cardUsepoint = cardUsepoint;
}
public String getCurrency() {
return currency;
}
public void setCurrency(String currency) {
this.currency = currency;
}
public String getOrgprice() {
return orgprice;
}
public void setOrgprice(String orgprice) {
this.orgprice = orgprice;
}
public String getFrstRegistPnttm() {
return frstRegistPnttm;
}
public void setFrstRegistPnttm(String frstRegistPnttm) {
this.frstRegistPnttm = frstRegistPnttm;
}
public String getFrstRegisterId() {
return frstRegisterId;
}
public void setFrstRegisterId(String frstRegisterId) {
this.frstRegisterId = frstRegisterId;
}
public String getLastUpdtPnttm() {
return lastUpdtPnttm;
}
public void setLastUpdtPnttm(String lastUpdtPnttm) {
this.lastUpdtPnttm = lastUpdtPnttm;
}
public String getLastUpdusrId() {
return lastUpdusrId;
}
public void setLastUpdusrId(String lastUpdusrId) {
this.lastUpdusrId = lastUpdusrId;
}
}

View File

@ -0,0 +1,15 @@
package kcc.kccadr.adjst.service.impl;
import org.springframework.stereotype.Repository;
import egovframework.rte.psl.dataaccess.EgovAbstractDAO;
import kcc.kccadr.adjst.service.PayVO;
@Repository("PayDAO")
public class PayDAO extends EgovAbstractDAO {
public int insertPayLog(PayVO payVO) throws Exception {
return (int) update("payDAO.insertPayLog", payVO);
}
}

View File

@ -0,0 +1,83 @@
package kcc.kccadr.adjst.service.impl;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;
import egovframework.rte.fdl.idgnr.EgovIdGnrService;
import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
import kcc.com.cmm.LoginVO;
import kcc.com.utl.fcc.service.EgovStringUtil;
import kcc.kccadr.adjst.service.PayService;
import kcc.kccadr.adjst.service.PayVO;
/**
* 결제를 위한 서비스
* @author 이준호
* @since 2022.11.3
* @version 1.0
* @see
*
* <pre>
* << 개정이력(Modification Information) >>
*
* 수정일 수정자 수정내용
* ------- -------- ---------------------------
* 2022.11.3 이준호 최초 생성
*
* </pre>
*/
@Service("PayService")
public class PayServiceImpl extends EgovAbstractServiceImpl implements PayService {
Logger log = LoggerFactory.getLogger(this.getClass());
// 조정사건이력관리 DAO
@Resource(name = "PayDAO")
private PayDAO payDAO;
// eGov 고유ID Generation
@Resource(name="payGnrService")
private EgovIdGnrService idgenService;
private static final Logger LOGGER = LoggerFactory.getLogger(PayServiceImpl.class);
@Override
public int insertPayLog(Map<String,String> map, String tableNm, String tablePk1, String tablePk2, String userId) throws Exception {
PayVO payVO = new PayVO();
String paySeq = idgenService.getNextStringId();
//map -> vo 매칭
ObjectMapper objMapper = new ObjectMapper();
// 매핑 대상이 없는 무시
objMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// 매핑 대소문자 구분없이 매칭
objMapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
payVO = objMapper.convertValue(map, PayVO.class);
payVO.setPaySeq(paySeq);
payVO.setAsctnTable(tableNm);
payVO.setAsctnTablePk1(tablePk1);
payVO.setAsctnTablePk2(tablePk2);
payVO.setFrstRegisterId(userId);
payVO.setLastUpdusrId(userId);
return payDAO.insertPayLog(payVO);
}
}

View File

@ -1,10 +1,26 @@
package kcc.kccadr.adjst.web;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import com.inicis.std.util.SignatureUtil;
import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
import kcc.com.cmm.LoginVO;
import kcc.com.utl.fcc.service.EgovStringUtil;
import kcc.kccadr.adjst.service.PayService;
import kcc.kccadr.kccadrCom.web.PayUtill;
/**
* 대국민(사용자)
* 조정신청에 관한 controller 클래스를 정의한다.
@ -24,6 +40,12 @@ import org.springframework.web.bind.annotation.RequestMapping;
*/
@Controller
public class InipayWebController {
@Resource(name="PayUtill")
private PayUtill payUtill;
@Resource(name="PayService")
private PayService payService;
private static final Logger LOGGER = LoggerFactory.getLogger(InipayWebController.class);
@ -43,7 +65,7 @@ public class InipayWebController {
) throws Exception {
return "/web/kccadr/inipay/INIStdPayRequest";
}
}
@RequestMapping("/web/kccadr/inipay/INIStdPayBill.do")
public String INIStdPayBill(
@ -77,4 +99,116 @@ public class InipayWebController {
return "/web/kccadr/inipay/popup";
}
/*
* 기록 열람 신청 발급
* 신용카드 결제 요청 URL
*
* */
@RequestMapping("/web/kccadr/inipay/INIstdpayPcReq.do")
public String INIstdpayPcReq(ModelMap model
) throws Exception {
String mid = "INIpayTest"; // 상점아이디
String signKey = "SU5JTElURV9UUklQTEVERVNfS0VZU1RS"; // 결제 signkey
String mKey = SignatureUtil.hash(signKey, "SHA-256");
String timestamp = SignatureUtil.getTimestamp(); // util에 의해서 자동생성
String orderNumber = mid+"_"+SignatureUtil.getTimestamp(); // 가맹점 주문번호(가맹점에서 직접 설정)
String price = "10"; // 상품가격(특수기호 제외, 가맹점에서 직접 설정)
Map<String, String> signParam = new HashMap<String, String>();
signParam.put("oid", orderNumber);
signParam.put("price", price);
signParam.put("timestamp", timestamp);
String signature = SignatureUtil.makeSignature(signParam);
/* 기타 */
String siteDomain = "http://127.0.0.1:8089/web/kccadr/inipay"; //가맹점 도메인 입력
model.addAttribute("mid", mid);
model.addAttribute("signKey", signKey);
model.addAttribute("mKey", mKey);
model.addAttribute("timestamp", timestamp);
model.addAttribute("orderNumber", orderNumber);
model.addAttribute("price", price);
model.addAttribute("signature", signature);
model.addAttribute("siteDomain", siteDomain);
return "/web/kccadr/inipay/INIstdpay_pc_req";
}
/*
* 기록 열람 신청 발급
* 신용카드 결제 리턴 URL
*
* */
@RequestMapping("/web/kccadr/inipay/INIstdpayPcReturn.do")
public String INIstdpayPcReturn(HttpServletRequest request, ModelMap model
) throws Exception {
HttpSession test = request.getSession();
LoginVO loginVO = (LoginVO) test.getAttribute("LoginVO");
if(loginVO == null) {
return "/";
}
/*
*
* 1. try catch 끝난 adr_pay 테이블 db insert
* 2. 망취소 여부 변수(boolean)
* true(정상결제)
* false(정상결제 망취소)
* pram request, model
*
* */
Map<String,String> map = payUtill.payProcessing(request, model);
/*
* 결제 결과
* 파라미터 :
* (
* map - 결제모듈 결과,
* tableNm - 사용테이블,
* tablePk1 - 사용테이블 pk1,
* tablePk2 - 사용테이블 pk2
* )
*
* */
payService.insertPayLog(
map,
"adr_record_reading",
"record_reading_seq",
"adr_seq",
loginVO.getUniqId()
);
return "/web/kccadr/inipay/INIstdpay_pc_return";
}
/*
* 기록 열람 신청 발급
* 신용카드 결제 닫기 URL
*
* */
@RequestMapping("/web/kccadr/inipay/INIstdpayClose.do")
public String INIstdpayClose(
) throws Exception {
return "/web/kccadr/inipay/close";
}
}

View File

@ -0,0 +1,233 @@
package kcc.kccadr.kccadrCom.web;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Component;
import org.springframework.ui.ModelMap;
import com.inicis.std.util.HttpUtil;
import com.inicis.std.util.ParseUtil;
import com.inicis.std.util.SignatureUtil;
@Component("PayUtill")
public class PayUtill {
public Map payProcessing(HttpServletRequest request, ModelMap model) throws Exception {
Boolean netCancleTorF = false;
Map<String, String> resultMap = new HashMap<String, String>();
try{
//#############################
// 인증결과 파라미터 일괄 수신
//#############################
request.setCharacterEncoding("UTF-8");
Map<String,String> paramMap = new Hashtable<String,String>();
Enumeration elems = request.getParameterNames();
String temp = "";
while(elems.hasMoreElements())
{
temp = (String) elems.nextElement();
paramMap.put(temp, request.getParameter(temp));
}
System.out.println("paramMap : "+ paramMap.toString());
if("0000".equals(paramMap.get("resultCode"))){
System.out.println("####인증성공/승인요청####");
//############################################
// 1.전문 필드 설정(***가맹점 개발수정***)
//############################################
String mid = paramMap.get("mid");
String timestamp= SignatureUtil.getTimestamp();
String charset = "UTF-8";
String format = "JSON";
String authToken= paramMap.get("authToken");
String authUrl = paramMap.get("authUrl");
String netCancel= paramMap.get("netCancelUrl");
String merchantData = paramMap.get("merchantData");
//#####################
// 2.signature 생성
//#####################
Map<String, String> signParam = new HashMap<String, String>();
signParam.put("authToken", authToken); // 필수
signParam.put("timestamp", timestamp); // 필수
// signature 데이터 생성 (모듈에서 자동으로 signParam을 알파벳 순으로 정렬후 NVP 방식으로 나열해 hash)
String signature = SignatureUtil.makeSignature(signParam);
//#####################
// 3.API 요청 전문 생성
//#####################
Map<String, String> authMap = new Hashtable<String, String>();
authMap.put("mid" ,mid); // 필수
authMap.put("authToken" ,authToken); // 필수
authMap.put("signature" ,signature); // 필수
authMap.put("timestamp" ,timestamp); // 필수
authMap.put("charset" ,charset); // default=UTF-8
authMap.put("format" ,format); // default=XML
HttpUtil httpUtil = new HttpUtil();
try{
//#####################
// 4.API 통신 시작
//#####################
String authResultString = "";
authResultString = httpUtil.processHTTP(authMap, authUrl);
//############################################################
//5.API 통신결과 처리(***가맹점 개발수정***)
//############################################################
String test = authResultString.replace(",", "&").replace(":", "=").replace("\"", "").replace(" ","").replace("\n", "").replace("}", "").replace("{", "");
resultMap = ParseUtil.parseStringToMap(test); //문자열을 MAP형식으로 파싱
// 수신결과를 파싱후 resultCode가 "0000"이면 승인성공 이외 실패
/*
* 이준호 테스트 강제 exception 망취소 - 데이터 확인
*
* */
// if(true) {
// throw new Exception();
// }
netCancleTorF = true;
} catch (Exception ex) {
//####################################
// 실패시 처리(***가맹점 개발수정***)
//####################################
//---- db 저장 실패시 예외처리----//
System.out.println(ex);
//#####################
// 망취소 API
//#####################
String netcancelResultString = httpUtil.processHTTP(authMap, netCancel); // 망취소 요청 API url(고정, 임의 세팅 금지)
System.out.println("## 망취소 API 결과 ##");
// 취소 결과 확인
System.out.println("<p>"+netcancelResultString.replaceAll("<", "&lt;").replaceAll(">", "&gt;")+"</p>");
}
}else{
resultMap.put("resultCode", paramMap.get("resultCode"));
resultMap.put("resultMsg", paramMap.get("resultMsg"));
}
model.addAttribute("resultMap", resultMap);
resultMap = keyConvStyleClient(resultMap);
}catch(Exception e){
System.out.println(e);
}
return resultMap;
}
public void paySetting(HttpServletRequest request, ModelMap model) throws Exception {
}
// ----------------map to VO 세팅------------------
public static HashMap keyConvStyleClient(HashMap map) {
Iterator<String> iterKey = map.keySet().iterator();
HashMap newMap = new HashMap();
while (iterKey.hasNext()) {
String key = iterKey.next();
String typeName = map.get(key).getClass().getSimpleName();
if (typeName.indexOf("List") >= 0) { // 리스트로 간주.
List<Map> newList = new LinkedList<Map>();
List subList = (List) map.get(key);
for (int i = 0; i < subList.size(); i++) {
Map subItem = (Map) subList.get(i);
newList.add(keyConvStyleClient(subItem));
}
newMap.put(convertVariableRevert(key), newList);
} else {
newMap.put(convertVariableRevert(key), map.get(key));
}
}
return newMap;
}
public static Map keyConvStyleClient(Map map) {
Iterator<String> iterKey = map.keySet().iterator();
Map newMap = new HashMap();
while (iterKey.hasNext()) {
String key = iterKey.next();
String typeName = map.get(key).getClass().getSimpleName();
if (typeName.indexOf("List") >= 0) { // 리스트로 간주.
List<Map> newList = new LinkedList<Map>();
List subList = (List) map.get(key);
for (int i = 0; i < subList.size(); i++) {
Map subItem = (Map) subList.get(i);
newList.add(keyConvStyleClient(subItem));
}
newMap.put(convertVariableRevert(key), newList);
} else {
newMap.put(convertVariableRevert(key), map.get(key));
}
}
return newMap;
}
static String convertVariableRevert(String key) {
StringBuffer sb = new StringBuffer(); // 새로 생성
for (int i = 0; i < key.length(); i++) {
String str = String.valueOf(key.charAt(i));
if (str.equals("_")) {
sb.append(String.valueOf(key.charAt(i + 1)).toUpperCase());
i++;
} else {
sb.append(str);
}
}
return sb.toString();
}
// ----------------map to VO 세팅 ------------------
}

View File

@ -177,4 +177,18 @@ Globals.ozFontPath=/home/oz80/fontTestDir/
#Globals.ozFontPath=/home/oz80/fontTestDir/
#\uc624\uc988\ub9ac\ud3ec\ud2b8 \ud3f0\ud2b8 \uc885\ub958
Globals.ozFont=NanumSquareR.ttf
Globals.ozFont=NanumSquareR.ttf
#\ub300\uc6a9\ub7c9 innorix filePath
Globals.Innorix.FilePath=D:\\usr\\local\\tomcat\\file\\sht\\
#inipay \uacb0\uc81c
#\uac1c\ubc1c\uc11c\ubc84
Globals.pay.mid=INIpayTest
Globals.pay.signKey=SU5JTElURV9UUklQTEVERVNfS0VZU1RS
Globals.pay.siteDomain=http://119.193.215.98:8087/web/kccadr/inipay
#\uc2e4\uc11c\ubc84
#inipay \uacb0\uc81c
#Globals.pay.mid=crosorkr01
#Globals.pay.signKey=UE9idGFmcGJEdU1HR04zbEdLdUM0QT09
#Globals.pay.siteDomain=https://adr.copyright.or.kr/web/kccadr/inipay

View File

@ -177,4 +177,18 @@ Globals.ozFontPath=/home/oz80/fontTestDir/
#Globals.ozFontPath=/home/oz80/fontTestDir/
#\uc624\uc988\ub9ac\ud3ec\ud2b8 \ud3f0\ud2b8 \uc885\ub958
Globals.ozFont=NanumSquareR.ttf
Globals.ozFont=NanumSquareR.ttf
#\ub300\uc6a9\ub7c9 innorix filePath
Globals.Innorix.FilePath=D:\\usr\\local\\tomcat\\file\\sht\\
#inipay \uacb0\uc81c
#\uac1c\ubc1c\uc11c\ubc84
Globals.pay.mid=INIpayTest
Globals.pay.signKey=SU5JTElURV9UUklQTEVERVNfS0VZU1RS
Globals.pay.siteDomain=http://119.193.215.98:8087/web/kccadr/inipay
#\uc2e4\uc11c\ubc84
#inipay \uacb0\uc81c
#Globals.pay.mid=crosorkr01
#Globals.pay.signKey=UE9idGFmcGJEdU1HR04zbEdLdUM0QT09
#Globals.pay.siteDomain=https://adr.copyright.or.kr/web/kccadr/inipay

View File

@ -181,3 +181,14 @@ Globals.ozFont=NanumSquareR.ttf
#\ub300\uc6a9\ub7c9 innorix filePath
Globals.Innorix.FilePath=D:\\usr\\local\\tomcat\\file\\sht\\
#inipay \uacb0\uc81c
#\uac1c\ubc1c\uc11c\ubc84
Globals.pay.mid=INIpayTest
Globals.pay.signKey=SU5JTElURV9UUklQTEVERVNfS0VZU1RS
Globals.pay.siteDomain=http://119.193.215.98:8087/web/kccadr/inipay
#\uc2e4\uc11c\ubc84
#inipay \uacb0\uc81c
#Globals.pay.mid=crosorkr01
#Globals.pay.signKey=UE9idGFmcGJEdU1HR04zbEdLdUM0QT09
#Globals.pay.siteDomain=https://adr.copyright.or.kr/web/kccadr/inipay

View File

@ -178,4 +178,15 @@ Globals.ozFontPath=/home/oz80/fontTestDir/
Globals.ozFont=NanumSquareR.ttf
#\ub300\uc6a9\ub7c9 innorix filePath
Globals.Innorix.FilePath=/usr/local/tomcat/file/sht/
Globals.Innorix.FilePath=/usr/local/tomcat/file/sht/
#inipay \uacb0\uc81c
#\uac1c\ubc1c\uc11c\ubc84
Globals.pay.mid=INIpayTest
Globals.pay.signKey=SU5JTElURV9UUklQTEVERVNfS0VZU1RS
Globals.pay.siteDomain=http://119.193.215.98:8087/web/kccadr/inipay
#\uc2e4\uc11c\ubc84
#inipay \uacb0\uc81c
#Globals.pay.mid=crosorkr01
#Globals.pay.signKey=UE9idGFmcGJEdU1HR04zbEdLdUM0QT09
#Globals.pay.siteDomain=https://adr.copyright.or.kr/web/kccadr/inipay

View File

@ -2881,5 +2881,23 @@
<property name="fillChar" value="0" />
</bean>
<!-- 결재로그 ID Generation Config-->
<bean name="payGnrService"
class="egovframework.rte.fdl.idgnr.impl.EgovTableIdGnrServiceImpl"
destroy-method="destroy">
<property name="dataSource" ref="dataSource" />
<property name="strategy" ref="payStrategy" />
<property name="blockSize" value="10"/>
<property name="table" value="IDS"/>
<property name="tableName" value="PAYLOG_ID"/>
</bean>
<!-- 결재로그 ID Generation Strategy Config -->
<bean name="payStrategy"
class="egovframework.rte.fdl.idgnr.impl.strategy.EgovIdGnrStrategyImpl">
<property name="prefix" value="PAYLOG_" />
<property name="cipers" value="13" />
<property name="fillChar" value="0" />
</bean>
</beans>

View File

@ -20,6 +20,7 @@
<security:http pattern="/js/**" security="none"/>
<security:http pattern="/resource/**" security="none"/>
<security:http pattern="\A/WEB-INF/jsp/.*\Z" request-matcher="regex" security="none"/>
<security:http pattern="/web/kccadr/inipay/**" security="none"/>
<egov-security:config id="securityConfig"
loginUrl="/uat/uia/actionMain.do"

View File

@ -5,4 +5,5 @@
<sqlMapConfig>
<sqlMap resource="egovframework/sqlmap/kccadr/Xxx_SQL_Mysql.xml"/><!-- XXX -->
<sqlMap resource="egovframework/sqlmap/kccadr/adjst/AdjstReq_SQL_Mysql.xml"/><!-- 대국민 조정신청 -->
<sqlMap resource="egovframework/sqlmap/kccadr/adjst/Pay_SQL_Mysql.xml"/><!-- 결제로그 -->
</sqlMapConfig>

View File

@ -0,0 +1,217 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-2.dtd">
<!-- 결제로그 -->
<sqlMap namespace="Pay">
<typeAlias alias="egovMap" type="egovframework.rte.psl.dataaccess.util.EgovMap"/>
<typeAlias alias="PayVO" type="kcc.kccadr.adjst.service.PayVO"/>
<update id="payDAO.insertPayLog" parameterClass="PayVO">
INSERT
INTO adr_pay
(
pay_seq,
<isNotEmpty property="asctnTable">
asctn_table,
</isNotEmpty>
<isNotEmpty property="asctnTablePk1">
asctn_table_pk1,
</isNotEmpty>
<isNotEmpty property="asctnTablePk2">
asctn_table_pk2,
</isNotEmpty>
<isNotEmpty property="resultcode">
resultcode,
</isNotEmpty>
<isNotEmpty property="resultmsg">
resultmsg,
</isNotEmpty>
<isNotEmpty property="tid">
tid,
</isNotEmpty>
<isNotEmpty property="moid">
moid,
</isNotEmpty>
<isNotEmpty property="totprice">
totprice,
</isNotEmpty>
<isNotEmpty property="goodname">
goodname,
</isNotEmpty>
<isNotEmpty property="paymethod">
paymethod,
</isNotEmpty>
<isNotEmpty property="appldate">
appldate,
</isNotEmpty>
<isNotEmpty property="appltime">
appltime,
</isNotEmpty>
<isNotEmpty property="eventcode">
eventcode,
</isNotEmpty>
<isNotEmpty property="buyername">
buyername,
</isNotEmpty>
<isNotEmpty property="buyertel">
buyertel,
</isNotEmpty>
<isNotEmpty property="buyeremail">
buyeremail,
</isNotEmpty>
<isNotEmpty property="custemail">
custemail,
</isNotEmpty>
<isNotEmpty property="applnum">
applnum,
</isNotEmpty>
<isNotEmpty property="cardNum">
card_num,
</isNotEmpty>
<isNotEmpty property="cardInterest">
card_interest,
</isNotEmpty>
<isNotEmpty property="cardQuota">
card_quota,
</isNotEmpty>
<isNotEmpty property="cardCode">
card_code,
</isNotEmpty>
<isNotEmpty property="cardCorpflag">
card_corpflag,
</isNotEmpty>
<isNotEmpty property="cardCheckflag">
card_checkflag,
</isNotEmpty>
<isNotEmpty property="cardPrtccode">
card_prtccode,
</isNotEmpty>
<isNotEmpty property="cardBankcode">
card_bankcode,
</isNotEmpty>
<isNotEmpty property="cardSrccode">
card_srccode,
</isNotEmpty>
<isNotEmpty property="cardPoint">
card_point,
</isNotEmpty>
<isNotEmpty property="cardUsepoint">
card_usepoint,
</isNotEmpty>
<isNotEmpty property="currency">
currency,
</isNotEmpty>
<isNotEmpty property="orgprice">
orgprice,
</isNotEmpty>
frst_regist_pnttm,
frst_register_id,
last_updt_pnttm,
last_updusr_id
)
VALUES
(
#paySeq#
<isNotEmpty property="asctnTable">
, #asctnTable#
</isNotEmpty>
<isNotEmpty property="asctnTablePk1">
, #asctnTablePk1#
</isNotEmpty>
<isNotEmpty property="asctnTablePk2">
, #asctnTablePk2#
</isNotEmpty>
<isNotEmpty property="resultcode">
, #resultcode#
</isNotEmpty>
<isNotEmpty property="resultmsg">
, #resultmsg#
</isNotEmpty>
<isNotEmpty property="tid">
, #tid#
</isNotEmpty>
<isNotEmpty property="moid">
, #moid#
</isNotEmpty>
<isNotEmpty property="totprice">
, #totprice#
</isNotEmpty>
<isNotEmpty property="goodname">
, #goodname#
</isNotEmpty>
<isNotEmpty property="paymethod">
, #paymethod#
</isNotEmpty>
<isNotEmpty property="appldate">
, #appldate#
</isNotEmpty>
<isNotEmpty property="appltime">
, #appltime#
</isNotEmpty>
<isNotEmpty property="eventcode">
, #eventcode#
</isNotEmpty>
<isNotEmpty property="buyername">
, #buyername#
</isNotEmpty>
<isNotEmpty property="buyertel">
, #buyertel#
</isNotEmpty>
<isNotEmpty property="buyeremail">
, #buyeremail#
</isNotEmpty>
<isNotEmpty property="custemail">
, #custemail#
</isNotEmpty>
<isNotEmpty property="applnum">
, #applnum#
</isNotEmpty>
<isNotEmpty property="cardNum">
, #cardNum#
</isNotEmpty>
<isNotEmpty property="cardInterest">
, #cardInterest#
</isNotEmpty>
<isNotEmpty property="cardQuota">
, #cardQuota#
</isNotEmpty>
<isNotEmpty property="cardCode">
, #cardCode#
</isNotEmpty>
<isNotEmpty property="cardCorpflag">
, #cardCorpflag#
</isNotEmpty>
<isNotEmpty property="cardCheckflag">
, #cardCheckflag#
</isNotEmpty>
<isNotEmpty property="cardPrtccode">
, #cardPrtccode#
</isNotEmpty>
<isNotEmpty property="cardBankcode">
, #cardBankcode#
</isNotEmpty>
<isNotEmpty property="cardSrccode">
, #cardSrccode#
</isNotEmpty>
<isNotEmpty property="cardPoint">
, #cardPoint#
</isNotEmpty>
<isNotEmpty property="cardUsepoint">
, #cardUsepoint#
</isNotEmpty>
<isNotEmpty property="currency">
, #currency#
</isNotEmpty>
<isNotEmpty property="orgprice">
, #orgprice#
</isNotEmpty>
, now()
, #frstRegisterId#
, now()
, #lastUpdusrId#
)
</update>
</sqlMap>

View File

@ -121,6 +121,7 @@
<pattern>/web/kccadr/adjst/adjstReqRegistTutorial.do</pattern>
<pattern>/web/kccadr/accdnt/ai/docIssReqRegistPop.do</pattern>
<pattern>/web/kccadr/inipay/*</pattern> <!-- 결재 모듈 테스트 -->
</decorator>
<!-- 관리자 게시글 작성, 템플릿 미리보기(헤더풋터 없음) -->

View File

@ -29,6 +29,15 @@
<script src="/kccadrPb/usr/datepicker/legacy.js"></script>
<script src="/kccadrPb/usr/datepicker/ko_KR.js"></script>
<!--테스트 JS--><script language="javascript" type="text/javascript" src="https://stgstdpay.inicis.com/stdjs/INIStdPay.js" charset="UTF-8"></script>
<!--운영 JS> <script language="javascript" type="text/javascript" src="https://stdpay.inicis.com/stdjs/INIStdPay.js" charset="UTF-8"></script> -->
<script type="text/javascript">
function paybtn() {
INIStdPay.pay('SendPayForm_id');
}
</script>
<script type="text/javaScript" language="javascript">
$(document).ready(function() {
@ -88,6 +97,26 @@
</script>
</head>
<body>
<form name="" id="SendPayForm_id" method="post" class="mt-5">
<input type="hidden" name="version" value="1.0">
<input type="text" name="gopaymethod" value="Card">
<input type="text" name="mid" value="<c:out value='${mid}'/>">
<input type="text" name="oid" value="<c:out value='${orderNumber}'/>">
<input type="text" name="price" value="<c:out value='${price}'/>">
<input type="text" name="timestamp" value="<c:out value='${timestamp}'/>">
<input type="hidden" name="signature" value="<c:out value='${signature}'/>">
<input type="hidden" name="mKey" value="<c:out value='${mKey}'/>">
<input type="hidden" name="currency" value="WON">
<input type="text" name="goodname" value="테스트상품">
<input type="text" name="buyername" value="테스터">
<input type="text" name="buyertel" value="01012345678">
<input type="text" name="buyeremail" value="test@test.com">
<input type="hidden" name="returnUrl" value="http://119.193.215.98:8087/web/kccadr/inipay/INIstdpayPcReturn.do">
<input type="hidden" name="closeUrl" value="http://119.193.215.98:8087/web/kccadr/inipay/INIstdpayClose.do">
<input type="text" name="acceptmethod" value="HPP(1):below1000:va_receipt:SKIN(#6666FF)">
</form>
<form:form id="listForm" name="listForm" commandName="adrRecordReadingVO" onsubmit="return false;" method="post">
<input type="hidden" name="pageIndex" value="<c:out value='${adrRecordReadingVO.pageIndex}' default='1' />"/>
<input type="hidden" name="searchSortCnd" value="<c:out value="${adrRecordReadingVO.searchSortCnd}" />" />
@ -194,7 +223,7 @@
<p>
<c:choose>
<c:when test="${list.prcsnStatCd eq '10'}">
<button type="button" class="btnType10">수수료결제</button>
<button type="button" class="btnType10" onclick="paybtn()">수수료결제</button>
<button type="button" class="btnType10" onclick="fncDeleteReq('<c:out value="${list.recordReadingSeq}" />');">삭제</button>
</c:when>
<c:when test="${list.prcsnStatCd eq '20'}">

View File

@ -0,0 +1,162 @@
<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%-- <%
String mid = "INIpayTest"; // 상점아이디
String signKey = "SU5JTElURV9UUklQTEVERVNfS0VZU1RS"; // 웹 결제 signkey
String mKey = SignatureUtil.hash(signKey, "SHA-256");
String timestamp = SignatureUtil.getTimestamp(); // util에 의해서 자동생성
String orderNumber = mid+"_"+SignatureUtil.getTimestamp(); // 가맹점 주문번호(가맹점에서 직접 설정)
String price = "1000"; // 상품가격(특수기호 제외, 가맹점에서 직접 설정)
Map<String, String> signParam = new HashMap<String, String>();
signParam.put("oid", orderNumber);
signParam.put("price", price);
signParam.put("timestamp", timestamp);
String signature = SignatureUtil.makeSignature(signParam);
/* 기타 */
String siteDomain = "http://127.0.0.1:8089/web/kccadr/inipay"; //가맹점 도메인 입력
%> --%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport"
content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>KG이니시스 결제샘플</title>
<link rel="stylesheet" href="/css/inicis/style.css">
<link rel="stylesheet" href="/css/inicis/bootstrap.min.css">
<!--테스트 JS--><script language="javascript" type="text/javascript" src="https://stgstdpay.inicis.com/stdjs/INIStdPay.js" charset="UTF-8"></script>
<!--운영 JS> <script language="javascript" type="text/javascript" src="https://stdpay.inicis.com/stdjs/INIStdPay.js" charset="UTF-8"></script> -->
<script type="text/javascript">
function paybtn() {
INIStdPay.pay('SendPayForm_id');
}
</script>
</head>
<body class="wrap">
<!-- 본문 -->
<main class="col-8 cont" id="bill-01">
<!-- 페이지타이틀 -->
<section class="mb-5">
<div class="tit">
<h2>일반결제</h2>
<p>KG이니시스 결제창을 호출하여 다양한 지불수단으로 안전한 결제를 제공하는 서비스</p>
</div>
</section>
<!-- //페이지타이틀 -->
<!-- 카드CONTENTS -->
<section class="menu_cont mb-5">
<div class="card">
<div class="card_tit">
<h3>PC 일반결제</h3>
</div>
<!-- 유의사항 -->
<div class="card_desc">
<h4>※ 유의사항</h4>
<ul>
<li>테스트MID 결제시 실 승인되며, 당일 자정(24:00) 이전에 자동으로 취소처리 됩니다.</li>
<li>가상계좌 채번 후 입금할 경우 자동환불되지 않사오니, 가맹점관리자 내 "입금통보테스트" 메뉴를 이용부탁드립니다.<br>(실 입금하신 경우 별도로 환불요청해주셔야 합니다.)</li>
<li>국민카드 정책상 테스트 결제가 불가하여 오류가 발생될 수 있습니다. 국민, 카카오뱅크 외 다른 카드로 테스트결제 부탁드립니다.</li>
</ul>
</div>
<!-- //유의사항 -->
<form name="" id="SendPayForm_id" method="post" class="mt-5">
<div class="row g-3 justify-content-between" style="--bs-gutter-x:0rem;">
<!--label class="col-10 col-sm-2 gap-2 input param" style="border:none;">version</label>
<label class="col-10 col-sm-9 input"-->
<input type="hidden" name="version" value="1.0">
<!--/label-->
<label class="col-10 col-sm-2 input param" style="border:none;">gopaymethod</label>
<label class="col-10 col-sm-9 input">
<!-- <input type="text" name="gopaymethod" value="Card:Directbank:vbank"> -->
<input type="text" name="gopaymethod" value="Card">
</label>
<label class="col-10 col-sm-2 input param" style="border:none;">mid</label>
<label class="col-10 col-sm-9 input">
<input type="text" name="mid" value="<c:out value='${mid}'/>">
</label>
<label class="col-10 col-sm-2 input param" style="border:none;">oid</label>
<label class="col-10 col-sm-9 input">
<input type="text" name="oid" value="<c:out value='${orderNumber}'/>">
</label>
<label class="col-10 col-sm-2 input param" style="border:none;">price</label>
<label class="col-10 col-sm-9 input">
<input type="text" name="price" value="<c:out value='${price}'/>">
</label>
<label class="col-10 col-sm-2 input param" style="border:none;">timestamp</label>
<label class="col-10 col-sm-9 input">
<input type="text" name="timestamp" value="<c:out value='${timestamp}'/>">
</label>
<input type="hidden" name="signature" value="<c:out value='${signature}'/>">
<input type="hidden" name="mKey" value="<c:out value='${mKey}'/>">
<input type="hidden" name="currency" value="WON">
<label class="col-10 col-sm-2 input param" style="border:none;">goodname</label>
<label class="col-10 col-sm-9 input">
<input type="text" name="goodname" value="테스트상품">
</label>
<label class="col-10 col-sm-2 input param" style="border:none;">buyername</label>
<label class="col-10 col-sm-9 input">
<input type="text" name="buyername" value="테스터">
</label>
<label class="col-10 col-sm-2 input param" style="border:none;">buyertel</label>
<label class="col-10 col-sm-9 input">
<input type="text" name="buyertel" value="01012345678">
</label>
<label class="col-10 col-sm-2 input param" style="border:none;">buyeremail</label>
<label class="col-10 col-sm-9 input">
<input type="text" name="buyeremail" value="test@test.com">
</label>
<%-- <input type="hidden" name="returnUrl" value="<%=siteDomain%>/INIstdpay_pc_return.jsp"> --%>
<input type="hidden" name="returnUrl" value="http://119.193.215.98:8087/web/kccadr/inipay/INIstdpayPcReturn.do">
<%-- <input type="hidden" name="closeUrl" value="<%=siteDomain%>/INIstdpayClose.do"> --%>
<input type="hidden" name="closeUrl" value="http://119.193.215.98:8087/web/kccadr/inipay/INIstdpayClose.do">
<%-- <input type="hidden" name="closeUrl" value="<%=siteDomain%>/close.jsp"> --%>
<label class="col-10 col-sm-2 input param" style="border:none;">acceptmethod</label>
<label class="col-10 col-sm-9 input">
<input type="text" name="acceptmethod" value="HPP(1):below1000:va_receipt:SKIN(#6666FF)">
</label>
</div>
</form>
<button onclick="paybtn()" class="btn_solid_pri col-6 mx-auto btn_lg" style="margin-top:50px">결제 요청</button>
</div>
</section>
</main>
</body>
</html>

View File

@ -0,0 +1,237 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%-- <%@ page import="com.inicis.std.util.ParseUtil"%>
<%@ page import="com.inicis.std.util.SignatureUtil"%>
<%@ page import="com.inicis.std.util.HttpUtil"%>
<%@ page import="java.util.*"%> --%>
<%-- <%
Map<String, String> resultMap = new HashMap<String, String>();
try{
//#############################
// 인증결과 파라미터 일괄 수신
//#############################
request.setCharacterEncoding("UTF-8");
Map<String,String> paramMap = new Hashtable<String,String>();
Enumeration elems = request.getParameterNames();
String temp = "";
while(elems.hasMoreElements())
{
temp = (String) elems.nextElement();
paramMap.put(temp, request.getParameter(temp));
}
System.out.println("paramMap : "+ paramMap.toString());
if("0000".equals(paramMap.get("resultCode"))){
System.out.println("####인증성공/승인요청####");
//############################################
// 1.전문 필드 값 설정(***가맹점 개발수정***)
//############################################
String mid = paramMap.get("mid");
String timestamp= SignatureUtil.getTimestamp();
String charset = "UTF-8";
String format = "JSON";
String authToken= paramMap.get("authToken");
String authUrl = paramMap.get("authUrl");
String netCancel= paramMap.get("netCancelUrl");
String merchantData = paramMap.get("merchantData");
//#####################
// 2.signature 생성
//#####################
Map<String, String> signParam = new HashMap<String, String>();
signParam.put("authToken", authToken); // 필수
signParam.put("timestamp", timestamp); // 필수
// signature 데이터 생성 (모듈에서 자동으로 signParam을 알파벳 순으로 정렬후 NVP 방식으로 나열해 hash)
String signature = SignatureUtil.makeSignature(signParam);
//#####################
// 3.API 요청 전문 생성
//#####################
Map<String, String> authMap = new Hashtable<String, String>();
authMap.put("mid" ,mid); // 필수
authMap.put("authToken" ,authToken); // 필수
authMap.put("signature" ,signature); // 필수
authMap.put("timestamp" ,timestamp); // 필수
authMap.put("charset" ,charset); // default=UTF-8
authMap.put("format" ,format); // default=XML
HttpUtil httpUtil = new HttpUtil();
try{
//#####################
// 4.API 통신 시작
//#####################
String authResultString = "";
authResultString = httpUtil.processHTTP(authMap, authUrl);
//############################################################
//5.API 통신결과 처리(***가맹점 개발수정***)
//############################################################
String test = authResultString.replace(",", "&").replace(":", "=").replace("\"", "").replace(" ","").replace("\n", "").replace("}", "").replace("{", "");
resultMap = ParseUtil.parseStringToMap(test); //문자열을 MAP형식으로 파싱
// 수신결과를 파싱후 resultCode가 "0000"이면 승인성공 이외 실패
//throw new Exception("강제 Exception");
} catch (Exception ex) {
//####################################
// 실패시 처리(***가맹점 개발수정***)
//####################################
//---- db 저장 실패시 등 예외처리----//
System.out.println(ex);
//#####################
// 망취소 API
//#####################
String netcancelResultString = httpUtil.processHTTP(authMap, netCancel); // 망취소 요청 API url(고정, 임의 세팅 금지)
out.println("## 망취소 API 결과 ##");
// 취소 결과 확인
out.println("<p>"+netcancelResultString.replaceAll("<", "&lt;").replaceAll(">", "&gt;")+"</p>");
}
}else{
resultMap.put("resultCode", paramMap.get("resultCode"));
resultMap.put("resultMsg", paramMap.get("resultMsg"));
}
}catch(Exception e){
System.out.println(e);
}
%> --%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport"
content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>KG이니시스 결제샘플</title>
<link rel="stylesheet" href="css/style.css">
<link rel="stylesheet" href="css/bootstrap.min.css">
<script language="javascript" type="text/javascript" src="https://stdpay.inicis.com/stdjs/INIStdPay.js" charset="UTF-8"></script>
<script type="text/javascript">
function paybtn() {
INIStdPay.pay('SendPayForm_id');
}
</script>
</head>
<body class="wrap">
<!-- 본문 -->
<main class="col-8 cont" id="bill-01">
<!-- 페이지타이틀 -->
<section class="mb-5">
<div class="tit">
<h2>일반결제</h2>
<p>KG이니시스 결제창을 호출하여 다양한 지불수단으로 안전한 결제를 제공하는 서비스</p>
</div>
</section>
<!-- //페이지타이틀 -->
<!-- 카드CONTENTS -->
<section class="menu_cont mb-5">
<div class="card">
<div class="card_tit">
<h3>PC 일반결제</h3>
</div>
<!-- 유의사항 -->
<div class="card_desc">
<h4>※ 유의사항</h4>
<ul>
<li>테스트MID 결제시 실 승인되며, 당일 자정(24:00) 이전에 자동으로 취소처리 됩니다.</li>
<li>가상계좌 채번 후 입금할 경우 자동환불되지 않사오니, 가맹점관리자 내 "입금통보테스트" 메뉴를 이용부탁드립니다.<br>(실 입금하신 경우 별도로 환불요청해주셔야 합니다.)</li>
<li>국민카드 정책상 테스트 결제가 불가하여 오류가 발생될 수 있습니다. 국민, 카카오뱅크 외 다른 카드로 테스트결제 부탁드립니다.</li>
</ul>
</div>
<!-- //유의사항 -->
<form name="" id="result" method="post" class="mt-5">
<div class="row g-3 justify-content-between" style="--bs-gutter-x:0rem;">
<label class="col-10 col-sm-2 gap-2 input param" style="border:none;">resultCode</label>
<label class="col-10 col-sm-9 reinput">
<c:out value='${resultMap.get("resultCode")}'/>
</label>
<label class="col-10 col-sm-2 input param" style="border:none;">resultMsg</label>
<label class="col-10 col-sm-9 reinput">
<c:out value='${resultMap.get("resultMsg")}'/>
</label>
<label class="col-10 col-sm-2 input param" style="border:none;">tid</label>
<label class="col-10 col-sm-9 reinput">
<c:out value='${resultMap.get("tid")}'/>
</label>
<label class="col-10 col-sm-2 input param" style="border:none;">MOID</label>
<label class="col-10 col-sm-9 reinput">
<c:out value='${resultMap.get("MOID")}'/>
</label>
<label class="col-10 col-sm-2 input param" style="border:none;">TotPrice</label>
<label class="col-10 col-sm-9 reinput">
<c:out value='${resultMap.get("TotPrice")}'/>
</label>
<label class="col-10 col-sm-2 input param" style="border:none;">goodName</label>
<label class="col-10 col-sm-9 reinput">
<c:out value='${resultMap.get("goodName")}'/>
</label>
<label class="col-10 col-sm-2 input param" style="border:none;">applDate</label>
<label class="col-10 col-sm-9 reinput">
<c:out value='${resultMap.get("applDate")}'/>
</label>
<label class="col-10 col-sm-2 input param" style="border:none;">applTime</label>
<label class="col-10 col-sm-9 reinput">
<c:out value='${resultMap.get("applTime")}'/>
</label>
</div>
</form>
<button onclick="location.href='INIstdpayPcReq.do'" class="btn_solid_pri col-6 mx-auto btn_lg" style="margin-top:50px">돌아가기</button>
</div>
</section>
</main>
</body>
</html>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,190 @@
@charset "utf-8";
/* =====================================
RESET
===================================== */
* { outline:0 !important; }
html,body,h1,h2,h3,h4,h5,h6,div,p,blockquote,pre,code,address,ul,ol,li,menu,nav,section,article,aside,
dl,dt,dd,table,thead,tbody,tfoot,label,caption,th,td,form,fieldset,legend,hr,input,button,textarea,object,figure,figcaption,select { margin:0; padding:0; font-family:'pretendard','pretendard-subset',sans-serif; line-height: 120%; font-weight: 300; color: var(--secondary); word-break: keep-all; }
html, body { width:100%; }
html { -webkit-touch-callout:none; -webkit-user-select:none; -webkit-tap-highlight-color:rgba(0, 0, 0, 0); }
body { width:100%; background:#fff; min-width:280px; -webkit-text-size-adjust:none; word-wrap:break-word; word-break:break-all; }
body,input,select,textarea,button { border:none; -webkit-border-radius: 0; font-weight: 300;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none; }
ul,ol,li { list-style:none; }
table { width:100%; border-spacing:0; border-collapse:collapse; -webkit-user-select:text; }
img,fieldset { border:0; }
address,cite,code,em { font-style:normal; font-weight:normal; }
label,img,input,select,textarea,button { vertical-align:middle; }
main,header,section,nav,footer,aside,article,figure { display:block; }
a { text-decoration:none; color: #fff; cursor: pointer; }
b {font-weight: 700;}
button { cursor: pointer; background:none; }
/* Scroll bar hidden */
body { -ms-overflow-style: none; /* IE and Edge */ scrollbar-width: none; /* Firefox */ }
body::-webkit-scrollbar { display: none; /* Chrome, Safari, Opera*/ }
::selection, ::-webkit-selection {background-color: #fceac1;}
label span{padding-left: 10px;font-size:14px;font-weight:500;}
label.param{border:none; font-weight:600;}
/* =====================================
Color
===================================== */
:root {
--primary : #ffba1a;
--secondary : #141523;
--white :#fff;
--gray001 : #f6f6f6;
--gray01 : #f1f1f1;
--gray02 : #a8a8a8;
--gray03 : #5B5B5B;
--wt50 : #ffffff80;
--bk50 : #00000080;
--red01 : #FFDBDB;
--red02 : #FF3434;
--orange01 : #FFE6D1;
--orange02: #E44600;
--yellow01 : #fff1d1;
--yellow02 : #ff9900;
--ygreen01 : #EEFCE7;
--ygreen02 : #2C680F;
--lgreen02 : #6ebb1a;
--green01 : #ebf5f5;
--green02 : #0f6866;
--skyblue01 : #ECF7FC;
--skyblue02 : #007AB9;
--blue01 : #e9f1ff;
--blue02 : #06296e;
--navy01 :#E8EAFF;
--navy02 :#0A116B;
--purple01 : #EBDFFF;
--purple02 : #44227A;
--violet01 :#F1E0EE;
--violet02 : #742F5A;
}
:root {
--max-width :1240px;
--lnb-width :240px;
}
.wrap { width: 100%; background-color: var(--gray01); }
.inner { width: 100%; max-width: var(--max-width); margin: auto; }
.text_r { color: var(--red02); }
.text_y { color: var(--yellow02); }
.text_b { color: var(--skyblue02); }
.text_g { color: var(--lgreen02); }
.btn_lg {height: 60px; font-size: 18px; font-weight: 700;}
/* =====================================
Components
===================================== */
/* 버튼 */
.btn_line_01 { border: 1px solid var(--white); color: var(--white); padding: 10px 50px; border-radius: 4px; font-size: 16px; display: inline-block; text-align: center;}
.btn_line_02 { border: 1px solid var(--secondary); color: var(--secondary); padding: 10px 50px; border-radius: 4px; font-size: 16px; display: inline-block;text-align: center;}
.btn_solid_pri { border: 1px solid var(--primary); color: var(--secondary); padding: 10px; border-radius: 4px; font-size: 16px; background-color: var(--primary); font-weight: 500; display: inline-block; text-align: center;}
.btn_solid_sec { border: 1px solid var(--secondary); color: var(--white); padding: 10px; border-radius: 4px; font-size: 16px; background-color: var(--secondary); font-weight: 500; display: inline-block; text-align: center;}
.btn_solid_red { border: 1px solid var(--red02); color: var(--red02); padding: 10px; border-radius: 4px; font-size: 16px; background-color: var(--red01); font-weight: 500; display: inline-block; text-align: center;}
.btn_solid_yel { border: 1px solid var(--yellow02); color: var(--yellow02); padding: 10px; border-radius: 4px; font-size: 16px; background-color: var(--yellow01); font-weight: 500; display: inline-block; text-align: center;}
.reinput {position: relative; padding: 20px; border-radius: 4px; height: 60px; display: flex; min-width: 200px; ;}
.input {position: relative; border:1px solid var(--gray02); padding: 20px; border-radius: 4px; height: 60px; display: flex; min-width: 200px; ;}
.input img {margin-right: 20px;}
.input input {width: 100%;}
.input select {width: 100%; margin-top: -20px; height: 60px; background: url(../img/acc_bot.png) center right no-repeat; background-size: 20px; }
.input textarea {width: 100%;}
.input.col {width: 49%;}
/* =====================================
Main
===================================== */
.main .section:first-child {max-width:100vw}
.main .section {margin: auto; display: flex; align-items: center; position: relative; min-width: 280px; left: 0;}
.main .section .sec_cont {align-items: center; align-content: center; margin-top: -120px; padding-left: 100px;}
.main .section .sec_cont h2 {font-size: 60px;font-weight: 700;}
.main .section .sec_cont span {font-size: 20px; line-height: 1.5em; display: block; margin: 30px 0;}
.main .section .sec_cont a { border: 1px solid var(--secondary); font-size: 16px; width: 200px; height: 40px; border-radius:4px ; -webkit-border-radius:4px ; -moz-border-radius:4px ; -ms-border-radius:4px ; -o-border-radius:4px ; }
.main .section .sec_img {position: absolute; top: 50%; right: 0; transform:translate(0%, -50%); width: 80vw; text-align: center; z-index: -1;}
.main .section .sec_img img {max-width: 1000px; min-width: 280px; width: 100%;}
.main .page_scroll {z-index: 2;}
#fullpage {height: 100%; position: relative; touch-action: none; transition: all 700ms ease 0s;}
.main .section {display: table; table-layout: fixed; width: 100%; position: relative; box-sizing: border-box; height: 100vh;}
/* =====================================
Content
===================================== */
.tit { margin-bottom: 40px; padding-top: 0px; }
.tit h2 { font-size: 36px; font-weight: 700; padding-bottom: 10px;}
.tit p { font-size: 20px; font-weight: 500; }
main .card { width: 100%; background: var(--white); border-radius: 20px; box-shadow: 0 2px 6px rgba(0,0,0,0.05); padding: 80px; padding-top: 0; box-sizing: border-box; -webkit-user-select:text;}
main .card .card_tit h3 { font-size: 28px; font-weight: 700; padding-top: 60px; -webkit-user-select:none;}
main .card .card_tit p { font-size: 16px; font-weight: 300; padding: 10px 0; line-height: 1.5em; -webkit-user-select:none;}
main .card .card_tit .step-tag { background-color: var(--primary); padding:0 10px; color: var(--secondary); font-weight: 700; font-size: 14px; line-height: 30px; display: inline-block; margin-right: 10px; margin-bottom: 4px; border-radius: 4px; vertical-align: middle; }
main .card .card_sub_tit {padding: 40px 0 20px 0; margin-top: 30px; border-top: 2px solid var(--gray01);}
main .card .card_sub_tit h3 { font-size: 20px; font-weight: 700; }
main .card .card_sub_tit p { font-size: 16px; font-weight: 300; padding: 10px 0; line-height: 1.5em; }
.popup .card_sub_tit h3 { font-size: 20px; font-weight: 700; }
.popup .card_sub_tit p { font-size: 16px; font-weight: 300; padding: 10px 0; line-height: 1.5em; }
main.cont { margin: auto;padding: 30px; padding-top:100px}
main.cont section .card_desc { border: 6px solid var(--gray01); border-radius: 10px; padding: 40px 10px 20px 40px; box-sizing: border-box; margin: 30px 0; }
main.cont section .card_desc h4 { font-weight: 700; margin-bottom: 4px; -webkit-user-select:none; }
main.cont section .card_desc ul { margin-top: 20px; margin-bottom: 20px; }
main.cont section .card_desc ul li { list-style-type: disc; margin-left: 20px; line-height:180%; font-size:14px;}
main.cont section .card_desc ol { margin-top: 20px; margin-bottom: 20px; }
main.cont section .card_desc ol li { list-style-type: decimal; margin-left: 40px; }
main.cont section .card_desc ol li { list-style-type: decimal; margin-left: 40px; }
/* TAB */
.card_tab li { flex: 1; text-align: center; border-bottom:4px solid var(--gray01); padding: 10px; box-sizing: border-box; font-weight: 700; color: var(--gray02); cursor: pointer; -webkit-user-select:none; }
.card_tab li.sel { border-bottom:4px solid var(--primary); font-weight: 700; color: var(--secondary); }
.code_table [class*=table_cont] { width: 100%; max-height: 500px;}
.code_table [class*=table_cont] tbody { display:inline-table; width: 100%; }
.code_table [class*=table_cont] tr { height: 92px; vertical-align: middle; border-bottom: 1px solid var(--gray02); }
.code_table [class*=table_cont] th { font-weight: 700; padding: 10px; padding-left: 20px; position: relative; }
.code_table [class*=table_cont] td { padding: 10px; padding-left: 20px;}
.code_table [class*=table_cont] td .table_desc { font-size: 14px; font-weight: 700; }
.code_table [class*=table_cont] th em { padding-left: 4px; }
/* 테이블 디자인 */
.code_table .table_01 table {height: 60px}
.code_table .table_01 table tr {height: 60px;}
.code_table .table_01 table tr th {background-color: var(--gray01);border-bottom: 1px solid var(--gray01);}
.code_table .table_01 table td {word-break: break-all; border-left: 1px solid var(--gray01);border-bottom: 1px solid var(--gray01);}
.code_table .table_01 table th:first-child {border-left: 0; text-align: center;}
.code_table .table_01 table td:first-child {border-left: 0; text-align: center;}