Replies: 1 comment
수정된 API 명세서 (프로토타입 버전)5. 주문 / 결제 (Orders)5.1 장바구니 → 주문 생성 (결제 준비)
5.2 결제 승인 (Mock API) (기존 PG 웹훅 대체)
6. 게이트 토큰 (Gates)6.1 출구 토큰 발급 (앱 → 서버)
6.2 게이트 단말 토큰 검증 (게이트 → 서버)
주문 게이트쪽 명세서 수정 |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
1. Auth / 사용자 (users)
1.1 회원가입
POST /api/auth/signup
users요청
{ "email": "user@example.com", "password": "P@ssw0rd!", "name": "홍길동", "phone_number": "010-1234-5678", "budget_amount": 100000 }처리
password_hash(BCrypt 등) 로 저장budget_amount→ users.budget_amountcreated_at현재 시간응답
{ "success": true, "data": { "user_id": 1, "email": "user@example.com", "name": "홍길동", "phone_number": "010-1234-5678", "budget_amount": 100000, "created_at": "2025-09-22T12:00:00Z" } }1.2 로그인(JWT 발급)
POST /api/auth/login
users요청
{ "email": "user@example.com", "password": "P@ssw0rd!" }응답
{ "success": true, "data": { "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "expires_in": 3600, "user": { "user_id": 1, "email": "user@example.com", "name": "홍길동", "phone_number": "010-1234-5678", "budget_amount": 100000 } } }1.3 내 정보 조회
GET /api/users/me
users응답
{ "success": true, "data": { "user_id": 1, "email": "user@example.com", "name": "홍길동", "phone_number": "010-1234-5678", "budget_amount": 100000, "created_at": "2025-09-22T12:00:00Z" } }1.4 예산 변경 (budget_amount)
PATCH /api/users/me/budget
users요청
{ "budget_amount": 80000 }응답
{ "success": true, "data": { "user_id": 1, "budget_amount": 80000 } }2. 상품 (products)
2.1 바코드 스캔 → 상품 조회
POST /api/products/scan
productsproduct_id로 취급요청
{ "product_id": "8801234567890" // = products.product_id }응답(상품 존재)
{ "success": true, "data": { "product_id": "8801234567890", "name": "콜라 500ml", "price": 1800, "stock": 25, "is_active": true, "updated_at": "2025-09-22T10:00:00Z" } }2.2 상품 상세 조회
GET /api/products/{product_id}
products응답
{ "success": true, "data": { "product_id": "8801234567890", "name": "콜라 500ml", "price": 1800, "stock": 25, "is_active": true, "updated_at": "2025-09-22T10:00:00Z" } }2.3 상품 목록 검색
GET /api/products?keyword=콜라&page=0&size=20
products응답
{ "success": true, "data": { "items": [ { "product_id": "8801234567890", "name": "콜라 500ml", "price": 1800, "stock": 25, "is_active": true } ], "page": 0, "size": 20, "total": 1 } }3. 장바구니(cart_items)
ERD상 따로 cart 테이블 없이 cart_items만 있으니까,
“현재 장바구니 = user_id 기준 cart_items + products join 결과”로 본다.
3.1 현재 장바구니 조회
GET /api/cart
cart_items,products응답
{ "success": true, "data": { "user_id": 1, "items": [ { "cart_item_id": 10, "product_id": "8801234567890", "name": "콜라 500ml", "price": 1800, // products.price "quantity": 2, // cart_items.quantity "subtotal": 3600 // cart_items.subtotal }, { "cart_item_id": 11, "product_id": "8809999999999", "name": "감자칩", "price": 2500, "quantity": 1, "subtotal": 2500 } ], "total_price": 6100 } }total_price는 cart_items.subtotal 합계(orders.final_price의 베이스).3.2 장바구니에 상품 추가
POST /api/cart/items
cart_items요청
{ "product_id": "8801234567890", "quantity": 1 }처리
user_id= JWT의 user_id응답
{ "success": true, "data": { "cart_item_id": 10, "user_id": 1, "product_id": "8801234567890", "quantity": 2, "subtotal": 3600, "created_at": "2025-09-22T12:10:00Z" } }3.3 장바구니 수량 변경
PATCH /api/cart/items/{cart_item_id}
cart_items요청
{ "quantity": 3 }응답
{ "success": true, "data": { "cart_item_id": 10, "quantity": 3, "subtotal": 5400 } }3.4 장바구니 항목 삭제
DELETE /api/cart/items/{cart_item_id}
cart_items응답
{ "success": true }4. 쇼핑리스트(shopping_lists)
테이블이 “한 줄 = 한 아이템” 구조라서 그 기준으로 설계.
4.1 쇼핑리스트 전체 조회
GET /api/shopping-lists
shopping_lists응답
{ "success": true, "data": [ { "list_id": 1, "user_id": 1, "item_name": "콜라 500ml", "is_checked": true, "created_at": "2025-09-22T09:00:00Z" }, { "list_id": 2, "user_id": 1, "item_name": "감자칩", "is_checked": false, "created_at": "2025-09-22T09:05:00Z" } ] }4.2 쇼핑리스트 아이템 추가
POST /api/shopping-lists
요청
{ "item_name": "우유 1L" }응답
{ "success": true, "data": { "list_id": 3, "user_id": 1, "item_name": "우유 1L", "is_checked": false, "created_at": "2025-09-22T10:00:00Z" } }4.3 쇼핑리스트 수정 / 체크 토글
PATCH /api/shopping-lists/{list_id}
요청 예시(체크 상태 변경)
{ "is_checked": true }요청 예시(이름 변경)
{ "item_name": "저지방 우유 1L" }응답
{ "success": true, "data": { "list_id": 3, "item_name": "저지방 우유 1L", "is_checked": true } }4.4 쇼핑리스트 항목 삭제
DELETE /api/shopping-lists/{list_id}
응답
{ "success": true }5. 주문 / 결제(orders, order_details)
5.1 장바구니 → 주문 생성 & PG 준비
POST /api/orders
사용 테이블:
orders,order_details,cart_items,products설명:
orders에 row 생성 (status = "PENDING")order_detailsrow로 복사요청
{ "payment_method": "KAKAO_PAY" }응답
{ "success": true, "data": { "order_id": "O20250922001", "user_id": 1, "final_price": 15200, "payment_method": "KAKAO_PAY", "status": "PENDING", "pg_redirect_url": "https://kakaopay.com/...", "created_at": "2025-09-22T12:20:00Z" } }이때 DB 상태
ordersorder_details각 cart_items 에 대해
성공 후 cart_items 는 비우는 방향(또는 주문 완료 후 비우기).
5.2 PG 웹훅(CAPTURED 확정)
POST /api/payments/webhook
ordersorders.status,approved_at,receipt_url갱신.요청(예시)
{ "order_id": "O20250922001", "status": "CAPTURED", "approved_at": "2025-09-22T12:35:12Z", "final_price": 15200, "receipt_url": "https://pg.com/receipt/123" }처리
orderswhere order_id = ...응답
{ "success": true }5.3 주문 상세 조회
GET /api/orders/{order_id}
orders,order_details응답
{ "success": true, "data": { "order": { "order_id": "O20250922001", "user_id": 1, "final_price": 15200, "payment_method": "KAKAO_PAY", "status": "CAPTURED", "approved_at": "2025-09-22T12:35:12Z", "receipt_url": "https://pg.com/receipt/123", "created_at": "2025-09-22T12:20:00Z" }, "order_details": [ { "order_detail_id": 100, "product_id": "8801234567890", "product_name": "콜라 500ml", "item_price": 1800, "quantity": 2 }, { "order_detail_id": 101, "product_id": "8809999999999", "product_name": "감자칩", "item_price": 2500, "quantity": 1 } ] } }5.4 주문 목록 조회(내 결제 내역)
GET /api/orders?status=CAPTURED&page=0&size=10
orders응답
{ "success": true, "data": { "items": [ { "order_id": "O20250922001", "final_price": 15200, "payment_method": "KAKAO_PAY", "status": "CAPTURED", "approved_at": "2025-09-22T12:35:12Z" } ], "page": 0, "size": 10, "total": 1 } }5.5 결제 실패/취소 알림
POST /api/orders/{order_id}/fail
orders요청
{ "reason": "PG_USER_CANCEL" }처리: orders.status = "FAILED" 또는 "CANCELED"
응답
{ "success": true, "data": { "order_id": "O20250922001", "status": "CANCELED" } }6. 게이트 토큰(gate_tokens)
6.1 출구 토큰 발급 (앱 → 서버)
POST /api/gates/token
gate_tokens,ordersorders.status = CAPTURED인 order 에 대해 gate_tokens row 생성요청
{ "order_id": "O20250922001" }처리
orders.status 가 "CAPTURED" 인지 확인
JWT/ECDSA 등으로
token_value생성gate_tokens row 삽입
응답
{ "success": true, "data": { "token_id": 1, "order_id": "O20250922001", "token_value": "eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9...", "status": "ISSUED", "issued_at": "2025-09-22T12:39:00Z", "expires_at": "2025-09-22T12:40:00Z" } }6.2 게이트 단말 → 서버 토큰 검증
POST /api/gates/verify
사용 테이블:
gate_tokens,orders설명:
요청
{ "token_value": "eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9...", "gate_id": "GATE_A01", "timestamp": "2025-09-22T12:39:58Z" }성공 응답(토큰 유효 + orders.status = CAPTURED)
{ "status": "OK", "message": "CAPTURED transaction verified, gate open" }이때 DB
실패 예시(만료)
{ "status": "FAIL", "reason": "EXPIRED", "message": "토큰이 만료되었습니다. 앱에서 재발급 후 다시 시도해주세요." }7. 관리자용 API (선택) – ERD 매핑
7.1 상품 추가/수정/삭제
productsinsertproductsupdateproductsdelete or is_active=false요청(추가 예시)
{ "product_id": "8801234567890", "name": "콜라 500ml", "price": 1800, "stock": 100, "is_active": true }All reactions