|
|
@@ -1,9 +1,14 @@
|
|
|
package com.style24.front.biz.service;
|
|
|
|
|
|
+import java.io.*;
|
|
|
+import java.net.MalformedURLException;
|
|
|
+import java.net.URL;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.Collection;
|
|
|
import java.util.List;
|
|
|
|
|
|
+import javax.net.ssl.HttpsURLConnection;
|
|
|
+import javax.servlet.http.Cookie;
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
|
|
|
@@ -991,23 +996,158 @@ public class TsfOrderService {
|
|
|
return "SUCCESS";
|
|
|
}
|
|
|
|
|
|
- public GagaMap nPayReq50(Order param) {
|
|
|
+ public GagaMap nPayReq50(Order param, HttpServletRequest request, HttpServletResponse response) {
|
|
|
GagaMap result = new GagaMap();
|
|
|
|
|
|
+ // 로그인 정보 조회
|
|
|
+ if(TsfSession.isLogin()) {
|
|
|
+ param.setCustNo(TsfSession.getInfo().getCustNo());
|
|
|
+ } else {
|
|
|
+ param.setCustNo(0);
|
|
|
+ param.setJsessionId(TsfSession.getSessionId());
|
|
|
+ }
|
|
|
+
|
|
|
try {
|
|
|
- param.setFrontGb(TsfSession.getFrontGb());
|
|
|
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);
|
|
|
|
|
|
+ // 배송비 정보 조회
|
|
|
+ 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");
|
|
|
} catch(Exception e) {
|
|
|
@@ -1019,6 +1159,76 @@ public class TsfOrderService {
|
|
|
|
|
|
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 "";
|
|
|
+ }
|
|
|
|
|
|
/**
|
|
|
* 장바구니정보 주문번호 이력 등록
|