@PostMapping("/order/submit")
public ResponseEntity orderSubmit
(Amount amount,
OrderDTO orderDTO,
HttpSession session,
@RequestParam(value = "cartNo", required = false) List<Integer> cartNos,
@RequestParam(value = "usedPoint", required = false) Integer usedPoint,
@RequestParam(value = "issueNo", required = false) Long issueNo,
@RequestParam(value = "itemPoint", required = false) List<Integer> itemPointList,
@AuthenticationPrincipal UserDetails userDetails) throws Exception {
return orderTransactionService.processOrderAndPay(
amount,
orderDTO,
session,
cartNos,
usedPoint,
issueNo,
itemPointList,
userDetails
);
}
기술 설명
- @PostMapping("/order/submit"): POST 요청을
/order/submit경로로 매핑.- Amount amount: 카카오페이 결제를 위한 금액 정보(총 결제 금액 등)를
AmountDTO로 바인딩.- OrderDTO orderDTO: 주문 정보(주문자, 배송지, 결제 정보 등)를 담은
OrderDTO.- HttpSession session: 세션 객체로, 주문 생성 후
orderNo를 세션에 저장하여 결제 완료 시 참조.- @RequestParam(value = "cartNo", required = false) List cartNos: 장바구니에서 한 번에 주문할 경우 전달된
cartNo목록(선택된 장바구니 번호들).- @RequestParam(value = "usedPoint", required = false) Integer usedPoint: 사용자가 적용할 포인트 금액(옵션).
- @RequestParam(value = "issueNo", required = false) Long issueNo: 선택된 쿠폰 발급 번호(옵션).
- @RequestParam(value = "itemPoint", required = false) List itemPointList: 각 상품별 적립 포인트 값 목록(옵션).
- @AuthenticationPrincipal UserDetails userDetails: 현재 로그인된 사용자 정보(
UserDetails) 자동 주입.- orderTransactionService.processOrderAndPay(...):
- 주문 테이블에
OrderDTO로 레코드 생성 → 생성된orderNo를 세션에 저장.- 장바구니(
cartNos) 항목 삭제 또는 바로 구매 항목 처리.- 포인트 사용(
usedPoint) 및 쿠폰 할인(issueNo)을 반영하여 결제 금액 최종 계산.- 각 상품별 적립 포인트(
itemPointList)를 사용자에게 적립.- 카카오페이 결제 요청(즉시 결제 준비) → 응답으로 받은 결제 URL(
next_redirect_pc_url)을ResponseEntity로 반환.- ResponseEntity: 카카오페이로부터 받은 결제 URL이나 오류 메시지를 JSON 형태로 클라이언트에 전달.
@GetMapping("/payment/success")
public String afterPayRequest(@RequestParam(value="pg_token", required = false) String pgToken,
HttpSession session) {
if (pgToken != null) {
try {
KakaoApproveResponse approveResponse = kakaoPayService.approveResponse(pgToken);
if (approveResponse != null) {
Integer orderNo = (Integer) session.getAttribute("orderNo");
productOrderSubmitService.updateOrderStatusToCompleted(orderNo);
}
} catch (Exception e) {
e.printStackTrace();
}
}
return "redirect:/product/order_completed";
}
기술 설명
- @GetMapping("/payment/success"): GET 요청을
/payment/success경로로 매핑. 카카오페이 결제 완료 후 리다이렉트되는 콜백 URL.- @RequestParam(value="pg_token", required = false) String pgToken: 카카오페이 승인 토큰(
pg_token)을 파라미터로 받음.- HttpSession session: 세션에서 이전에 저장된
orderNo를 조회하기 위해 사용.- if (pgToken != null):
pg_token이 존재할 때만 승인 처리 로직 수행.
- kakaoPayService.approveResponse(pgToken):
- 카카오페이 서버에 최종 승인 요청을 보내고,
KakaoApproveResponse객체로 응답을 받음.- if (approveResponse != null): 승인 응답이 정상적으로 반환되었으면
- Integer orderNo = (Integer) session.getAttribute("orderNo"): 주문 과정에서 세션에 저장된
orderNo를 꺼냄.- productOrderSubmitService.updateOrderStatusToCompleted(orderNo):
- 주문 번호(
orderNo)를 기반으로 해당 주문 상태를 “결제 완료”로 변경.- return "redirect:/product/order_completed": 결제 성공 후
/product/order_completed페이지로 리다이렉트.
@GetMapping("/product/order_completed")
public String orderCompleted(HttpSession session, Model model) {
Integer orderNo = (Integer) session.getAttribute("orderNo");
OrderDTO orderDTO = productOrderSubmitService.findAllByOrderNo(orderNo);
model.addAttribute("orderDTO", orderDTO);
return "/product/order/order_completed";
}
기술 설명
- @GetMapping("/product/order_completed"): GET 요청을
/product/order_completed경로로 매핑.- HttpSession session: 세션에서
orderNo를 조회하기 위해 사용.- Integer orderNo = (Integer) session.getAttribute("orderNo"): 세션에서 방금 결제된 주문 번호를 꺼냄.
- productOrderSubmitService.findAllByOrderNo(orderNo):
- 주문 번호(
orderNo)를 바탕으로OrderDTO를 조회.OrderDTO에 주문 정보, 결제 정보, 배송지 정보 등의 모든 주문 상세 데이터를 포함.- model.addAttribute("orderDTO", orderDTO): 조회된
OrderDTO를"orderDTO"라는 이름으로 뷰에 전달.- return "/product/order/order_completed":
order_completed.html템플릿을 렌더링하여 주문 완료 화면 표시.