Spring Boot - 부트페이 (1) 설명, 구조도

ysh·2023년 10월 3일
1

인턴십

목록 보기
6/25

Bootpay

  • 부트페이(Bootpay)는 다양한 결제 수단을 통합하여 제공하고, 개발자들이 이를 쉽게 통합할 수 있도록 도와주는 대한민국의 결제 게이트웨이 서비스 플랫폼.
  • 구현 목표는 프론트에서 넘겨준 데이터(여기선 영수증ID로 봐도 될 듯)로 백엔드에서 결제 요청을 처리, 특정 조건에서 취소되게 하는 것.
  • 공식 개발 문서
    : 솔직히 개발문서가 너무 잘 되어있고, 코드도 간단해서 구성만 이해한다면 따로 코드로 보여줄 필요가 있을까 싶다.

    https://docs.bootpay.co.kr/?front=unity&backend=java#introduce

구조도 (결제 순서도)

Bootpay.requestPayment

저 윗 단계가 Bootpay.requestPayment만 한 번 써주면 끝이 난다.
호출 시 알아서 우리가 관리자 페이지에서 설정한 PG사(결제 대행? 중개사?)로 결제 페이지가 뜨고, 거기서 사용자가 결제를 진행할 때 까지의 순서다.
옵션으로 더 넣을 수 있는 것들도 있고,
데이터 전체가 아래와 같이 들어가 직관적이고 혹시 모르겠더라도 공식문서 한 번 쓱 훑어보면 이해가 갈 것이다.
(공식 문서 - 클라이언트 연동하기 - 1. 일반결제 구현하기)

  • 승인 전 로직 적용을 위해 extra에 separately_confirmed 옵션은 true로 해주자.
const response = await Bootpay.requestPayment({
  "application_id": "59a4d323396fa607cbe75de4",
  "price": 1000,
  "order_name": "테스트결제",
  "order_id": "TEST_ORDER_ID",
  "pg": "다날",
  "method": "카드",
  "tax_free": 0,
  "user": {
    "id": "회원아이디",
    "username": "회원이름",
    "phone": "01000000000",
    "email": "test@test.com"
  },
  "items": [
    {
      "id": "item_id",
      "name": "테스트아이템",
      "qty": 1,
      "price": 1000
    }
  ],
  "extra": {
    "open_type": "iframe",
    "card_quota": "0,2,3",
    "escrow": false
    // 승인 전 로직을 다루기 위해서 설정해줌.
    "separately_confirmed" : true
  }
})

confirm(data) 메소드 호출됨

결제 도중 결제창을 닫거나 정상적으로 결제가 진행되지 않은 상황에는 다른 메소드들이 호출되지만, 정상적으로 진행되었다면 confirm(data) 메소드가 호출된다. (우리가 하는 거 아님)
data에 결제 승인 전 영수증 ID가 포함되서 넘어온다.
나는 백엔드에서 승인, 취소 등의 로직을 전부 수행할 것이기 때문에 영수증 ID를 백엔드로 넘겨줄 것이다.

Bootpay.confirm 호출

위에서 말했듯 백엔드에서 승인 로직을 수행할 것이기 때문에, confirm은 호출하지 않고, 백엔드에서 다른 함수를 사용하여 승인 요청을 할 것이다.
이 과정에서, 위의 requestPayment에서 넘겨주는 데이터가 조작됐을 가능성을 대비해,
DB에 저장해놓은 order(주문 정보)의 가격과 승인 전 영수증의 가격이 일치하는 지 확인 후,
일치하지 않을 시 승인 요청을 하지 않는다. (미승인 상태로 남겨놓음)

결제 결과 전달

서버에서 승인과 취소(미승인) 로직을 실행하기 때문에, 메소드가 호출되지 않는 것으로 보인다.
부트페이 관리자 페이지에서 웹훅 설정을 할 시 특정 이벤트(결제 완료 / 취소 등) 발생 시
설정한 주소로 웹훅 정보가 전달되고, 그 정보로 가격 비교 등의 검토를 할 수 있지만,
우리는 승인 전에 값을 검토하기 때문에 웹훅은 안쓴다.
(웹훅 설정은 부트페이 공식문서 - 결제 결과 통지 받기 - 서버로 통지 받기 에서 설명해준다.)

정리

내 나름대로 정리해보자면,

  1. Bootpay.requestPayment로 구매 정보 등을 실어 보내면, 부트페이에서 알아서 구매창, 결제 등을 구현해준다.
  2. 그 후 사용자가 결제 진행 시 승인 전 데이터가 confirm 메소드를 통해 들어오고,
    메소드 안에 값 검토를 통한 승인과 취소(미승인) 로직을 구현한다. (우리는 백엔드에서 구현할 것이기 때문에 프론트에서는 값을 넘겨주기만 한다.)
  3. 백엔드에서 값을 검토하고, 결과에 따라 승인하거나 미승인 상태로 둔다.

실제로 서비스 할 때는 DB에 item테이블이나 order테이블로 따로 저장하여 그 값들과 비교해야 하겠지만, 간단하게 구현할 것이므로 order 테이블(값 입력 시에 바로 order 테이블에 저장)만 만들어 주문 가격이 조작되지 않았는 지만 검사한다.

profile
유승한

0개의 댓글

관련 채용 정보