Просмотр исходного кода

이태영 - 20210511 네이버페이 주문 개발 중

xodud lee 5 лет назад
Родитель
Сommit
47145f9467

+ 2 - 2
src/main/java/com/style24/front/biz/service/TsfCartService.java

@@ -321,7 +321,7 @@ public class TsfCartService {
 
 
 			if (cartSqList != null && cartSqList.size() > 0) {		// 장바구니 기존재
 			if (cartSqList != null && cartSqList.size() > 0) {		// 장바구니 기존재
 				if (cartSqList.size() > 1) {						// 장바구니 조회 결과 이상시 insert or select 수정 필요
 				if (cartSqList.size() > 1) {						// 장바구니 조회 결과 이상시 insert or select 수정 필요
-					throw new IllegalArgumentException("장바구니 조회에 실패하였습니다. 관리자에게 문의해주세요.");
+					throw new IllegalStateException("장바구니 조회에 실패하였습니다. 관리자에게 문의해주세요.");
 				} else {
 				} else {
 					cart.setCartSq(cartSqList.iterator().next().getCartSq());
 					cart.setCartSq(cartSqList.iterator().next().getCartSq());
 					cartSqs.add(cart.getCartSq());
 					cartSqs.add(cart.getCartSq());
@@ -405,7 +405,7 @@ public class TsfCartService {
 
 
 			if (cartSqList != null && cartSqList.size() > 0) {			// 장바구니 기존재
 			if (cartSqList != null && cartSqList.size() > 0) {			// 장바구니 기존재
 				if (cartSqList.size() > 1) {							// 장바구니 조회 결과 이상시 insert or select 수정 필요
 				if (cartSqList.size() > 1) {							// 장바구니 조회 결과 이상시 insert or select 수정 필요
-					throw new IllegalArgumentException("장바구니 조회에 실패하였습니다. 관리자에게 문의해주세요.");
+					throw new IllegalStateException("장바구니 조회에 실패하였습니다. 관리자에게 문의해주세요.");
 				} else {
 				} else {
 					item.setCartSq(cartSqList.iterator().next());
 					item.setCartSq(cartSqList.iterator().next());
 					cartSqs.add(item.getCartSq());
 					cartSqs.add(item.getCartSq());

+ 219 - 9
src/main/java/com/style24/front/biz/service/TsfOrderService.java

@@ -1,9 +1,14 @@
 package com.style24.front.biz.service;
 package com.style24.front.biz.service;
 
 
+import java.io.*;
+import java.net.MalformedURLException;
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collection;
 import java.util.List;
 import java.util.List;
 
 
+import javax.net.ssl.HttpsURLConnection;
+import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponse;
 
 
@@ -924,23 +929,158 @@ public class TsfOrderService {
 		return "SUCCESS";
 		return "SUCCESS";
 	}
 	}
 	
 	
-	public GagaMap nPayReq50(Order param) {
+	public GagaMap nPayReq50(Order param, HttpServletRequest request, HttpServletResponse response) {
 		GagaMap result = new GagaMap();
 		GagaMap result = new GagaMap();
 
 
+		// 로그인 정보 조회
+		if(TsfSession.isLogin()) {
+			param.setCustNo(TsfSession.getInfo().getCustNo());
+		} else {
+			param.setCustNo(0);
+			param.setJsessionId(TsfSession.getSessionId());
+		}
+
 		try {
 		try {
-			param.setFrontGb(TsfSession.getFrontGb());
 			param.setSiteCd(TscConstants.Site.STYLE24.value());
 			param.setSiteCd(TscConstants.Site.STYLE24.value());
-			if(TsfSession.isLogin()) {
-				param.setCustNo(TsfSession.getInfo().getCustNo());
-			} else {
-				param.setCustNo(0);
-				param.setJsessionId(TsfSession.getSessionId());
-			}
+			param.setFrontGb(TsfSession.getFrontGb());	// 디바이스 정보
+			param.setPrePntDcAmtYn("N");				// 네이버페이 : 선포인트 사용하지 않음으로 강제 지정
+			param.setShotDelvYn("N");					// 네이버페이 : 총알배송 여부 설정 N
+			param.setInsuranceYn("N");					// 네이버페이 : 보증보험 신청 여부 N
 
 
-			// 장바구니 정보 조회
+			// 장바구니 등록된 주문 정보 조회
 			Collection<Order> cartList = coreOrderService.getCartGoodsList(param);
 			Collection<Order> cartList = coreOrderService.getCartGoodsList(param);
 
 
+			// 배송비 정보 조회
+			GagaMap delvMap = coreOrderService.getCartDelvGoodsCntList(cartList, param);
+			param.setDelvFeeCdList((Collection<Order>) delvMap.get("delvFeeCdList"));
+
+			// 주문 상세 정보 세팅
+			for(Order item : cartList) {
+				item.setSavePntAmt(0);
+				item.setOrdAmt((item.getCurrPrice() + item.getOptAddPrice()) * item.getGoodsQty());			// ordAmt = (즉시할인가 + 옵션가) * 수량
+				item.setRealOrdAmt(item.getOrdAmt());														// 네이버페이는 할인 없으므로 ordAmt와 동일
+				item.setShotDelvYn("N");
+				item.setGiftPackYn("N");
+				item.setRegNo(param.getCustNo());
+			}
+			param.setOrderDetailList(cartList);
+
+			// 주문 정보 등록
+			coreOrderService.createPreOrder(param);
+
+			// 네이버페이 기본정보
+			String shopId			= env.getProperty("naverPay.shop.id");				// shopId
+			String certificationKey	= env.getProperty("naverPay.certification.key");	// 네이버페이 인증키
+			String cpaInflowCode	= getCookieValue(request, "CPAValidator");
+			String naverInflowCode	= getCookieValue(request, "NA_CO");
+			String saClickId		= getCookieValue(request, "NVADID");
+			String domain 			= env.getProperty("domain.front");					// 도메인 주소
+			String staticUrl		= "/resources";
+			String goodsImgUrl		= env.getProperty("upload.goods.view");				// 상품 이미지 경로
+			int totPrice			= 0;												// 전체 주문 금액
+
+			log.info("CHECK PARAM ::::: {} / {}", param.getBackUrl(), param.getGoodsUrl());
+
+			// 네이버페이 송부용 xml 작성
+			StringBuffer sb = new StringBuffer();
+			sb.append("<order>");
+			sb.append("<merchantId>").append(shopId).append("</merchantId>");								//<!-- 상점ID -->
+			sb.append("<certiKey>").append("<![CDATA[" + certificationKey + "]]>").append("</certiKey>");	//<!-- 인증키 -->
+			sb.append("<backUrl>").append("<![CDATA[" + param.getBackUrl() + "]]>").append("</backUrl>");	//<!-- 이전페이지 -->
+			sb.append("<interface>");
+			sb.append("<merchantCustomCode1>").append(param.getOrdNo()).append("</merchantCustomCode1>");
+			sb.append("<cpaInflowCode>").append(cpaInflowCode).append("</cpaInflowCode>");
+			sb.append("<naverInflowCode>").append(naverInflowCode).append("</naverInflowCode>");
+			sb.append("<saClickId>").append(saClickId).append("</saClickId>");
+			sb.append("</interface>");
+
+			for(Order item : param.getOrderDetailList()) {
+				//<!-- 상품정보 -->
+				sb.append("<product>");
+				sb.append("<id>").append(item.getGoodsCd()).append("</id>");							//<!-- 상품코드 -->
+				sb.append("<ecMallProductId>").append(item.getGoodsCd()).append("</ecMallProductId>");	//<!-- 상품코드 -->
+				sb.append("<name>").append("<![CDATA[" + item.getGoodsNm() + "]]>").append("</name>");	//<!-- 상품명 -->
+				sb.append("<basePrice>").append(item.getCurrPrice() + item.getOptAddPrice()).append("</basePrice>");						//<!-- 상품금액 -->
+				sb.append("<infoUrl>").append("<![CDATA[http:" + param.getGoodsUrl() + item.getGoodsCd() + "]]>").append("</infoUrl>");		//<!-- 상품상세페이지 URL -->
+				sb.append("<imageUrl>").append("<![CDATA[http:" + goodsImgUrl + "/" + item.getSysImgNm() + "]]>").append("</imageUrl>");	//<!-- 상품원본이미지 URL -->
+
+				// 옵션 정보
+				sb.append("<option>");
+				sb.append("<quantity>").append(item.getGoodsQty()).append("</quantity>");							//<!-- 옵션수량-->
+				sb.append("<price>").append(item.getOptAddPrice()).append("</price>");								//<!-- 옵션금액 -->
+				sb.append("<manageCode>").append("<![CDATA[" + item.getOptCd() + "]]>").append("</manageCode>");	//<!-- 옵션관리코드 -->
+
+				// 칼라코드
+				sb.append("<selectedItem>");
+				sb.append("<type>SELECT</type>");//<!-- 옵션유형 -->
+				sb.append("<name>칼라</name>");//<!-- 옵션명 -->
+				sb.append("<value>");
+				sb.append("<id>").append("<![CDATA[" + item.getOptCd1() + "]]>").append("</id>");//<!-- 칼라코드 -->
+				sb.append("<text>").append("<![CDATA[" + item.getColorNm() + "]]>").append("</text>");//<!-- 칼라명 -->
+				sb.append("</value>");
+				sb.append("</selectedItem>");
+
+				// 사이즈코드
+				sb.append("<selectedItem>");
+				sb.append("<type>SELECT</type>");//<!-- 옵션유형 -->
+				sb.append("<name>사이즈</name>");//<!-- 옵션명 -->
+				sb.append("<value>");
+				sb.append("<id>").append("<![CDATA[" + item.getOptCd2() + "]]>").append("</id>");//<!-- 사이즈코드 -->
+				sb.append("<text>").append("<![CDATA[" + item.getOptCd2() + "]]>").append("</text>");//<!-- 사이즈명 -->
+				sb.append("</value>");
+				sb.append("</selectedItem>");
+				sb.append("</option>");
+
+				// 배송비 판단 후 배송비유형 선택 (추가 기본배송비, 무료배송비 기준 조회후 등록)
+				//<!-- 배송정보 -->
+				String delvFeeCrite = "CHARGE";
+				int delvFee = item.getDelvFee();
+				String feePayType = "PREPAYED";
+				// 배송비 조건
+				if(TscConstants.DelvFeeCrite.NORMAL.value().equals(item.getDelvFeeCrite())) {
+					delvFeeCrite = "CONDITIONAL_FREE";		// 조건부 무료(배송비 조건이 무료이거나 배송 방법이 착불일때만 배송비는 0원으로 변경)
+				} else if(TscConstants.DelvFeeCrite.FREE.value().equals(item.getDelvFeeCrite())) {
+					delvFeeCrite = "FREE";
+					feePayType = "FREE";
+					delvFee = 0;
+				}
+
+				sb.append("<shippingPolicy>");
+				sb.append("<groupId>").append(item.getDelvFeeCd()).append("</groupId>");		//<!-- 배송비묶음그룹ID -->
+				sb.append("<method>DELIVERY</method>");											//<!-- 배송방법 : 택배,소포,등기 -->
+				sb.append("<feeType>").append("CONDITIONAL_FREE").append("</feeType>");			//<!-- 배송비유형 : 유료 -->
+				sb.append("<feePayType>").append("PREPAYED").append("</feePayType>");			//<!-- 배송비결제방법 : 선불 -->
+				sb.append("<feePrice>").append(item.getDelvFee()).append("</feePrice>");		//<!-- 기본배송비 -->
+
+				// 조건부 무료일경우에만 송부
+				if(TscConstants.DelvFeeCrite.NORMAL.value().equals(item.getDelvFeeCrite())) {
+					sb.append("<conditionalFree>");
+					sb.append("<basePrice>").append(item.getMinOrdAmt()).append("</basePrice>");	//<!-- 무료배송비기준 -->
+					sb.append("</conditionalFree>");
+				}
+
+				sb.append("</shippingPolicy>");
+				sb.append("</product>");
+
+				totPrice = totPrice + ((item.getCurrPrice() + item.getOptAddPrice()) * item.getGoodsQty());
+			}
 
 
+			sb.append("</order>");
+
+			log.info("CHECK NAVER PAY SB ::::: \n{}", sb.toString());
+
+			result = sendOrderInfoToNC(sb);
+
+			// 네이버 페이 주문번호 저장
+			param.setNpayOrdNo(Integer.parseInt(result.get("orderKey").toString()));
+
+			log.info("CHECK NAVER PAY ORD NO ::::: {}", param.getNpayOrdNo());
+
+			// 3.주문정보 저장
+			coreOrderDao.updateNaverPayOrderNo(param);
+			result.put("npayOrderUrl", env.getProperty("naverPay.order.url"));
+			result.put("orderkey", result.get("orderKey").toString());
+			result.put("resultNo", result.get("resultNo").toString());
 
 
 			result.put("state", "sucess");
 			result.put("state", "sucess");
 		} catch(Exception e) {
 		} catch(Exception e) {
@@ -952,6 +1092,76 @@ public class TsfOrderService {
 
 
 		return result;
 		return result;
 	}
 	}
+
+	private GagaMap sendOrderInfoToNC(StringBuffer sb) throws IOException {
+		GagaMap resultMap = new GagaMap();
+
+		// 1.0, 2.0  일때 구분값 처리
+		URL _url = new URL(env.getProperty("naverPay.order.api.url"));
+		String ENCODING = "UTF-8";
+
+		HttpsURLConnection conn = (HttpsURLConnection)_url.openConnection();
+
+		log.info("CHECK URL ::::: {}", env.getProperty("naverPay.order.api.url"));
+
+		conn.setDoInput(true);
+		conn.setDoOutput(true);
+		conn.setUseCaches(false);
+		conn.setRequestMethod("POST");
+		conn.addRequestProperty("Content-Type", "application/xml; charset=UTF-8");
+
+		// 주문 등록 API 호출
+		Writer writer = new OutputStreamWriter(conn.getOutputStream(), ENCODING);
+		writer.write(sb.toString());
+
+		writer.flush();
+		writer.close();
+
+		int respCode = conn.getResponseCode();
+		log.info("CHECK RESP CODE ::::: {}", respCode);
+
+		if (respCode != 200) {
+			throw new RuntimeException(String.format("NC Response fail : %d %s", respCode, conn.getResponseMessage()));
+		}
+
+		BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
+
+		String[] arr = reader.readLine().toString().split(":");
+
+		log.info("CHECK RESULT ARR ::::: {} / {} / {}", arr[0], arr[1], arr[2]);
+		if ("SUCCESS".equals(arr[0])) {
+			resultMap.put("state", 		arr[0]);
+			resultMap.put("orderKey", 	arr[1]);
+			resultMap.put("resultNo", 	arr[2]);
+		} else {
+			throw new IllegalStateException(String.format("NC Response fail : %d %s", reader.readLine().toString()));
+		}
+
+		conn.disconnect();
+
+		return resultMap;
+	}
+
+	/*
+	 * 쿠키값 가져오기
+	 */
+	private String getCookieValue(HttpServletRequest request, String name) {
+		if (name == null || request == null) {
+			return "";
+		}
+
+		Cookie[] cookies = request.getCookies();
+
+		if (cookies != null) {
+			for (int i = 0; i < cookies.length; i++) {
+				if (name.equals(cookies[i].getName())) {
+					return cookies[i].getValue();
+				}
+			}
+		}
+
+		return "";
+	}
 	
 	
 	/**
 	/**
 	 * 장바구니정보 주문번호 이력 등록
 	 * 장바구니정보 주문번호 이력 등록

+ 2 - 13
src/main/java/com/style24/front/biz/web/TsfPgController.java

@@ -181,18 +181,7 @@ public class TsfPgController extends TsfBaseController {
 	 */
 	 */
 	@ResponseBody
 	@ResponseBody
 	@PostMapping("/nPayReq")
 	@PostMapping("/nPayReq")
-	public GagaMap nPayReq(@RequestBody Order param) {
-		GagaMap map = new GagaMap();
-		//for(Order param : params) {
-		//	log.info("CHECK NPAY INPUT >>>> {} / {} / {}", param.getGoodsCd(), param.getOptCd(), param.getGoodsQty());
-		//}
-
-		for(int cartSq : param.getCartSqArr()) {
-			log.info("CHECK NPAY INPUT >>>> {}", param.getCartSqArr());
-		}
-
-		map = orderService.nPayReq50(param);
-
-		return map;
+	public GagaMap nPayReq(@RequestBody Order param, HttpServletRequest request, HttpServletResponse response) {
+		return orderService.nPayReq50(param, request, response);
 	}
 	}
 }
 }

+ 1 - 0
src/main/resources/config/application-locd.yml

@@ -88,6 +88,7 @@ naverPay:
     common.certification.key : s_3799db3bf4af-
     common.certification.key : s_3799db3bf4af-
     certification.key: 2BC5E173-2840-4B48-BC7D-FF770005DD76
     certification.key: 2BC5E173-2840-4B48-BC7D-FF770005DD76
     order.api.url: https://test-api.pay.naver.com/o/customer/api/order/v20/register
     order.api.url: https://test-api.pay.naver.com/o/customer/api/order/v20/register
+    order.url: https://test-order.pay.naver.com/customer/buy
 
 
 # ERP (한세드림)
 # ERP (한세드림)
 erp:
 erp:

+ 9 - 6
src/main/webapp/WEB-INF/views/web/goods/GoodsDetailFormWeb.html

@@ -453,30 +453,33 @@
 										}
 										}
 
 
 										function buy_nc_req(cartSqArr) {
 										function buy_nc_req(cartSqArr) {
-											alert(cartSqArr.length);
-											// buyList[0].backUrl = location.href;
+											let data = {  cartSqArr : cartSqArr
+														, backUrl : location.href
+														, goodsUrl : _PAGE_GOODS_DETAIL
+											};
+											let jsonData = JSON.stringify(data);
 
 
 											$.ajax( {
 											$.ajax( {
 												type		: "POST",
 												type		: "POST",
 												url 		: "/pg/nPayReq",
 												url 		: "/pg/nPayReq",
 												dataType 	: 'json',
 												dataType 	: 'json',
-												data		: {cartSqArr : JSON.stringify(cartSqArr)},
+												data		: jsonData,
 												beforeSend : function(xhr, settings) {
 												beforeSend : function(xhr, settings) {
 													xhr.setRequestHeader("AJAX"			, "true");
 													xhr.setRequestHeader("AJAX"			, "true");
 													xhr.setRequestHeader('Accept'		, 'application/json');
 													xhr.setRequestHeader('Accept'		, 'application/json');
 													xhr.setRequestHeader('Content-Type'	, 'application/json');
 													xhr.setRequestHeader('Content-Type'	, 'application/json');
 												},
 												},
 												error: function(xhr, status, error) {
 												error: function(xhr, status, error) {
-													alert(status + '; ' + error);
+													mcxDialog.alert(status + '; ' + error);
 												},
 												},
 												success : function(result) {
 												success : function(result) {
 													if (result.state == "sucess") {
 													if (result.state == "sucess") {
 														window.open('about:blank', 'popupView');
 														window.open('about:blank', 'popupView');
 														document.nPayForm.target = 'popupView';
 														document.nPayForm.target = 'popupView';
-														document.nPayForm.action = "$!{NPAY_ORDER_URL}" + result.orderKey + "/" + result.resultNo;
+														document.nPayForm.action = result.npayOrderUrl + "/" + result.orderKey + "/" + result.resultNo;
 														document.nPayForm.submit();
 														document.nPayForm.submit();
 													} else {
 													} else {
-														alert(result.message);
+														mcxDialog.alert(result.message);
 													}
 													}
 												}
 												}
 											});
 											});