리셀러 API 문서
로그인 없이 확인 가능한 공개 문서입니다.
포털 API (독립 호스팅용)
원청 테이블 키를 숨기기 위해 아래 표준 키로 재매핑하여 제공합니다.
| 메서드 |
경로 |
설명 |
GET |
/api/reseller/portal/verify?reseller_id={id} |
리셀러 ID + API 키 매칭 검증 |
GET |
/api/reseller/portal/summary?reseller_id={id} |
정산 요약(보유금액/누적/월간) |
GET |
/api/reseller/portal/products?reseller_id={id}&limit=80 |
리셀러 판매 상품 목록 |
POST |
/api/reseller/portal/event-issue-settle?reseller_id={id} |
웨딩 발행 성공 건 정산 반영(리셀러 차감 + 회사 보유금 차감) |
공통 헤더: x-api-key: {API_KEY}
공통 쿼리: reseller_id (숫자 ID, 필수)
정산 반영 규약 (웨딩 발행 성공 건)
외부 호스팅된 웨딩 페이지는 발행 성공 직후 아래 API를 1회 호출합니다.
백엔드에서 지갑/원장/회사보유금까지 통합 반영합니다.
| 항목 |
값 |
| 메서드 | POST |
| 경로 | /api/reseller/portal/event-issue-settle?reseller_id={id} |
| 헤더 | x-api-key: {API_KEY}, Content-Type: application/json |
| 멱등키 | entry_id (같은 값 재전송 시 중복 차감 방지) |
요청 예시
POST /api/reseller/portal/event-issue-settle?reseller_id=1
x-api-key: {API_KEY}
Content-Type: application/json
{
"entry_id": 12345,
"order_id": "FRONTSIM-ABC123",
"reseller_debit": 10670,
"company_debit": 10000,
"memo": "event_issue:FRONTSIM-ABC123"
}
응답 예시
{
"status": "ok",
"already_applied": false,
"mode": "live",
"reseller_balance": 39871960,
"company_balance": 99940000
}
에러 코드: 400 missing_reseller/invalid_entry_id,
401 missing_api_key/invalid_api_key_or_reseller,
404 reseller_not_found
필드 리네이밍 규약
| 리셀러 공개 키 |
의미 |
productCode | 상품 코드 |
productName | 상품명 |
basePrice | 기준 공급가 |
retailPrice | 소비자가 |
resellerPrice | 리셀러 적용 판매가 |
walletBalance | 리셀러 보유 금액 |
usedTotal | 누적 사용 금액 |
usedMonthly | 월간 사용 금액 |
구매 페이지 구현 최소 흐름
GET /api/reseller/catalog로 상품 목록 조회
- 사용자가
goodsId를 선택하고 주문 정보 입력
POST /api/reseller/orders로 주문 생성
GET /api/reseller/orders/{orderId}로 상태/쿠폰 확인
내부 QA 기능(웹훅 시뮬레이션, 내부 전용 payload/raw 필드)은 리셀러 구매 화면에 노출하지 마세요.
구매 UI 권장 필드
| 화면 영역 |
필수 필드 |
비고 |
| 상품 목록 |
goodsId, goodsName, sellPrice, status |
이미지는 image250Url 권장 |
| 주문 입력 |
goodsId, receiver, sender, title, msg |
orderId, reservedDate, reservedTime는 선택 |
| 주문 결과 |
orderId, status, tradeCode |
발급 완료 후 couponNo/pinNo/barcode 노출 |
엔드포인트 요청/응답 예시
카탈로그 조회
GET /api/reseller/catalog?limit=20&offset=0
x-api-key: {API_KEY}
{
"items": [
{
"goodsId": "G000000001",
"goodsName": "아메리카노 Tall",
"sellPrice": 4500,
"status": "active"
}
],
"limit": 20,
"offset": 0
}
주문 생성
POST /api/reseller/orders
Content-Type: application/json
x-api-key: {API_KEY}
{
"goodsId": "G000000001",
"receiver": "01012345678",
"sender": "BTSCON",
"title": "쿠폰 발송",
"msg": "주문하신 쿠폰입니다.",
"orderId": "my-order-1001"
}
{
"orderId": "rec01-my-order-1001",
"clientOrderId": "my-order-1001",
"status": "queued"
}
주문 조회
GET /api/reseller/orders/rec01-my-order-1001
x-api-key: {API_KEY}
{
"orderId": "rec01-my-order-1001",
"goodsId": "G000000001",
"status": "sent",
"tradeCode": "02",
"sellPrice": 4500,
"trId": "rec01-my-order-1001",
"couponNo": "1234-5678-9012"
}
보안 정책
- 화이트리스트 ON: 등록된 IP만 허용
- 화이트리스트 OFF: IP 제한 없음
- 관리자 페이지에는 영향 없음
오류 코드
| HTTP |
error |
설명 |
| 401 |
missing_api_key, invalid_api_key |
인증 헤더 누락/불일치 |
| 403 |
ip_not_allowed |
화이트리스트 ON 상태에서 미허용 IP |
| 400 |
missing_fields, invalid_order_id |
요청 필수값 누락/형식 오류 |
| 404 |
product_not_found, order_not_found |
상품/주문 미존재 |
리셀러 제공 데이터 규약 (초안)
원청 수신 데이터를 아래 필드로 정규화해 리셀러에게 제공합니다.
원본 전체 payload는 내부 저장용이며 리셀러에는 공개하지 않습니다.
비공개 항목 (내부 저장용)
| 구분 |
필드 |
설명 |
| 상품 목록 |
raw_payload |
원청 원본 전체 데이터 |
| 쿠폰 발급 결과 |
raw_payload |
원청 원본 전체 데이터 |
| 웹훅 이벤트 |
raw_payload |
원청 원본 전체 데이터 |
1) 상품 목록 (goods)
| 리셀러 제공 키 |
설명 |
필수 |
공개 |
비고 |
goodsId |
상품 고유 코드 |
Y |
Y |
- |
goodsName |
상품명 |
Y |
Y |
- |
brandCode |
브랜드 코드 |
N |
Y |
- |
brandName |
브랜드명 |
N |
Y |
- |
brandIconUrl |
브랜드 아이콘 이미지 |
N |
Y |
- |
brandThumbUrl |
브랜드 썸네일 이미지 |
N |
Y |
- |
categoryName |
분류명 |
N |
Y |
단일 문자열로 제공 |
categoryCode |
분류 코드 |
N |
Y |
- |
categoryDetailCode |
분류 상세 코드 |
N |
Y |
- |
description |
상품 설명 |
N |
Y |
- |
image250Url |
250px 이미지 |
N |
Y |
- |
image500Url |
500px 이미지 |
N |
Y |
- |
imageDescUrl |
상세 이미지 |
N |
Y |
- |
image250Path |
250px 이미지 경로 |
N |
Y |
- |
image500Path |
500px 이미지 경로 |
N |
Y |
- |
imageDescPath |
상세 이미지 경로 |
N |
Y |
- |
supplierCode |
공급사 코드 |
N |
Y |
- |
supplierName |
공급사명 |
N |
Y |
- |
useCompanyCode |
사용처 코드 |
N |
Y |
- |
useCompanyName |
사용처명 |
N |
Y |
- |
validDate |
유효기간 날짜(원청 표기) |
N |
Y |
- |
validDays |
유효기간 일수 |
N |
Y |
- |
validTypeCode |
유효기간 타입 코드 |
N |
Y |
- |
cancelable |
취소 가능 여부 |
N |
Y |
Y/N |
refundable |
환불 가능 여부 |
N |
Y |
Y/N |
extendable |
연장 가능 여부 |
N |
Y |
Y/N |
standardTermsApplied |
표준약관 적용 여부 |
N |
Y |
Y/N |
sellPrice |
판매가 |
N |
Y |
정수 |
consumerPrice |
소비자가 |
N |
Y |
정수 |
discountAmount |
할인 금액 |
N |
Y |
정수 |
sellEndDate |
판매 종료일 |
N |
Y |
- |
status |
판매 상태 코드 |
N |
Y |
기본값: active |
2) 쿠폰 발급 결과 (coupon/send)
| 리셀러 제공 키 |
설명 |
필수 |
공개 |
비고 |
trId |
거래 ID |
Y |
Y |
- |
couponId |
쿠폰 ID |
N |
Y |
- |
couponNo |
쿠폰 번호 |
N |
Y |
- |
pinNo |
PIN 번호 |
N |
Y |
- |
barcode |
바코드 |
N |
Y |
- |
3) 웹훅 이벤트 (거래 상태 통지)
리셀러 API 키에 등록된 hook_url로 JSON POST 전송됩니다.
| 리셀러 제공 키 |
설명 |
필수 |
공개 |
비고 |
trId |
거래 ID |
Y |
Y |
- |
mdCode |
가맹점 코드 |
N |
Y |
- |
tradeType |
거래 유형 |
Y |
Y |
- |
tradeCode |
거래 상태 코드 |
Y |
Y |
02 승인, 03 취소, 04 재발송, 07 실패 |
tradeDate |
거래 일시 |
Y |
Y |
- |