|
|
@@ -1,27 +1,18 @@
|
|
|
package com.style24.core.biz.service;
|
|
|
|
|
|
-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;
|
|
|
-import org.springframework.http.HttpHeaders;
|
|
|
-import org.springframework.http.MediaType;
|
|
|
-import org.springframework.http.ResponseEntity;
|
|
|
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.gagaframework.web.util.GagaFileUtil;
|
|
|
-import com.google.gson.Gson;
|
|
|
-import com.google.gson.GsonBuilder;
|
|
|
-import com.style24.core.biz.dao.TscPointDao;
|
|
|
+import com.style24.core.biz.thirdparty.KakaoPayApi;
|
|
|
+import com.style24.core.support.message.TscMessageByLocale;
|
|
|
+import com.style24.persistence.domain.KakaoPay;
|
|
|
import com.style24.persistence.domain.Order;
|
|
|
-import com.style24.persistence.domain.Point;
|
|
|
+import com.style24.persistence.domain.Payment;
|
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
|
@@ -39,58 +30,188 @@ public class TscKakaoPayService {
|
|
|
private Environment env;
|
|
|
|
|
|
@Autowired
|
|
|
- private RestTemplate restTemplate;
|
|
|
+ private TscMessageByLocale message;
|
|
|
|
|
|
- public static final String PROTOCOL = "http:";
|
|
|
+ @Autowired
|
|
|
+ private RestTemplate restTemplate;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private KakaoPayApi kakaoPayApi;
|
|
|
|
|
|
/**
|
|
|
* 카카오페이 결제준비 처리
|
|
|
*
|
|
|
* @param Order
|
|
|
- * @return GagaMap
|
|
|
+ * @return KakaoPay
|
|
|
* @author card007
|
|
|
* @since 2021. 03. 03
|
|
|
*/
|
|
|
@Transactional("shopTxnManager")
|
|
|
- public GagaMap kakaoPaymentReady(Order order) {
|
|
|
- GagaMap map = new GagaMap();
|
|
|
+ public KakaoPay kakaoPaymentReady(Order order) {
|
|
|
+ // API 전송 URL 설정
|
|
|
String paymentReadyUrl = env.getProperty("kakao.paymentReadyUrl");
|
|
|
- try {
|
|
|
- MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
|
|
|
- params.add("cid", env.getProperty("kakao.cid"));
|
|
|
- params.add("partner_order_id", order.getOrdNo()+"");
|
|
|
- params.add("partner_user_id", order.getCustNo()+"");
|
|
|
- params.add("item_name", order.getGoodsNm());
|
|
|
- params.add("quantity", order.getOrdQty()+"");
|
|
|
- params.add("total_amount", order.getRealOrdAmt()+"");
|
|
|
- params.add("tax_free_amount", "0");
|
|
|
- params.add("approval_url", PROTOCOL + env.getProperty("domain.front"));
|
|
|
- params.add("fail_url", PROTOCOL + env.getProperty("domain.front"));
|
|
|
- params.add("cancel_url", PROTOCOL + env.getProperty("domain.front"));
|
|
|
-
|
|
|
- // Header
|
|
|
- HttpHeaders headers = new HttpHeaders();
|
|
|
- headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
|
|
|
- headers.set("Authorization", "KakaoAK " + env.getProperty("kakao.adminKey"));
|
|
|
-
|
|
|
- HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(params, headers);
|
|
|
- URI url = URI.create(paymentReadyUrl);
|
|
|
-
|
|
|
- // POST방식으로 호출
|
|
|
- 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();
|
|
|
- map = gson.fromJson(jsonResult, GagaMap.class); //access_token, refresh_token
|
|
|
-
|
|
|
- } catch (Exception e) {
|
|
|
- log.error(e.getMessage());
|
|
|
+
|
|
|
+ // API 파라메터 설정
|
|
|
+ MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
|
|
|
+ params.add("cid", env.getProperty("kakao.cid"));
|
|
|
+ params.add("partner_order_id", order.getOrdNo()+"");
|
|
|
+ params.add("partner_user_id", order.getCustNo()+"");
|
|
|
+ params.add("item_name", order.getGoodsNm());
|
|
|
+ params.add("quantity", order.getOrdQty()+"");
|
|
|
+ params.add("total_amount", order.getRealOrdAmt()+"");
|
|
|
+ params.add("tax_free_amount", "0");
|
|
|
+ params.add("approval_url", order.getApprovalUrl());
|
|
|
+ params.add("fail_url", order.getFailUrl());
|
|
|
+ params.add("cancel_url", order.getCancelUrl());
|
|
|
+
|
|
|
+ // 카카오페이 API 전송
|
|
|
+ return kakaoPayApi.kakaoPaymentApi(params, paymentReadyUrl);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 카카오페이 승인 처리
|
|
|
+ *
|
|
|
+ * @param Order
|
|
|
+ * @return Payment
|
|
|
+ * @author card007
|
|
|
+ * @since 2021. 03. 04
|
|
|
+ */
|
|
|
+ @Transactional("shopTxnManager")
|
|
|
+ public Payment approveKakaoPayment(Order order) {
|
|
|
+ // API 전송 URL 설정
|
|
|
+ String approvePaymentUrl = env.getProperty("kakao.approvePaymentUrl");
|
|
|
+
|
|
|
+ // API 파라메터 설정
|
|
|
+ MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
|
|
|
+ params.add("cid", env.getProperty("kakao.cid"));
|
|
|
+ params.add("tid", order.getPgTid());
|
|
|
+ params.add("partner_order_id", order.getOrdNo()+"");
|
|
|
+ params.add("partner_user_id", order.getCustNo()+"");
|
|
|
+ params.add("pg_token", order.getPgToken());
|
|
|
+
|
|
|
+ // 카카오페이 API 전송
|
|
|
+ KakaoPay kakaoPay = kakaoPayApi.kakaoPaymentApi(params, approvePaymentUrl);
|
|
|
+
|
|
|
+ // 카카오페이 API 전송 결과 처리
|
|
|
+ Payment payment = new Payment();
|
|
|
+ int statusCode = kakaoPay.getStatusCode();
|
|
|
+
|
|
|
+ // 승인 성공일때 200
|
|
|
+ if (statusCode == 200) {
|
|
|
+ payment.setPgTradeNo(kakaoPay.getAid());
|
|
|
+ payment.setPgTid(kakaoPay.getTid());
|
|
|
+ payment.setPgShopId(kakaoPay.getCid());
|
|
|
+ payment.setOrdNo(Integer.parseInt(kakaoPay.getPartner_order_id()));
|
|
|
+ payment.setCustNo(Integer.parseInt(kakaoPay.getPartner_user_id()));
|
|
|
+ payment.setKakaoMethodType(kakaoPay.getPayment_method_type());
|
|
|
+ payment.setPayAmt(kakaoPay.getAmount().getTotal());
|
|
|
+ payment.setKakaoPoint(kakaoPay.getAmount().getPoint());
|
|
|
+ payment.setKakaoDiscount(kakaoPay.getAmount().getDiscount());
|
|
|
+
|
|
|
+ // 카카오페이 카드결제 시 카드정보 설정
|
|
|
+ if ("CARD".equals(kakaoPay.getPayment_method_type())) {
|
|
|
+ payment.setCardKind(kakaoPay.getCard_info().getPurchase_corp());
|
|
|
+ payment.setCardNm(kakaoPay.getCard_info().getIssuer_corp());
|
|
|
+ payment.setCardType("신용".equals(kakaoPay.getCard_info().getCard_type()) ? "N" : "Y");
|
|
|
+ payment.setCardMips(kakaoPay.getCard_info().getInstall_month());
|
|
|
+ }
|
|
|
+
|
|
|
+ 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 map;
|
|
|
+
|
|
|
+ return payment;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 카카오페이 주문 조회
|
|
|
+ *
|
|
|
+ * @param Order
|
|
|
+ * @return KakaoPay
|
|
|
+ * @author card007
|
|
|
+ * @since 2021. 03. 04
|
|
|
+ */
|
|
|
+ @Transactional("shopTxnManager")
|
|
|
+ public KakaoPay getKakaoPaymentOrder(Order order) {
|
|
|
+ // API 전송 URL 설정
|
|
|
+ String paymentOrderUrl = env.getProperty("kakao.paymentOrderUrl");
|
|
|
+
|
|
|
+ // API 파라메터 설정
|
|
|
+ MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
|
|
|
+ params.add("cid", env.getProperty("kakao.cid"));
|
|
|
+ params.add("tid", order.getPgTid());
|
|
|
+
|
|
|
+ // 카카오페이 API 전송
|
|
|
+ KakaoPay pay = kakaoPayApi.kakaoPaymentApi(params, paymentOrderUrl);
|
|
|
+
|
|
|
+ return pay;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 카카오페이 결제 취소
|
|
|
+ *
|
|
|
+ * @param Order
|
|
|
+ * @return KakaoPay
|
|
|
+ * @author card007
|
|
|
+ * @since 2021. 03. 05
|
|
|
+ */
|
|
|
+ @Transactional("shopTxnManager")
|
|
|
+ public Payment cancelKakaoPayment(Order order) {
|
|
|
+ // API 전송 URL 설정
|
|
|
+ String cancelPaymentUrl = env.getProperty("kakao.cancelPaymentUrl");
|
|
|
+
|
|
|
+ // API 파라메터 설정
|
|
|
+ MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
|
|
|
+ params.add("cid", env.getProperty("kakao.cid"));
|
|
|
+ params.add("tid", order.getPgTid());
|
|
|
+ params.add("cancel_tax_free_amount", "0");
|
|
|
+
|
|
|
+ // 전체 취소의 경우 카카오페이에 취소가능금액으로 취소금액 설정
|
|
|
+ if ("Y".equals(order.getAllCanYn())) {
|
|
|
+ KakaoPay orderInfo = getKakaoPaymentOrder(order);
|
|
|
+ params.add("cancel_amount", String.valueOf(orderInfo.getCancel_available_amount().getTotal()));
|
|
|
+ } else {
|
|
|
+ params.add("cancel_amount", String.valueOf(order.getCnclRtnAmt()));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 카카오페이 API 전송
|
|
|
+ KakaoPay kakaoPay = kakaoPayApi.kakaoPaymentApi(params, cancelPaymentUrl);
|
|
|
+
|
|
|
+ // 카카오페이 API 전송 결과 처리
|
|
|
+ Payment payment = new Payment();
|
|
|
+ int statusCode = kakaoPay.getStatusCode();
|
|
|
+
|
|
|
+ // 승인 성공일때 200
|
|
|
+ if (statusCode == 200) {
|
|
|
+ payment.setPgTradeNo(kakaoPay.getAid());
|
|
|
+ payment.setPgTid(kakaoPay.getTid());
|
|
|
+ payment.setPgShopId(kakaoPay.getCid());
|
|
|
+ payment.setStatus(kakaoPay.getStatus());
|
|
|
+ payment.setOrdNo(Integer.parseInt(kakaoPay.getPartner_order_id()));
|
|
|
+ payment.setCustNo(Integer.parseInt(kakaoPay.getPartner_user_id()));
|
|
|
+ payment.setKakaoMethodType(kakaoPay.getPayment_method_type());
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+
|
|
|
}
|