card007 5 лет назад
Родитель
Сommit
6ef1002256

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

@@ -198,10 +198,17 @@ public class TscKakaoPayService {
 			payment.setOrdNo(Integer.parseInt(kakaoPay.getPartner_order_id()));
 			payment.setCustNo(Integer.parseInt(kakaoPay.getPartner_user_id()));
 			payment.setKakaoMethodType(kakaoPay.getPayment_method_type());
-			payment.setPayAmt(Integer.parseInt(params.getFirst("cancel_amount")));
-			
+			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;

+ 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);
+	}
+
+}

+ 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;
+	}
+}

+ 14 - 4
src/main/java/com/style24/persistence/domain/KakaoPay.java

@@ -35,7 +35,7 @@ public class KakaoPay extends TscBaseDomain {
 	private String approved_at;											// 결제 승인 시각
 	private SelectedCardInfo selected_card_info;						// 결제 카드 정보
 	private Collection<PaymentActionDetails> payment_action_details;	// 결제/취소 상세
-	private int statusCode;
+	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 웹)
@@ -44,9 +44,10 @@ public class KakaoPay extends TscBaseDomain {
 	private String payload;												// 결제 승인 요청에 대해 저장한 값, 요청 시 전달된 내용
 	private int total_amount;											// 상품 총액
 	private CardInfo card_info;											// 결제 상세 정보, 결제수단이 카드일 경우만 포함
-	private String code;
-	private String msg;
-	private Extras extras;
+	private int statusCode;												// 요청상태코드
+	private String code;												// 결과코드
+	private String msg;													// 결과메세지
+	private Extras extras;												// 실패정보
 
 	@Data
 	public class Amount {
@@ -119,4 +120,13 @@ public class KakaoPay extends TscBaseDomain {
 		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;											// 취소요청으로 취소된 할인 금액
+	}
 }

+ 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;				// 결제예약키
+	}
+
+}

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

@@ -520,13 +520,16 @@ public class Order extends TscBaseDomain {
 	private int cancelCount;
 	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);