Orders API

주문 생성 및 주문 관리 API 문서입니다.

모든 Orders API는 인증이 필요합니다. API Key를 Authorization: Bearer <API_KEY> 헤더로 제공하세요.

주문 상태 코드

코드설명
20PAID결제 완료 (충전금 차감)
25PDF_READYPDF 생성 완료
30CONFIRMED제작 확정 (출력일 배정)
40IN_PRODUCTION제작 진행 중
45COMPLETED항목 제작 완료 (개별)
50PRODUCTION_COMPLETE전체 제작 완료
60SHIPPED발송 완료
70DELIVERED배송 완료
80CANCELLED취소
81CANCELLED_REFUND환불 완료
90ERROR오류

상태 전이 (State Transitions)

주문 상태는 다음과 같은 흐름으로 전이됩니다. 파트너 관점에서의 전이 주체를 함께 표기합니다.

FromTo주체비고
PAIDPDF_READY자동PDF 생성 완료 시
PDF_READYCONFIRMED관리자제작 확정
CONFIRMEDIN_PRODUCTION관리자제작 시작
IN_PRODUCTIONCOMPLETED관리자개별 항목 제작 완료
COMPLETEDPRODUCTION_COMPLETE관리자전체 제작 완료
PRODUCTION_COMPLETESHIPPED관리자운송장 번호 포함
SHIPPEDDELIVERED관리자배송 완료 확인
PAIDCANCELLED_REFUND파트너파트너 취소, 자동 환불

파트너 가능 액션

액션가능 상태설명
주문 취소PAIDPAID 상태에서만 취소 가능, 자동 환불 처리
배송지 변경PAID, PDF_READY, CONFIRMED발송 전까지만 배송지 변경 가능

주문 생성

POST/v1/orders

FINALIZED 상태의 책을 대상으로 주문을 생성합니다. 충전금이 즉시 차감됩니다.

Request Body

json
{
  "items": [
    { "bookUid": "bk_abc123", "quantity": 1 },
    { "bookUid": "bk_def456", "quantity": 2 }
  ],
  "shipping": {
    "recipientName": "홍길동",
    "recipientPhone": "010-1234-5678",
    "postalCode": "06101",
    "address1": "서울시 강남구 테헤란로 123",
    "address2": "4층 401호",
    "memo": "부재시 경비실"
  },
  "externalRef": "PARTNER-ORDER-001"
}

Request 필드 설명

필드타입필수설명
itemsarrayO주문 항목 목록 (최소 1개)
items[].bookUidstringO책 UID (FINALIZED 상태여야 함)
items[].quantityintO수량 (1~100)
shippingobjectO배송지 정보
shipping.recipientNamestringO수령인 (최대 100자)
shipping.recipientPhonestringO연락처 (최대 20자)
shipping.postalCodestringO우편번호 (최대 10자)
shipping.address1stringO주소 (최대 200자)
shipping.address2string-상세주소 (최대 200자)
shipping.memostring-배송 메모 (최대 200자)
externalRefstring-파트너 외부 참조 식별자 (최대 100자)

Response (201 Created)

json
{
  "success": true,
  "message": "주문이 생성되었습니다",
  "data": {
    "orderUid": "or_3eAx1IQiGByu",
    "orderType": "NORMAL",
    "orderStatus": 20,
    "orderStatusDisplay": "결제완료",
    "isTest": true,
    "totalProductAmount": 60400.00,
    "totalShippingFee": 3500.00,
    "totalPackagingFee": 500.00,
    "totalAmount": 64400.00,
    "paidCreditAmount": 64400.00,
    "creditBalanceAfter": 935600.00,
    "recipientName": "홍길동",
    "recipientPhone": "010-1234-5678",
    "postalCode": "06101",
    "address1": "서울시 강남구 테헤란로 123",
    "address2": "4층 401호",
    "shippingMemo": "부재시 경비실",
    "orderedAt": "2026-02-19T01:10:47Z",
    "paidAt": "2026-02-19T01:10:47Z",
    "items": [
      {
        "itemUid": "oi_aB3cD4eF5gH6",
        "bookUid": "bk_abc123",
        "bookTitle": "우리 아이 성장앨범",
        "bookSpecUid": "bs_spec001",
        "bookSpecName": "포토북 A4",
        "quantity": 1,
        "pageCount": 24,
        "unitPrice": 60400.00,
        "itemAmount": 60400.00,
        "itemStatus": 20,
        "itemStatusDisplay": "결제완료"
      }
    ]
  }
}

잔액 부족 시 (402 Payment Required)

json
{
  "success": false,
  "message": "Insufficient Credit",
  "data": {
    "required": 64400.00,
    "balance": 10000.00,
    "currency": "KRW"
  },
  "errors": ["잔액이 부족합니다. 필요: 64400.00, 잔액: 10000.00"]
}

처리 로직

  1. 각 bookUid 유효성 검증 (존재, 파트너 소유, FINALIZED 상태)
  2. 각 책의 bookSpecUid로 가격 계산
  3. 배송비(3,500원) + 포장비(500원/수량) + 상품금액 합산
  4. 충전금 잔액 확인 후 차감
  5. 주문/항목 레코드 생성

HTTP 상태 코드

상태 코드설명
201 Created주문 생성 성공
400 Bad Request유효성 검증 실패 (Book 미존재, 미FINALIZED 등)
401 Unauthorized인증 실패
402 Payment Required충전금 잔액 부족
500 Internal Server Error서버 오류

주문 취소

POST/v1/orders/{orderUid}/cancel

PAID 상태의 주문을 취소합니다. 결제된 충전금은 전액 환불됩니다.

Request Body

json
{
  "cancelReason": "고객 변심"
}

취소 조건

  • PAID 상태이고 NORMAL 유형의 주문만 취소 가능합니다
  • 제작이 시작된 주문(CONFIRMED 이후)은 취소할 수 없습니다
  • 취소 시 결제 금액이 충전금으로 전액 환불됩니다

Response (200 OK): 변경된 주문 상세 정보가 반환됩니다.


배송지 변경

PATCH/v1/orders/{orderUid}/shipping

PAID ~ CONFIRMED 상태에서 배송지를 변경할 수 있습니다. 발송(SHIPPED) 이후에는 변경이 불가합니다. 변경할 필드만 전달합니다.

Request Body

json
{
  "recipientName": "김영희",
  "address1": "서울시 서초구 반포대로 100"
}

지원 필드: recipientName, recipientPhone, postalCode, address1, address2, shippingMemo