• 티스토리 홈
  • 프로필사진
    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.:18
        728x90
        반응형

        [셸위:게임 친구 매칭 사이트] 토스 페이먼츠 API - 서브몰 지급 정산 기능

         

         이번에는 지급 정산 기능에 대해 설명해보고자 한다. 토스 페이먼츠 API에서 지원하는 지급 정산 API는 총 세 개의 과정을 필요로 한다. 복잡해보이지만 한 번 해보면 간단한 기능인 만큼 따라해보면 좋을 것 같다!

         

        1. 유저가 강의 수익을 환전 신청
        2. 플랫폼은 현재 정산 가능 금액이 충분한지 확인
        3. 2에서 조건을 충족한다면, 유저의 서브몰 정보로 지급 정산 요청을 Toss Payments API 서버에 전송!

        지급 정산 로직을 그림으로 그려보았다

         

        현재 소지중인 렉처머니(환전용 포인트)와 환전 신청 금액을 대조하는 과정이나, 유저의 유효성 정보 체크 같은 부분은 일단 제외했다. 간단히 정리해보면 (1) 내 플랫폼이 얼마까지 대금을 지급해줄 수 있는지 확인 후 (2) 유저의 서브몰 정보에 대금 지급 요청을 하게 된다. 서브몰이란 대금 지급을 받을 객체, 쉽게 말하면 수취인의 정보이다. 하위 상점이라고도 말하는 것 같다.

         

         실제로 하위 상점을 등록할 때에는 계좌 실명 인증등의 KYC 보안 정책을 따라 인증 절차가 있다고 하는데, 내가 맡은 부분은 관리자 측에서의 대금지급 승인이기 때문에 오늘은 그 부분만 이야기할 것이다!

         


         

        1. adminExchange.jsp

        -아래의 코드는 환전 신청 승인 시 들어가게 되는 jsp의 소스코드이다. 환전 신청의 상태에 따라 버튼을 보여주기도/보여주지 않기도 한다. 

        -환전 신청 승인 버튼을 클릭하면 button-onclick의 fetch함수를 통해 Controller 측으로 흐름이 넘어가게 된다. 

        <%@ 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="${exchangeList != null}">
        			<table class="table">
        				<tr>
        					<th>id</th>
        					<th>유저ID</th>
        					<th>서브몰ID</th>
        					<th>환전금액</th>
        					<th>환전신청일자</th>
        					<th>처리 상태</th>
        				</tr>
        			<c:forEach var="exchange" items="${exchangeList}">
        				<tr>
        					<td>${exchange.id}</td>
        					<td>${exchange.userId}</td>
        					<td>${exchange.submallId}</td>
        					<td>${exchange.amount}</td>
        					<td>${exchange.createdAt}</td>
        					<td><c:if test="${exchange.status == 0 }"><button class="refund-table" value="${exchange.id}" onclick="decideRefund(this)">환전 미완료</button></c:if>
        						<c:if test="${exchange.status != 0 }"><div>환전 처리 완료</div></c:if>
        					</td>
        				</tr>
        			</c:forEach>
        			</table>
        	</c:if>
        	
        	</div>
        	<script>
        	function decideRefund(data) {
            	var a = data.value ; 
            	console.log(a);
                fetch(`http://localhost:8080/admin/exchange/send-request`, {
                    method: "POST",
                    headers: {
                        "Content-Type": "application/json"
                    },
                    body: JSON.stringify({ "id": a })
                })
                .catch(error => {
                    console.error('요청 처리 중 오류 발생:', error);
                });
            }	
        	
        	</script>
        
        <%@ include file="/WEB-INF/view/layout/adminFooter.jsp"%>

         

         

        2. AdminExchangeController.java

        환전신청 승인 페이지에서 버튼을 클릭하게 되면 해당 메서드로 넘어오게 된다. 찬찬히 살펴보면...

        1. 먼저 넘어온 환전신청정보의 id를 통해 환전신청 기록을 DB에서 조회한다.
        2. 그리고 환전신청기록에 있는 userId를 통해 user의 현재 잔액을 체크하고, 현재 잔액보다 신청 금액이 크다면 통과시킨다.
        3. 그리고 나서는 셸위, 즉 플랫폼의 대금 지급 가능 금액을 조회한다. 이 역시 유저가 신청한 대금 지급 신청액보다 커야한다.
        4. 만약 환전이 가능하다면 API를 사용해 Toss Payments 서버에 환전 요청을 하게 된다. 또한 유저의 환전 신청 정보의 status를 변경하고 / 유저의 현재 포인트는 차감시킨다!
        	
        	/**
        	 * 환전 신청 처리
        	 * @param id
        	 * @return
        	 * @throws InterruptedException 
        	 * @throws IOException 
        	 */
        	@ResponseBody
        	@PostMapping("/send-request")
        	public String sendExchangeRequest(@RequestBody IdDTO id, Model model) throws IOException, InterruptedException {
        		
        		// 1. 환전 신청 id 찾기
        		int exchangeId = Integer.parseInt(id.getId());
        		
        		// 2. DB에서 환전 신청 기록 찾기
        		RegisterExchange exchageRecord = registerExchangeService.getRegisterExchange(exchangeId);
        		
        		// 3. 해당 유저 잔액 - 환전 금액 대조
        		// 유저의 현재 잔액 > 신청 금액 이어야 한다.
        		User user = userService.searchByUserId(exchageRecord.userId);
        		
        		// 4. 셸위 잔액 조회
        		Boolean flag = registerExchangeService.sendRequestExchange(exchageRecord);
        		
        		// 5. 환전 처리
        		// (1) 만약 환전이 가능하다면? (잔액 > 환전 요청액)
        		if(flag == true) {
        			// 환전 요청
        			registerExchangeService.sendExchangeRequest(exchageRecord);
        			// status 설정 - 환전 처리 중
        			registerExchangeService.setStatusToFinished(exchageRecord);
        		}
        		
        		
        		List<RegisterExchange> exchangeList = registerExchangeService.getAllExchangeList(10,0);
        		model.addAttribute("exchangeList", exchangeList);
        		
        		return "/admin/adminExchange";
        	}

         

         

        * API에 요청한 메서드는 아래와 같다!

          
           /**
            * 환전 요청하기
            * @param exchageRecord
            * @throws IOException
            * @throws InterruptedException
            */
           public void sendExchangeRequest(RegisterExchange exchageRecord) throws IOException, InterruptedException {
        	   String requestBody = String.format(
        	            "[{\"subMallId\":\"%s\",\"payoutAmount\":%s,\"payoutDate\":\"%s\"}," +
        	            "{\"subMallId\":\"%s\",\"payoutAmount\":%s,\"payoutDate\":\"%s\"}]",
        	            exchageRecord.getSubmallId(), // 서브몰 ID 
        	            exchageRecord.getAmount()*0.7, // 환전 신청 액수
        	            "2024-09-03",  // 지급일
        	            exchageRecord.getSubmallId(), // 서브몰 ID 
        	            exchageRecord.getAmount(), // 환전 신청 액수
        	            "2024-09-03"   // 지급일
        	        );
        	   
        	   HttpRequest request = HttpRequest.newBuilder()
        			.uri(URI.create("https://api.tosspayments.com/v1/payouts/sub-malls/settlements"))
        			.header("Authorization", "Base64 인증키")
        			.header("Content-Type", "application/json")
        			.method("POST", HttpRequest.BodyPublishers.ofString(requestBody))
        		    .build();
        	    HttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
        		System.out.println(response.body());
        		return;
        	}

         

         

         개념이 낯설어서 그렇지, 한 번 해보면 크게 어렵지는 않은 대금 지급 요청 API!! 다만 이래저래 검증할 구간이 많아서 까다로웠다. 다음에 구현한다면 인증 및 검증 절차를 더욱 꼼꼼하게 구현하고 싶다.

        728x90
        반응형

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

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

        티스토리툴바