💡My project/셸위 : 게임 친구 매칭 사이트

[셸위:게임 친구 매칭 사이트] 카카오 페이 API - 결제 기능

Song hyun 2024. 9. 25. 19:14
728x90
반응형

[셸위:게임 친구 매칭 사이트] 카카오 페이 API - 결제 기능

 

*참고하면 좋은 글

https://whatsthatsound.tistory.com/674

 

[셸위:게임 친구 매칭 사이트] 토스 페이먼츠 API - 결제 기능

[셸위:게임 친구 매칭 사이트] 토스 페이먼츠 API - 결제 기능    이번 프로젝트에서는 토스 페이먼츠, 카카오 페이 총 두 개의 결제 API를 사용해서 현금 결제 기능을 구현해봤다. 이번에

whatsthatsound.tistory.com


 

 기본적인 로직은 토스 페이먼츠 결제 API와 유사하지만, 카카오페이 API 는 로직이나 요구하는 값들이 훨씬 단순하고 간편하다는 장점이 있다. 아래는 참고한 개발자 센터 문서.

https://developers.kakaopay.com/docs/payment/online/single-payment

 

카카오페이 | 개발자센터

새로운 기회와 가치를 함께 만들어봐요

developers.kakaopay.com

 

 

 카카오페이 결제 API는 결제 로직이 무척 단순하고 편리해서, 토스 페이먼츠 결제 API를 사용해본 사람이라면 금방 할 수 있을 것이다. 아래는 controller 단의 코드!!

	/**
	 * 카카오 페이 - 결제 요청 페이지
	 * @param txId
	 * @param paymentId
	 * @return
	 */
	// http://localhost:8080/cash/send-request-kakao
	@PostMapping("/send-request/kakao/{totalAmount}")
	@ResponseBody
	public ReadyResponseDTO payCashByKakao(@PathVariable("totalAmount") String totalAmount) {
		User user = (User)httpSession.getAttribute("principal");
		
		// 1. 가주문 생성하기 (보안을 위한 정보 저장)
		Long totalPrice = Long.valueOf(totalAmount); // 결제 가격
		String orderId = orderService.makeNewOrder(user.getUserId(),totalPrice,1, null); // 가주문 생성

		// 2. 결제 요청 메세지 보내기
		ReadyResponseDTO readyResponseDTO = kakaoPayService.payReady(totalPrice,orderId); //  결제 요청

		// 3. tid 생성하기
		SessionUtils.addAtribute("tid", readyResponseDTO.getTid()); // tid 생성
		orderService.setTid(orderId, readyResponseDTO.getTid());

		// 4. response 값 보내기 - chargeCash.jsp의 redirect_url_pc로 연결
		return readyResponseDTO;
	}
	
	/**
	 * 카카오 페이 - 결제 승인 페이지
	 * @param model
	 * @return
	 */
	// http://localhost:8080/cash/result/kakao
	@GetMapping("/result/kakao")
	public String resultKakaoPay(@RequestParam("pg_token") String pgToken,
									Model model) {
		
		// 유저 정보 가지고 오기
		User user = (User)httpSession.getAttribute("principal");
		
		// 1. 결제 보안 처리를 위한 정보 가져오기
		// (1) tid 가져오기
	    String tid = SessionUtils.getStringAttributeValue("tid");
	    // (2) 주문 세부사항 가져오기
	    OrderDetail orderDetail = orderService.checkOrder(tid);
	    // (3) 예외 처리 - 만약 가주문 정보가 없다면, 정상적인 주문 경로 x -> return
	    if(orderDetail == null) {
	    	return "/cash/chargeFailed";
	    }
	    
	    // 2. 주문 세부사항을 통해 가주문 - 진주문 대조 확인 (인증)
	    Order checkOrderRecord = orderService.checkOrderRecord(user.getUserId(),orderDetail);
	    
	    // 3. 만약 주문 테이블이 있다면 ...
	    if(checkOrderRecord != null) {
	    	// (1) 인증된 유저는 카카오 결제 승인 요청
		    ApproveResponseDTO approveResponseDTO = kakaoPayService.payApprove(tid, pgToken);
		    
		    // (2) 결제 후 -> DB 상의 유저 캐쉬 변경
		    userService.updateUserCash(user.getUserId(),checkOrderRecord.amount);
		    
		    // (3) 주문 상태 변경
		    orderService.changeOrderStatus(checkOrderRecord.orderId);
		    
	    } else {
	    	return "/cash/chargeFailed";
	    }
	    
	    // 4. 유저 캐쉬 상태 변경
	    orderService.updateUsersCurrentCash(user.getUserId(),checkOrderRecord.getAmount());
	    User updateUser = userService.searchByUserId(user.getUserId());
	    
	    httpSession.setAttribute("principal",user);
	    model.addAttribute("user", updateUser);
    	return "/cash/chargeResult" ;
	}
728x90
반응형