리셀러 API 문서

로그인 없이 확인 가능한 공개 문서입니다.

개요

리셀러는 API 키로 인증하여 상품/포인트/주문 정보를 조회합니다.

샘플 페이지: https://btscon.co.kr/guide/reseller-purchase.html

PHP 샘플 파일 경로: frontphp/reseller/index.php

독립 호스팅용 포털 API: /api/reseller/portal/* (리셀러 ID + 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.krimgs.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월간 사용 금액

구매 페이지 구현 최소 흐름

  1. GET /api/reseller/catalog로 상품 목록 조회
  2. 사용자가 goodsId를 선택하고 주문 정보 입력
  3. POST /api/reseller/orders로 주문 생성
  4. 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"
}

보안 정책

오류 코드

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 -