sayren Docs
주문서

주문서에 쓸 수 있는 내 쿠폰

로그인한 구매자의 사용 가능한 쿠폰마다 이 주문서에 혼자 적용했을 때의 예상 할인과 적용 가능 여부를 돌려준다. 비회원은 빈 목록이다. 쿠폰을 쓸 수 없는 상태(`COUPONS_UNAVAILABLE`)여도 빈 목록이다.

GET
/storefront/v1/checkout/{checkoutId}/coupons

로그인한 구매자의 사용 가능한 쿠폰마다 이 주문서에 혼자 적용했을 때의 예상 할인과 적용 가능 여부를 돌려준다. 비회원은 빈 목록이다. 쿠폰을 쓸 수 없는 상태(COUPONS_UNAVAILABLE)여도 빈 목록이다.

AuthorizationBearer <token>

회원 accessToken

In: header

Path Parameters

checkoutId*string

Response Body

application/json

curl -X GET "https://example.com/storefront/v1/checkout/string/coupons"
{  "meta": {    "status": 200,    "code": "OK",    "message": "OK",    "isSuccess": true  },  "data": [    {      "issueId": "string",      "couponId": "string",      "name": "string",      "description": "string",      "kind": "string",      "benefit": {        "type": "string",        "value": 0,        "maxDiscountAmount": 0      },      "minOrderAmount": 0,      "validUntil": "string",      "applicable": true,      "expectedDiscountAmount": 0,      "rejectReason": "string"    }  ],  "error": null}

쿠폰·적립금 금액 미리보기 POST

고른 쿠폰(내 쿠폰의 `issueId` 또는 코드)으로 결제 금액을 미리 계산한다. **주문서를 바꾸지 않고 쿠폰을 예약하지 않는다** — 확정은 결제 시작의 `coupons`다. 쿠폰마다 적용 결과와 적용하지 못한 사유를 돌려준다. 한 주문에 주문 쿠폰 1장, 주문상품 한 줄에 상품 쿠폰 1장까지 함께 쓴다. 정률 할인은 10원 단위로 내린다. `zipCode`를 주면 제주·도서산간 추가 배송비까지 반영한다. 코드 입력은 구매자당 분당 10회까지다. 상점 전체에서 없는 코드 입력이 많으면 비회원의 코드 입력을 잠시 막는다. 회원은 `pointAmount`로 적립금 사용액을 미리 본다. 적용 순서는 즉시할인 → 쿠폰 → 적립금이고, 상점의 사용 규칙(최소 보유액·최소 사용액·사용 단위·최대 사용 비율·배송비 사용 여부)에 맞춰 줄인다. 결제 금액이 100원 아래로 내려가면 적립금을 줄여 100원을 남긴다(`points.adjustReason` `MIN_PAYMENT`). 결제 금액 전체를 덮으면 `totalAmount`가 0이고 결제창 없이 결제한다. 적립금을 예약하지 않는다 — 확정은 결제 시작의 `pointAmount`다.

결제 시작 POST

배송지와 결제 옵션(`option`: PG·결제수단·간편결제사)으로 결제를 시작하고 결제 서비스 주소(`payUrl`)를 돌려준다. `option`은 주문서의 `paymentOptions` 항목을 그대로 보내거나 직접 쓴다. 스토어프론트는 `payUrl`을 팝업(쿼리 `mode=popup`)이나 전체 페이지로 열고, 결제 서비스가 PG 결제창을 띄워 승인까지 마친다(`@sayren/storefront-sdk/payments`). 결제가 끝나면 구매자는 `returnUrl`로 돌아오고, 결과는 결제 상태 조회로 확정한다. `returnUrl`은 https여야 한다(테스트 결제는 localhost 허용). 상점 결제 도메인(상점 플랫폼 설정 › 결제)을 등록했다면 그 안이어야 한다. PG 시크릿은 물론 결제창 호출 값도 이 응답에 담기지 않는다. 비회원은 `guest`가 필수다. `testPayment`가 true면 상점이 테스트 결제(샌드박스) 중이라 실제로 돈이 나가지 않는다. **보낸 배송지로 배송비를 다시 계산해 결제 금액을 확정한다** — 제주·도서산간 추가 배송비 때문에 주문서 조회 시점의 `amounts`와 다를 수 있다. 확정 금액은 이 응답의 `amounts`이고, 미리 보려면 배송비 미리보기를 쓴다. 계좌이체·가상계좌 옵션은 `cashReceipt`로 현금영수증을 신청할 수 있다. 결제가 승인되면 결제한 PG로 발급하고 환불하면 그만큼 취소한다. 회원은 `pointAmount`로 적립금을 쓴다. 계산은 금액 미리보기와 같고, 결제 시작이 그 금액을 예약한다. 결제가 실패하거나 만료되면 예약을 풀어 잔액으로 돌린다. **적립금이 결제 금액 전체를 덮으면(0원 결제) 결제창 없이 이 요청에서 주문을 만든다** — `option`을 생략할 수 있고, 응답은 `status: "completed"`·`orderId`이며 `payUrl`·`attemptId`·`option`이 null이다. 이 결제는 재시도할 수 없다(409 `ALREADY_PROCESSED`). 헤더 `Idempotency-Key`를 보내면 같은 키의 재요청에 처음 결과를 돌려주고, 같은 키의 동시 요청은 409 `IDEMPOTENCY_KEY_IN_USE`다.