bin2107 пре 5 година
родитељ
комит
4560c8bc7a

+ 15 - 3
src/main/java/com/style24/core/biz/service/TscFreegiftService.java

@@ -49,7 +49,9 @@ public class TscFreegiftService {
 		
 		// 1. 장바구니 담긴 상품으로 적용된 사은품 프로모션 정보 조회 (with 상품금액)
 		Collection<Order> fregiftGoodsApplyAmtList = freegiftDao.getFreeGiftGoodsApplyAmt(order);
-		
+
+		log.info("fregiftGoodsApplyAmtList.size() ::: {}", fregiftGoodsApplyAmtList.size());
+
 		// 1.1 장바구니 상품으로 적용된 사은품 여부 판단
 		if (fregiftGoodsApplyAmtList.size() > 0) {
 			int[] freegiftSqArr = new int[fregiftGoodsApplyAmtList.size()];
@@ -86,14 +88,24 @@ public class TscFreegiftService {
 						
 						// 같은 사은품 프로모션끼리 등록
 						if (fregiftGoodsApplyAmt.getFreegiftSq() == freegiftGoodsApplySection.getFreegiftSq()) {
+
+							log.info("fregiftGoodsApplyAmt.getFreegiftSq() ::: {}", fregiftGoodsApplyAmt.getFreegiftSq());
+							log.info("freegiftAmt ::: {}", freegiftAmt);
+							log.info("sectionVal ::: {}", sectionVal);
+							log.info("tempFreegiftSectionSq ::: {}", tempFreegiftSectionSq);
+
 							if (freegiftAmt > sectionVal) {
 								tempFreegiftSectionSq = freegiftSectionSq;
 							} else {
-								freegiftSectionSqArr[k] = tempFreegiftSectionSq;
-								k++;
+								if (tempFreegiftSectionSq > 0) {
+									freegiftSectionSqArr[k] = tempFreegiftSectionSq;
+									k++;
+								}
 							}
 						}
 					}
+
+					freegiftSectionSqArr[k] = tempFreegiftSectionSq;
 				}
 				
 				// 3. 사은품 적용구간 의 적용 사은품정보조회

+ 175 - 54
src/main/java/com/style24/core/biz/service/TscKakaoPayService.java

@@ -1,27 +1,18 @@
 package com.style24.core.biz.service;
 
-import java.net.URI;
-
-import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
-import org.springframework.http.HttpEntity;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.util.MultiValueMap;
 import org.springframework.web.client.RestTemplate;
 
-import com.gagaframework.web.parameter.GagaMap;
-import com.gagaframework.web.util.GagaFileUtil;
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-import com.style24.core.biz.dao.TscPointDao;
+import com.style24.core.biz.thirdparty.KakaoPayApi;
+import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.persistence.domain.KakaoPay;
 import com.style24.persistence.domain.Order;
-import com.style24.persistence.domain.Point;
+import com.style24.persistence.domain.Payment;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -39,58 +30,188 @@ public class TscKakaoPayService {
 	private Environment env;
 
 	@Autowired
-	private RestTemplate restTemplate;
+	private TscMessageByLocale message;
 
-	public static final String PROTOCOL = "http:";
+	@Autowired
+	private RestTemplate restTemplate;
+	
+	@Autowired
+	private KakaoPayApi kakaoPayApi;
 
 	/**
 	 * 카카오페이 결제준비 처리
 	 * 
 	 * @param Order
-	 * @return GagaMap
+	 * @return KakaoPay
 	 * @author card007
 	 * @since 2021. 03. 03
 	 */
 	@Transactional("shopTxnManager")
-	public GagaMap kakaoPaymentReady(Order order) {
-		GagaMap map = new GagaMap();
+	public KakaoPay kakaoPaymentReady(Order order) {
+		// API 전송 URL 설정
 		String paymentReadyUrl = env.getProperty("kakao.paymentReadyUrl");
-		try {
-			MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
-			params.add("cid", env.getProperty("kakao.cid"));
-			params.add("partner_order_id", order.getOrdNo()+"");
-			params.add("partner_user_id", order.getCustNo()+"");
-			params.add("item_name", order.getGoodsNm());
-			params.add("quantity", order.getOrdQty()+"");
-			params.add("total_amount", order.getRealOrdAmt()+"");
-			params.add("tax_free_amount", "0");
-			params.add("approval_url", PROTOCOL + env.getProperty("domain.front"));
-			params.add("fail_url", PROTOCOL + env.getProperty("domain.front"));
-			params.add("cancel_url", PROTOCOL + env.getProperty("domain.front"));
-
-			// Header
-			HttpHeaders headers = new HttpHeaders();
-			headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
-			headers.set("Authorization", "KakaoAK " + env.getProperty("kakao.adminKey"));
-
-			HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(params, headers);
-			URI url = URI.create(paymentReadyUrl);
-
-			// POST방식으로 호출
-			ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, request, String.class);
-			log.info("responseEntity.getStatusCode(): {} ", responseEntity.getStatusCode());
-
-			String jsonResult = responseEntity.getBody();
-			log.info("responseEntity.getBody(): {} ", jsonResult);
-
-			Gson gson = new GsonBuilder().create();
-			map = gson.fromJson(jsonResult, GagaMap.class); //access_token, refresh_token
-
-		} catch (Exception e) {
-			log.error(e.getMessage());
+
+		// API 파라메터 설정
+		MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
+		params.add("cid", env.getProperty("kakao.cid"));
+		params.add("partner_order_id", order.getOrdNo()+"");
+		params.add("partner_user_id", order.getCustNo()+"");
+		params.add("item_name", order.getGoodsNm());
+		params.add("quantity", order.getOrdQty()+"");
+		params.add("total_amount", order.getRealOrdAmt()+"");
+		params.add("tax_free_amount", "0");
+		params.add("approval_url", order.getApprovalUrl());
+		params.add("fail_url", order.getFailUrl());
+		params.add("cancel_url", order.getCancelUrl());
+
+		// 카카오페이 API 전송
+		return kakaoPayApi.kakaoPaymentApi(params, paymentReadyUrl);
+	}
+
+	/**
+	 * 카카오페이 승인 처리
+	 *
+	 * @param Order
+	 * @return Payment
+	 * @author card007
+	 * @since 2021. 03. 04
+	 */
+	@Transactional("shopTxnManager")
+	public Payment approveKakaoPayment(Order order) {
+		// API 전송 URL 설정
+		String approvePaymentUrl = env.getProperty("kakao.approvePaymentUrl");
+
+		// API 파라메터 설정
+		MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
+		params.add("cid", env.getProperty("kakao.cid"));
+		params.add("tid", order.getPgTid());
+		params.add("partner_order_id", order.getOrdNo()+"");
+		params.add("partner_user_id", order.getCustNo()+"");
+		params.add("pg_token", order.getPgToken());
+
+		// 카카오페이 API 전송
+		KakaoPay kakaoPay = kakaoPayApi.kakaoPaymentApi(params, approvePaymentUrl);
+
+		// 카카오페이 API 전송 결과 처리
+		Payment payment = new Payment();
+		int statusCode = kakaoPay.getStatusCode();
+
+		// 승인 성공일때 200
+		if (statusCode == 200) {
+			payment.setPgTradeNo(kakaoPay.getAid());
+			payment.setPgTid(kakaoPay.getTid());
+			payment.setPgShopId(kakaoPay.getCid());
+			payment.setOrdNo(Integer.parseInt(kakaoPay.getPartner_order_id()));
+			payment.setCustNo(Integer.parseInt(kakaoPay.getPartner_user_id()));
+			payment.setKakaoMethodType(kakaoPay.getPayment_method_type());
+			payment.setPayAmt(kakaoPay.getAmount().getTotal());
+			payment.setKakaoPoint(kakaoPay.getAmount().getPoint());
+			payment.setKakaoDiscount(kakaoPay.getAmount().getDiscount());
+
+			// 카카오페이 카드결제 시 카드정보 설정
+			if ("CARD".equals(kakaoPay.getPayment_method_type())) {
+				payment.setCardKind(kakaoPay.getCard_info().getPurchase_corp());
+				payment.setCardNm(kakaoPay.getCard_info().getIssuer_corp());
+				payment.setCardType("신용".equals(kakaoPay.getCard_info().getCard_type()) ? "N" : "Y");
+				payment.setCardMips(kakaoPay.getCard_info().getInstall_month());
+			}
+			
+			payment.setResCd(String.valueOf(statusCode));
+			payment.setResMsg(message.getMessage("SUCC_0004"));
+		} else {
+			int code = Integer.parseInt(kakaoPay.getCode());
+			String msg = kakaoPay.getMsg();
+			String resultCode = kakaoPay.getExtras().getMethod_result_code();
+			String resultMessage = kakaoPay.getExtras().getMethod_result_message();
+
+			payment.setResCd(String.valueOf(code));
+			payment.setResMsg(resultMessage);
 		}
-		
-		return map;
+
+		return payment;
 	}
-	
+
+	/**
+	 * 카카오페이 주문 조회
+	 *
+	 * @param Order
+	 * @return KakaoPay
+	 * @author card007
+	 * @since 2021. 03. 04
+	 */
+	@Transactional("shopTxnManager")
+	public KakaoPay getKakaoPaymentOrder(Order order) {
+		// API 전송 URL 설정
+		String paymentOrderUrl = env.getProperty("kakao.paymentOrderUrl");
+
+		// API 파라메터 설정
+		MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
+		params.add("cid", env.getProperty("kakao.cid"));
+		params.add("tid", order.getPgTid());
+
+		// 카카오페이 API 전송
+		KakaoPay pay = kakaoPayApi.kakaoPaymentApi(params, paymentOrderUrl);
+
+		return pay;
+	}
+
+	/**
+	 * 카카오페이 결제 취소
+	 *
+	 * @param Order
+	 * @return KakaoPay
+	 * @author card007
+	 * @since 2021. 03. 05
+	 */
+	@Transactional("shopTxnManager")
+	public Payment cancelKakaoPayment(Order order) {
+		// API 전송 URL 설정
+		String cancelPaymentUrl = env.getProperty("kakao.cancelPaymentUrl");
+
+		// API 파라메터 설정
+		MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
+		params.add("cid", env.getProperty("kakao.cid"));
+		params.add("tid", order.getPgTid());
+		params.add("cancel_tax_free_amount", "0");
+
+		// 전체 취소의 경우 카카오페이에 취소가능금액으로 취소금액 설정
+		if ("Y".equals(order.getAllCanYn())) {
+			KakaoPay orderInfo = getKakaoPaymentOrder(order);
+			params.add("cancel_amount", String.valueOf(orderInfo.getCancel_available_amount().getTotal()));
+		} else {
+			params.add("cancel_amount", String.valueOf(order.getCnclRtnAmt()));
+		}
+
+		// 카카오페이 API 전송
+		KakaoPay kakaoPay = kakaoPayApi.kakaoPaymentApi(params, cancelPaymentUrl);
+
+		// 카카오페이 API 전송 결과 처리
+		Payment payment = new Payment();
+		int statusCode = kakaoPay.getStatusCode();
+
+		// 승인 성공일때 200
+		if (statusCode == 200) {
+			payment.setPgTradeNo(kakaoPay.getAid());
+			payment.setPgTid(kakaoPay.getTid());
+			payment.setPgShopId(kakaoPay.getCid());
+			payment.setStatus(kakaoPay.getStatus());
+			payment.setOrdNo(Integer.parseInt(kakaoPay.getPartner_order_id()));
+			payment.setCustNo(Integer.parseInt(kakaoPay.getPartner_user_id()));
+			payment.setKakaoMethodType(kakaoPay.getPayment_method_type());
+			payment.setPayAmt(kakaoPay.getApproved_cancel_amount().getTotal());
+			payment.setResCd(String.valueOf(statusCode));
+			payment.setResMsg(message.getMessage("SUCC_0004"));
+		} else {
+			int code = Integer.parseInt(kakaoPay.getCode());
+			String msg = kakaoPay.getMsg();
+			String resultCode = kakaoPay.getExtras().getMethod_result_code();
+			String resultMessage = kakaoPay.getExtras().getMethod_result_message();
+
+			payment.setResCd(String.valueOf(code));
+			payment.setResMsg(resultMessage);
+		}
+
+		return payment;
+	}
+
 }

+ 58 - 16
src/main/java/com/style24/core/biz/service/TscKcpService.java

@@ -26,25 +26,22 @@ public class TscKcpService {
 		return  val;
 	}
 
-	public GagaMap kcpPayRequest(Payment param, HttpServletRequest request, HttpServletResponse response) throws Exception {
-		GagaMap result = new GagaMap();
-		// PC pay_method
-		/* =  신용카드 : 100000000000, 계좌이체  : 010000000000, 가상계좌 : 001000000000 = */
-		/* =  포인트   : 000100000000, 휴대폰    : 000010000000, 상품권   : 000000001000 = */
-		/* =  ARS      : 000000000010                                                    = */
+	public Payment kcpPayRequest(Payment param, HttpServletRequest request, HttpServletResponse response) throws Exception {
+		Payment result = new Payment();
 
 		// 01. characterEncoding EUC-KR 세팅
 		request.setCharacterEncoding("euc-kr");
 
-		log.info("CHECK INFO PARAM >> {}", param.toString());
 		if (!"POST".equals(request.getMethod())) {
 			throw new IllegalArgumentException("잘못된 경로로 접속하셨습니다.");
 		}
 
 		// 02. 지불 요청 정보 설정
-		param.setReqTx(request.getParameter("req_tx"));
-		param.setTranCd(request.getParameter("tran_cd"));
-		param.setOrdrIdxx(request.getParameter("ordr_idxx"));
+		result.setReqTx(request.getParameter("req_tx"));
+		result.setTranCd(request.getParameter("tran_cd"));
+		result.setUsePayMethod(request.getParameter("use_pay_method"));
+		result.setOrdNo(Integer.parseInt(request.getParameter("ordr_idxx")));
+
 
 		// 03. 인스턴스 생성 및 초기화(변경 불가) (결제에 필요한 인스턴스를 생성하고 초기화 합니다.)
 		J_PP_CLI_N c_PayPlus = new J_PP_CLI_N();
@@ -52,7 +49,7 @@ public class TscKcpService {
 		c_PayPlus.mf_init_set();
 
 		// 04-1. 승인 요청 정보 설정
-		if ("pay".equals(param.getReqTx())){
+		if ("pay".equals(result.getReqTx())){
 			c_PayPlus.mf_set_enc_data(f_get_parm(request.getParameter("enc_data" )), f_get_parm(request.getParameter("enc_info")));
 
 			/* 1원은 실제로 업체에서 결제하셔야 될 원 금액을 넣어주셔야 합니다. 결제금액 유효성 검증 */
@@ -61,17 +58,62 @@ public class TscKcpService {
 		}
 
 		// 05. 실행
-		if (param.getTranCd().length() > 0) {
-			c_PayPlus.mf_do_tx(env.getProperty("pg.kcp.site.cd"), env.getProperty("pg.kcp.site.key"), param.getTranCd(), "", param.getOrdrIdxx(), env.getProperty("pg.kcp.log.level"), "0");
+		if (result.getTranCd().length() > 0) {
+			c_PayPlus.mf_do_tx(env.getProperty("pg.kcp.site.cd"), env.getProperty("pg.kcp.site.key"), result.getTranCd(), "", result.getOrdNo() + "", env.getProperty("pg.kcp.log.level"), "0");
 		} else {
 			c_PayPlus.m_res_cd  = "9562";
 			c_PayPlus.m_res_msg = "연동 오류|tran_cd값이 설정되지 않았습니다.";
 		}
 
-		param.setResCd(c_PayPlus.m_res_cd);		// 결과 코드
-		param.setResMsg(c_PayPlus.m_res_msg);	// 결과 메시지
+		result.setResCd(c_PayPlus.m_res_cd);		// 결과 코드
+		result.setResMsg(c_PayPlus.m_res_msg);		// 결과 메시지
+
+		// 06. 승인 결과 값 추출
+		if ("pay".equals(result.getReqTx())) {
+			if ("0000".equals(result.getResCd())) {
+				result.setPgTid(c_PayPlus.mf_get_res("tno"));							// KCP 거래 고유 번호
+				//result.setPntIssue(c_PayPlus.mf_get_res("pnt_issue"));					// 결제 포인트사 코드
+				result.setPayAmt(Integer.parseInt(c_PayPlus.mf_get_res("amount")));	// KCP 실제 거래 금액
+				result.setPgCpnAmt(c_PayPlus.mf_get_res("coupon_mny").isEmpty() ? 0 : Integer.parseInt(c_PayPlus.mf_get_res("coupon_mny")));    // 쿠폰 할인금액
+
+				if ("100000000000".equals(result.getUsePayMethod())) {
+					// 06-1. 신용카드 승인 결과 처리
+					result.setCardNm(c_PayPlus.mf_get_res("card_name"));			// 카드명. 결제수단이 "30:신용카드"일 때 사용. PG사에서 받은 값
+					result.setPayDt(c_PayPlus.mf_get_res("app_time"));			// 승인 시간
+					result.setPgTradeNo(c_PayPlus.mf_get_res("app_no"));			// PG거래번호(승인번호)
+					result.setCardMips(c_PayPlus.mf_get_res("quota"));			// 할부개월수
+					//noinf = c_PayPlus.mf_get_res("noinf"); // 무이자 여부
+					result.setCardPcableYn(c_PayPlus.mf_get_res("partcanc_yn"));	// 부분취소 가능유무
+					// N : 신용카드, Y : 체크카드, G 기프트카드 (기프트카드는 어떻게 입력해야할지 ?)
+					result.setCardType("0".equals(c_PayPlus.mf_get_res("card_bin_type_02")) ? "N" : "Y");
+				} else if ("010000000000".equals(result.getUsePayMethod())) {
+					// 06-2. 실시간 계좌이체 승인 결과 처리
+					result.setPayDt(c_PayPlus.mf_get_res("app_time"));			// 승인 시간
+					result.setCashAuthNo(c_PayPlus.mf_get_res("cash_authno"));	// 현금영수증 승인번호
+					result.setCashTradeNo(c_PayPlus.mf_get_res("cash_no"));		// 현금영수증 거래번호
+				} else if ("001000000000".equals(result.getUsePayMethod())) {
+					// 06-3. 가상계좌 승인 결과 처리 (현금영수증은 입금완료 noti에서 입력)
+					result.setVaNm(c_PayPlus.mf_get_res("va_name"));				// 입금할 계좌 예금주
+					result.setVaNo(c_PayPlus.mf_get_res("account"));				// 입금할 계좌 번호
+					result.setVaBank(c_PayPlus.mf_get_res("bankcode"));			// 입금 은행 코드(공통코드 G940)
+					result.setVaDeadline(c_PayPlus.mf_get_res("vaDate"));		// 가상계좌 입금마감시간
+				} else if ("000010000000".equals(result.getUsePayMethod())) {
+					// 06-4. 휴대폰 승인 결과 처리
+					result.setPayDt(c_PayPlus.mf_get_res("hp_app_time"));		// 승인시간
+					result.setTelecom(c_PayPlus.mf_get_res("commid"));			// 통신사코드
+				}
+			} else {
+				log.info("KCP RESULT :::: {}, {}", result.getResCd(), result.getResMsg());
+				throw new IllegalArgumentException("결제 실패하였습니다.");
+			}
+		} else {
+			// PAY가 아닐 경우 ?? 다른 메서드로 진행할지 확인 후 Exception 처리할건지 취소가 진행될건지 소스 진행
+			int a = 1;
+		}
 
-		log.info("CHECK RESULT >> " + param.toString());
+		log.info("CHECK RESPONSE DATA        ::::: {} / {}", c_PayPlus.toString(), c_PayPlus.getRecvObj().toString());
+		log.info("CHECK RESPONSE RESULT DATA ::::: {}", result.toString());
+		log.info("CHECK RESPONSE PARAM DATA  ::::: {}", param.toString());
 
 		return result;
 	}

+ 77 - 78
src/main/java/com/style24/core/biz/service/TscLookbookService.java

@@ -26,83 +26,82 @@ import com.gagaframework.web.util.GagaFileUtil;
 @Service
 @Slf4j
 public class TscLookbookService {
-    @Autowired
-    private TscLookbookDao lookbookDao;
-
-    @Autowired
-    private Environment env;
-
-    /**
-     * 팝업관리 저장
-     * @return
-     * @author bin2107
-     * @since 2021. 3. 3
-     */
-    @Transactional("shopTxnManager")
-    public void saveLookbook(Lookbook lookbook) {
-        if(!StringUtils.isEmpty(lookbook.getNewSysTnfileNm())){
-            String bannerUploadPath = env.getProperty("upload.default.target.path");
-            bannerUploadPath = bannerUploadPath + "/display";
-            String yearMonth = GagaDateUtil.getToday().substring(0, 6);
-            bannerUploadPath = GagaFileUtil.getConcatenationPath(bannerUploadPath, "/lookbook/thumbnail");
-            File newFile = new File(GagaFileUtil.getConcatenationPath(bannerUploadPath, lookbook.getNewSysTnfileNm()));
-            bannerUploadPath = GagaFileUtil.getConcatenationPath(bannerUploadPath, yearMonth);
-            String newFilename = "LOOKBOOK_" + GagaDateUtil.getTodayDateTime() + "." + StringUtils.getFilenameExtension(lookbook.getNewSysTnfileNm());
-            File uniqueFile = GagaFileUtil.getUniqueFile(new File(GagaFileUtil.getConcatenationPath(bannerUploadPath, newFilename)));
+	@Autowired
+	private TscLookbookDao lookbookDao;
+
+	@Autowired
+	private Environment env;
+
+	/**
+	 * 팝업관리 저장
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 3. 3
+	 */
+	@Transactional("shopTxnManager")
+	public void saveLookbook(Lookbook lookbook) {
+		if (!StringUtils.isEmpty(lookbook.getNewSysTnfileNm())) {
+			String bannerUploadPath = env.getProperty("upload.default.target.path");
+			bannerUploadPath = bannerUploadPath + "/display";
+			String yearMonth = GagaDateUtil.getToday().substring(0, 6);
+			bannerUploadPath = GagaFileUtil.getConcatenationPath(bannerUploadPath, "/lookbook/thumbnail");
+			File newFile = new File(GagaFileUtil.getConcatenationPath(bannerUploadPath, lookbook.getNewSysTnfileNm()));
+			bannerUploadPath = GagaFileUtil.getConcatenationPath(bannerUploadPath, yearMonth);
+			String newFilename = "LOOKBOOK_" + GagaDateUtil.getTodayDateTime() + "." + StringUtils.getFilenameExtension(lookbook.getNewSysTnfileNm());
+			File uniqueFile = GagaFileUtil.getUniqueFile(new File(GagaFileUtil.getConcatenationPath(bannerUploadPath, newFilename)));
 //          Rename a file
-            File path = new File(bannerUploadPath);
-            if (!path.exists()) {
-                path.mkdir();
-            }
-            newFile.renameTo(uniqueFile);
-
-            lookbook.setOrgTnfileNm("/lookbook/thumbnail/" + yearMonth + "/" + newFilename);
-            lookbook.setSysTnfileNm("/lookbook/thumbnail/" + yearMonth + "/" + newFilename);
-        }
-
-        lookbookDao.saveLookbook(lookbook);
-    }
-
-
-    /**
-     * 룩북 리스트 카운트
-     * @return
-     * @author bin2107
-     * @since 2021. 3. 5
-     */
-    public int getLookbookListCount(Lookbook lookbook) {
-        return lookbookDao.getLookbookListCount(lookbook);
-    }
-
-    /**
-     * 룩북 리스트
-     * @return
-     * @author bin2107
-     * @since 2021. 3. 5
-     */
-    public Collection<Lookbook> getLookbookList(Lookbook lookbook){
-        return lookbookDao.getLookbookList(lookbook);
-    }
-
-    /**
-     * 룩북 삭제
-     * @return
-     * @author bin2107
-     * @since 2021. 3. 5
-     */
-    @Transactional("shopTxnManager")
-    public void deleteLookbook(Lookbook lookbook){
-        for(String lookbookSq : lookbook.getSelectDataArr()){
-            lookbook.setLookbookSq(Integer.parseInt(lookbookSq));
-            lookbookDao.deleteLookbook(lookbook);
-        }
-    }
-    
-    /**
-     * front 영역
-     */
-    
-    /**
+			File path = new File(bannerUploadPath);
+			if (!path.exists()) {
+				path.mkdir();
+			}
+			newFile.renameTo(uniqueFile);
+
+			lookbook.setOrgTnfileNm("/lookbook/thumbnail/" + yearMonth + "/" + newFilename);
+			lookbook.setSysTnfileNm("/lookbook/thumbnail/" + yearMonth + "/" + newFilename);
+		}
+
+		lookbookDao.saveLookbook(lookbook);
+	}
+
+	/**
+	 * 룩북 리스트 카운트
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 3. 5
+	 */
+	public int getLookbookListCount(Lookbook lookbook) {
+		return lookbookDao.getLookbookListCount(lookbook);
+	}
+
+	/**
+	 * 룩북 리스트
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 3. 5
+	 */
+	public Collection<Lookbook> getLookbookList(Lookbook lookbook) {
+		return lookbookDao.getLookbookList(lookbook);
+	}
+
+	/**
+	 * 룩북 삭제
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 3. 5
+	 */
+	@Transactional("shopTxnManager")
+	public void deleteLookbook(Lookbook lookbook) {
+		for (String lookbookSq : lookbook.getSelectDataArr()) {
+			lookbook.setLookbookSq(Integer.parseInt(lookbookSq));
+			lookbookDao.deleteLookbook(lookbook);
+		}
+	}
+
+	/**
+	 * front 영역
+	 */
+
+	/**
 	 * 룩북
 	 *
 	 * @param lookbook
@@ -112,11 +111,11 @@ public class TscLookbookService {
 	 */
 	public Collection<Lookbook> getLookbookListForGoods(Lookbook lookbook) {
 		Collection<Lookbook> lookbookBannerList = lookbookDao.getLookbookBannerList(lookbook);
-		
+
 		for (Lookbook tempLookbook : lookbookBannerList) {
 			tempLookbook.setLookbookGoodsList(lookbookDao.getLookbookBannerGoodsList(tempLookbook));
 		}
-		
+
 		return lookbookBannerList;
 	}
 }

+ 70 - 0
src/main/java/com/style24/core/biz/service/TscNaverPayService.java

@@ -0,0 +1,70 @@
+package com.style24.core.biz.service;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
+
+import com.gagaframework.web.parameter.GagaMap;
+import com.style24.core.biz.thirdparty.KakaoPayApi;
+import com.style24.core.biz.thirdparty.NaverPayApi;
+import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.persistence.domain.KakaoPay;
+import com.style24.persistence.domain.NaverPay;
+import com.style24.persistence.domain.Order;
+import com.style24.persistence.domain.Payment;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 네이버페이 Service
+ * 
+ * @author card007
+ * @since 2020. 03. 03
+ */
+@Service
+@Slf4j
+public class TscNaverPayService {
+
+	@Autowired
+	private Environment env;
+
+	@Autowired
+	private TscMessageByLocale message;
+
+	@Autowired
+	private NaverPayApi naverPayApi;
+
+	/**
+	 * 네이버페이 결제준비 처리
+	 * 
+	 * @param Order
+	 * @return KakaoPay
+	 * @author card007
+	 * @since 2021. 03. 03
+	 */
+	@Transactional("shopTxnManager")
+	public NaverPay naverPaymentReady(Order order) {
+		// API 전송 URL 설정
+		String paymentReadyUrl = "https://dev.apis.naver.com/np_ktptw906068/naverpay/payments/v2/reserve";
+
+		// API 파라메터 설정
+		NaverPay naverPay = new NaverPay();
+		naverPay.setModelVersion("2");
+		naverPay.setMerchantUserKey(order.getCustNo());
+		naverPay.setMerchantPayKey(order.getOrdNo());
+		naverPay.setProductName(order.getGoodsNm());
+		naverPay.setProductCount(order.getOrdQty());
+		naverPay.setTotalPayAmount(order.getRealOrdAmt());
+		naverPay.setTaxScopeAmount(order.getRealOrdAmt());
+		naverPay.setTaxExScopeAmount(0);
+		naverPay.setReturnUrl(order.getReturnUrl());
+
+		// 카카오페이 API 전송
+		return naverPayApi.naverPaymentApi(naverPay, paymentReadyUrl);
+	}
+
+}

+ 0 - 1
src/main/java/com/style24/core/biz/service/TscOrderService.java

@@ -922,7 +922,6 @@ public class TscOrderService {
 	 * @author jsh77b
 	 * @since 2021. 02. 02
 	 */	
-	@SuppressWarnings({ "unchecked", "rawtypes" })
 	public GagaMap getGoodsDcAmt(Collection<Order> tmtbGoodsApplyList) {
 		
 		GagaMap resultMap = new GagaMap();

+ 79 - 0
src/main/java/com/style24/core/biz/thirdparty/KakaoPayApi.java

@@ -0,0 +1,79 @@
+package com.style24.core.biz.thirdparty;
+
+import java.net.URI;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
+
+import com.gagaframework.web.parameter.GagaMap;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.persistence.domain.KakaoPay;
+import com.style24.persistence.domain.Order;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 카카오페이 API
+ *
+ * @author card007
+ * @since 2021. 03. 04
+ */
+@Component
+@Slf4j
+public class KakaoPayApi {
+
+	@Autowired
+	private Environment env;
+
+	@Autowired
+	private TscMessageByLocale message;
+
+	@Autowired
+	private RestTemplate restTemplate;
+
+	/**
+	 * 카카오페이 API
+	 *
+	 * @param Order
+	 * @return GagaMap
+	 * @author card007
+	 * @since 2021. 03. 03
+	 */
+	public KakaoPay kakaoPaymentApi(MultiValueMap<String, String> params, String apiUrl) {
+		KakaoPay pay;
+		try {
+			HttpHeaders headers = new HttpHeaders();
+			headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+			headers.set("Authorization", "KakaoAK " + env.getProperty("kakao.adminKey"));
+
+			HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(params, headers);
+			URI url = URI.create(apiUrl);
+
+			ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, request, String.class);
+			log.info("responseEntity.getStatusCode(): {} ", responseEntity.getStatusCode());
+
+			String jsonResult = responseEntity.getBody();
+			log.info("responseEntity.getBody(): {} ", jsonResult);
+
+			Gson gson = new GsonBuilder().create();
+			pay = gson.fromJson(jsonResult, KakaoPay.class);
+			pay.setStatusCode(responseEntity.getStatusCode().value());
+
+		} catch (Exception e) {
+			throw new IllegalStateException(message.getMessage("FAIL_0004"));
+		}
+
+		return pay;
+	}
+}

+ 82 - 0
src/main/java/com/style24/core/biz/thirdparty/NaverPayApi.java

@@ -0,0 +1,82 @@
+package com.style24.core.biz.thirdparty;
+
+import java.net.URI;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Component;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
+
+import com.gagaframework.web.parameter.GagaMap;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.persistence.domain.KakaoPay;
+import com.style24.persistence.domain.NaverPay;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 네이버페이 API
+ *
+ * @author card007
+ * @since 2021. 03. 07
+ */
+@Component
+@Slf4j
+public class NaverPayApi {
+
+	@Autowired
+	private Environment env;
+
+	@Autowired
+	private TscMessageByLocale message;
+
+	@Autowired
+	private RestTemplate restTemplate;
+
+	/**
+	 * 네이버페이 API
+	 *
+	 * @param Order
+	 * @return GagaMap
+	 * @author card007
+	 * @since 2021. 03. 07
+	 */
+	public NaverPay naverPaymentApi(NaverPay params, String apiUrl) {
+		NaverPay naverPay;
+		try {
+			HttpHeaders headers = new HttpHeaders();
+			headers.setContentType(MediaType.APPLICATION_JSON);
+			headers.set("X-Naver-Client-Id", "8TSWSyJMMUvOLKUySQx6");
+			headers.set("X-Naver-Client-Secret", "oGXnO7cMD1");
+			// headers.set("X-Naver-Client-Id", env.getProperty("naver.clientId"));
+			// headers.set("X-Naver-Client-Secret", env.getProperty("naver.clientSecret"));
+			
+
+			HttpEntity<NaverPay> request = new HttpEntity<>(params, headers);
+			URI url = URI.create(apiUrl);
+
+			ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, request, String.class);
+			log.info("responseEntity.getStatusCode(): {} ", responseEntity.getStatusCode());
+
+			String jsonResult = responseEntity.getBody();
+			log.info("responseEntity.getBody(): {} ", jsonResult);
+
+			Gson gson = new GsonBuilder().create();
+			naverPay = gson.fromJson(jsonResult, NaverPay.class);
+			naverPay.setStatusCode(responseEntity.getStatusCode().value());
+
+		} catch (Exception e) {
+			// throw new IllegalStateException(message.getMessage("FAIL_0004"));
+			throw new IllegalStateException(e.getMessage());
+		}
+
+		return naverPay;
+	}
+}

+ 0 - 60
src/main/java/com/style24/core/biz/web/TscKcpController.java

@@ -1,60 +0,0 @@
-package com.style24.core.biz.web;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.core.env.Environment;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-import com.gagaframework.web.parameter.GagaMap;
-import com.style24.core.biz.service.TscKcpService;
-import com.style24.core.biz.service.TscOrderService;
-import com.style24.persistence.domain.Order;
-
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * KCP PG Controller
- * @author xodud1202
- * @since 2021. 03. 02
- */
-@Controller
-@RequestMapping("/kcp")
-@Slf4j
-public class TscKcpController {
-	@Autowired
-	private TscKcpService kcpService;
-
-	@Autowired
-	private TscOrderService orderService;
-
-	@Autowired
-	private Environment env;
-
-	/**
-	 * KCP ORDER
-	 * @return
-	 * @author xodud1202
-	 * @since 2021. 01. 28
-	 */
-	@ResponseBody
-	@PostMapping("/test")
-	public GagaMap kcpTest(Order param, HttpServletRequest request, HttpServletResponse response) {
-		GagaMap result = new GagaMap();
-		try {
-			request.setCharacterEncoding("euc-kr");
-
-			//result = kcpService.kcpOrderRequest(param, request, response);
-			result.put("message", "SUCCESS");
-		} catch (Exception e) {
-
-		}
-
-		return result;
-	}
-}

+ 21 - 1
src/main/java/com/style24/core/support/env/TscConstants.java

@@ -330,6 +330,26 @@ public class TscConstants {
 		}
 	}
 
+	// PG 구분
+	public enum PgGb {
+		INICIS("INICIS"),	// 이니시스
+		KAKAO("KAKAO"),		// 카카오페이
+		KCP("KCP"),			// KCP
+		NAVER("NAVER"),		// NAVERPAY
+		NICE("NICE"),		// NICEPAY
+		PAYCO("PAYCO");		// PAYCO
+
+		private String value;
+
+		private PgGb(String value) {
+			this.value = value;
+		}
+
+		public String value() {
+			return value;
+		}
+	}
+
 	// 배송비구분
 	public enum DeliveryFeeGb {
 		ORIGIN_DELIVERY_FEE("G018_10"),		// 원주문배송비
@@ -805,7 +825,7 @@ public class TscConstants {
 
 	// 프론트 구분
 	public enum FrontGb {
-		MOBIEL("M"),
+		MOB("M"),
 		PC("P");
 
 		private String value;

+ 132 - 0
src/main/java/com/style24/persistence/domain/KakaoPay.java

@@ -0,0 +1,132 @@
+package com.style24.persistence.domain;
+
+import java.util.Collection;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 카카오페이 도메인
+ * 
+ * @author card007
+ * @since 2021. 03. 05
+ */
+@SuppressWarnings("serial")
+@Data
+public class KakaoPay extends TscBaseDomain {
+
+	private String aid;													// 요청 고유 번호
+	private String tid;													// 결제 고유 번호, 20자
+	private String cid;													// 가맹점 코드, 10자
+	private String cid_secret;											// 가맹점 코드 인증키, 24자, 숫자+영문 소문자 조합
+	private String sid;													// 정기결제용 ID, 정기결제 CID로 단건결제 요청 시 발급
+	private String status;												// 결제 상태
+	private String partner_order_id;									// 가맹점 주문번호, 최대 100자
+	private String partner_user_id;										// 가맹점 회원 id, 최대 100자
+	private String payment_method_type;									// 결제 수단, CARD 또는 MONEY 중 하나
+	private String item_name;											// 상품명, 최대 100자
+	private String item_code;											// 상품코드, 최대 100자
+	private int quantity;												// 상품 수량
+	private Amount amount;												// 결제 금액 정보
+	private CanceledAmount canceled_amount;								// 취소된 금액
+	private CancelAvailableAmount cancel_available_amount;				// 취소 가능 금액
+	private String created_at;											// 결제 준비 요청 시간
+	private String approved_at;											// 결제 승인 시각
+	private SelectedCardInfo selected_card_info;						// 결제 카드 정보
+	private Collection<PaymentActionDetails> payment_action_details;	// 결제/취소 상세
+	private ApprovedCancelAmount approved_cancel_amount;				// 취소요청으로 취소된 금액
+	private String next_redirect_app_url;								// 카카오톡 결제 페이지 Redirect URL (모바일 앱)
+	private String next_redirect_mobile_url;							// 카카오톡 결제 페이지 Redirect URL (모바일 웹)
+	private String next_redirect_pc_url;								// 카카오톡 결제 페이지 Redirect URL (PC 웹)
+	private String android_app_scheme;									// 카카오페이 결제 화면으로 이동하는 Android 앱 스킴(Scheme)
+	private String ios_app_scheme;										// 카카오페이 결제 화면으로 이동하는 iOS 앱 스킴
+	private String payload;												// 결제 승인 요청에 대해 저장한 값, 요청 시 전달된 내용
+	private int total_amount;											// 상품 총액
+	private CardInfo card_info;											// 결제 상세 정보, 결제수단이 카드일 경우만 포함
+	private int statusCode;												// 요청상태코드
+	private String code;												// 결과코드
+	private String msg;													// 결과메세지
+	private Extras extras;												// 실패정보
+
+	@Data
+	public class Amount {
+		private int total;												// 전체 결제 금액
+		private int tax_free;											// 비과세 금액
+		private int vat;												// 부가세 금액
+		private int point;												// 사용한 포인트 금액
+		private int discount;											// 할인 금액
+	}
+
+	@Data
+	public class CanceledAmount {
+		private int total;												// 전체 취소 금액
+		private int tax_free;											// 취소된 비과세 금액
+		private int vat;												// 취소된 부가세 금액
+		private int point;												// 취소된 포인트 금액
+		private int discount;											// 취소된 할인 금액
+	}
+
+	@Data
+	public class CancelAvailableAmount {
+		private int total;												// 전체 취소 가능 금액
+		private int tax_free;											// 취소 가능한 비과세 금액
+		private int vat;												// 취소 가능한 부가세 금액
+		private int point;												// 취소 가능한 포인트 금액
+		private int discount;											// 취소 가능한 할인 금액
+	}
+	
+	@Data
+	public class SelectedCardInfo {
+		private String card_bin;										// 카드 BIN
+		private int install_month;										// 할부 개월 수
+		private String card_corp_name;									// 카드사 정보
+		private String interest_free_install;							// 무이자할부 여부(Y/N)
+	}
+
+	@Data
+	public class PaymentActionDetails {
+		private String aid;												// Request 고유 번호
+		private String payment_action_type;								// 결제 타입 PAYMENT(결제), CANCEL(결제취소), ISSUED_SID(SID 발급) 중 하나
+		private String payment_method_type;								// 결제 수단, CARD 또는 MONEY 중 하나
+		private int amount;												// 결제/취소 총액
+		private int point_amount;										// 결제/취소 포인트 금액
+		private int discount_amount;									// 할인 금액
+		private String approved_at;										// 거래시간
+		private String payLoad;											// Request로 전달한 값
+	}
+	
+	@Data
+	public class CardInfo {
+		private String purchase_corp;									// 매입 카드사 한글명
+		private String purchase_corp_code;								// 매입 카드사 코드
+		private String issuer_corp;										// 카드 발급사 한글명
+		private String issuer_corp_code;								// 카드 발급사 코드
+		private String kakaopay_purchase_corp;							// 카카오페이 매입사명
+		private String kakaopay_purchase_corp_code;						// 카카오페이 매입사 코드
+		private String kakaopay_issuer_corp;							// 카카오페이 발급사명
+		private String kakaopay_issuer_corp_code;						// 카카오페이 발급사 코드
+		private String bin;												// 카드 BIN
+		private String card_type;										// 카드 타입
+		private String install_month;									// 할부 개월 수
+		private String approved_id;										// 카드사 승인번호
+		private String card_mid;										// 카드사 가맹점 번호
+		private String interest_free_install;							// 무이자할부 여부(Y/N)
+		private String card_item_code;									// 카드 상품 코드
+	}
+	
+	@Data
+	public class Extras {
+		private String method_result_code;								// 실패 코드
+		private String method_result_message;							// 실패 메세지
+	}
+	
+	@Data
+	public class ApprovedCancelAmount {
+		private int total;												// 취소요청으로 취소된 전체 금액
+		private int tax_free;											// 취소요청으로 취소된 비과세 금액
+		private int vat;												// 취소요청으로 취소된 부가세 금액
+		private int point;												// 취소요청으로 취소된 포인트 금액
+		private int discount;											// 취소요청으로 취소된 할인 금액
+	}
+}

+ 34 - 31
src/main/java/com/style24/persistence/domain/Lookbook.java

@@ -1,10 +1,11 @@
 package com.style24.persistence.domain;
 
 import java.util.Collection;
+
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.style24.persistence.TscBaseDomain;
-
 import com.style24.persistence.TscPageRequest;
+
 import lombok.Data;
 
 /**
@@ -15,40 +16,42 @@ import lombok.Data;
 @SuppressWarnings("serial")
 @Data
 public class Lookbook extends TscBaseDomain {
-    private Integer lookbookSq;     //룩분일련번호
-    private String  brandCd;        //브랜드
-    private String  fyear;
-    private String  tyear;
-    private String  seasonStr;
-    private String  title;          //타이틀
-    private String  orgTnfileNm;    //원본썸네일명
-    private String  sysTnfileNm;    //시스템썸네일명
-    private String  newSysTnfileNm;
-    private String  dispStdt;       //전시시작일
-    private String  dispStTime;
-    private String  dispEddt;       //전시종료일
-    private String  dispEdTime;
-    private String  dispYn;         //표시여부
-    private Integer dispOrd;        //표시순서
-    private String  mainDispYn;     //메인노출여부
-    
-    private Integer lookbookbSq;	// 룩북배너일련번호
+	private Integer lookbookSq;     //룩분일련번호
+	private String brandCd;        //브랜드
+	private String fyear;
+	private String tyear;
+	private String seasonStr;
+	private String title;          //타이틀
+	private String orgTnfileNm;    //원본썸네일명
+	private String sysTnfileNm;    //시스템썸네일명
+	private String newSysTnfileNm;
+	private String dispStdt;       //전시시작일
+	private String dispStTime;
+	private String dispEddt;       //전시종료일
+	private String dispEdTime;
+	private String dispYn;         //표시여부
+	private Integer dispOrd;        //표시순서
+	private String mainDispYn;     //메인노출여부
+
+	private Integer lookbookbSq;	// 룩북배너일련번호
 	private String orgFileNm;		// 원본파일명
 	private String sysFileNm;		// 시스템파일명
+	private String xlim;			// X좌표
+	private String ylim;			// Y좌표
+
+	Collection<LookbookPicker> lookbookGoodsList;	//베너별 상품목록
 
-	Collection<LookbookGoods> lookbookGoodsList;	//베너별 상품목록
-	
 	private String goodsCd; 		// 상품상세검색용
 	private String frontGb; 		// 상품상세검색용
 	private String custGb; 			// 상품상세검색용
-    
-    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-    private String[] selectDataArr;
-
-    // Pagination
-    private TscPageRequest pageable;
-    private int pageNo = 1;
-    private int pageSize = 50;
-    private int pageUnit = 10;
-   
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] selectDataArr;
+
+	// Pagination
+	private TscPageRequest pageable;
+	private int pageNo = 1;
+	private int pageSize = 50;
+	private int pageUnit = 10;
+
 }

+ 38 - 0
src/main/java/com/style24/persistence/domain/NaverPay.java

@@ -0,0 +1,38 @@
+package com.style24.persistence.domain;
+
+import java.util.Collection;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 네이버페이 도메인
+ * 
+ * @author card007
+ * @since 2021. 03. 07
+ */
+@SuppressWarnings("serial")
+@Data
+public class NaverPay extends TscBaseDomain {
+
+	private String modelVersion;				// 결제 연동 방식
+	private int merchantUserKey;				// 가맹점 주문내역 확인 가능한 가맹점 결제번호 또는 주문번호를 전달해야 합니다
+	private int merchantPayKey;					// 가맹점의 사용자 키(개인 아이디와 같은 개인정보 데이터는 제외하여 전달해야 합니다)
+	private String productName;					// 대표 상품명. 예: 장미의 이름 외 1건(X), 장미의 이름(O)
+	private int productCount;					// 상품 수량 예: A 상품 2개 + B 상품 1개의 경우 productCount 3으로 전달
+	private int totalPayAmount;					// 총 결제 금액. 최소 결제금액은 100원
+	private String returnUrl;					// 결제 완료 후 이동할 URL(returnUrl + 가맹점 파라미터 전달이 가능합니다)
+	private int taxScopeAmount;					// 과세 대상 금액. 과세 대상 금액 + 면세 대상 금액 = 총 결제 금액
+	private int taxExScopeAmount;				// 면세 대상 금액. 과세 대상 금액 + 면세 대상 금액 = 총 결제 금액
+	private int statusCode;						// 요청상태코드
+	private String code;						// 결과코드
+	private String message;						// 결과메세지
+	private Body body;
+	
+	@Data
+	public class Body {
+		private String reserveId;				// 결제예약키
+	}
+
+}

+ 10 - 0
src/main/java/com/style24/persistence/domain/Order.java

@@ -521,6 +521,15 @@ public class Order extends TscBaseDomain {
 	private int exchangeCount;
 	private int returnCount;
 
+	// 카카오페이
+	private String approvalUrl;
+	private String failUrl;
+	private String cancelUrl;
+	private String pgToken;
+
+	// 네이버페이
+	private String returnUrl;
+
 	// 암호화 대상 복호화 처리
 	public String getCustNm() {
 		this.custNm = CryptoUtils.decryptAES(this.custNm);
@@ -547,5 +556,6 @@ public class Order extends TscBaseDomain {
 		return this.recipDtlAddr;
 	}
 	
+	private String dispYn;
 	
 }

+ 59 - 23
src/main/java/com/style24/persistence/domain/Payment.java

@@ -18,31 +18,67 @@ import lombok.Data;
 @SuppressWarnings("serial")
 @Data
 public class Payment extends TscBaseDomain {
+	// TB_PAYMENT
+	private int paySq;				// 결제 일련번호
+	private int ordNo;				// 주문번호
+	private int payAmt;				// 결제금액
+	private int pgCpnAmt;			// PG 쿠폰할인금
+	private int npayPntAmt;			// 네이버페이 포인트 할인금
+	private int ordChgSq;			// 주문변경일련번호
+	private int custNo;				// 고객번호
+	private String payGb;			// 결제구분(O:주문시결제, D:배송시결제, E:에러(강제 결제 태울 때 또는 에러일 때)
+	private String payDt;			// 결제일자
+	private String pgMeans;			// 결제수단
+	private String pgGb;			// PG구분
+	private String pgTid;			// PG TID
+	private String pgTradeNo;		// PG거래번호(승인번호)
+	private String pgShopId;		// PG가맹점ID
+	private String cardType;		// PG 카드 유형 (Y:체크카드, N:신용카드, G:기프트카드) 결제수단이 "30:신용카드"일 때 사용. PG사에서 받은 값
+	private String cardKind;		// 카드종류. 결제수단이 "30:신용카드"일 때 사용. PG사에서 받은 값
+	private String cardBank;		// 카드발급은행. 결제수단이 "30:신용카드"일 때 사용. PG사에서 받은 값
+	private String cardNm;			// 카드명. 결제수단이 "30:신용카드"일 때 사용. PG사에서 받은 값
+	private String cardMips;		// 카드할부개월수. 결제수단이 "30:신용카드"일 때 사용. PG사에서 받은 값
+	private String cardPcableYn;	// 부분취소가능여부
+	private String vaNo;			// 가상계좌번호. 결제수단이 "20:무통장입금일" 때 사용
+	private String vaNm;			// 가상계좌예금주명. 결제수단이 "20:무통장입금일" 때 사용
+	private String vaBank;			// 가상계좌은행(공통코드G940). 결제수단이 "20:무통장입금일" 때 사용
+	private String vaDeadline;		// 무통장입금마감일시. 결제수단이 "20:무통장입금일" 때 사용
+	private String telecom;			// 통신사.결제수단이 휴대폰결제인경우만 사용
+	private String escrowYn;		// 에스크로 여부
+	private String cashAuthNo;		// 현금영수증 승인번호
+	private String cashTradeNo;		// 현금영수증 거래번호
+
 	// KCP
-	private int quotaopt;			// 할부옵션
+	private int ordrIdxx;			// 가맹점 주문번호
 	private int goodMny;			// 결제금액
-	private String reqTx;			// 요청종류 (승인 : pay, 취소, 매입 : mod)
-	private String siteCd;			// 회사코드
-	private String siteName;		// 사이트명
-	private String currency;		// 결제 화폐단위
-	private String moduleType;		// 모듈타입
-	private String payMethod;		// 지불 방법(신용카드 : 100000000000, 계좌이체 : 010000000000, 가상계좌 : 001000000000, 포인트   : 000100000000, 휴대폰   : 000010000000, 상품권   : 000000001000, ARS      : 000000000010)
-	private String ordrIdxx;		// 주문번호
+	private int shopUserId;			// 가맹점 고객 ID (CUST_NO)
+	private int quotaopt;			// 신용카드 최대 할부개월수
+	private Integer vcntExpireTerm;	// 무통장입금 유효기간 설정
+	private String dispTaxYn;		// 현금영수증 노출 여부
+	private String paycoDirect;		// 페이코 직접 호출 변수
+	private String payMthod;		// 페이코 직접 호출 변수
+	private String siteCd;			// 가맹점 상점코드
+	private String siteName;		// 가맹점 명
+	private String moduleType;
+	private String goodExpr;
+	private String buyrName;		// 구매자명
+	private String buyrMail;		// 구매자메일
+	private String buyrTel1;		// 구매자 전화번호
+	private String buyrTel2;		// 구매자 휴대폰번호
+	private String currency;		// 원화/달러 구분
+	private String payMethod;		// 신용카드, 무통장입금, 가상계좌, 휴대폰결제 구분
 	private String goodName;		// 상품명
-	private String buyrName;		// 주문자명
-	private String buyrMail;		// 주문자 E-MAIL
-	private String buyrTel1;		// 주문자 연락처1(전화번호)
-	private String buyrTel2;		// 주문자 연락처2(휴대폰번호)
-	private String goodExpr;		// 2012년 8월 18일 전자상거래법 개정 관련 설정 부분 : 제공 기간 설정 0:일회성 1:기간설정(ex 1:2012010120120131)
-	private String resCd;
-	private String resMsg;
-	private String encInfo;
-	private String encData;
-	private String retPayMethod;
+	private String reqTx;			// 요청종류 (승인 : pay, 취소, 매입 : mod)
+	private String usePayMethod;	// 신용카드, 무통장입금, 가상계좌, 휴대폰결제 요청 결과
 	private String tranCd;
-	private String usePayMethod;
-	private String ordrChk;
-	private String cashYn;
-	private String cashTrCode;
-	private String cashIdInfo;
+	private String resCd;			// 결과코드
+	private String resMsg;			// 결과메세지
+	
+	// KAKAOPAY
+	private String kakaoMethodType;	// 결제 수단, CARD 또는 MONEY 중 하나
+	private int kakaoPoint;			// 사용한 포인트 금액
+	private int kakaoDiscount;		// 할인 금액
+	private String createDt;		// 결제 준비 요청 시각
+	private String approveDt;		// 결제 승인 시각
+	private String status;			// 카카오페이 결제 상태
 }

+ 13 - 7
src/main/java/com/style24/persistence/mybatis/shop/TscLookbook.xml

@@ -126,16 +126,18 @@
 	</select>
 	
 	<!-- 룩북 베너 상품 목록 조회 -->
-	<select id="getLookbookBannerGoodsList" parameterType="Lookbook" resultType="Lookbook">
+	<select id="getLookbookBannerGoodsList" parameterType="Lookbook" resultType="LookbookPicker">
 		/* TsfGoods.getLookbookBannerGoodsList */
 		SELECT Z.*
 		     , 100 - ROUND((CURR_PRICE / LIST_PRICE) * 100 ,0) AS DC_RATE
 		FROM (
 		      SELECT A.LOOKBOOK_SQ
 		           , B.LOOKBOOKB_SQ 
-		           , C.GOODS_CD 
-		           , RANK() OVER(PARTITION BY A.LOOKBOOK_SQ, B.LOOKBOOKB_SQ  ORDER BY C.DISP_ORD ) RNUM 
-		           , C.DISP_ORD 
+		           , P.GOODS_CD 
+		           , RANK() OVER(PARTITION BY A.LOOKBOOK_SQ, B.LOOKBOOKB_SQ  ORDER BY P.DISP_ORD ) RNUM 
+		           , P.DISP_ORD 
+		           , P.XLIM
+		           , P.YLIM
 		           , G.GOODS_NM
 		           , CONCAT(IF(IFNULL(G.GOODS_GB,'') IN ('G073_11','G073_15', ''), '',IFNULL(CONCAT('[',FN_GET_CODE_NM('G073',G.GOODS_GB),']'),'') )
 		                   ,IF(G.FOREIGN_BUY_YN='N','[해외구매대행]','' )
@@ -144,7 +146,7 @@
 		                   ,G.GOODS_NM ) AS GOODS_FULL_NM
 		          , G.GOODS_STAT
 		          , G.MIN_ORD_QTY 
-		          , (CASE WHEN D.DISP_NM_LANG = 'EN' THEN D.BRAND_ENM ELSE D.BRAND_KNM END) AS BRAND_NM
+		          , (CASE WHEN E.DISP_NM_LANG = 'EN' THEN E.BRAND_GROUP_ENM ELSE E.BRAND_GROUP_KNM END) AS BRAND_GROUP_NM
 		          , G.LIST_PRICE
 		          , FN_GET_BENEFIT_PRICE(#{frontGb},G.GOODS_CD, G.CURR_PRICE,#{custGb}) AS CURR_PRICE
 		          , G.MAIN_COLOR_CD
@@ -160,11 +162,15 @@
 		      INNER JOIN TB_LOOKBOOK_BANNER B ON A.LOOKBOOK_SQ = B.LOOKBOOK_SQ 
 		                                      AND B.DISP_YN = 'Y'
 		                                      AND B.LOOKBOOKB_SQ = #{lookbookbSq}
-		      INNER JOIN TB_LOOKBOOK_GOODS C ON B.LOOKBOOKB_SQ  = C.LOOKBOOKB_SQ 
-		      INNER JOIN TB_GOODS G ON C.GOODS_CD = G.GOODS_CD
+		      INNER JOIN TB_LOOKBOOK_PICKER P ON B.LOOKBOOKB_SQ  = P.LOOKBOOKB_SQ
+		                                      AND P.USE_YN = 'Y'
+		      INNER JOIN TB_GOODS G ON P.GOODS_CD = G.GOODS_CD
 		                            AND G.GOODS_STAT = 'G008_90'
+		                            AND G.SELF_MALL_YN = 'Y'
 		      INNER JOIN TB_BRAND D ON G.BRAND_CD = D.BRAND_CD
 		                    AND D.USE_YN = 'Y'
+		      INNER JOIN TB_BRAND_GROUP E ON D.BRAND_GROUP_NO = E.BRAND_GROUP_NO
+		                            AND E.USE_YN = 'Y'
 		      LEFT OUTER JOIN (SELECT GOODS_CD
 		                            , SUM(CASE WHEN SOLDOUT_YN = 'Y' THEN 0
 		                                       ELSE CURR_STOCK_QTY

+ 5 - 1
src/main/java/com/style24/persistence/mybatis/shop/TscOrder.xml

@@ -1656,7 +1656,7 @@
 					 END AS SAVE_PNT_AMT
 			 , CASE WHEN #{frontGb} IN ('P')      AND Z.PRE_PPNT_USABLE_YN IN ('Y') THEN (Z.CURR_PRICE * Z.GOODS_QTY) * (Z.PNT_PRATE/100)
 			        WHEN #{frontGb} IN ('M', 'A') AND Z.PRE_MPNT_USABLE_YN IN ('Y') THEN (Z.CURR_PRICE * Z.GOODS_QTY) * (Z.PNT_MRATE/100)
-					 END AS PRE_PNT_AMT
+					 END AS PRE_PNT_DC_AMT
 		FROM  ( SELECT CA.CART_SQ
 					 , CD.CART_DTL_SQ
 					 , BR.BRAND_ENM
@@ -1798,7 +1798,11 @@
 		     , CDA.RECIP_DTL_ADDR
 		     , CDA.RECIP_PHNNO
 		     , CDA.DELV_MEMO
+		     , CU.CUST_NM
+		     , CU.CELL_PHNNO
 		  FROM TB_CUST_DELIVERY_ADDR CDA
+		 INNER JOIN TB_CUSTOMER CU
+		    ON CDA.CUST_NO = CU.CUST_NO
 		 WHERE 1=1
 		   AND CDA.CUST_NO = #{custNo}
 		   AND CDA.DEL_YN = 'N'