B2C
GHC 앱 + LogShop API
LOG 앱에서 고객에게 노출되는 상품은 season_event_products만 사용한다.
LogShop
Read this first
B2C
LOG 앱에서 고객에게 노출되는 상품은 season_event_products만 사용한다.
B2B
기존 수발주와 백오피스 운영을 유지한다. B2C 요구 때문에 B2B 흐름을 깨지 않는다.
공유 자산
이미지, 상품 설명, 재고 기준은 기존 자산을 재활용한다. 필요한 경우 이벤트 상품에 복사한다.
Backoffice flow
products공급사·브랜드·원가·기본 상품 정보의 기준 데이터다.
season_event_productsB2C 노출 대상은 이 테이블 기준이다. LOG 앱은 이 목록만 사용한다.
/api/catalog/event-products노출 가능한 시즌 이벤트 상품을 조회하고 상세 페이지를 구성한다.
b2c_orders / b2c_order_itemsGHC 서버가 API Key로 주문을 생성한다. 클라이언트에 키를 노출하지 않는다.
orders / fulfillment운영자는 주문 상태, 재고, 출고 흐름을 기존 운영 규칙과 맞춰 처리한다.
Order states
| 상태값 | 설명 | 설명 | 전이 권한 |
|---|---|---|---|
| pending | 주문 접수 | 결제 대기 중인 초기 상태 | partner |
| confirmed | 결제 확정 | 결제가 완료되고 배송 준비 대기 중 | partner |
| preparing | 배송 준비 중 | 배송 준비를 진행 중 (3PL에서 관리) | logistics |
| shipped | 배송 중 | 배송사에 인계됨 (송장 정보 포함) | logistics |
| delivered | 배송 완료 | 고객이 배송을 수령함 | logistics |
| cancelled | 주문 취소 | 파트너가 주문을 취소함 | partner |
| refund_requested | 환불 요청 | 고객이 환불을 신청함 (PG 취소 대기 중) | partner |
| refunded | 환불 처리 | 관리자가 PG 취소 확인 후 환불 완료 처리함 | admin |
| refund_failed | 환불 실패 | 관리자가 환불 요청을 거절하거나 PG 취소 불가 | admin |
| failed | 주문 실패 | 결제 실패, 재고 없음 등의 사유로 실패 | partner |
Current state
LOG 앱이 조회할 B2C 상품 목록 기준이 존재한다.
API Key 기반으로 주문과 주문 품목을 생성한다.
주문 ID 기준으로 주문 상세를 조회한다.
external_user_id 필터링 지원으로 특정 사용자의 주문만 조회할 수 있다.
partner와 logistics 역할별로 상태 전이를 제어한다.
배송 중, 배송 완료 상태 전이 시 송장 정보를 함께 기록한다.
운영 조회·상태 관리 범위는 현재 화면 구현과 맞춰 확인이 필요하다.
delivered 상태에서만 신청 가능. 중복 신청 방지. 백오피스에서 승인·거절 처리.
주문 ID 기준으로 환불 요청 현황을 조회한다.
어드민이 PG 콘솔 확인 후 환불 승인·거절 처리. pid(PG 결제 ID) 표시.
정책 확정 후 API와 운영 화면을 별도 설계한다.
GHC 앱에 상태 변경을 push할지 polling으로 갈지 결정이 필요하다.
B2C 매출·수수료·출고 비용 기준 확정 후 개발한다.
3PL guide
더신나게 파트너사가 요청할 때 key_role: "logistics"로 설정하여 API Key를 발급한다.
key_role: "partner"로 발급되므로 배송 상태 전이 불가API reference
GET /api/catalog/event-productsLOG 앱에서 노출할 시즌 이벤트 상품 목록을 조회한다.
Response
{
"data": [
{
"id": "product-uuid",
"product_name": "상품명",
"consumer_price": 35000,
"event_supply_price": 28000,
"stock_quantity": 100,
"brand_name": "브랜드명",
"brand_id": "brand-uuid",
"is_perpetual": 0,
"event_start_at": "2026-07-01T00:00:00.000Z",
"event_end_at": "2026-07-31T23:59:59.000Z"
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 45,
"totalPages": 3
},
"synonymsExpanded": []
}GET /api/catalog/products/{id}상품 상세 페이지에 필요한 설명, 이미지, 가격 정보를 조회한다.
Response
{
"data": {
"id": "product-uuid",
"product_name": "상품명",
"consumer_price": 35000,
"event_supply_price": 28000,
"stock_quantity": 100,
"brand_name": "브랜드명",
"brand_id": "brand-uuid",
"description": "상품 설명",
"thumbnail_url": "https://...",
"is_perpetual": 0,
"event_start_at": "2026-07-01T00:00:00.000Z",
"event_end_at": "2026-07-31T23:59:59.000Z"
}
}GET /api/catalog/brands카탈로그 필터 또는 브랜드 칩 구성에 사용할 브랜드 목록이다.
Response
{
"data": [
{
"id": "brand-uuid",
"brand_name": "브랜드명",
"description": "브랜드 설명",
"logo_url": "https://...",
"event_count": 3
}
],
"eventCount": 5
}POST /api/b2c/ordersGHC 서버가 고객 결제 완료 후 LogShop에 주문을 생성한다.
Request
{
"customer_name": "홍길동",
"customer_phone": "01012345678",
"delivery_address": "서울시 강남구 테헤란로 123",
"delivery_detail_address": "456호",
"delivery_postal_code": "06234",
"external_order_id": "GHC-ORDER-001",
"external_user_id": "ghc-user-123",
"pid": "T1234567890",
"pay_type": 1,
"items": [
{
"season_event_product_id": "product-uuid",
"quantity": 1
}
]
}Response
{
"order_number": "B2C-20260710-59240",
"order_id": "uuid",
"status": "confirmed",
"total_amount": 35000,
"total_quantity": 1,
"items": [
{
"season_event_product_id": "product-uuid",
"product_name": "상품명",
"quantity": 1,
"unit_price": 35000,
"subtotal": 35000
}
]
}GET /api/b2c/orders/{orderId}주문 상세와 처리 상태를 조회한다.
Response
{
"order_id": "uuid",
"order_number": "B2C-20260710-59240",
"status": "confirmed",
"customer_name": "홍길동",
"customer_phone": "01012345678",
"delivery_address": "서울시 강남구 테헤란로 123",
"delivery_detail_address": "456호",
"delivery_postal_code": "06234",
"total_amount": 35000,
"total_quantity": 1,
"external_order_id": "GHC-ORDER-001",
"external_user_id": "ghc-user-123",
"pid": "T1234567890",
"pay_type": 1,
"created_at": "2026-07-10T08:30:00.000Z",
"updated_at": "2026-07-10T08:30:00.000Z",
"items": [
{
"season_event_product_id": "product-uuid",
"product_name": "상품명",
"quantity": 1,
"unit_price": 35000,
"subtotal": 35000,
"brand_id": "brand-001",
"brand_name": "글로우뷰티",
"tracking_number": "1234567890",
"carrier": "CJ대한통운",
"shipped_at": "2026-07-11T10:00:00.000Z"
}
]
}GET /api/b2c/orders파트너의 모든 B2C 주문을 조회한다. external_user_id로 특정 사용자의 주문만 필터링할 수 있다.
Response
{
"data": [
{
"order_id": "uuid",
"order_number": "B2C-20260710-59240",
"status": "confirmed",
"customer_name": "홍길동",
"customer_phone": "01012345678",
"delivery_address": "서울시 강남구 테헤란로 123",
"delivery_detail_address": "456호",
"delivery_postal_code": "06234",
"total_amount": 35000,
"total_quantity": 1,
"external_order_id": "GHC-ORDER-001",
"external_user_id": "ghc-user-123",
"pid": "T1234567890",
"pay_type": 1,
"created_at": "2026-07-10T08:30:00.000Z",
"updated_at": "2026-07-10T08:30:00.000Z"
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 3,
"totalPages": 1
}
}PATCH /api/b2c/orders/{orderId}/status주문 상태를 전이한다. API Key의 role(partner/logistics)에 따라 허용된 전이만 가능하다.
Request
{
"status": "shipped",
"tracking_number": "1234567890",
"carrier": "CJ대한통운"
}Response
{
"order_id": "uuid",
"order_number": "B2C-20260710-59240",
"status": "shipped",
"tracking_number": "1234567890",
"carrier": "CJ대한통운",
"updated_at": "2026-07-10T12:00:00.000Z"
}POST /api/b2c/orders/{orderId}/refunddelivered 상태의 주문에 대해 환불을 신청한다. 어드민이 PG 콘솔에서 수동 취소 후 승인 처리한다.
Request
{
"reason": "고객 변심",
"refund_amount": 35000
}Response
{
"refund_id": "uuid",
"order_id": "uuid",
"status": "pending",
"refund_amount": 35000,
"reason": "고객 변심",
"created_at": "2026-07-14T09:00:00.000Z"
}GET /api/b2c/orders/{orderId}/refund주문의 환불 요청 현황을 조회한다.
Response
{
"refund_id": "uuid",
"order_id": "uuid",
"status": "pending",
"refund_amount": 35000,
"reason": "고객 변심",
"admin_note": null,
"created_at": "2026-07-14T09:00:00.000Z",
"updated_at": "2026-07-14T09:00:00.000Z"
}Docs index