Sfoglia il codice sorgente

Merge branch 'card007' into order

card007 5 anni fa
parent
commit
844ddcd351

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

@@ -159,7 +159,7 @@ public class TscKakaoPayService {
 	 * 카카오페이 결제 취소
 	 *
 	 * @param Order
-	 * @return KakaoPay
+	 * @return Payment
 	 * @author card007
 	 * @since 2021. 03. 05
 	 */

+ 170 - 4
src/main/java/com/style24/core/biz/service/TscNaverPayService.java

@@ -1,5 +1,9 @@
 package com.style24.core.biz.service;
 
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Service;
@@ -42,14 +46,14 @@ public class TscNaverPayService {
 	 * 네이버페이 결제준비 처리
 	 * 
 	 * @param Order
-	 * @return KakaoPay
+	 * @return NaverPay
 	 * @author card007
-	 * @since 2021. 03. 03
+	 * @since 2021. 03. 07
 	 */
 	@Transactional("shopTxnManager")
 	public NaverPay naverPaymentReady(Order order) {
 		// API 전송 URL 설정
-		String paymentReadyUrl = "https://dev.apis.naver.com/np_ktptw906068/naverpay/payments/v2/reserve";
+		String paymentReadyUrl = env.getProperty("naverPay.apiUrl") + env.getProperty("naverPay.partnerId") + env.getProperty("naverPay.paymentReadyUrl");
 
 		// API 파라메터 설정
 		NaverPay naverPay = new NaverPay();
@@ -63,8 +67,170 @@ public class TscNaverPayService {
 		naverPay.setTaxExScopeAmount(0);
 		naverPay.setReturnUrl(order.getReturnUrl());
 
+		// 네이버페이 API 전송
+		return naverPayApi.naverPaymentJsonApi(naverPay, paymentReadyUrl);
+	}
+
+	/**
+	 * 네이버페이 결제승인 처리
+	 *
+	 * @param Order
+	 * @return NaverPay
+	 * @author card007
+	 * @since 2021. 03. 08
+	 */
+	@Transactional("shopTxnManager")
+	public Payment approveNaverPayment(Order order) {
+		// API 전송 URL 설정
+		String paymentReadyUrl = env.getProperty("naverPay.apiUrl") + env.getProperty("naverPay.partnerId") + env.getProperty("naverPay.approvePaymentUrl");
+
+		// API 파라메터 설정
+		MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
+		params.add("paymentId", order.getPaymentId());
+
+		// 네이버페이 API 전송
+		NaverPay naverPay = naverPayApi.naverPaymentApi(params, paymentReadyUrl);
+
+		// 카카오페이 API 전송 결과 처리
+		Payment payment = new Payment();
+		int statusCode = naverPay.getStatusCode();
+
+		// 승인 성공일때 200
+		if (statusCode == 200) {
+			payment.setPgTradeNo(naverPay.getBody().getPayHistId());
+			payment.setPgTid(naverPay.getBody().getDetail().getPaymentId());
+			payment.setPgShopId(naverPay.getBody().getDetail().getMerchantId());
+			payment.setOrdNo(Integer.parseInt(naverPay.getBody().getDetail().getMerchantPayKey()));
+			payment.setCustNo(Integer.parseInt(naverPay.getBody().getDetail().getMerchantUserKey()));
+			payment.setNaverMethodType(naverPay.getBody().getDetail().getPrimaryPayMeans());
+			payment.setPayAmt(naverPay.getBody().getDetail().getTotalPayAmount());
+			payment.setNpayPntAmt(naverPay.getBody().getDetail().getNpointPayAmount());
+
+			// 네이버페이 카드결제 시 카드정보 설정
+			if ("CARD".equals(naverPay.getBody().getDetail().getPrimaryPayMeans())) {
+				payment.setCardNm(getCardNm(naverPay.getBody().getDetail().getCardCorpCode()));
+				payment.setCardMips(String.valueOf(naverPay.getBody().getDetail().getCardInstCount()));
+			}
+		}
+
+		payment.setResCd(naverPay.getCode());
+		payment.setResMsg(naverPay.getMessage());
+		
+		return payment;
+	}
+	
+	private String getCardNm(String cardCode) {
+		String result = "";
+		String[] codeArr = {"C0", "C1", "C2", "C3", "C4", "C5", "C6", "C7", "C8", "C9", "CA", "CB", "CC", "CD", "CF", "CH"};
+		String[] codeNmArr = {"신한", "비씨", "광주", "KB국민", "NH", "롯데", "산업", "삼성", "수협", "씨티", "외환", "우리", "전북", "제주", "하나-외환", "현대"};
+
+		List<String> list = Arrays.asList(codeArr);
+
+		int index = list.indexOf(cardCode);
+
+		if (index >= 0) {
+			result = codeNmArr[list.indexOf(cardCode)];
+		} else {
+			result = cardCode;
+		}
+
+		return result; 
+	}
+
+	/**
+	 * 네이버페이 주문 조회
+	 *
+	 * @param Order
+	 * @return NaverPay
+	 * @author card007
+	 * @since 2021. 03. 08
+	 */
+	@Transactional("shopTxnManager")
+	public NaverPay getNaverPaymentOrder(Order order) {
+		// API 전송 URL 설정
+		String paymentOrderUrl = env.getProperty("naverPay.apiUrl") + env.getProperty("naverPay.partnerId") + env.getProperty("naverPay.paymentOrderUrl");
+
+		// API 파라메터 설정
+		NaverPay naverPay = new NaverPay();
+		naverPay.setPaymentId(order.getPaymentId());
+
+		// 기간별 주문 조회 (31일 이내)
+		// naverPay.setStartTime(order.getStartTime());
+		// naverPay.setEndTime(order.getEndTime());
+		// naverPay.setApprovalType(order.getApprovalType());
+		// naverPay.setPageNumber(order.getPageNo());
+		// naverPay.setRowsPerPage(order.getPageSize());
+
 		// 카카오페이 API 전송
-		return naverPayApi.naverPaymentApi(naverPay, paymentReadyUrl);
+		return naverPayApi.naverPaymentJsonApi(naverPay, paymentOrderUrl);
 	}
 
+	/**
+	 * 네이버페이 결제 취소
+	 *
+	 * @param Order
+	 * @return Payment
+	 * @author card007
+	 * @since 2021. 03. 08
+	 */
+	@Transactional("shopTxnManager")
+	public Payment cancelNaverPayment(Order order) {
+		// API 전송 URL 설정
+		String cancelPaymentUrl = env.getProperty("naverPay.apiUrl") + env.getProperty("naverPay.partnerId") + env.getProperty("naverPay.cancelPaymentUrl");
+
+		// API 파라메터 설정
+		MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
+		params.add("paymentId", order.getPaymentId());
+		params.add("cancelReason", order.getChgReasonNm());
+
+		// 전체 취소의 경우 네이버페이에 취소가능금액으로 취소금액 설정
+		if ("Y".equals(order.getAllCanYn())) {
+			NaverPay orderInfo = getNaverPaymentOrder(order);
+			
+			int cancelAmount = 0;
+			for (int i = 0; i < orderInfo.getBody().getList().size(); i++) {
+				int amt = 0;
+
+				if ("01".equals(orderInfo.getBody().getList().get(i).getAdmissionTypeCode())) {
+					amt = orderInfo.getBody().getList().get(i).getTotalPayAmount();
+				} else if ("04".equals(orderInfo.getBody().getList().get(i).getAdmissionTypeCode())) {
+					amt = orderInfo.getBody().getList().get(i).getTotalPayAmount() * -1;
+				}
+
+				cancelAmount += amt;
+			}
+			params.add("cancelAmount", String.valueOf(cancelAmount));
+		} else {
+			params.add("cancelAmount", String.valueOf(order.getCnclRtnAmt()));
+		}
+		
+		// 취소 요청자 설정
+		String cancelRequester = "2";
+		if (StringUtils.isNotBlank(order.getCancelRequester())) {
+			cancelRequester = order.getCancelRequester();
+		}
+		params.add("cancelRequester", cancelRequester);
+
+		// 카카오페이 API 전송
+		NaverPay naverPay = naverPayApi.naverPaymentApi(params, cancelPaymentUrl);
+
+		// 카카오페이 API 전송 결과 처리
+		Payment payment = new Payment();
+		int statusCode = naverPay.getStatusCode();
+
+		// 승인 성공일때 200
+		if (statusCode == 200) {
+			payment.setPgTradeNo(naverPay.getBody().getPayHistId());
+			payment.setPgTid(naverPay.getBody().getPaymentId());
+			payment.setOrdNo(order.getOrdNo());
+			payment.setCustNo(order.getCustNo());
+			payment.setNaverMethodType(naverPay.getBody().getPrimaryPayMeans());
+			payment.setPayAmt(naverPay.getBody().getPrimaryPayCancelAmount() + naverPay.getBody().getNpointCancelAmount());
+		}
+
+		payment.setResCd(naverPay.getCode());
+		payment.setResMsg(naverPay.getMessage());
+
+		return payment;
+	}
 }

+ 43 - 7
src/main/java/com/style24/core/biz/thirdparty/NaverPayApi.java

@@ -2,6 +2,7 @@ package com.style24.core.biz.thirdparty;
 
 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;
@@ -41,23 +42,20 @@ public class NaverPayApi {
 	private RestTemplate restTemplate;
 
 	/**
-	 * 네이버페이 API
+	 * 네이버페이 JSON API
 	 *
 	 * @param Order
 	 * @return GagaMap
 	 * @author card007
 	 * @since 2021. 03. 07
 	 */
-	public NaverPay naverPaymentApi(NaverPay params, String apiUrl) {
+	public NaverPay naverPaymentJsonApi(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"));
-			
+			headers.set("X-Naver-Client-Id", env.getProperty("naverPay.clientId"));
+			headers.set("X-Naver-Client-Secret", env.getProperty("naverPay.clientSecret"));
 
 			HttpEntity<NaverPay> request = new HttpEntity<>(params, headers);
 			URI url = URI.create(apiUrl);
@@ -79,4 +77,42 @@ public class NaverPayApi {
 
 		return naverPay;
 	}
+
+	/**
+	 * 네이버페이 API
+	 *
+	 * @param Order
+	 * @return GagaMap
+	 * @author card007
+	 * @since 2021. 03. 08
+	 */
+	public NaverPay naverPaymentApi(MultiValueMap<String, String> params, String apiUrl) {
+		// 취소가 완료되기까지 시간이 걸리므로, Timeout 시간을 최소 60초로 설정해야 합니다
+		NaverPay naverPay;
+		try {
+			HttpHeaders headers = new HttpHeaders();
+			headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+			headers.set("X-Naver-Client-Id", env.getProperty("naverPay.clientId"));
+			headers.set("X-Naver-Client-Secret", env.getProperty("naverPay.clientSecret"));
+
+			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();
+			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;
+	}
 }

+ 86 - 1
src/main/java/com/style24/persistence/domain/NaverPay.java

@@ -1,6 +1,7 @@
 package com.style24.persistence.domain;
 
 import java.util.Collection;
+import java.util.List;
 
 import com.style24.persistence.TscBaseDomain;
 
@@ -28,11 +29,95 @@ public class NaverPay extends TscBaseDomain {
 	private int statusCode;						// 요청상태코드
 	private String code;						// 결과코드
 	private String message;						// 결과메세지
+	private String paymentId;					// 결제번호
+	private String startTime;					// 주문조회 시작일시
+	private String endTime;						// 주문조회 종료일시
+	private String approvalType;				// 주문조회 타입 (ALL:전체, APPROVAL:승인, CANCEL:취소, CANCEL_FAIL:취소실패)
+	private int pageNumber;						// 조회하고자 하는 페이지번호 (값이 없으면 1로 간주)
+	private int rowsPerPage;					// 페이지 당 row 건수 (1~100까지 지정 가능하며, 값이 없으면 20으로 간주)
 	private Body body;
-	
+
 	@Data
 	public class Body {
 		private String reserveId;				// 결제예약키
+		private String paymentId;				// 결제번호
+		private Detail detail;					// 네이버페이 결제결과 상세정보
+		private String payHistId;				// 취소 결제 번호
+		private String primaryPayMeans;			// 취소 처리된 주 결제 수단(CARD: 신용카드, BANK: 계좌 이체)
+		private int primaryPayCancelAmount;		// 주 결제 수단 취소 금액
+		private int primaryPayRestAmount;		// 추가로 취소 가능한 주 결제 수단 잔여 결제 금액
+		private int npointCancelAmount;			// 네이버페이 포인트 취소 금액
+		private int npointRestAmount;			// 추가로 취소 가능한 네이버페이 포인트 잔여 결제 금액
+		private String cancelYmdt;				// 취소 일시(YYYYMMDDHH24MMSS)
+		private int totalRestAmount;			// 추가로 취소 가능한 전체 잔여 결제 금액(primaryPayRestAmount + npointRestAmount)
+		private List<PaymentInfo> list;			// 결제 내역 배열
+		private int totalCount;					// 조회조건에 대한 전체건수
+		private int responseCount;				// 현재 페이지에 대한 응답건수
+		private int totalPageCount;				// 전체 페이지 개수
+		private int currentPageNumber;			// 응답 된 현재 페이지 번호
+
+		@Data
+		public class Detail {
+			private String paymentId;				// 네이버페이 결제번호
+			private String payHistId;				// 네이버페이 결제 이력 번호
+			private String merchantId;				// 가맹점 아이디 (가맹점센터 로그인 아이디)
+			private String merchantName;			// 가맹점명
+			private String merchantPayKey;			// 가맹점의 결제번호
+			private String merchantUserKey;			// 가맹점의 사용자 키
+			private String admissionTypeCode;		// 결제승인 유형 (01:원결제 승인건, 03:전체취소 건, 04:부분취소 건)
+			private String admissionYmdt;			// 결제/취소 일시(YYYYMMDDHH24MMSS)
+			private String tradeConfirmYmdt;		// 거래완료 일시(정산기준날짜, YYYYMMDDHH24MMSS)
+			private String admissionState;			// 결제/취소 시도에 대한 최종결과 (SUCCESS:완료, FAIL:실패)
+			private int totalPayAmount;				// 총 결제/취소 금액
+			private int primaryPayAmount;			// 주 결제 수단 결제/취소 금액
+			private int npointPayAmount;			// 네이버페이 포인트 결제/취소 금액
+			private String primaryPayMeans;			// 주 결제 수단 (CARD:신용카드, BANK:계좌이체)
+			private String cardCorpCode;			// 주 결제 수단 카드사
+			private String cardNo;					// 일부 마스킹 된 신용카드 번호
+			private String cardAuthNo;				// 카드승인번호
+			private int cardInstCount;				// 할부 개월 수 (일시불은 0)
+			private String bankCorpCode;			// 주 결제 수단 은행
+			private String bankAccountNo;			// 일부 마스킹 된 계좌 번호
+			private String productName;				// 상품명
+			private Boolean settleExpected;			// 정산 예정 금액과 결제 수수료 금액이 계산되었는지 여부
+			private int settleExpectAmount;			// 정산 예정 금액
+			private int payCommissionAmount;		// 결제 수수료 금액
+		}
+
+		@Data
+		public class PaymentInfo {
+			private String paymentId;				// 네이버페이 결제번호
+			private String payHistId;				// 네이버페이 결제 이력 번호
+			private String merchantId;				// 가맹점 아이디 (가맹점센터 로그인 아이디)
+			private String merchantName;			// 가맹점명
+			private String merchantPayKey;			// 가맹점의 결제번호
+			private String merchantUserKey;			// 가맹점의 사용자 키
+			private String admissionTypeCode;		// 결제승인 유형 (01:원결제 승인건, 03:전체취소 건, 04:부분취소 건)
+			private String admissionYmdt;			// 결제/취소 일시(YYYYMMDDHH24MMSS)
+			private String tradeConfirmYmdt;		// 거래완료 일시(정산기준날짜, YYYYMMDDHH24MMSS)
+			private String admissionState;			// 결제/취소 시도에 대한 최종결과 (SUCCESS:완료, FAIL:실패)
+			private int totalPayAmount;				// 총 결제/취소 금액
+			private int primaryPayAmount;			// 주 결제 수단 결제/취소 금액
+			private int npointPayAmount;			// 네이버페이 포인트 결제/취소 금액
+			private String primaryPayMeans;			// 주 결제 수단 (CARD:신용카드, BANK:계좌이체)
+			private String cardCorpCode;			// 주 결제 수단 카드사
+			private String cardNo;					// 일부 마스킹 된 신용카드 번호
+			private String cardAuthNo;				// 카드승인번호
+			private int cardInstCount;				// 할부 개월 수 (일시불은 0)
+			private String bankCorpCode;			// 주 결제 수단 은행
+			private String bankAccountNo;			// 일부 마스킹 된 계좌 번호
+			private String productName;				// 상품명
+			private SettleInfo settleInfo;			// 정산 데이터 그룹
+
+			@Data
+			public class SettleInfo {
+				private Boolean settleCreated;			// 정산 데이터 생성 여부
+				private int primarySettleAmount;		// 주결제수단 정산 입금금액
+				private int primaryCommissionAmount;	// 주결제수단 정산 수수료 금액
+				private int npointSettleAmount;			// 네이버페이 포인트 정산 입금금액
+				private int npointCommissionAmount;		// 네이버페이 정산 수수료 금액
+			}
+		}
 	}
 
 }

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

@@ -534,6 +534,11 @@ public class Order extends TscBaseDomain {
 
 	// 네이버페이
 	private String returnUrl;
+	private String paymentId;
+	private String startTime;
+	private String endTime;
+	private String approvalType;
+	private String cancelRequester;
 
 	// 암호화 대상 복호화 처리
 	public String getCustNm() {

+ 4 - 1
src/main/java/com/style24/persistence/domain/Payment.java

@@ -75,11 +75,14 @@ public class Payment extends TscBaseDomain {
 	private String resCd;			// 결과코드
 	private String resMsg;			// 결과메세지
 	
-	// KAKAOPAY
+	// KakaoPay
 	private String kakaoMethodType;	// 결제 수단, CARD 또는 MONEY 중 하나
 	private int kakaoPoint;			// 사용한 포인트 금액
 	private int kakaoDiscount;		// 할인 금액
 	private String createDt;		// 결제 준비 요청 시각
 	private String approveDt;		// 결제 승인 시각
 	private String status;			// 카카오페이 결제 상태
+	
+	// NaverPay
+	private String naverMethodType;	// 주 결제 수단 (CARD:신용카드, BANK:계좌이체)
 }