• 티스토리 홈
  • 프로필사진
    Song hyun
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
Song hyun
  • 프로필사진
    Song hyun
    • 분류 전체보기 (780)
      • 백준 (0)
      • 영어 (2)
        • Diary (0)
        • Toast Masters (2)
      • 메모 (13)
      • 설치 메뉴얼 (30)
      • Java (178)
      • MySQL (60)
      • JSP (67)
      • Springboot (46)
      • HTML,CSS, JS (71)
        • HTML (8)
        • CSS (12)
        • JavaScript (37)
        • HTML&CSS 스터디 (13)
      • C++ (7)
      • Linux (7)
      • JPA (34)
      • Kotlin (2)
      • Flutter (42)
      • Error Note (39)
      • 디자인 패턴 (12)
      • 디지털논리회로 (4)
      • 데이터베이스 시스템 (8)
      • 알고리즘 (7)
      • 운영체제 (3)
      • 이산수학 (3)
      • 인공지능 (1)
      • 자료 구조 (14)
        • 기본 개념 (14)
        • 자료구조 스터디 (0)
      • 💡My project (76)
        • 팩맨 : Java Swing 게임 제작 프로젝트 (6)
        • 네이트톡 : Java 소켓 통신 프로젝트 (4)
        • 포켓옥션 : HikariCP&JDBC CRUD 프.. (3)
        • 이지 부산 : BDIA-Devton 2024 프로.. (20)
        • 그린 유니버시티 : JSP를 사용한 학사관리 프로.. (1)
        • 애드 포커 : 웹 소켓과 Spring을 사용한 카.. (1)
        • 셸위 : 게임 친구 매칭 사이트 (21)
        • 다모아 : 개발자 중개 플랫폼 (20)
      • 📗스터디 (13)
        • CNN : 웹개발 스터디 (10)
        • Node&React로 유튜브 사이트 만들기 (3)
      • 📙독서 및 강연 기록 (36)
        • 강연 (14)
        • 독서 (22)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • [셸위:게임 친구 매칭 사이트] 카카오 페이 API - 결제 취소 기능
        2024년 09월 25일
        • Song hyun
        • 작성자
        • 2024.09.25.오후07:15
        728x90
        반응형

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

        https://whatsthatsound.tistory.com/675

         

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

        [셸위:게임 친구 매칭 사이트] 카카오 페이 API - 결제 기능 *참고하면 좋은 글https://whatsthatsound.tistory.com/674 [셸위:게임 친구 매칭 사이트] 토스 페이먼츠 API - 결제 기능[셸위:게임 친구 

        whatsthatsound.tistory.com


        환불 관리 페이지

         

        - 앞서 진행한 카카오페이 결제 API에서는 카카오페이 서버에 결제 정보를 저장했었다. 이번에는 해당 정보를 바탕으로 결제 취소기능을 만드는 것에 대해 설명해보고자 한다. 이번에도 똑같이 카카오페이 결제 취소 API를 사용해보고자 한다.

         

        https://developers.kakaopay.com/docs/payment/online/cancellation

         

        카카오페이 | 개발자센터

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

        developers.kakaopay.com

         

         

         내가 사용한 결제 취소 로직은 아래와 같다.

        나는 유저 측에서 전송한 결제 취소 정보를 승인하고, API 측으로 정보를 전송해주는 기능을 만들었다. 결제 취소의 경우는 이미 검증된 정보를 사용하는 것이기 때문에, 결제 때와 같이 까다로운 정보 검증이 필요하지는 않다고 선생님께서 말씀하셨다.

        관리자 측에서 환불 신청을 받아, API에 정보를 전송하는 로직

         

         

        1. AdminRefund.jsp


        -화면은 위와 같다. [환불 미완료] 버튼을 클릭하면, 해당 결제 정보를 서버에 fetch로 전송하게 된다.

        -이 때, 해당 결제 정보에서 platform(결제 방식-카카오/토스)에 따라 다른 메서드로 요청이 전송된다.

        <%@ page language="java" contentType="text/html; charset=UTF-8"
            pageEncoding="UTF-8"%>
        <%@ include file="/WEB-INF/view/layout/adminHeader.jsp"%>
        <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
        
        <link rel="stylesheet" href="/css/adminRefund.css">
        	<div class="main-board">
        	<h1>환불 내역 관리</h1>
        	<c:if test="${refundList != null}">
        			<table class="table">
        				<tr>
        					<th>id</th>
        					<th>주문번호</th>
        					<th>유저명</th>
        					<th>환불 신청 일자</th>
        					<th>플랫폼</th>
        					<th>처리 상태</th>
        				</tr>
        			<c:forEach var="refundDto" items="${refundList}">
        				<tr>
        					<td>${refundDto.id}</td>
        					<td>${refundDto.orderId}</td>
        					<td>${refundDto.userId}</td>
        					<td>${refundDto.createdAt}</td>
        					<td><c:if test="${refundDto.platform == 1 }">카카오페이</c:if>
        						<c:if test="${refundDto.platform == 2 }">토스페이먼츠</c:if>
        					</td>
        					<td><c:if test="${refundDto.status == 0 }">
        						<button class="refund-table" onclick="decideRefund(${refundDto.platform}, ${refundDto.id}, ${refundDto.orderId}, ${refundDto.userId},)">환불 미완료</button></c:if>
        						<c:if test="${refundDto.status == 1 }"><div>환불 처리 완료</div></c:if>
        					</td>
        					</tr>
        			</c:forEach>
        			</table>
        	</c:if>
        	
        	</div>
        	<script>
        		function decideRefund(platform, id){
        			console.log(platform, id);
        			
        			// 카카오페이 결제 - 환불 처리
        			if(platform == 1){
        				fetch(`http://localhost:8080/admin/refund/send-request/kakao`, {
        		            method: "POST",
        		            headers: {
        		                "Content-Type": "application/json",
        		                // "charset"은 필요하지 않음. 브라우저가 자동으로 처리
        		            },
        		            body: JSON.stringify({"id" : id}) // 요청 본문에 데이터를 포함
        		        })
        			}
        			}
        			
        			
        			// 토스 페이 환불 처리
        			if(platform == 2){
        				fetch(`http://localhost:8080/admin/refund/send-request/toss`, {
        		            method: "POST",
        		            headers: {
        		                "Content-Type": "application/json",
        		                // "charset"은 필요하지 않음. 브라우저가 자동으로 처리
        		            },
        		            body: JSON.stringify({"id" : id}) // 요청 본문에 데이터를 포함
        		        })
        			}
        			 
        		}
        		
        		
        	</script>
        
        <%@ include file="/WEB-INF/view/layout/adminFooter.jsp"%>

         

         

        2. AdminRefundController

        -컨트롤러 측에서는 service 단으로 API 요청을 하게끔 명령을 전송한다.

        	
        	/**
        	 * 카카오 - 환불 처리
        	 * @param refundData
        	 * @return
        	 */
        	@PostMapping("/send-request/kakao")
        	@ResponseBody
        	public String sendRefundToKakao(@RequestBody IdDTO id, Model model) {
        		
        		Refund refund = refundService.getRefundById(Integer.parseInt(id.getId()));
        		
        		refundService.updateRefundStatus(Integer.parseInt(id.id));
        		
        		// 환불 요청
        		RefundResponseDTO refundResponseDTO = refundService.readyRefundForKakao(refund);
        		
        		// 환불 결과 받아오기
        		new ResponseEntity<>(refundResponseDTO,HttpStatus.OK);
        		
        		List<RefundDTO> refundList = refundService.getAllRefundDto(10, 0);
        		model.addAttribute("refundList", refundList);
        
        		return "/admin/adminRefund";
        	}

         

         

        3. AdminRefundService

        -Service 측에서는 controller가 전송한 정보에 따라 요청을 처리하고, API에게 HttpEntity와 RestTemplate를 통해 HTTP 메세지를 통해 메세지를 전달한다. 이후 RefundResponseDTO에 응답 정보를 저장하게 된다!

        -getHeaders() 메서드에서는 내 Authorization -secret key의 정보와 method를 정의해 HttpHeaders를 만든다.

        /**
        	 * 카카오 페이 - 환불 처리
        	 * @param refund
        	 * @return
        	 */
        	public com.example.demo.dto.RefundResponseDTO readyRefundForKakao(Refund refundDto) {
        		
        		// order amount 찾기
        		Order order = orderRepository.selectOrderById(refundDto.orderId);
        		OrderDetail orderDetail = orderDetailRepository.selectOrderDetailByOrderId(order.orderId);
        		Long cancelAmount = order.getAmount();
        		
        		Map<String,String> parameters = new HashMap<>();
        		parameters.put("cid", "-----------");
        		parameters.put("tid", orderDetail.tid);
        		parameters.put("cancel_amount", (cancelAmount.toString()));
        		parameters.put("cancel_tax_free_amount", "0");
        		parameters.put("cancel_vat_amount", "0");
        		parameters.put("cancel_available_amount",order.getAmount().toString());
        		
        		// HttpMessage 만들기
        		HttpEntity<Map<String,String>> requestEntity = new HttpEntity(parameters,this.getKakaoHeaders());
        		System.out.println(requestEntity);
        		RestTemplate template = new RestTemplate();
        		// 환불 요청 url
                String url = "https://open-api.kakaopay.com/online/v1/payment/cancel";
                
                // 응답 객체 생성
                RefundResponseDTO refundResponse = template.postForObject(url, requestEntity, RefundResponseDTO.class);
                System.out.println(refundResponse);
                return refundResponse;
        	}

         

         

        4. AdminRefundResponseDTO.class

        RefundResponseDTO의 변수들은 Kakao Payment 결제취소 API의 Response Body와 동일하다!

        package com.example.demo.dto;
        
        import com.example.demo.repository.model.Amount;
        import com.example.demo.repository.model.ApprovedCancelAmount;
        import com.example.demo.repository.model.CancelAvailableAmount;
        import com.example.demo.repository.model.CanceledAmount;
        
        import lombok.AllArgsConstructor;
        import lombok.Builder;
        import lombok.Data;
        import lombok.NoArgsConstructor;
        import lombok.ToString;
        
        
        @ToString
        @Data
        @AllArgsConstructor
        @NoArgsConstructor
        @Builder
        public class RefundResponseDTO {
        	
        	public String aid;
        	public String tid;
        	public String cid;
        	public String status;
        	public String partnerOrderId;
        	public String partnerUserId;
        	public String paymentMethodType;
        	public Amount amount;
        	public ApprovedCancelAmount approvedCancelAmount;
        	public CanceledAmount canceledAmount;
        	public CancelAvailableAmount cancelAvailableAmount;
        	public String itemName;
        	public String item_code;
        	public Integer quantity;
        	public String created_at;
        	public String approved_at;
        	public String canceled_at;
        	public String payload;
        }

        -결제 API를 하고 난 뒤라 그런지, 결제 취소 API의 경우에는 한결 더 수월했다!

        -결제가 제대로 승인되지 않은 경우에는 에러가 발생할 수 있으니 유의하면 좋다...

        728x90
        반응형

        '💡My project > 셸위 : 게임 친구 매칭 사이트' 카테고리의 다른 글

        [셸위:게임 친구 매칭 사이트] 토스 페이먼츠 API - 서브몰 생성 기능  (0) 2024.09.25
        [셸위:게임 친구 매칭 사이트] 토스 페이먼츠 API - 결제 취소 기능  (0) 2024.09.25
        [셸위:게임 친구 매칭 사이트] 카카오 페이 API - 결제 기능  (0) 2024.09.25
        [셸위:게임 친구 매칭 사이트] 토스 페이먼츠 API - 결제 기능  (0) 2024.09.25
        [셸위:게임 친구 매칭 사이트] 최종 정리  (2) 2024.09.25
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
      • [셸위:게임 친구 매칭 사이트] 카카오 페이 API - 결제 취소 기능
      • 안녕하세요
      • 감사해요
      • 잘있어요

      티스토리툴바

      단축키

      내 블로그

      내 블로그 - 관리자 홈 전환
      Q
      Q
      새 글 쓰기
      W
      W

      블로그 게시글

      글 수정 (권한 있는 경우)
      E
      E
      댓글 영역으로 이동
      C
      C

      모든 영역

      이 페이지의 URL 복사
      S
      S
      맨 위로 이동
      T
      T
      티스토리 홈 이동
      H
      H
      단축키 안내
      Shift + /
      ⇧ + /

      * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.