Skip to main content

개요

Booking 서비스의 구매 도메인은 공개 구매 요청 생성, 조회, 결제 처리 기능을 제공합니다. MainPay 결제 게이트웨이와의 연동을 통한 온라인 결제를 지원합니다.

Types

PublicPurchase

공개 구매 요청 객체
type PublicPurchase {
  id: ID!
  status: String!
  datePricesToken: String!
  accommodationId: ID!
  roomTypeId: ID!
  useStartAt: Date!
  useExpireAt: Date!
  data: String!
}

MainPayPurchaseSignature

MainPay 결제 서명 정보
type MainPayPurchaseSignature {
  signature: String!
  timestamp: String!
  mbrRefNo: String!
  mbrNo: String!
  aid: String!
  pcUrl: String!
  mobileUrl: String!
}

Queries

getAccommodationPublicPurchases

숙박시설의 공개 구매 요청 목록을 페이지네이션하여 조회합니다.

GraphQL Signature

query GetAccommodationPublicPurchases(
  $accommodationId: ID!
  $first: Int
  $after: String
  $last: Int
  $before: String
) {
  getAccommodationPublicPurchases(
    accommodationId: $accommodationId
    first: $first
    after: $after
    last: $last
    before: $before
  ) {
    edges {
      cursor
      node {
        id
        status
        accommodationId
        roomTypeId
        useStartAt
        useExpireAt
      }
    }
    pageInfo {
      hasNextPage
      hasPreviousPage
      startCursor
      endCursor
    }
    totalCount
  }
}

파라미터

accommodationId
ID!
required
조회할 숙박시설 ID
first
Int
앞에서부터 가져올 항목 수 (forward pagination)
after
String
이 커서 이후의 항목들을 가져옴
last
Int
뒤에서부터 가져올 항목 수 (backward pagination)
before
String
이 커서 이전의 항목들을 가져옴

예제

query {
  getAccommodationPublicPurchases(
    accommodationId: "01HQKS9V8X2N3P4Q5R"
    first: 10
  ) {
    edges {
      node {
        id
        status
        useStartAt
        useExpireAt
      }
    }
    totalCount
  }
}

getSinglePublicPurchase

단일 공개 구매 요청을 ID로 조회합니다.

GraphQL Signature

query GetSinglePublicPurchase($id: ID!) {
  getSinglePublicPurchase(id: $id) {
    id
    status
    datePricesToken
    accommodationId
    roomTypeId
    useStartAt
    useExpireAt
    data
  }
}

파라미터

id
ID!
required
조회할 구매 요청 ID

getAccommodationPgConfig

숙박시설의 PG(결제 게이트웨이) 설정을 조회합니다.

GraphQL Signature

query GetAccommodationPgConfig($accommodationId: ID!) {
  getAccommodationPgConfig(accommodationId: $accommodationId) {
    accommodationId
    data
  }
}

파라미터

accommodationId
ID!
required
조회할 숙박시설 ID

Mutations

createPublicPurchaseRequest

새로운 공개 구매 요청을 생성합니다.

GraphQL Signature

mutation CreatePublicPurchaseRequest($input: CreatePublicPurchaseRequestInput!) {
  createPublicPurchaseRequest(input: $input) {
    id
    status
    accommodationId
    roomTypeId
    useStartAt
    useExpireAt
  }
}

입력 파라미터

input CreatePublicPurchaseRequestInput {
  datePricesToken: String!
  accommodationId: ID!
  roomTypeId: ID!
  useStartAt: Date!
  useExpireAt: Date!
  person: Int!
  overSleeps: Int!
  request: String
  guestName: String!
  phone: String!
  roomTypeName: String!
  couponUsageHash: String
  claimedDiscountAmount: Int
}
datePricesToken
String!
required
날짜별 가격 정보 토큰
accommodationId
ID!
required
숙박시설 ID
roomTypeId
ID!
required
객실 타입 ID
useStartAt
Date!
required
사용 시작일
useExpireAt
Date!
required
사용 종료일
person
Int!
required
투숙 인원
overSleeps
Int!
required
추가 인원
guestName
String!
required
투숙객 이름
phone
String!
required
투숙객 연락처
roomTypeName
String!
required
객실 타입 이름
request
String
특별 요청사항
couponUsageHash
String
쿠폰 사용 해시
claimedDiscountAmount
Int
할인 금액

예제

mutation {
  createPublicPurchaseRequest(input: {
    datePricesToken: "token_12345"
    accommodationId: "01HQKS9V8X2N3P4Q5R"
    roomTypeId: "01HQKS9V8X2N3P4Q5S"
    useStartAt: "2025-01-15"
    useExpireAt: "2025-01-16"
    person: 2
    overSleeps: 0
    guestName: "홍길동"
    phone: "01012345678"
    roomTypeName: "디럭스 더블"
    request: "조용한 방 부탁드립니다"
  }) {
    id
    status
  }
}

requestMainpayPurchaseReady

MainPay 결제를 준비하고 결제 서명을 발급합니다.

GraphQL Signature

mutation RequestMainpayPurchaseReady($input: MainPayPurchaseRequest!) {
  requestMainpayPurchaseReady(input: $input) {
    signature
    timestamp
    mbrRefNo
    mbrNo
    aid
    pcUrl
    mobileUrl
  }
}

입력 파라미터

input MainPayPurchaseRequest {
  publicPurchaseId: ID!
  accommodationId: ID!
  amount: Int!
  goodsName: String!
  name: String!
  phone: String!
  email: String
  redirectionHost: String!
  accommodationName: String!
}
publicPurchaseId
ID!
required
구매 요청 ID
amount
Int!
required
결제 금액 (원)
goodsName
String!
required
상품명
name
String!
required
구매자 이름
phone
String!
required
구매자 연락처
redirectionHost
String!
required
결제 완료 후 리다이렉션될 호스트 URL

응답

결제 페이지로 이동하기 위한 서명 정보를 반환합니다.
pcUrl
String!
PC 결제 페이지 URL
mobileUrl
String!
모바일 결제 페이지 URL

resolveMainpayPurchase

MainPay 결제 결과를 확인하고 처리합니다.

GraphQL Signature

mutation ResolveMainpayPurchase($input: MainPayPurchaseResolve!) {
  resolveMainpayPurchase(input: $input) {
    complete
    resultCode
    resultMessage
  }
}

입력 파라미터

publicPurchaseId
ID!
required
구매 요청 ID
authToken
String!
required
MainPay 인증 토큰

응답

complete
Boolean!
결제 완료 여부
resultCode
String!
결제 결과 코드
resultMessage
String
결제 결과 메시지

waitPublicPurchaseResolved

구매 요청이 완료될 때까지 대기하고 예약 객체를 반환합니다.

GraphQL Signature

mutation WaitPublicPurchaseResolved($id: ID!) {
  waitPublicPurchaseResolved(id: $id) {
    id
    # Reservation 필드들
  }
}
이 mutation은 결제 완료 후 예약이 생성될 때까지 대기하는 폴링 방식으로 동작합니다.

결제 흐름

  1. 구매 요청 생성: createPublicPurchaseRequest
  2. 결제 준비: requestMainpayPurchaseReady로 결제 URL 획득
  3. 결제 진행: 반환된 URL로 사용자를 리다이렉션하여 MainPay 결제 진행
  4. 결제 완료: resolveMainpayPurchase로 결제 결과 확인
  5. 예약 확인: waitPublicPurchaseResolved로 생성된 예약 조회

관련 API