diff --git a/src/main/java/com/sumte/payment/controller/KakaoRedirectController.java b/src/main/java/com/sumte/payment/controller/KakaoRedirectController.java index 078d584..d5b329a 100644 --- a/src/main/java/com/sumte/payment/controller/KakaoRedirectController.java +++ b/src/main/java/com/sumte/payment/controller/KakaoRedirectController.java @@ -41,20 +41,38 @@ public ResponseEntity> success( log.info("[KAKAO SUCCESS] paymentId={}, pg_token={}", paymentId, pgToken); - String deepLink = UriComponentsBuilder.newInstance() - .scheme("myapp").host("pay").path("/success") - .queryParam("paymentId", paymentId) - .queryParam("pg_token", pgToken) - .build(true).toUriString(); + String query = "paymentId=" + paymentId + + "&pg_token=" + java.net.URLEncoder.encode(pgToken, java.nio.charset.StandardCharsets.UTF_8); - log.info("DeepLink constructed: {}", deepLink); + String intentUrl = "intent://pay/success?" + query + + "#Intent;scheme=myapp;package=com.example.sumte;end"; + + log.info("Intent URL constructed: {}", intentUrl); HttpHeaders headers = new HttpHeaders(); - headers.setLocation(URI.create(deepLink)); + headers.setLocation(java.net.URI.create(intentUrl)); log.info("Responding 302 with Location: {}", headers.getLocation()); + + // 바디엔 확인용으로 동일 문자열 내려줌 return ResponseEntity.status(HttpStatus.FOUND) .headers(headers) - .body(ApiResponse.success(deepLink)); + .body(ApiResponse.success(intentUrl)); + +// String deepLink = UriComponentsBuilder.newInstance() +// .scheme("myapp").host("pay").path("/success") +// .queryParam("paymentId", paymentId) +// .queryParam("pg_token", pgToken) +// .build(true).toUriString(); +// +// log.info("DeepLink constructed: {}", deepLink); + +// HttpHeaders headers = new HttpHeaders(); +// headers.setLocation(URI.create(deepLink)); +// log.info("Responding 302 with Location: {}", headers.getLocation()); +// +// return ResponseEntity.status(HttpStatus.FOUND) +// .headers(headers) +// .body(ApiResponse.success(deepLink)); } @GetMapping("/pay/cancel") diff --git a/src/main/java/com/sumte/payment/controller/PaymentController.java b/src/main/java/com/sumte/payment/controller/PaymentController.java index e0374be..b89d4e0 100644 --- a/src/main/java/com/sumte/payment/controller/PaymentController.java +++ b/src/main/java/com/sumte/payment/controller/PaymentController.java @@ -49,4 +49,14 @@ public ResponseEntity> approvePayment( KakaoPayApproveResponseDTO response = paymentService.approvePayment(id, pgToken); return ResponseEntity.ok(ApiResponse.success(response)); } + + @PatchMapping("/{id}/approve/manual") + @Operation( + summary = "임의 결제 승인 API (테스트/관리자용)", + description = "paymentId로 결제를 강제 승인(PAID) 처리합니다." + ) + public ResponseEntity> approvePaymentManually(@PathVariable("id") Long id) { + paymentService.approvePaymentManually(id); + return ResponseEntity.ok(ApiResponse.success("PAID")); + } } diff --git a/src/main/java/com/sumte/payment/service/PaymentService.java b/src/main/java/com/sumte/payment/service/PaymentService.java index b29f545..2877953 100644 --- a/src/main/java/com/sumte/payment/service/PaymentService.java +++ b/src/main/java/com/sumte/payment/service/PaymentService.java @@ -7,4 +7,5 @@ public interface PaymentService { PaymentResponseDTO.PaymentReadyResponse requestPayment(PaymentRequestDTO.PaymentRequestCreate dto); KakaoPayApproveResponseDTO approvePayment(Long paymentId, String pgToken); + void approvePaymentManually(Long paymentId); } diff --git a/src/main/java/com/sumte/payment/service/PaymentServiceImpl.java b/src/main/java/com/sumte/payment/service/PaymentServiceImpl.java index 5269e58..fa274e3 100644 --- a/src/main/java/com/sumte/payment/service/PaymentServiceImpl.java +++ b/src/main/java/com/sumte/payment/service/PaymentServiceImpl.java @@ -91,4 +91,11 @@ public KakaoPayApproveResponseDTO approvePayment(Long paymentId, String pgToken) return response; } + + @Override + @Transactional + public void approvePaymentManually(Long paymentId) { + paymentRepository.findById(paymentId) + .ifPresent(Payment::markAsPaid); // 없으면 아무 것도 안 함 (예외 X) + } } diff --git a/src/main/java/com/sumte/reservation/converter/ReservationConverter.java b/src/main/java/com/sumte/reservation/converter/ReservationConverter.java index 27c92b6..a725a82 100644 --- a/src/main/java/com/sumte/reservation/converter/ReservationConverter.java +++ b/src/main/java/com/sumte/reservation/converter/ReservationConverter.java @@ -45,6 +45,7 @@ public ReservationResponseDTO.MyReservationDTO toMyReservationDTO(Reservation re .guestHouseName(guestHouse.getName()) .roomName(room.getName()) .roomId(room.getId()) + .reservedAt(reservation.getCreatedAt()) .imageUrl(firstRoomImageUrl) .startDate(reservation.getStartDate()) .endDate(reservation.getEndDate()) diff --git a/src/main/java/com/sumte/reservation/dto/ReservationResponseDTO.java b/src/main/java/com/sumte/reservation/dto/ReservationResponseDTO.java index bd43ac8..bd19e68 100644 --- a/src/main/java/com/sumte/reservation/dto/ReservationResponseDTO.java +++ b/src/main/java/com/sumte/reservation/dto/ReservationResponseDTO.java @@ -27,6 +27,7 @@ public static class MyReservationDTO { private String guestHouseName; private String roomName; private Long roomId; + private LocalDateTime reservedAt; private String imageUrl; private LocalDate startDate; private LocalDate endDate; diff --git a/src/main/java/com/sumte/review/dto/ReviewRequestDto.java b/src/main/java/com/sumte/review/dto/ReviewRequestDto.java index d85c5b7..96bf8d7 100644 --- a/src/main/java/com/sumte/review/dto/ReviewRequestDto.java +++ b/src/main/java/com/sumte/review/dto/ReviewRequestDto.java @@ -2,7 +2,6 @@ import jakarta.validation.constraints.Max; import jakarta.validation.constraints.Min; -import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Builder; @@ -18,7 +17,6 @@ public class ReviewRequestDto { @NotNull private Long roomId; - @NotBlank private String contents; @Min(1)