From a883df7fe6a15640f30cd614ea8f668ba07df426 Mon Sep 17 00:00:00 2001 From: kimtaeyoung <62414583+kimtaeyoung201910794@users.noreply.github.com> Date: Wed, 11 Sep 2024 22:08:01 +0900 Subject: [PATCH 01/10] =?UTF-8?q?productorder,=20payment=20=EC=97=94?= =?UTF-8?q?=ED=8B=B0=ED=8B=B0=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 8196 -> 8196 bytes .../java/friend/spring/domain/Payment.java | 78 ++++++++++-------- .../friend/spring/domain/ProductOrder.java | 33 ++++++++ .../spring/domain/enums/PaymentState.java | 10 +-- .../friend/spring/domain/enums/Product.java | 6 ++ 5 files changed, 87 insertions(+), 40 deletions(-) create mode 100644 src/main/java/friend/spring/domain/ProductOrder.java create mode 100644 src/main/java/friend/spring/domain/enums/Product.java diff --git a/.DS_Store b/.DS_Store index b4a0214db6bf936834d81e25c4d8aa05cc6306a5..20352e97a6d8979eaaefa259066fcbfcb3626e0f 100644 GIT binary patch delta 256 zcmZp1XmQxUDi|jq^o45`dzNI0HJCt*v=u1A3bZGaA%!88AraZ8Me900Uv-;&Na!!K z7)$u%L&EV)$`2+hi!8LUoC?&%%uviw#E^`vgMp#JU<1T$a9M=QAhMH0C7F0XY%F}k Rw3%Jv8w)c~15D^8698$0M;8D9 diff --git a/src/main/java/friend/spring/domain/Payment.java b/src/main/java/friend/spring/domain/Payment.java index 2389dbd..bba17e3 100644 --- a/src/main/java/friend/spring/domain/Payment.java +++ b/src/main/java/friend/spring/domain/Payment.java @@ -1,35 +1,43 @@ -//package friend.spring.domain; -// -//import friend.spring.domain.common.BaseEntity; -//import friend.spring.domain.enums.PaymentState; -//import lombok.*; -// -//import javax.persistence.*; -//import java.math.BigDecimal; -// -//@Entity -//@Getter -//@Builder -//@AllArgsConstructor -//@NoArgsConstructor(access = AccessLevel.PROTECTED) -//public class Payment extends BaseEntity { -// -// @Id -// @GeneratedValue(strategy = GenerationType.IDENTITY) -// private Long id; -// -// @Column(nullable = false) -// private BigDecimal amount; -// -// //주문 고유 번호 -// private String merchantUid; -// -// //결제 상태 -// @Enumerated(EnumType.STRING) -// -// private PaymentState paymentState; -// -// -// -// -//} +package friend.spring.domain; + +import friend.spring.domain.common.BaseEntity; +import friend.spring.domain.enums.PaymentState; +import lombok.*; + +import javax.persistence.*; +import java.math.BigDecimal; + +@Entity +@Getter +@Builder +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Payment extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private BigDecimal amount; + + //주문 고유 번호 + private String merchantUid; + + //결제 상태 + @Builder.Default + @Enumerated(EnumType.STRING) + private PaymentState paymentState = PaymentState.READY; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id", nullable = false) + private User user; + + + // 결제 상태 업데이트 편의 메서드 + public void updatePaymentState(PaymentState paymentState) { + this.paymentState = paymentState; + } + + +} diff --git a/src/main/java/friend/spring/domain/ProductOrder.java b/src/main/java/friend/spring/domain/ProductOrder.java new file mode 100644 index 0000000..277db6e --- /dev/null +++ b/src/main/java/friend/spring/domain/ProductOrder.java @@ -0,0 +1,33 @@ +package friend.spring.domain; + +import friend.spring.domain.common.BaseEntity; +import friend.spring.domain.enums.Product; +import lombok.*; + +import javax.persistence.*; +import java.math.BigDecimal; + +@Getter +@Builder +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class ProductOrder extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Enumerated(EnumType.STRING) + private Product product; + + @Column(nullable = false) + private String merchantUid; + + @Column(nullable = false) + private BigDecimal amount; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id", nullable = false) + private User user; + +} diff --git a/src/main/java/friend/spring/domain/enums/PaymentState.java b/src/main/java/friend/spring/domain/enums/PaymentState.java index f6be152..67491e0 100644 --- a/src/main/java/friend/spring/domain/enums/PaymentState.java +++ b/src/main/java/friend/spring/domain/enums/PaymentState.java @@ -1,5 +1,5 @@ -//package friend.spring.domain.enums; -// -//public enum PaymentState { -// READY, PAID, FAILED, CANCEL -//} +package friend.spring.domain.enums; + +public enum PaymentState { + READY, PAID, FAILED, CANCEL +} diff --git a/src/main/java/friend/spring/domain/enums/Product.java b/src/main/java/friend/spring/domain/enums/Product.java new file mode 100644 index 0000000..31f7015 --- /dev/null +++ b/src/main/java/friend/spring/domain/enums/Product.java @@ -0,0 +1,6 @@ +package friend.spring.domain.enums; + +public enum Product { + // 물건 가격 임시로 설정 ( 추후에 pm 님과 상의 후 fix ) + POINT_1000, POINT_2000 +} From f5a0c412715109d23bfde9c9848690b48db81b48 Mon Sep 17 00:00:00 2001 From: kimtaeyoung <62414583+kimtaeyoung201910794@users.noreply.github.com> Date: Wed, 11 Sep 2024 22:47:06 +0900 Subject: [PATCH 02/10] =?UTF-8?q?gradle=EC=97=90=20iamport=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 8196 -> 8196 bytes build.gradle | 2 ++ 2 files changed, 2 insertions(+) diff --git a/.DS_Store b/.DS_Store index 20352e97a6d8979eaaefa259066fcbfcb3626e0f..14cc4fa17fbd9aedb03ef014a37dfb0985205111 100644 GIT binary patch delta 192 zcmZp1XmQxUCK#(;$-uzC!l1{H&XCDalAG`1l9ZF51Qg>4x;FR5Gmm4AsPZXz@WHO{Mq%tHTTXOMwT-@u)2ZdzSz$}P$NNQ0G RWZ1wkxlUMYvy|{F9sr Date: Thu, 12 Sep 2024 17:17:16 +0900 Subject: [PATCH 03/10] =?UTF-8?q?order=20controller=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 8196 -> 8196 bytes build.gradle | 1 + .../domain/{ProductOrder.java => Order.java} | 11 ++- .../java/friend/spring/domain/Payment.java | 22 ++--- .../spring/domain/enums/PaymentState.java | 2 +- .../spring/repository/OrderRepository.java | 14 +++ .../spring/repository/PaymentRepository.java | 7 ++ .../repository/ProductOrderRepository.java | 7 ++ .../friend/spring/service/OrderService.java | 13 +++ .../spring/service/OrderServiceImpl.java | 80 ++++++++++++++++++ .../friend/spring/service/PaymentService.java | 10 +++ .../spring/service/PaymentServiceImpl.java | 37 ++++++++ .../web/controller/OrderController.java | 32 +++++++ .../web/controller/PaymentController.java | 38 +++++++++ .../spring/web/dto/OrderRequestDTO.java | 17 ++++ .../spring/web/dto/PaymentResponseDTO.java | 20 +++++ src/main/resources/application.yml | 3 + 17 files changed, 294 insertions(+), 20 deletions(-) rename src/main/java/friend/spring/domain/{ProductOrder.java => Order.java} (66%) create mode 100644 src/main/java/friend/spring/repository/OrderRepository.java create mode 100644 src/main/java/friend/spring/repository/PaymentRepository.java create mode 100644 src/main/java/friend/spring/repository/ProductOrderRepository.java create mode 100644 src/main/java/friend/spring/service/OrderService.java create mode 100644 src/main/java/friend/spring/service/OrderServiceImpl.java create mode 100644 src/main/java/friend/spring/service/PaymentService.java create mode 100644 src/main/java/friend/spring/service/PaymentServiceImpl.java create mode 100644 src/main/java/friend/spring/web/controller/OrderController.java create mode 100644 src/main/java/friend/spring/web/controller/PaymentController.java create mode 100644 src/main/java/friend/spring/web/dto/OrderRequestDTO.java create mode 100644 src/main/java/friend/spring/web/dto/PaymentResponseDTO.java diff --git a/.DS_Store b/.DS_Store index 14cc4fa17fbd9aedb03ef014a37dfb0985205111..2e43dfb1edabd0b37854ff748937156158dc48d9 100644 GIT binary patch delta 310 zcmZp1XmQxUCKziI&cMLH!l1{H&XCDalAG`1l9ZF51Qg@Q;@0?>?Rm@*RXznSUpnQ6 zKe~KDhGB4Wer^F!4+Debg2~B(8<~z*OcoRBO7YhL3b6t$%4A4kNM%Swwu=7=-#@5P zC@K(^3I2-RkO*-Mk_r^-7#=W8t`ip9EG4{((I);P&^BgPv`&u delta 310 zcmZp1XmQxUCK#(;$-uzC!l1{H&XCDalAG`1l9ZF51Qg>4x;FR5Gmm4AsPZXz?%;KW7xnjxlUMYvy|{EMjP9|K--uZiW!O+l96o!icVkP4)zpW7GVoSc9N(Rqrk?( TH%yz^CBCsR1Jy%CUNQjy6bMtb diff --git a/build.gradle b/build.gradle index db70bcf..86dbf35 100644 --- a/build.gradle +++ b/build.gradle @@ -19,6 +19,7 @@ configurations { repositories { mavenCentral() + maven { url 'https://jitpack.io' } // 깃허브에 있는 오픈소스 프로젝트를 직접 의존성으로 가져와 사용할 수 있게 해주는 설정입니다. } dependencies { diff --git a/src/main/java/friend/spring/domain/ProductOrder.java b/src/main/java/friend/spring/domain/Order.java similarity index 66% rename from src/main/java/friend/spring/domain/ProductOrder.java rename to src/main/java/friend/spring/domain/Order.java index 277db6e..e7bb992 100644 --- a/src/main/java/friend/spring/domain/ProductOrder.java +++ b/src/main/java/friend/spring/domain/Order.java @@ -11,23 +11,26 @@ @Builder @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class ProductOrder extends BaseEntity { +public class Order extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Enumerated(EnumType.STRING) - private Product product; + private Product product; // POINT_1000, POINT_2000 일단 두개 설정해놨습니다. @Column(nullable = false) - private String merchantUid; + private BigDecimal price; @Column(nullable = false) - private BigDecimal amount; + private String orderUid; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id", nullable = false) private User user; + @OneToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "payment_id") + private Payment payment; } diff --git a/src/main/java/friend/spring/domain/Payment.java b/src/main/java/friend/spring/domain/Payment.java index bba17e3..344164f 100644 --- a/src/main/java/friend/spring/domain/Payment.java +++ b/src/main/java/friend/spring/domain/Payment.java @@ -19,25 +19,17 @@ public class Payment extends BaseEntity { private Long id; @Column(nullable = false) - private BigDecimal amount; - - //주문 고유 번호 - private String merchantUid; + private BigDecimal price; //결제 상태 - @Builder.Default @Enumerated(EnumType.STRING) - private PaymentState paymentState = PaymentState.READY; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "user_id", nullable = false) - private User user; + private PaymentState paymentState; + //주문 고유 번호 + private String paymentUid; - // 결제 상태 업데이트 편의 메서드 - public void updatePaymentState(PaymentState paymentState) { - this.paymentState = paymentState; - } - +// @ManyToOne(fetch = FetchType.LAZY) +// @JoinColumn(name = "user_id", nullable = false) +// private User user; } diff --git a/src/main/java/friend/spring/domain/enums/PaymentState.java b/src/main/java/friend/spring/domain/enums/PaymentState.java index 67491e0..7dad986 100644 --- a/src/main/java/friend/spring/domain/enums/PaymentState.java +++ b/src/main/java/friend/spring/domain/enums/PaymentState.java @@ -1,5 +1,5 @@ package friend.spring.domain.enums; public enum PaymentState { - READY, PAID, FAILED, CANCEL + READY, ING, PAID, CANCEL } diff --git a/src/main/java/friend/spring/repository/OrderRepository.java b/src/main/java/friend/spring/repository/OrderRepository.java new file mode 100644 index 0000000..d734cd9 --- /dev/null +++ b/src/main/java/friend/spring/repository/OrderRepository.java @@ -0,0 +1,14 @@ +package friend.spring.repository; + +import friend.spring.domain.Order; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.Optional; + +public interface OrderRepository extends JpaRepository { + @Query("SELECT o FROM Order o " + "LEFT JOIN FETCH o.payment p " + "LEFT JOIN FETCH o.member m " + "WHERE o.orderUid = :orderUid") + Optional findOrderAndPaymentAndMember(@Param("orderUid") String orderUid); +} +} diff --git a/src/main/java/friend/spring/repository/PaymentRepository.java b/src/main/java/friend/spring/repository/PaymentRepository.java new file mode 100644 index 0000000..b3e91a5 --- /dev/null +++ b/src/main/java/friend/spring/repository/PaymentRepository.java @@ -0,0 +1,7 @@ +package friend.spring.repository; + +import friend.spring.domain.Payment; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface PaymentRepository extends JpaRepository { +} diff --git a/src/main/java/friend/spring/repository/ProductOrderRepository.java b/src/main/java/friend/spring/repository/ProductOrderRepository.java new file mode 100644 index 0000000..44c3136 --- /dev/null +++ b/src/main/java/friend/spring/repository/ProductOrderRepository.java @@ -0,0 +1,7 @@ +package friend.spring.repository; + +import friend.spring.domain.Order; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ProductOrderRepository extends JpaRepository { +} diff --git a/src/main/java/friend/spring/service/OrderService.java b/src/main/java/friend/spring/service/OrderService.java new file mode 100644 index 0000000..d3bda99 --- /dev/null +++ b/src/main/java/friend/spring/service/OrderService.java @@ -0,0 +1,13 @@ +package friend.spring.service; + +import friend.spring.domain.Order; +import friend.spring.web.dto.OrderRequestDTO; + +import javax.servlet.http.HttpServletRequest; + +public interface OrderService { + + Long createOrder(OrderRequestDTO orderRequestDTO, HttpServletRequest request); + + Order checkOrder(Long orderId); +} diff --git a/src/main/java/friend/spring/service/OrderServiceImpl.java b/src/main/java/friend/spring/service/OrderServiceImpl.java new file mode 100644 index 0000000..83e20b6 --- /dev/null +++ b/src/main/java/friend/spring/service/OrderServiceImpl.java @@ -0,0 +1,80 @@ +package friend.spring.service; + +import friend.spring.apiPayload.code.status.ErrorStatus; +import friend.spring.apiPayload.handler.UserHandler; +import friend.spring.domain.Order; +import friend.spring.domain.Payment; +import friend.spring.domain.User; +import friend.spring.domain.enums.PaymentState; +import friend.spring.domain.enums.Product; +import friend.spring.repository.OrderRepository; +import friend.spring.repository.PaymentRepository; +import friend.spring.repository.UserRepository; +import friend.spring.security.JwtTokenProvider; +import friend.spring.web.dto.OrderRequestDTO; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import javax.servlet.http.HttpServletRequest; +import java.math.BigDecimal; +import java.util.UUID; + +@Service +@RequiredArgsConstructor +public class OrderServiceImpl implements OrderService{ + + private final JwtTokenProvider jwtTokenProvider; + private final UserRepository userRepository; + private final PaymentRepository paymentRepository; + private final OrderRepository orderRepository; + + + public Long createOrder(OrderRequestDTO orderRequestDTO, HttpServletRequest request) { + Product product = null; + long price = 0L; + + if(orderRequestDTO.getItemName().equals("POINT_1000")) { + product = Product.POINT_1000; + price = 1000L; + } else if (orderRequestDTO.getItemName().equals("POINT_2000")) { + product = Product.POINT_2000; + price = 2000L; + } + else { + throw new RuntimeException("잘못된 상품 이름입니다."); // 추후에 에러핸들러와 에러 코드 만들어야합니다. + } + + Long userId = jwtTokenProvider.getCurrentUser(request); + User user = userRepository.findById(userId).orElseThrow(() -> { + throw new UserHandler(ErrorStatus.USER_NOT_FOUND); + }); + + Payment payment = Payment.builder() + .price(BigDecimal.valueOf(price)) + .paymentState(PaymentState.ING) + .build(); + + paymentRepository.save(payment); + + Order order = Order.builder() + .user(user) + .price(BigDecimal.valueOf(price)) + .product(product) + .orderUid(UUID.randomUUID().toString()) + .payment(payment) + .build(); + + Order result = orderRepository.save(order); + + return result.getId(); + } + + // 주문 체크 및 조회 + @Override + public Order checkOrder(Long orderId) { + return orderRepository.findById(orderId).orElseThrow(() -> { + throw new RuntimeException("주문 id가 존재하지 않습니다."); // 추후에 핸들러,에러상태 추가해야합니다. + }); + } + +} diff --git a/src/main/java/friend/spring/service/PaymentService.java b/src/main/java/friend/spring/service/PaymentService.java new file mode 100644 index 0000000..b6350dc --- /dev/null +++ b/src/main/java/friend/spring/service/PaymentService.java @@ -0,0 +1,10 @@ +package friend.spring.service; + +import friend.spring.web.dto.PaymentResponseDTO; + +public interface PaymentService { + + String previewOrderUid(Long orderId); + + PaymentResponseDTO previewOrderResponse(String orderUid); +} diff --git a/src/main/java/friend/spring/service/PaymentServiceImpl.java b/src/main/java/friend/spring/service/PaymentServiceImpl.java new file mode 100644 index 0000000..d92a1f7 --- /dev/null +++ b/src/main/java/friend/spring/service/PaymentServiceImpl.java @@ -0,0 +1,37 @@ +package friend.spring.service; + +import com.siot.IamportRestClient.IamportClient; +import friend.spring.domain.Order; +import friend.spring.repository.OrderRepository; +import friend.spring.web.dto.PaymentResponseDTO; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class PaymentServiceImpl implements PaymentService{ + + private final OrderRepository orderRepository; + + @Override + public String previewOrderUid(Long orderId) { + Order result = orderRepository.findById(orderId).orElseThrow(() -> new RuntimeException("주문 번호가 없습니다.")); // 추후 핸들러, 에러상태 수정 + return result.getOrderUid(); + } + + @Override + public PaymentResponseDTO previewOrderResponse(String orderUid) { + Order order = orderRepository.findOrderAndPaymentAndMember(orderUid).orElseThrow(() -> new RuntimeException("주문이 존재하지 않습니다.")); + + return PaymentResponseDTO.builder() + .buyerName(order.getUser().getNickname()) + .buyerEmail(order.getUser().getEmail()) + .paymentPrice(order.getPayment().getPrice()) + .product(order.getProduct()) + .orderUid(order.getOrderUid()) + .build(); + } + + +} diff --git a/src/main/java/friend/spring/web/controller/OrderController.java b/src/main/java/friend/spring/web/controller/OrderController.java new file mode 100644 index 0000000..38a4f5c --- /dev/null +++ b/src/main/java/friend/spring/web/controller/OrderController.java @@ -0,0 +1,32 @@ +package friend.spring.web.controller; + +import friend.spring.apiPayload.ApiResponse; +import friend.spring.domain.Order; +import friend.spring.service.OrderService; +import friend.spring.web.dto.OrderRequestDTO; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/order") +public class OrderController { + + private final OrderService orderService; + + + // 주문 번호 생성 api + @PostMapping("/request") + public ApiResponse createOrder(@RequestBody OrderRequestDTO orderRequestDTO, @RequestHeader("atk") String atk, HttpServletRequest request) { + Long orderId = orderService.createOrder(orderRequestDTO, request); + return ApiResponse.onSuccess(orderId); + } + + // 생성된 주문 id 로 체크 + @GetMapping("/check") + public Order checkOrder(Long orderId) { + return orderService.checkOrder(orderId); + } +} diff --git a/src/main/java/friend/spring/web/controller/PaymentController.java b/src/main/java/friend/spring/web/controller/PaymentController.java new file mode 100644 index 0000000..06877c2 --- /dev/null +++ b/src/main/java/friend/spring/web/controller/PaymentController.java @@ -0,0 +1,38 @@ +package friend.spring.web.controller; + +import com.siot.IamportRestClient.IamportClient; +import friend.spring.apiPayload.ApiResponse; +import friend.spring.domain.Order; +import friend.spring.repository.OrderRepository; +import friend.spring.service.PaymentService; +import friend.spring.web.dto.PaymentResponseDTO; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +public class PaymentController { + + private final PaymentService paymentService; + + + @GetMapping("/payment/{orderId}") + public ApiResponse paymentPreview(@PathVariable Long orderId) { + + String orderUid = paymentService.previewOrderUid(orderId); + PaymentResponseDTO paymentResponseDTO = paymentService.previewOrderResponse(orderUid); + return ApiResponse.onSuccess(paymentResponseDTO); + } + + + + + + + + + +} diff --git a/src/main/java/friend/spring/web/dto/OrderRequestDTO.java b/src/main/java/friend/spring/web/dto/OrderRequestDTO.java new file mode 100644 index 0000000..f1f9a9f --- /dev/null +++ b/src/main/java/friend/spring/web/dto/OrderRequestDTO.java @@ -0,0 +1,17 @@ +package friend.spring.web.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.Pattern; + +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class OrderRequestDTO { + + @Pattern(regexp = "^(POINT_1000|POINT_2000)$", message = "포인트는 POINT_1000 또는 POINT_2000 중 하나여야 합니다.") + private String itemName; + +} diff --git a/src/main/java/friend/spring/web/dto/PaymentResponseDTO.java b/src/main/java/friend/spring/web/dto/PaymentResponseDTO.java new file mode 100644 index 0000000..d600b79 --- /dev/null +++ b/src/main/java/friend/spring/web/dto/PaymentResponseDTO.java @@ -0,0 +1,20 @@ +package friend.spring.web.dto; + +import friend.spring.domain.enums.Product; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +@Getter +@Builder +public class PaymentResponseDTO { + private String orderUid; + private Product product; + private String buyerName; + private String buyerEmail; + private BigDecimal paymentPrice; + +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 4f9a80a..5cfdb22 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -67,4 +67,7 @@ kakao: client: ${KAKAO_AUTH_CLIENT} redirect_uri: ${KAKAO_AUTH_REDIRECT_URI} secret_key: ${KAKAO_AUTH_SECRET_KEY} +iamport: + api_key: ${iamport_Rest_Api_Key} + api_secret: ${iamport_Rest_Api_Secret} From 77966e36ba1b59722e629805e70ce906696b77de Mon Sep 17 00:00:00 2001 From: kimtaeyoung <62414583+kimtaeyoung201910794@users.noreply.github.com> Date: Thu, 12 Sep 2024 17:42:18 +0900 Subject: [PATCH 04/10] =?UTF-8?q?=EA=B2=B0=EC=A0=9C=20=EA=B2=80=EC=A6=9D?= =?UTF-8?q?=20=EB=A1=9C=EC=A7=81=20=EC=B4=88=EB=B0=98=20=EB=B6=80=EB=B6=84?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 8196 -> 8196 bytes .../friend/spring/service/PaymentService.java | 5 +++++ .../spring/service/PaymentServiceImpl.java | 12 ++++++++++++ .../web/controller/PaymentController.java | 12 +++++++++--- .../spring/web/dto/PaymentCallback.java | 12 ++++++++++++ 5 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 src/main/java/friend/spring/web/dto/PaymentCallback.java diff --git a/.DS_Store b/.DS_Store index 2e43dfb1edabd0b37854ff748937156158dc48d9..956477e1acded2bdcdf58dc961d77ed0dc041499 100644 GIT binary patch delta 169 zcmZp1XmQxUCKy|!z`(%3!l1{H&XCDalAG`1l9ZF51Qg@gdsk#%zUMJVRQVLV@&y@& z!O8i#1wcIv4AL7mCkxs#DteXyIjle{G8s}BQW+AFEzy5nmR+#?Rm@*RXznSUpnQ6 zKe~KDhGB4Wer^F!4+Debg3ZZ-wv3AYIzSF9(27ik6oyoWL}W|&pYZ+5-h5DqnTaX> Z;^bo@A&dt$7QSKH%q}6!3Sz!w0s!8@EfW9$ diff --git a/src/main/java/friend/spring/service/PaymentService.java b/src/main/java/friend/spring/service/PaymentService.java index b6350dc..fa8de34 100644 --- a/src/main/java/friend/spring/service/PaymentService.java +++ b/src/main/java/friend/spring/service/PaymentService.java @@ -1,5 +1,8 @@ package friend.spring.service; +import com.siot.IamportRestClient.response.IamportResponse; +import friend.spring.domain.Payment; +import friend.spring.web.dto.PaymentCallback; import friend.spring.web.dto.PaymentResponseDTO; public interface PaymentService { @@ -7,4 +10,6 @@ public interface PaymentService { String previewOrderUid(Long orderId); PaymentResponseDTO previewOrderResponse(String orderUid); + + IamportResponse paymentByCallBack(PaymentCallback paymentCallback); } diff --git a/src/main/java/friend/spring/service/PaymentServiceImpl.java b/src/main/java/friend/spring/service/PaymentServiceImpl.java index d92a1f7..165c34c 100644 --- a/src/main/java/friend/spring/service/PaymentServiceImpl.java +++ b/src/main/java/friend/spring/service/PaymentServiceImpl.java @@ -1,8 +1,11 @@ package friend.spring.service; import com.siot.IamportRestClient.IamportClient; +import com.siot.IamportRestClient.response.IamportResponse; import friend.spring.domain.Order; +import friend.spring.domain.Payment; import friend.spring.repository.OrderRepository; +import friend.spring.web.dto.PaymentCallback; import friend.spring.web.dto.PaymentResponseDTO; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; @@ -13,6 +16,7 @@ public class PaymentServiceImpl implements PaymentService{ private final OrderRepository orderRepository; + private final IamportClient iamportClient; @Override public String previewOrderUid(Long orderId) { @@ -33,5 +37,13 @@ public PaymentResponseDTO previewOrderResponse(String orderUid) { .build(); } + @Override + public IamportResponse paymentByCallBack(PaymentCallback paymentCallback) { + try{ + // 결제 단건 조회 + IamportResponse iamportResponse = iam + } + } + } diff --git a/src/main/java/friend/spring/web/controller/PaymentController.java b/src/main/java/friend/spring/web/controller/PaymentController.java index 06877c2..351d5df 100644 --- a/src/main/java/friend/spring/web/controller/PaymentController.java +++ b/src/main/java/friend/spring/web/controller/PaymentController.java @@ -1,16 +1,17 @@ package friend.spring.web.controller; import com.siot.IamportRestClient.IamportClient; +import com.siot.IamportRestClient.response.IamportResponse; import friend.spring.apiPayload.ApiResponse; import friend.spring.domain.Order; +import friend.spring.domain.Payment; import friend.spring.repository.OrderRepository; import friend.spring.service.PaymentService; +import friend.spring.web.dto.PaymentCallback; import friend.spring.web.dto.PaymentResponseDTO; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; @RestController @RequiredArgsConstructor @@ -27,6 +28,11 @@ public ApiResponse paymentPreview(@PathVariable Long orderId return ApiResponse.onSuccess(paymentResponseDTO); } + @PostMapping("/payment") + public IamportResponse validationPayment(@RequestBody PaymentCallback paymentCallback) { + IamportResponse iamportResponse = + } + diff --git a/src/main/java/friend/spring/web/dto/PaymentCallback.java b/src/main/java/friend/spring/web/dto/PaymentCallback.java new file mode 100644 index 0000000..16b5613 --- /dev/null +++ b/src/main/java/friend/spring/web/dto/PaymentCallback.java @@ -0,0 +1,12 @@ +package friend.spring.web.dto; + +import com.fasterxml.jackson.databind.PropertyNamingStrategies; +import com.fasterxml.jackson.databind.annotation.JsonNaming; +import lombok.Data; + +@Data +@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) +public class PaymentCallback { + private String paymentUid; // 결제 고유 번호 + private String orderUid; // 주문 고유 번호 +} From 05f697c78a6189694c96581bbec18cc8fb560719 Mon Sep 17 00:00:00 2001 From: kimtaeyoung <62414583+kimtaeyoung201910794@users.noreply.github.com> Date: Thu, 12 Sep 2024 20:01:37 +0900 Subject: [PATCH 05/10] =?UTF-8?q?=EA=B2=B0=EC=A0=9C=20=EA=B8=88=EC=95=A1?= =?UTF-8?q?=20=EC=9C=84=EB=B3=80=EC=A1=B0=20=EA=B2=80=EC=A6=9D=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 8196 -> 8196 bytes .../spring/repository/OrderRepository.java | 5 +- .../repository/ProductOrderRepository.java | 7 --- .../friend/spring/service/PaymentService.java | 3 +- .../spring/service/PaymentServiceImpl.java | 45 +++++++++++++++++- .../web/controller/PaymentController.java | 2 +- 6 files changed, 50 insertions(+), 12 deletions(-) delete mode 100644 src/main/java/friend/spring/repository/ProductOrderRepository.java diff --git a/.DS_Store b/.DS_Store index 956477e1acded2bdcdf58dc961d77ed0dc041499..a60c986bd6998a66adeedc93d81177e22b9ec867 100644 GIT binary patch delta 168 zcmZp1XmQxUCK%IY#=yY9!l1{H&XCDalAG`1l9ZF51Qg?#yg}hYo#!z}RQVLR{JgZ< z(gHO3f(*mpR-g@;3@Hq$42j5g=)W$@F4%lfh?$8gC4cfUkr2iU S8w=ksZDyAcW(6@{G64WJ04<#W diff --git a/src/main/java/friend/spring/repository/OrderRepository.java b/src/main/java/friend/spring/repository/OrderRepository.java index d734cd9..b4ca06e 100644 --- a/src/main/java/friend/spring/repository/OrderRepository.java +++ b/src/main/java/friend/spring/repository/OrderRepository.java @@ -10,5 +10,8 @@ public interface OrderRepository extends JpaRepository { @Query("SELECT o FROM Order o " + "LEFT JOIN FETCH o.payment p " + "LEFT JOIN FETCH o.member m " + "WHERE o.orderUid = :orderUid") Optional findOrderAndPaymentAndMember(@Param("orderUid") String orderUid); + + @Query("SELECT o FROM Order o " + "LEFT JOIN FETCH o.payment p " + "WHERE o.orderUid = :orderUid") + Optional findOrderAndPayment(@Param("orderUid") String orderUid); } -} + diff --git a/src/main/java/friend/spring/repository/ProductOrderRepository.java b/src/main/java/friend/spring/repository/ProductOrderRepository.java deleted file mode 100644 index 44c3136..0000000 --- a/src/main/java/friend/spring/repository/ProductOrderRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package friend.spring.repository; - -import friend.spring.domain.Order; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface ProductOrderRepository extends JpaRepository { -} diff --git a/src/main/java/friend/spring/service/PaymentService.java b/src/main/java/friend/spring/service/PaymentService.java index fa8de34..b2e008e 100644 --- a/src/main/java/friend/spring/service/PaymentService.java +++ b/src/main/java/friend/spring/service/PaymentService.java @@ -1,7 +1,8 @@ package friend.spring.service; import com.siot.IamportRestClient.response.IamportResponse; -import friend.spring.domain.Payment; + +import com.siot.IamportRestClient.response.Payment; import friend.spring.web.dto.PaymentCallback; import friend.spring.web.dto.PaymentResponseDTO; diff --git a/src/main/java/friend/spring/service/PaymentServiceImpl.java b/src/main/java/friend/spring/service/PaymentServiceImpl.java index 165c34c..ec22eb4 100644 --- a/src/main/java/friend/spring/service/PaymentServiceImpl.java +++ b/src/main/java/friend/spring/service/PaymentServiceImpl.java @@ -1,21 +1,30 @@ package friend.spring.service; import com.siot.IamportRestClient.IamportClient; +import com.siot.IamportRestClient.exception.IamportResponseException; +import com.siot.IamportRestClient.request.CancelData; import com.siot.IamportRestClient.response.IamportResponse; +import com.siot.IamportRestClient.response.Payment; import friend.spring.domain.Order; -import friend.spring.domain.Payment; + import friend.spring.repository.OrderRepository; +import friend.spring.repository.PaymentRepository; import friend.spring.web.dto.PaymentCallback; import friend.spring.web.dto.PaymentResponseDTO; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Service; +import java.io.IOException; +import java.math.BigDecimal; + @Service @RequiredArgsConstructor public class PaymentServiceImpl implements PaymentService{ private final OrderRepository orderRepository; + private final PaymentRepository paymentRepository; private final IamportClient iamportClient; @Override @@ -41,7 +50,39 @@ public PaymentResponseDTO previewOrderResponse(String orderUid) { public IamportResponse paymentByCallBack(PaymentCallback paymentCallback) { try{ // 결제 단건 조회 - IamportResponse iamportResponse = iam + IamportResponse iamportResponse = iamportClient.paymentByImpUid(paymentCallback.getPaymentUid()); + // 주문 내역 조회 + Order order = orderRepository.findOrderAndPayment(paymentCallback.getOrderUid()).orElseThrow(() -> new RuntimeException("주문이 없습니다.")); + + if(!iamportResponse.getResponse().getStatus().equals("paid")) { + orderRepository.delete(order); + paymentRepository.delete(order.getPayment()); + throw new RuntimeException("결제 미완료 에러입니다."); + } + + // 데이터 베이스상에 있는 결제금액 + BigDecimal price = order.getPayment().getPrice(); + // 실제 결제금액 + int iamportPrice = iamportResponse.getResponse().getAmount().intValue(); + + // 결제 금액 검증 + if (iamportPrice != price) { + orderRepository.delete(order); + paymentRepository.delete(order.getPayment()); + + // 결제금액 위변조로 의심되는 결제 금액을 취소 + iamportClient.cancelPaymentByImpUid(new CancelData(iamportResponse.getResponse().getImpUid(), true, new BigDecimal(iamportPrice))); + + throw new RuntimeException("결제금액 위변조 의심"); + } + // 결제 상태 변경 + // order.getPayment(). + + + } catch (IamportResponseException e) { + throw new RuntimeException(e); + } catch (IOException e) { + throw new RuntimeException(e); } } diff --git a/src/main/java/friend/spring/web/controller/PaymentController.java b/src/main/java/friend/spring/web/controller/PaymentController.java index 351d5df..cf8aecf 100644 --- a/src/main/java/friend/spring/web/controller/PaymentController.java +++ b/src/main/java/friend/spring/web/controller/PaymentController.java @@ -2,9 +2,9 @@ import com.siot.IamportRestClient.IamportClient; import com.siot.IamportRestClient.response.IamportResponse; +import com.siot.IamportRestClient.response.Payment; import friend.spring.apiPayload.ApiResponse; import friend.spring.domain.Order; -import friend.spring.domain.Payment; import friend.spring.repository.OrderRepository; import friend.spring.service.PaymentService; import friend.spring.web.dto.PaymentCallback; From 7265f3fd12590e102f97dca26ba8abb3d49c4c17 Mon Sep 17 00:00:00 2001 From: kimtaeyoung <62414583+kimtaeyoung201910794@users.noreply.github.com> Date: Fri, 13 Sep 2024 15:04:38 +0900 Subject: [PATCH 06/10] =?UTF-8?q?=EA=B2=B0=EC=A0=9C=20=EC=99=84=EB=A3=8C?= =?UTF-8?q?=20=EC=8B=9C=20=EC=83=81=ED=83=9C,=20=ED=8F=AC=EC=9D=B8?= =?UTF-8?q?=ED=8A=B8=20=EB=B3=80=EA=B2=BD=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 8196 -> 8196 bytes build.gradle | 3 ++- .../friend/spring/config/IamportConfig.java | 22 ++++++++++++++++++ .../java/friend/spring/domain/Payment.java | 9 ++++--- .../spring/service/PaymentServiceImpl.java | 22 ++++++++++++------ 5 files changed, 45 insertions(+), 11 deletions(-) create mode 100644 src/main/java/friend/spring/config/IamportConfig.java diff --git a/.DS_Store b/.DS_Store index a60c986bd6998a66adeedc93d81177e22b9ec867..ee245154361c50da521fcb4cfedd9a811af37cad 100644 GIT binary patch delta 176 zcmZp1XmQxUCK$UcjDdlHg+Y%YogtHq@VlIQVcN_tA0DoT9nC paymentByCallBack(PaymentCallback paymentCallbac int iamportPrice = iamportResponse.getResponse().getAmount().intValue(); // 결제 금액 검증 - if (iamportPrice != price) { + if (price.compareTo(BigDecimal.valueOf(iamportPrice)) != 0) { + + // 금액이 다를경우 주문 및 결제정보를 삭제합니다. orderRepository.delete(order); paymentRepository.delete(order.getPayment()); @@ -76,12 +77,19 @@ public IamportResponse paymentByCallBack(PaymentCallback paymentCallbac throw new RuntimeException("결제금액 위변조 의심"); } // 결제 상태 변경 - // order.getPayment(). + order.getPayment().changePaymentBySuccess(PaymentState.PAID, iamportResponse.getResponse().getImpUid()); + // 멤버 포인트 변경 + int currentPoint = order.getUser().getPoint(); - } catch (IamportResponseException e) { - throw new RuntimeException(e); - } catch (IOException e) { + if(price.compareTo(BigDecimal.valueOf(1000)) == 0) { + order.getUser().setPoint(currentPoint + 1000); + } else if (price.compareTo(BigDecimal.valueOf(2000)) == 0) { + order.getUser().setPoint(currentPoint + 2000); + } else { + // 추후 pm님과 상의 후 포인트 로직 추가하거나 수정하면 될 것 같습니다. + } + } catch (IamportResponseException | IOException e) { throw new RuntimeException(e); } } From e409b7a56540928e4be4e63381e63f6d63052d94 Mon Sep 17 00:00:00 2001 From: kimtaeyoung <62414583+kimtaeyoung201910794@users.noreply.github.com> Date: Fri, 13 Sep 2024 15:11:25 +0900 Subject: [PATCH 07/10] =?UTF-8?q?payment=20controller=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 8196 -> 8196 bytes .../web/controller/PaymentController.java | 17 ++++++++--------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/.DS_Store b/.DS_Store index ee245154361c50da521fcb4cfedd9a811af37cad..8ba887a04b8626076f78827c65b70f9448205c72 100644 GIT binary patch delta 153 zcmZp1XmQxUCK!9Po`HdZg+Y%YogtHXx~2ZflKm paymentPreview(@PathVariable Long orderId } @PostMapping("/payment") - public IamportResponse validationPayment(@RequestBody PaymentCallback paymentCallback) { - IamportResponse iamportResponse = + public ApiResponse> validationPayment(@RequestBody PaymentCallback paymentCallback) { + IamportResponse iamportResponse = paymentService.paymentByCallBack(paymentCallback); + log.info("결제 응답입니다.", iamportResponse.getResponse().toString()); // 결제 응답 로그 출력입니다. + return ApiResponse.onSuccess(iamportResponse); } - - - - - - - } From c15c1abf3b35687f8eab38f719e1e5e719d2e95f Mon Sep 17 00:00:00 2001 From: kimtaeyoung <62414583+kimtaeyoung201910794@users.noreply.github.com> Date: Sat, 14 Sep 2024 13:30:24 +0900 Subject: [PATCH 08/10] =?UTF-8?q?order,=20payment=20controller=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 8196 -> 8196 bytes src/main/java/friend/spring/domain/Order.java | 2 ++ .../spring/repository/OrderRepository.java | 2 +- .../spring/service/PaymentServiceImpl.java | 1 + .../web/controller/OrderController.java | 2 +- .../web/controller/PaymentController.java | 6 ++++-- 6 files changed, 9 insertions(+), 4 deletions(-) diff --git a/.DS_Store b/.DS_Store index 8ba887a04b8626076f78827c65b70f9448205c72..414fc49f06084ad294eef7c7c77855e2baa5bdaa 100644 GIT binary patch delta 350 zcmZp1XmQxUCK!A9AOiyf3xgg*IzuKyNp8N2OHxjL5>SkT$$NbpyVo&CRQVLV@&y@& z!O8i#1wcIv4Dtn&lLa?0^ULv178A;L;6DHoWCdE4$&kX3%8;0oj-;5u>msTwvQsh@ zUEG&UJ}C6BUc4(6tSpJ46lhEiLkhAopbW1d#Ko)(NGcF+#;yXz)oKDjMGS1f@F-$P m1UfW_Ar;}!$#x=ba>W~g3YZy+feMn*toK~vwfT{V5;p)2i%!b` delta 279 zcmZp1XmQxUCK!9Po`HdZg+Y%YogtH&5+^h_6p~-$i;!;R_6i4YKOjZ_I$X_%U YXbdw$F+&kUGRTOJBGQ}RiHLCn0JkYZ)c^nh diff --git a/src/main/java/friend/spring/domain/Order.java b/src/main/java/friend/spring/domain/Order.java index e7bb992..8193c69 100644 --- a/src/main/java/friend/spring/domain/Order.java +++ b/src/main/java/friend/spring/domain/Order.java @@ -7,10 +7,12 @@ import javax.persistence.*; import java.math.BigDecimal; +@Entity @Getter @Builder @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) + public class Order extends BaseEntity { @Id diff --git a/src/main/java/friend/spring/repository/OrderRepository.java b/src/main/java/friend/spring/repository/OrderRepository.java index b4ca06e..eb78388 100644 --- a/src/main/java/friend/spring/repository/OrderRepository.java +++ b/src/main/java/friend/spring/repository/OrderRepository.java @@ -8,7 +8,7 @@ import java.util.Optional; public interface OrderRepository extends JpaRepository { - @Query("SELECT o FROM Order o " + "LEFT JOIN FETCH o.payment p " + "LEFT JOIN FETCH o.member m " + "WHERE o.orderUid = :orderUid") + @Query("SELECT o FROM Order o " + "LEFT JOIN FETCH o.payment p " + "LEFT JOIN FETCH o.user m " + "WHERE o.orderUid = :orderUid") Optional findOrderAndPaymentAndMember(@Param("orderUid") String orderUid); @Query("SELECT o FROM Order o " + "LEFT JOIN FETCH o.payment p " + "WHERE o.orderUid = :orderUid") diff --git a/src/main/java/friend/spring/service/PaymentServiceImpl.java b/src/main/java/friend/spring/service/PaymentServiceImpl.java index f1226ea..fff281b 100644 --- a/src/main/java/friend/spring/service/PaymentServiceImpl.java +++ b/src/main/java/friend/spring/service/PaymentServiceImpl.java @@ -89,6 +89,7 @@ public IamportResponse paymentByCallBack(PaymentCallback paymentCallbac } else { // 추후 pm님과 상의 후 포인트 로직 추가하거나 수정하면 될 것 같습니다. } + return iamportResponse; } catch (IamportResponseException | IOException e) { throw new RuntimeException(e); } diff --git a/src/main/java/friend/spring/web/controller/OrderController.java b/src/main/java/friend/spring/web/controller/OrderController.java index 38a4f5c..50e2f37 100644 --- a/src/main/java/friend/spring/web/controller/OrderController.java +++ b/src/main/java/friend/spring/web/controller/OrderController.java @@ -26,7 +26,7 @@ public ApiResponse createOrder(@RequestBody OrderRequestDTO orderRequestDT // 생성된 주문 id 로 체크 @GetMapping("/check") - public Order checkOrder(Long orderId) { + public Order checkOrder(Long orderId, @RequestHeader("atk") String atk, HttpServletRequest request) { return orderService.checkOrder(orderId); } } diff --git a/src/main/java/friend/spring/web/controller/PaymentController.java b/src/main/java/friend/spring/web/controller/PaymentController.java index 6946fb0..3d250bb 100644 --- a/src/main/java/friend/spring/web/controller/PaymentController.java +++ b/src/main/java/friend/spring/web/controller/PaymentController.java @@ -15,6 +15,8 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletRequest; + @RestController @RequiredArgsConstructor public class PaymentController { @@ -25,7 +27,7 @@ public class PaymentController { @GetMapping("/payment/{orderId}") - public ApiResponse paymentPreview(@PathVariable Long orderId) { + public ApiResponse paymentPreview(@PathVariable Long orderId, @RequestHeader("atk") String atk, HttpServletRequest request) { String orderUid = paymentService.previewOrderUid(orderId); PaymentResponseDTO paymentResponseDTO = paymentService.previewOrderResponse(orderUid); @@ -33,7 +35,7 @@ public ApiResponse paymentPreview(@PathVariable Long orderId } @PostMapping("/payment") - public ApiResponse> validationPayment(@RequestBody PaymentCallback paymentCallback) { + public ApiResponse> validationPayment(@RequestBody PaymentCallback paymentCallback, @RequestHeader("atk") String atk, HttpServletRequest request) { IamportResponse iamportResponse = paymentService.paymentByCallBack(paymentCallback); log.info("결제 응답입니다.", iamportResponse.getResponse().toString()); // 결제 응답 로그 출력입니다. return ApiResponse.onSuccess(iamportResponse); From 837dc756acbac832f8bb0a06b0285115ac9cda0a Mon Sep 17 00:00:00 2001 From: kimtaeyoung <62414583+kimtaeyoung201910794@users.noreply.github.com> Date: Sat, 14 Sep 2024 21:50:57 +0900 Subject: [PATCH 09/10] =?UTF-8?q?payment=20=EC=97=90=EB=9F=AC=20=ED=95=B8?= =?UTF-8?q?=EB=93=A4=EB=9F=AC=20=EC=B6=94=EA=B0=80,=20=EC=97=90=EB=9F=AC?= =?UTF-8?q?=EC=83=81=ED=83=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 8196 -> 8196 bytes .../apiPayload/code/status/ErrorStatus.java | 10 +++++++++- .../apiPayload/handler/PaymentHandler.java | 10 ++++++++++ .../spring/service/OrderServiceImpl.java | 5 +++-- .../spring/service/PaymentServiceImpl.java | 14 ++++++++++---- 5 files changed, 32 insertions(+), 7 deletions(-) create mode 100644 src/main/java/friend/spring/apiPayload/handler/PaymentHandler.java diff --git a/.DS_Store b/.DS_Store index 414fc49f06084ad294eef7c7c77855e2baa5bdaa..fc1dd1c7a94572c8ac63b974e5c49290b6bf36c7 100644 GIT binary patch delta 210 zcmZp1XmQxUCK&rYgn@y9g+Y%YogtHSkT$$NbpyVo&CRQVLV@&y@& z!O8i#1wcIv4Dtn=lLhS<6)pnVtUwzw8B!Qh84{80$W(N3U$Xh25Hpi(@kXFBW`<&h qB8FsSB|uTnC6gbDNV6~;2=bgHD#iF { - throw new RuntimeException("주문 id가 존재하지 않습니다."); // 추후에 핸들러,에러상태 추가해야합니다. + throw new PaymentHandler(ErrorStatus.ORDER_NOT_FOUND); }); } diff --git a/src/main/java/friend/spring/service/PaymentServiceImpl.java b/src/main/java/friend/spring/service/PaymentServiceImpl.java index fff281b..1f2ebb0 100644 --- a/src/main/java/friend/spring/service/PaymentServiceImpl.java +++ b/src/main/java/friend/spring/service/PaymentServiceImpl.java @@ -5,6 +5,8 @@ import com.siot.IamportRestClient.request.CancelData; import com.siot.IamportRestClient.response.IamportResponse; import com.siot.IamportRestClient.response.Payment; +import friend.spring.apiPayload.code.status.ErrorStatus; +import friend.spring.apiPayload.handler.PaymentHandler; import friend.spring.domain.Order; import friend.spring.domain.enums.PaymentState; @@ -28,13 +30,17 @@ public class PaymentServiceImpl implements PaymentService{ @Override public String previewOrderUid(Long orderId) { - Order result = orderRepository.findById(orderId).orElseThrow(() -> new RuntimeException("주문 번호가 없습니다.")); // 추후 핸들러, 에러상태 수정 + Order result = orderRepository.findById(orderId).orElseThrow(() -> { + throw new PaymentHandler(ErrorStatus.ORDER_ID_NOT_FOUND); + }); // 추후 핸들러, 에러상태 수정 return result.getOrderUid(); } @Override public PaymentResponseDTO previewOrderResponse(String orderUid) { - Order order = orderRepository.findOrderAndPaymentAndMember(orderUid).orElseThrow(() -> new RuntimeException("주문이 존재하지 않습니다.")); + Order order = orderRepository.findOrderAndPaymentAndMember(orderUid).orElseThrow(() -> { + throw new PaymentHandler(ErrorStatus.ORDER_NOT_FOUND); + }); return PaymentResponseDTO.builder() .buyerName(order.getUser().getNickname()) @@ -56,7 +62,7 @@ public IamportResponse paymentByCallBack(PaymentCallback paymentCallbac if(!iamportResponse.getResponse().getStatus().equals("paid")) { orderRepository.delete(order); paymentRepository.delete(order.getPayment()); - throw new RuntimeException("결제 미완료 에러입니다."); + throw new PaymentHandler(ErrorStatus.PAYMENT_NOT_PAID); } // 데이터 베이스상에 있는 결제금액 @@ -74,7 +80,7 @@ public IamportResponse paymentByCallBack(PaymentCallback paymentCallbac // 결제금액 위변조로 의심되는 결제 금액을 취소 iamportClient.cancelPaymentByImpUid(new CancelData(iamportResponse.getResponse().getImpUid(), true, new BigDecimal(iamportPrice))); - throw new RuntimeException("결제금액 위변조 의심"); + throw new PaymentHandler(ErrorStatus.PRICE_NOT_OK); } // 결제 상태 변경 order.getPayment().changePaymentBySuccess(PaymentState.PAID, iamportResponse.getResponse().getImpUid()); From ebc3f687401a8ae65ed4eb075b5822bc6eaf737b Mon Sep 17 00:00:00 2001 From: kimtaeyoung <62414583+kimtaeyoung201910794@users.noreply.github.com> Date: Sat, 14 Sep 2024 21:51:34 +0900 Subject: [PATCH 10/10] =?UTF-8?q?=EC=A3=BC=EC=84=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 8196 -> 8196 bytes .../spring/service/PaymentServiceImpl.java | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/.DS_Store b/.DS_Store index fc1dd1c7a94572c8ac63b974e5c49290b6bf36c7..f46dd4b4f5b56f3069254d4df24f9c9bb671039c 100644 GIT binary patch delta 180 zcmZp1XmQxUDi|jyBhSFVz`~%%kj{|FP?DSP;*yk;p9B=+U|?vFy6<(&5mi0~E4~U7*ZJ$ku3?m5SV>$^FbjNCYf-cDrSaa Uh9ZV!WEDWsKle626j9~|0KFM64*&oF diff --git a/src/main/java/friend/spring/service/PaymentServiceImpl.java b/src/main/java/friend/spring/service/PaymentServiceImpl.java index 1f2ebb0..626aff7 100644 --- a/src/main/java/friend/spring/service/PaymentServiceImpl.java +++ b/src/main/java/friend/spring/service/PaymentServiceImpl.java @@ -32,7 +32,7 @@ public class PaymentServiceImpl implements PaymentService{ public String previewOrderUid(Long orderId) { Order result = orderRepository.findById(orderId).orElseThrow(() -> { throw new PaymentHandler(ErrorStatus.ORDER_ID_NOT_FOUND); - }); // 추후 핸들러, 에러상태 수정 + }); return result.getOrderUid(); }