리셀러 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 |
리셀러 판매 상품 목록, 상품/브랜드/유효기간 메타 포함 |
GET |
/api/reseller/portal/products/{productCode}?reseller_id={id} |
리셀러 판매 상품 상세, 설명/공지/브랜드 이미지 포함 |
POST |
/api/reseller/portal/product-image/cache?reseller_id={id} |
외부 상품 이미지를 서버 로컬 이미지로 캐시 |
POST |
/api/reseller/portal/event-issue-settle?reseller_id={id} |
웨딩 발행 성공 건 정산 반영(리셀러 차감 + 회사 보유금 차감) |
공통 헤더: x-api-key: {API_KEY}
공통 쿼리: reseller_id (숫자 ID, 필수)
문자 발송 라인
POST /api/reseller/orders는 주문을 생성한 뒤 리셀러의 문자 발송 설정값에 따라 백엔드 워커가 발송 채널을 결정합니다.
리셀러 설정이 aligo면 알리고 MMS 큐로 보내고, giftishow면 기프티쇼 발송 라인으로 보냅니다.
| 설정값 |
처리 방식 |
이미지 처리 |
정산/상태 반영 |
aligo |
쿠폰 번호/핀/바코드 확보 후 알리고 MMS 메시지를 조합하여 발송 |
상품 이미지는 백엔드가 다시 조회하고, customImageUrl은 MMS 배경 이미지로 사용 |
알리고 최종 성공(sent) 후에만 발송 수량/정산 반영 |
giftishow |
기프티쇼 API로 직접 발송 |
쿠폰 번호를 별도 이미지로 합성하지 않고 원청 발송 라인을 사용 |
기프티쇼 최종 성공 후에만 발송 수량/정산 반영 |
실패 응답 또는 워커 최종 실패는 발송 수량/정산에 포함하지 않습니다. 프런트는 우선 주문을 접수하고,
GET /api/reseller/orders/{orderId}로 sent/failed 최종 상태를 확인해야 합니다.
상품 이미지 조회/캐시 규약
상품 이미지는 포털 API가 내려주는 image_url을 기본으로 사용합니다.
백엔드는 로컬 캐시 이미지가 있으면 우선 반환하고, 없으면 원청 이미지 필드를 정규화해서 반환합니다.
| 우선순위 |
필드/경로 |
비고 |
| 1 |
local_image_url / /data/uploads/event-goods/... |
포털 캐시 또는 관리자 저장 이미지 |
| 2 |
goods_img_500, goods_img_250, goods_img_desc |
원청 상품 이미지. timgs.giftishow.co.kr는 imgs.giftishow.co.kr로 정규화 |
| 3 |
image_url, imageUrl |
프런트 호환용으로 snake_case/camelCase 둘 다 제공 |
이미지 캐시 요청 예시
POST /api/reseller/portal/product-image/cache?reseller_id=1
x-api-key: {API_KEY}
Content-Type: application/json
{
"productCode": "G00000117135",
"image_url": "https://imgs.giftishow.co.kr/Resource/..."
}
{
"ok": true,
"source_id": "G00000117135",
"image_url": "/data/uploads/event-goods/reseller-1/G00000117135_xxx.jpg",
"file_path": "event-goods/reseller-1/G00000117135_xxx.jpg",
"cached": true
}
정산 반영 규약 (웨딩 발행 성공 건)
외부 호스팅된 웨딩 페이지는 발행 성공 직후 아래 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
포털 상품 응답 예시
응답 예시
{
"reseller": {
"resellerId": 1,
"resellerCode": "rec01",
"resellerName": "샘플 리셀러"
},
"items": [
{
"productCode": "G00000125871",
"productName": "CU 모바일상품권 1만원권",
"brand": "CU",
"brandImageUrl": "https://imgs.giftishow.co.kr/Resource/...",
"category": "일반상품(금액형)",
"image_url": "https://imgs.giftishow.co.kr/Resource/...",
"imageUrl": "https://imgs.giftishow.co.kr/Resource/...",
"basePrice": 9000,
"retailPrice": 10000,
"resellerRate": null,
"policyRate": null,
"resellerPrice": 9000,
"status": "active",
"validPrdDay": "30",
"validPrdDate": ""
}
]
}
image_url가 기본 필드이며, 프런트 호환용으로 imageUrl도 같이 제공합니다.
이미지가 없으면 빈 문자열로 내려갑니다.
포털 상품 상세 응답 예시
{
"reseller": {
"resellerId": 1,
"resellerCode": "rec01",
"resellerName": "샘플 리셀러"
},
"item": {
"productCode": "G00000125871",
"productName": "CU 모바일상품권 1만원권",
"brand": "CU",
"brandCode": "B001",
"brandImageUrl": "https://imgs.giftishow.co.kr/Resource/...",
"brand_image_url": "https://imgs.giftishow.co.kr/Resource/...",
"category": "일반상품(금액형)",
"image_url": "https://imgs.giftishow.co.kr/Resource/...",
"imageUrl": "https://imgs.giftishow.co.kr/Resource/...",
"description": "상품 상세 설명",
"notice": "사용 시 유의사항",
"basePrice": 9000,
"retailPrice": 10000,
"resellerPrice": 9000,
"status": "active",
"validPrdDay": "30",
"validPrdDate": "",
"cancelPossible": true,
"refundPossible": true,
"extendPossible": false
}
}
상세 API는 판매에 필요한 메타만 공개하며 raw_payload 같은 원청 원본은 외부에 노출하지 않습니다.
필드 리네이밍 규약
| 리셀러 공개 키 |
의미 |
productCode | 상품 코드 |
productName | 상품명 |
brand | 브랜드명 |
brandImageUrl | 브랜드 이미지 URL (camelCase) |
brand_image_url | 브랜드 이미지 URL (snake_case) |
category | 상품 분류 |
image_url | 상품 이미지 URL (기본 snake_case) |
imageUrl | 상품 이미지 URL (프런트 호환 camelCase) |
basePrice | 기준 공급가 |
retailPrice | 소비자가 |
resellerPrice | 리셀러 적용 판매가 |
status | 판매 상태 (`active` / `inactive`) |
validPrdDay | 유효기간 일수 |
validPrdDate | 유효기간 기준일 |
description | 상품 상세 설명 (상세 API) |
notice | 사용/발송 유의사항 (상세 API) |
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 |
이미지는 image_url 또는 imageUrl 사용 |
| 주문 입력 |
goodsId, receiver, sender, title, msg |
orderId, reservedDate, reservedTime, customImageUrl는 선택 |
| 주문 결과 |
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",
"customImageUrl": "/data/uploads/event-couple/123/message-image.jpg"
}
{
"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",
"pinNo": "9000-8231-3934",
"barcode": "900082313934"
}
보안 정책
- 화이트리스트 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 |
- |