Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 6 additions & 5 deletions src/main/java/com/kt/controller/payment/PaymentController.java
Original file line number Diff line number Diff line change
Expand Up @@ -91,15 +91,16 @@ public ApiResult<Void> create(@Valid @RequestBody PaymentCreateRequest request,
public ResponseEntity<?> confirmPayment(@RequestBody PaymentTossConfirmRequest request,
@AuthenticationPrincipal CustomUserDetails currentUser
) {
String orderId = request.orderId().split("-")[0];
Long orderIdLong = Long.parseLong(orderId);

try {
String url = tossPaymentsProperties.getApiUrl() + "/confirm";
String auth = tossPaymentsProperties.getSecretKey() + ":";
String encodedAuth = java.util.Base64.getEncoder().encodeToString(auth.getBytes(StandardCharsets.UTF_8));

String orderId = request.orderId().split("-")[0];
Long orderIdLong = Long.parseLong(orderId);
var order = orderService.getOrderDetail(orderIdLong, currentUser.getId());
if (order.orderStatus() != OrderStatus.ORDERED) {
var order = orderService.getOrderDetail(currentUser.getId(), orderIdLong);
if (order.orderStatus() != OrderStatus.PENDING_PAYMENT) {
return ResponseEntity
.status(HttpStatus.BAD_REQUEST)
.body(Map.of(
Expand Down Expand Up @@ -141,7 +142,7 @@ public ResponseEntity<?> confirmPayment(@RequestBody PaymentTossConfirmRequest r
} catch (Exception e) {
e.printStackTrace();

//TODO order 생성 기록 rollback
orderService.rollback(orderIdLong);
return ResponseEntity
.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(Map.of(
Expand Down
4 changes: 3 additions & 1 deletion src/main/java/com/kt/domain/order/Order.java
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public Order(String receiverName, String receiverPhone, String receiverAddress,
this.receiverName = receiverName;
this.receiverPhone = receiverPhone;
this.receiverAddress = receiverAddress;
this.orderStatus = OrderStatus.ORDERED;
this.orderStatus = OrderStatus.PENDING_PAYMENT;
this.isDeleted = false;

this.user = user;
Expand Down Expand Up @@ -85,6 +85,8 @@ public void approveReturn() {
this.orderStatus = OrderStatus.RETURNED;
}

public void failPayment() { this.orderStatus = OrderStatus.PAYMENT_FAILED; }

public void updateStatus(OrderStatus newStatus) {
this.orderStatus = newStatus;

Expand Down
10 changes: 5 additions & 5 deletions src/main/java/com/kt/domain/order/OrderStatus.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,11 @@
@Getter
@RequiredArgsConstructor
public enum OrderStatus {
ORDERED("주문 완료"),
// ORDERED("주문 완료"),
PENDING_PAYMENT("결제 대기"),
PAYMENT_FAILED("결제 실패"),
PAID("결제 완료"),

PROCESSING("배송 전"),
SHIPPED("배송 중"),
DELIVERED("배송 완료"),
Expand All @@ -16,10 +19,7 @@ public enum OrderStatus {
RETURN_REQUESTED("반품 요청"),
RETURNED("반품 완료"),
REFUND_REQUESTED("환불 요청"),
REFUNDED("환불 완료"),

PENDING_PAYMENT("결제 대기"),
PAYMENT_FAILED("결제 실패");
REFUNDED("환불 완료");

private final String description;
}
18 changes: 14 additions & 4 deletions src/main/java/com/kt/service/order/OrderService.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

import org.springframework.data.domain.Page;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.kt.common.exception.CustomException;
Expand Down Expand Up @@ -131,6 +132,12 @@ public void save(Long orderId){
order.updateStatus(OrderStatus.PAID);
}

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void rollback(Long orderId){
var order = orderRepository.findByIdOrThrow(orderId, ErrorCode.NOT_FOUND_ORDER);
order.failPayment();
}

public Page<OrderListResponse> getOrderList(Long userId, Paging paging) {
Page<Order> orders = orderRepositoryCustom.getOrders(userId, paging.toPageable());

Expand Down Expand Up @@ -176,7 +183,8 @@ public void cancel(Long orderId, Long userId) {
Preconditions.validate(order.getUser().getId().equals(userId), ErrorCode.NOT_ORDER_OWNER);

// 주문 취소 가능 여부 검증
Preconditions.validate(order.getOrderStatus() == OrderStatus.ORDERED ||
Preconditions.validate(order.getOrderStatus() == OrderStatus.PENDING_PAYMENT ||
order.getOrderStatus() == OrderStatus.PAYMENT_FAILED ||
order.getOrderStatus() == OrderStatus.PAID, ErrorCode.CANNOT_CANCEL_ORDER);

order.cancel();
Expand Down Expand Up @@ -224,8 +232,9 @@ public void update(OrderUpdateRequest request, Long orderId, Long userId) {

Preconditions.validate(order.getUser().getId().equals(userId), ErrorCode.NOT_ORDER_OWNER);

Preconditions.validate(order.getOrderStatus() == OrderStatus.ORDERED ||
order.getOrderStatus() == OrderStatus.PAID, ErrorCode.CANNOT_UPDATE_ORDER_INFO);
Preconditions.validate(order.getOrderStatus() == OrderStatus.PENDING_PAYMENT ||
order.getOrderStatus() == OrderStatus.PAID ||
order.getOrderStatus() == OrderStatus.PAYMENT_FAILED , ErrorCode.CANNOT_UPDATE_ORDER_INFO);

String updatedAddress = request.receiverAddressId() != null
? shoppingAddressRepository.findByIdAndUserIdOrThrow(request.receiverAddressId(), userId, ErrorCode.NOT_SHOPPING_ADDRESS_OWNER).getAddress()
Expand All @@ -243,7 +252,8 @@ public void cancelByAdmin(Long orderId) {
var order = orderRepository.findByIdOrThrow(orderId, ErrorCode.NOT_FOUND_ORDER);

// 주문 취소 가능 여부 검증
Preconditions.validate(order.getOrderStatus() == OrderStatus.ORDERED ||
Preconditions.validate(order.getOrderStatus() == OrderStatus.PENDING_PAYMENT ||
order.getOrderStatus() == OrderStatus.PAYMENT_FAILED ||
order.getOrderStatus() == OrderStatus.PAID, ErrorCode.CANNOT_CANCEL_ORDER);

order.cancel();
Expand Down
12 changes: 8 additions & 4 deletions src/main/java/com/kt/service/payment/PaymentFacade.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,13 @@ public class PaymentFacade {

@Transactional
public Long completePayment(Map<String, Object> tossResponse, Long userId, Long orderId) {
var paymentId = paymentService.create(tossResponse, userId);
orderService.save(orderId);

return paymentId;
try {
var paymentId = paymentService.create(tossResponse, userId, orderId);
orderService.save(orderId);
return paymentId;
} catch (Exception e) {
orderService.rollback(orderId);
throw e;
}
}
}
6 changes: 2 additions & 4 deletions src/main/java/com/kt/service/payment/PaymentService.java
Original file line number Diff line number Diff line change
Expand Up @@ -51,10 +51,8 @@ public class PaymentService {
private final OrderRepositoryCustom orderRepositoryCustom;
private final OrderProductRepositoryCustom orderProductRepositoryCustom;

public Long create(Map<String, Object> tossResponse, Long userId) {
String orderId = tossResponse.get("orderId").toString().split("-")[0];

var order = orderRepository.findByIdAndUserIdOrThrow(Long.parseLong(orderId), userId, ErrorCode.NOT_FOUND_ORDER);
public Long create(Map<String, Object> tossResponse, Long userId, Long orderId) {
var order = orderRepository.findByIdAndUserIdOrThrow(orderId, userId, ErrorCode.NOT_FOUND_ORDER);

var paymentType = paymentTypeRepository.findByName(tossResponse.get("method").toString()).orElseThrow();

Expand Down
1 change: 0 additions & 1 deletion src/test/java/com/kt/service/order/OrderServiceTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -274,7 +274,6 @@ void initOrderTestData() {
OrderDetailResponse orderDetail = orderService.getOrderDetail(user.getId(), orderId);

//then
assertThat(orderDetail.orderStatus()).isEqualTo(OrderStatus.ORDERED);
assertThat(orderDetail.receiverName()).isEqualTo(user.getName());
assertThat(orderDetail.receiverPhone()).isEqualTo(user.getMobile());
assertThat(orderDetail.receiverAddress()).isEqualTo(savedAddress.getAddress());
Expand Down
4 changes: 2 additions & 2 deletions src/test/java/com/kt/service/payment/PaymentServiceTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ void setUp() {

@Test
void 주문에_대한_결제_생성_가능() {
paymentService.create(토스_결제_응답(), user.getId());
paymentService.create(토스_결제_응답(), user.getId(), order.getId());

Payment payment = paymentRepository.findAll().get(0);

Expand All @@ -133,7 +133,7 @@ void setUp() {
new DiscountMembership(membershipDiscount, membership)
);

paymentService.create(토스_결제_응답(), user.getId());
paymentService.create(토스_결제_응답(), user.getId(), order.getId());

Payment payment = paymentRepository.findAll().get(0);

Expand Down
Loading