예약/결제 제어
관리자의 예약/결제 조회, 취소, 변경, 대리 예약 API입니다. 모든 요청에 관리자 세션 쿠키가 필요합니다.
예약/결제 목록 조회
GET /admin/reservations
지점의 예약/결제 현황을 조회합니다.
Headers
| 이름 | 필수 | 설명 |
|---|---|---|
Cookie | O | 관리자 세션 쿠키 |
Query Parameters
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
branch | String | O | 지점 영문명 (지점 코드 참고) |
base_date | String | O | 기준 날짜 (yyyyMMdd) |
base_hour | String | O | 기준 시간 (0 ~ 23) |
GET /api/admin/reservations?branch=Gwanghwamun&base_date=20260305&base_hour=14
Response
- 200 성공
- 403 권한 없음
{
"status": "success",
"errorType": null,
"errorCode": null,
"message": null,
"data": {
"booking": [
{ "id": "abc123", "time": "1-202603051400" }
],
"paid": [
{ "id": "142", "time": "2-202603051500" },
{ "id": "142", "time": "2-202603051510" }
],
"bookingMargin": ["1-202603051350"],
"paidMargin": ["2-202603051450", "2-202603051530"],
"disabledRooms": ["5"]
}
}
data 필드
| 필드 | 타입 | 설명 |
|---|---|---|
booking | IdTime[] | 예약 진행 중 목록 (ID + 슬롯) |
paid | IdTime[] | 결제 완료 목록 (ID + 슬롯) |
bookingMargin | String[] | 예약 진행 중 마진 슬롯 |
paidMargin | String[] | 결제 완료 마진 슬롯 |
disabledRooms | String[] | 비활성화된 룸 번호 |
IdTime
| 필드 | 타입 | 설명 |
|---|---|---|
id | String | 예약/결제 ID (상세 조회에 사용) |
time | String | 슬롯 ({room}-{YYYYMMDDHHmm}) |
{
"status": "error",
"errorType": "AuthorizationException",
"errorCode": null,
"message": "해당 지점에 접근 권한이 없습니다.",
"data": null
}
예약/결제 상세 조회
GET /admin/reservation/{id}
개별 예약/결제를 상세 조회합니다. dataType에 따라 응답 구조가 다릅니다.
Path Parameters
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
id | String | O | 목록 조회에서 받은 ID |
Response
- 200 결제 완료
- 200 예약 진행 중
- 403 권한 없음
{
"status": "success",
"errorType": null,
"errorCode": null,
"message": null,
"data": {
"dataType": "paid",
"paidName": "홍길동",
"paidMobileNum": "01012345678",
"paidEmail": "user@example.com",
"paidStartDateTime": "202603051400",
"paidEndDateTime": "202603051550",
"paidBranchEng": "Gwanghwamun",
"paidBranchKor": "광화문",
"paidRoom": "1",
"paidMachine": "Capsule A",
"paidTotalAmount": "12000",
"paidMethod": "카드",
"paidDateTime": "202603051230"
}
}
{
"status": "success",
"errorType": null,
"errorCode": null,
"message": null,
"data": {
"dataType": "booking",
"bookingTtl": 1500,
"bookingStatus": "paymentTab",
"bookingBranchEng": "Gwanghwamun",
"bookingBranchKor": "광화문",
"bookingRoom": "1",
"bookingMachine": "Capsule A",
"bookingStartDateTime": "202603051400",
"bookingEndDateTime": "202603051600",
"bookingAmount": "12000",
"bookingName": "홍길동",
"bookingMobileNum": "01012345678",
"bookingEmail": null,
"bookingVirtualaccountBankName": null,
"bookingVirtualaccountAccountNumber": null,
"bookingVirtualaccountDueDate": null
}
}
{
"status": "error",
"errorType": "AuthorizationException",
"errorCode": null,
"message": "해당 지점에 접근 권한이 없습니다.",
"data": null
}
결제 완료 (dataType = "paid") 필드
| 필드 | 타입 | Nullable | 설명 |
|---|---|---|---|
dataType | String | N | "paid" |
paidName | String | N | 예약자 이름 |
paidMobileNum | String | N | 휴대폰 번호 |
paidEmail | String | Y | 이메일 |
paidStartDateTime | String | N | 시작 시간 |
paidEndDateTime | String | N | 종료 시간 |
paidBranchEng | String | N | 지점 영문명 |
paidBranchKor | String | N | 지점 한글명 |
paidRoom | String | N | 방 번호 |
paidMachine | String | N | 머신(침대) 이름 |
paidTotalAmount | String | N | 결제 금액 |
paidMethod | String | N | 결제 수단 |
paidDateTime | String | N | 결제 완료 시간 |
예약 진행 중 (dataType = "booking") 필드
| 필드 | 타입 | Nullable | 설명 |
|---|---|---|---|
dataType | String | N | "booking" |
bookingTtl | Long | N | Redis TTL (남은 초) |
bookingStatus | String | N | beforePaymentTab / paymentTab / waitingForDeposit |
bookingBranchEng | String | N | 지점 영문명 |
bookingBranchKor | String | N | 지점 한글명 |
bookingRoom | String | N | 방 번호 |
bookingMachine | String | N | 머신 이름 |
bookingStartDateTime | String | N | 시작 시간 |
bookingEndDateTime | String | N | 종료 시간 |
bookingAmount | String | Y | 결제 금액 |
bookingName | String | Y | 예약자 이름 |
bookingMobileNum | String | Y | 휴대폰 번호 |
bookingEmail | String | Y | 이메일 |
bookingVirtualaccountBankName | String | Y | 가상계좌 은행명 |
bookingVirtualaccountAccountNumber | String | Y | 가상계좌 번호 |
bookingVirtualaccountDueDate | String | Y | 입금 기한 |
취소 (환불)
DELETE /admin/reservation/{id}
진행 중인 예약을 취소하거나 결제 완료 건을 환불합니다.
Path Parameters
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
id | String | O | 예약/결제 ID |
Query Parameters
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
bookingStatus | String | O | 상세 조회에서 확인한 현재 상태 |
가상계좌 입금 완료 후 환불
가상계좌 입금 완료 건을 취소할 경우 아래 추가 파라미터가 필수입니다:
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
refundReceiveAccountBank | String | O | 환불 은행 코드 (은행 코드 참고) |
refundReceiveAccountNumber | String | O | 환불 계좌번호 |
refundReceiveAccountHolderName | String | O | 예금주 |
Response
- 200 성공
- 400 파라미터 오류
- 403 권한 없음
- 404 조회 실패
{
"status": "success",
"errorType": null,
"errorCode": null,
"message": null,
"data": null
}
{
"status": "error",
"errorType": "IllegalArguemntError",
"errorCode": null,
"message": "bookingStatus 값이 올바르지 않습니다.",
"data": null
}
{
"status": "error",
"errorType": "AuthorizationException",
"errorCode": null,
"message": "해당 지점에 접근 권한이 없습니다.",
"data": null
}
{
"status": "error",
"errorType": "ResourceNotFoundException",
"errorCode": null,
"message": "해당 예약을 찾을 수 없습니다.",
"data": null
}
변경
PUT /admin/reservation/{payId}
결제 완료된 예약의 룸/시간을 변경합니다. 결제 금액은 변동되지 않습니다.
Path Parameters
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
payId | String | O | 결제 ID |
Request Body
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
room | String | O | 변경할 방 번호 (최대 10자) |
startDateTime | String | O | 변경할 시작 시간 (YYYYMMDDHHmm, 정확히 12자) |
endDateTime | String | O | 변경할 종료 시간 (YYYYMMDDHHmm, 정확히 12자) |
reason | String | X | 변경 사유 (최대 500자) |
요청 예시
{
"room": "3",
"startDateTime": "202603051500",
"endDateTime": "202603051700",
"reason": "고객 요청으로 룸 변경"
}
Response
- 200 성공
- 400 검증 실패
- 403 권한 없음
- 409 시간 충돌
{
"status": "success",
"errorType": null,
"errorCode": null,
"message": null,
"data": null
}
{
"status": "error",
"errorType": "IllegalArguemntError",
"errorCode": null,
"message": "최대 예약 시간은 5시간입니다.",
"data": null
}
{
"status": "error",
"errorType": "AuthorizationException",
"errorCode": null,
"message": "해당 지점에 접근 권한이 없습니다.",
"data": null
}
{
"status": "error",
"errorType": "ResourceAlreadyExistException",
"errorCode": null,
"message": "해당 시간대에 이미 예약이 존재합니다.",
"data": null
}
최대 예약 시간
최대 예약 시간은 5시간입니다.
결제 없이 대리 예약
관리자가 결제 없이 예약을 등록하는 2단계 프로세스입니다.
Step 1: 예약 시도
POST /admin/reservation
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
branch | String | O | 지점 영문명 (지점 코드 참고) |
room | int | O | 방 번호 |
startDateTime | String | O | 시작 시간 (YYYYMMDDHHmm) |
endDateTime | String | O | 종료 시간 (YYYYMMDDHHmm) |
요청 예시
{
"branch": "Gwanghwamun",
"room": 1,
"startDateTime": "202603051400",
"endDateTime": "202603051600"
}
성공 시 ADMIN_PAY_SESSIONID 쿠키 발급 (5분 TTL).
- 200 성공
- 403 권한 없음
- 409 슬롯 점유
Set-Cookie: ADMIN_PAY_SESSIONID=admin-abc123; Path=/; HttpOnly
{
"status": "success",
"errorType": null,
"errorCode": null,
"message": null,
"data": null
}
{
"status": "error",
"errorType": "AuthorizationException",
"errorCode": null,
"message": "해당 지점에 접근 권한이 없습니다.",
"data": null
}
{
"status": "error",
"errorType": "ResourceAlreadyExistException",
"errorCode": null,
"message": "이미 예약 진행 중인 시간대입니다.",
"data": null
}
Step 2: 예약 확정
POST /admin/payment
Headers
| 이름 | 필수 | 설명 |
|---|---|---|
Content-Type | O | application/json |
Cookie | O | ADMIN_PAY_SESSIONID (Step 1에서 발급) |
Request Body
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
name | String | X | 예약자 이름 (최대 50자) |
mobileNum | String | X | 휴대폰 번호 (최대 20자) |
email | String | X | 이메일 (최대 100자) |
reason | String | X | 대리 예약 사유 (최대 500자) |
정보
회원/비회원 모두 등록 가능합니다. 예약자 정보는 선택사항입니다.
요청 예시
{
"name": "홍길동",
"mobileNum": "01012345678",
"email": null,
"reason": "전화 예약 접수"
}
- 200 성공
- 401 세션 만료
- 403 권한 없음
{
"status": "success",
"errorType": null,
"errorCode": null,
"message": null,
"data": null
}
{
"status": "error",
"errorType": "ResourceTimeOutException",
"errorCode": null,
"message": "예약 세션이 만료되었습니다.",
"data": null
}
{
"status": "error",
"errorType": "AuthorizationException",
"errorCode": null,
"message": "해당 지점에 접근 권한이 없습니다.",
"data": null
}
가상계좌 발급
관리자가 가상계좌를 발급하는 2단계 프로세스입니다.
Step 1: 예약 시도
위의 대리 예약 Step 1과 동일합니다.
Step 2: 가상계좌 발급
POST /admin/v2/virtual-accounts
Headers
| 이름 | 필수 | 설명 |
|---|---|---|
Content-Type | O | application/json |
Cookie | O | ADMIN_PAY_SESSIONID (Step 1에서 발급) |
Request Body
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
amount | int | O | 결제 금액 |
orderName | String | O | 주문명 (1~100자) |
name | String | O | 예약자 이름 (최대 100자) |
mobileNum | String | O | 휴대폰 번호 |
email | String | X | 이메일 |
bankCode | String | O | 은행 코드 (은행 코드 참고) |
요청 예시
{
"amount": 12000,
"orderName": "광화문 1번방 14:00~16:00",
"name": "홍길동",
"mobileNum": "01012345678",
"email": null,
"bankCode": "88"
}
- 200 성공
- 401 세션 만료
- 403 권한 없음
{
"status": "success",
"errorType": null,
"errorCode": null,
"message": null,
"data": {
"dataType": "virtualaccount"
}
}
{
"status": "error",
"errorType": "ResourceTimeOutException",
"errorCode": null,
"message": "예약 세션이 만료되었습니다.",
"data": null
}
{
"status": "error",
"errorType": "AuthorizationException",
"errorCode": null,
"message": "해당 지점에 접근 권한이 없습니다.",
"data": null
}
입금 기한
가상계좌 입금 기한은 10분입니다. 미입금 시 자동 취소됩니다 (Redis TTL 만료 → 네이버 예약 자동 취소).