- [셸위:게임 친구 매칭 사이트] 토스 페이먼츠 API - 서브몰 지급 정산 기능2024년 09월 25일
- Song hyun
- 작성자
- 2024.09.25.:18
728x90반응형[셸위:게임 친구 매칭 사이트] 토스 페이먼츠 API - 서브몰 지급 정산 기능
이번에는 지급 정산 기능에 대해 설명해보고자 한다. 토스 페이먼츠 API에서 지원하는 지급 정산 API는 총 세 개의 과정을 필요로 한다. 복잡해보이지만 한 번 해보면 간단한 기능인 만큼 따라해보면 좋을 것 같다!
- 유저가 강의 수익을 환전 신청
- 플랫폼은 현재 정산 가능 금액이 충분한지 확인
- 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
환전신청 승인 페이지에서 버튼을 클릭하게 되면 해당 메서드로 넘어오게 된다. 찬찬히 살펴보면...
- 먼저 넘어온 환전신청정보의 id를 통해 환전신청 기록을 DB에서 조회한다.
- 그리고 환전신청기록에 있는 userId를 통해 user의 현재 잔액을 체크하고, 현재 잔액보다 신청 금액이 크다면 통과시킨다.
- 그리고 나서는 셸위, 즉 플랫폼의 대금 지급 가능 금액을 조회한다. 이 역시 유저가 신청한 대금 지급 신청액보다 커야한다.
- 만약 환전이 가능하다면 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 다음글이전글이전 글이 없습니다.댓글