Ver código fonte

모바일 카카오페이, 네이버페이 임시 커밋

card007 5 anos atrás
pai
commit
10fdff30a9

+ 97 - 5
src/main/java/com/style24/front/biz/service/TsfOrderService.java

@@ -1,17 +1,22 @@
 package com.style24.front.biz.service;
 
-import java.io.*;
-import java.net.MalformedURLException;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
 import java.net.URL;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
 
 import javax.net.ssl.HttpsURLConnection;
 import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import com.style24.front.biz.dao.TsfGoodsDao;
-import com.style24.persistence.domain.*;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
@@ -29,9 +34,20 @@ import com.style24.core.biz.service.TscNaverPayService;
 import com.style24.core.biz.service.TscOrderService;
 import com.style24.core.support.env.TscConstants;
 import com.style24.front.biz.dao.TsfCartDao;
+import com.style24.front.biz.dao.TsfGoodsDao;
 import com.style24.front.biz.dao.TsfOrderDao;
 import com.style24.front.biz.dao.TsfRendererDao;
 import com.style24.front.support.security.session.TsfSession;
+import com.style24.persistence.domain.Cart;
+import com.style24.persistence.domain.Coupon;
+import com.style24.persistence.domain.Delivery;
+import com.style24.persistence.domain.GiftCard;
+import com.style24.persistence.domain.Goods;
+import com.style24.persistence.domain.GoodsStock;
+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 com.usafe.guarantee.InsuranceInfo;
 import com.usafe.guarantee.InsuranceManager;
 
@@ -422,6 +438,82 @@ public class TsfOrderService {
 		return result;
 	}
 
+	/**
+	 * 카카오페이 모바일 결제승인
+	 * 
+	 * @param Payment
+	 * @return Payment
+	 * @author card007
+	 * @since 2021. 05. 20
+	 */
+	@Transactional("shopTxnManager")
+	public Payment kakaoPayResult(Payment payment) {
+		Payment result;
+
+		try {
+			result = coreKakaoPayService.approveKakaoPayment(payment);
+
+			// 결제 수단이 없는 경우(KAKAO, NAVER) CARD로 세팅
+			if(StringUtils.isEmpty(result.getPayMeans())) {
+				result.setPayMeans(TscConstants.PayMeans.CREDIT_CARD.value());
+			}
+
+			result.setPgGb(TscConstants.PgGb.KAKAO.value());
+			result.setPayGb("O");
+
+			// TB_PAYMENT 등록. 실패시 PG 환불.
+			if(coreOrderDao.insertPayment(result) < 1) {
+				payment.setLeftAmt(0);
+				coreKakaoPayService.kakaoPayRollBack(payment);
+
+				throw new IllegalArgumentException("결제 정보 저장 실패. 새로고침 후 다시 시작해주세요.");
+			}
+		} catch(Exception e) {
+			e.printStackTrace();
+			throw new IllegalArgumentException(e.getMessage());
+		}
+
+		return result;
+	}
+
+	/**
+	 * 네이버페이 모바일 결제승인
+	 *
+	 * @param Payment
+	 * @return Payment
+	 * @author card007
+	 * @since 2021. 05. 20
+	 */
+	@Transactional("shopTxnManager")
+	public Payment naverPayResult(Payment payment) {
+		Payment result;
+
+		try {
+			result = coreNaverPayService.approveNaverPayment(payment);
+
+			// 결제 수단이 없는 경우(KAKAO, NAVER) CARD로 세팅
+			if(StringUtils.isEmpty(result.getPayMeans())) {
+				result.setPayMeans(TscConstants.PayMeans.CREDIT_CARD.value());
+			}
+
+			result.setPgGb(TscConstants.PgGb.NAVER.value());
+			result.setPayGb("O");
+
+			// TB_PAYMENT 등록. 실패시 PG 환불.
+			if(coreOrderDao.insertPayment(result) < 1) {
+				payment.setLeftAmt(0);
+				coreNaverPayService.naverPayRollBack(payment);
+
+				throw new IllegalArgumentException("결제 정보 저장 실패. 새로고침 후 다시 시작해주세요.");
+			}
+		} catch(Exception e) {
+			e.printStackTrace();
+			throw new IllegalArgumentException(e.getMessage());
+		}
+
+		return result;
+	}
+
 	@Transactional("shopTxnManager")
 	public int updatePaymentForOrderFinished(Payment param) {
 		return orderDao.updatePaymentForOrderFinished(param);

+ 151 - 3
src/main/java/com/style24/front/biz/web/TsfOrderController.java

@@ -6,6 +6,7 @@ import java.util.Collection;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Controller;
@@ -18,6 +19,8 @@ import org.springframework.web.servlet.ModelAndView;
 
 import com.gagaframework.web.parameter.GagaMap;
 import com.style24.core.biz.service.TscFreegiftService;
+import com.style24.core.biz.service.TscKakaoPayService;
+import com.style24.core.biz.service.TscNaverPayService;
 import com.style24.core.biz.service.TscOrderService;
 import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.message.TscMessageByLocale;
@@ -63,6 +66,12 @@ public class TsfOrderController extends TsfBaseController {
 	
 	@Autowired
 	private NiceCertify niceCertify;
+
+	@Autowired
+	private TscKakaoPayService coreKakaoPayService;
+
+	@Autowired
+	private TscNaverPayService coreNaverPayService;
 	
 	/**
 	 * 회원, 비회원 주문페이지
@@ -738,11 +747,17 @@ public class TsfOrderController extends TsfBaseController {
 		
 		// 3. 주문기본정보등록(주문접수)
 		coreOrderService.createPreOrder(order);
-		
+
 		// 4. 2021.05.10 장바구니정보 주문번호 업데이트
 		orderService.insertCartHstOrdNo(order);
 
 		Payment payment = orderService.setPgDataInfo(order);
+
+		// 2021.05.20 카카오페이, 네이버페이 결제 필요 정보 세션 등록
+		if(TscConstants.PgGb.KAKAO.value().equals(payment.getPgGb()) || TscConstants.PgGb.NAVER.value().equals(payment.getPgGb())) {
+			TsfSession.setAttribute("ordNo", String.valueOf(order.getOrdNo()));
+			TsfSession.setAttribute("tid", payment.getPgTid());
+		}
 		
 		// 2021.05.10 추가
 		payment.setPayUrl("/create/preOrder");
@@ -817,6 +832,137 @@ public class TsfOrderController extends TsfBaseController {
 		return mav;
 	}
 
+	/**
+	 * 카카오페이 모바일 결제 PG 요청 완료
+	 *
+	 * @param Payment
+	 * @return ModelAndView
+	 * @author card007
+	 * @since 2021. 05. 20
+	 */
+	@ResponseBody
+	@RequestMapping(value = "/kakao/pay/result/response")
+	public ModelAndView kakaoPayResultResponse(Payment payment) {
+		ModelAndView mav = new ModelAndView();
+
+		Integer custNo = TsfSession.isLogin() ? TsfSession.getInfo().getCustNo() : 0;
+		String ordNo = TsfSession.getAttribute("ordNo");
+		String tid = TsfSession.getAttribute("tid");
+
+		if (StringUtils.isBlank(ordNo) || StringUtils.isBlank(tid)) {
+			throw new IllegalArgumentException("결제가 실패하였습니다.");
+		}
+
+		payment.setPgTid(tid);
+		payment.setPartnerOrderId(ordNo);
+		payment.setPartnerUserId(String.valueOf(custNo));
+		payment.setPgGb(TscConstants.PgGb.KAKAO.value());
+		payment.setRegNo(custNo);
+		payment.setUpdNo(custNo);
+
+		// 2. 결재정보등록(TB_PAYMENT)
+		
+		Payment result = orderService.kakaoPayResult(payment);
+		// Payment result = coreKakaoPayService.approveKakaoPayment(payment);
+
+		// 3. 주문정보 업데이트
+		Order order = new Order();
+		order.setOrdNo(Integer.parseInt(ordNo));
+		order.setCustNo(custNo);
+		order.setSellGb("10");
+		order.setPgGb(TscConstants.PgGb.KAKAO.value());
+		order.setPayMeans(result.getPayMeans());
+
+		coreOrderService.updateOrderInfo(order);
+
+		// 4. 2021.05.10 장바구니정보 삭제
+		boolean cartDelTemp = true;
+		if (TsfSession.isLogin()) {
+			if ("jsh77b".equals(TsfSession.getInfo().getCustId()) || "xodud1202".equals(TsfSession.getInfo().getCustId()) || "card007".equals(TsfSession.getInfo().getCustId())) {
+				cartDelTemp = false;
+			}
+		}
+
+		if (cartDelTemp) {
+			orderService.deleteCartOrdNo(order);
+		}
+
+		// TODO 5. 2021.05.10 보증보험 API 연동
+		orderService.updateInsurance(order);
+
+		// 2021.03.16 주문완료화면이동처리
+		mav.setViewName("redirect:/order/complete?ordNo=" + order.getOrdNo());
+		
+		// 2021.05.20 카카오페이, 네이버페이 결제 필요 정보 세션 삭제 
+		TsfSession.removeAtrribute("ordNo");
+		TsfSession.removeAtrribute("tid");
+
+		return mav;
+	}
+
+	/**
+	 * 네이버페이 모바일 결제 PG 요청 완료
+	 *
+	 * @param Payment
+	 * @return ModelAndView
+	 * @author card007
+	 * @since 2021. 05. 20
+	 */
+	@ResponseBody
+	@RequestMapping(value = "/naver/pay/result/response")
+	public ModelAndView naverPayResultResponse(Payment param) {
+		ModelAndView mav = new ModelAndView();
+
+		Integer custNo = TsfSession.isLogin() ? TsfSession.getInfo().getCustNo() : 0;
+		String ordNo = TsfSession.getAttribute("ordNo");
+
+		if (StringUtils.isBlank(ordNo)) {
+			throw new IllegalArgumentException("결제가 실패하였습니다.");
+		}
+
+		param.setPgTid(param.getPaymentId());
+		param.setRegNo(custNo);
+		param.setUpdNo(custNo);
+
+		// 2. 결재정보등록(TB_PAYMENT)
+		Payment result = orderService.naverPayResult(param);
+		// Payment result = coreNaverPayService.approveNaverPayment(param);
+
+		// 3. 주문정보 업데이트
+		Order order = new Order();
+		order.setOrdNo(Integer.parseInt(ordNo));
+		order.setCustNo(custNo);
+		order.setSellGb("10");
+		order.setPgGb(TscConstants.PgGb.NAVER.value());
+		order.setPayMeans(result.getPayMeans());
+
+		coreOrderService.updateOrderInfo(order);
+
+		// 4. 2021.05.10 장바구니정보 삭제
+		boolean cartDelTemp = true;
+		if (TsfSession.isLogin()) {
+			if ("jsh77b".equals(TsfSession.getInfo().getCustId()) || "xodud1202".equals(TsfSession.getInfo().getCustId()) || "card007".equals(TsfSession.getInfo().getCustId())) {
+				cartDelTemp = false;
+			}
+		}
+
+		if (cartDelTemp) {
+			orderService.deleteCartOrdNo(order);
+		}
+
+		// TODO 5. 2021.05.10 보증보험 API 연동
+		orderService.updateInsurance(order);
+
+		// 2021.03.16 주문완료화면이동처리
+		mav.setViewName("redirect:/order/complete?ordNo=" + order.getOrdNo());
+
+		// 2021.05.20 카카오페이, 네이버페이 결제 필요 정보 세션 삭제 
+		TsfSession.removeAtrribute("ordNo");
+		TsfSession.removeAtrribute("tid");
+
+		return mav;
+	}
+
 	/**
 	 * 주문완료페이지
 	 *
@@ -1115,7 +1261,8 @@ public class TsfOrderController extends TsfBaseController {
 	public ModelAndView kakaoPaymentRequest(@RequestParam(value = "pg_token", required = false) String pgToken) {
 		ModelAndView mav = new ModelAndView();
 		mav.addObject("pgToken", pgToken);
-		mav.setViewName(super.getDeviceViewName("/pg/KakaoPaymentRequest"));
+		mav.addObject("ordNo", TsfSession.getAttribute("ordNo"));
+		mav.setViewName(super.getDeviceViewName("pg/KakaoPaymentRequest"));
 		return mav;
 	}
 
@@ -1132,7 +1279,8 @@ public class TsfOrderController extends TsfBaseController {
 	public ModelAndView naverPaymentRequest(@RequestParam(value = "paymentId", required = false) String paymentId) {
 		ModelAndView mav = new ModelAndView();
 		mav.addObject("paymentId", paymentId);
-		mav.setViewName(super.getDeviceViewName("/pg/NaverPaymentRequest"));
+		mav.addObject("ordNo", TsfSession.getAttribute("ordNo"));
+		mav.setViewName(super.getDeviceViewName("pg/NaverPaymentRequest"));
 		return mav;
 	}
 

+ 11 - 7
src/main/webapp/WEB-INF/views/mob/order/OrderFormMob.html

@@ -354,6 +354,13 @@
 <div id="couponSelectPop02" class="popup_box couponSelectPop couponSelectPop02"></div>
 <!-- //배송비 쿠폰선택_팝업 -->
 
+<!-- 카카오페이 iframe -->
+<iframe name="kakaoPayiFrame" id="kakaoPayiFrame" style="display:block; width:100vw; height:100vh;"></iframe>
+<!-- //카카오페이 iframe -->
+<!-- 네이버페이 iframe -->
+<iframe name="naverPayiFrame" id="naverPayiFrame" style="display:block; width:100vw; height:100vh;"></iframe>
+<!-- //네이버페이 iframe -->
+
 <script th:inline="javascript">
 // 배송관련정보 변수선언
 var cartGoodsList		= [[${cartGoodsList}]]			// 배송목록
@@ -2567,11 +2574,9 @@ $(document).ready( function() {
 
 // PG 카카오페이 결제준비 처리
 var fnKakaoPaymentReady = function() {
-	//let nextRedirectUrl = $('#order_info input[name=nextRedirectPcUrl]').val();
 	let nextRedirectUrl = $('#order_info input[name=nextRedirectMobileUrl]').val();
-	//let option = 'width=420, height=520';
-	
-	window.open(nextRedirectUrl, 'kakaoPaymentPopup', option);
+
+	window.location.href = nextRedirectUrl;
 }
 
 // PG 카카오페이 결제 승인 요청
@@ -2590,9 +2595,8 @@ var fnNaverPaymentReady = function() {
 	let naverPayUrl = 'https://' + [[${@environment.getProperty('naverPay.payUrl.mob')}]];
 	let reserveId = $('#order_info input[name=reserveId]').val();
 	let url = naverPayUrl + '/payments/' + reserveId;
-	//let option = 'width=750, height=' + $(window).height();
-	
-	window.open(url, 'naverPaymentPopup', option);
+
+	window.location.href = url;
 }
 
 // PG 네이버페이 결제 승인 요청

+ 5 - 8
src/main/webapp/WEB-INF/views/mob/pg/KakaoPaymentRequestMob.html

@@ -14,18 +14,15 @@
  *******************************************************************************
  -->
 <head th:replace="~{mob/common/fragments/HeadMob :: head}"></head>
-<th:block th:replace="~{mob/common/fragments/VariablesMob :: variables}"></th:block>
+<!--<th:block th:replace="~{mob/common/fragments/VariablesMob :: variables}"></th:block>-->
 <th:block th:replace="~{mob/common/fragments/ScriptsMob :: scripts}"></th:block>
 <body>
-
+<form name="kakaoPayRequestForm" th:action="@{'/order/kakao/pay/result/response'}">
+	<input type="hidden" name="pgToken" th:value="${pgToken}"/>
+</form>
 <script th:inline="javascript">
-	let pgToken = [[${pgToken}]];
-
 	$(document).ready(function() {
-		let result = opener.fnKakaoPaymentRequest(pgToken);
-		if (result) {
-			self.close();
-		}
+		document.kakaoPayRequestForm.submit();
 	});
 </script>
 </body>

+ 5 - 8
src/main/webapp/WEB-INF/views/mob/pg/NaverPaymentRequestMob.html

@@ -14,18 +14,15 @@
  *******************************************************************************
  -->
 <head th:replace="~{mob/common/fragments/HeadMob :: head}"></head>
-<th:block th:replace="~{mob/common/fragments/VariablesMob :: variables}"></th:block>
+<!--<th:block th:replace="~{mob/common/fragments/VariablesMob :: variables}"></th:block>-->
 <th:block th:replace="~{mob/common/fragments/ScriptsMob :: scripts}"></th:block>
 <body>
-
+<form name="naverPayRequestForm" th:action="@{'/order/naver/pay/result/response'}">
+	<input type="hidden" name="paymentId" th:value="${paymentId}"/>
+</form>
 <script th:inline="javascript">
-	let paymentId = [[${paymentId}]];
-
 	$(document).ready(function() {
-		let result = opener.fnNaverPaymentRequest(paymentId);
-		if (result) {
-			self.close();
-		}
+		document.naverPayRequestForm.submit();
 	});
 </script>
 </body>