💡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
반응형