Next.js 14 App Router 기반 결제 데모 프로젝트입니다. TossPayments SDK를 이용해 카드 결제 수행 → 성공/실패 페이지로 이동 → Webhook 자동 동기화까지 포함합니다.
src/
├─ app/
│ ├─ page.tsx # 메인 페이지 (필요 시)
│ ├─ checkout/page.tsx # 결제 데모 페이지 (상품 선택 + 주문 생성 + Toss 결제 호출)
│ └─ payments/
│ ├─ success/page.tsx # 결제 성공 페이지 (paymentKey, orderId, amount 표시 예정)
│ └─ fail/page.tsx # 결제 실패 페이지 (에러 메시지 표시 예정)
│
├─ types/
│ └─ order.ts # Order / Payment / Product 관련 타입 정의
└─ styles/
└─ globals.css # 글로벌 스타일
- GET api/products
- Checkout 페이지에서 상품을 렌더링
- 여러 상품 + 수량 기반 Order + OrderLine 생성
Request:
export type CreateOrderItem = {
productId: number;
quantity: number;
};
export type CreateOrderRequest = {
userId: number;
items: CreateOrderItem[];
};Response:
export type CreateOrderResponse = {
orderId: string;
totalAmountKrw: number;
currency: string;
};- TossPayments 결제창 실행
tossPayments.requestPayment("카드", {
amount: order.totalAmountKrw,
orderId: order.orderId,
orderName: "테스트 주문",
successUrl: `${origin}/payments/success`,
failUrl: `${origin}/payments/fail`,
});- successUrl에서 paymentKey, orderId, amount 쿼리 파라미터 제공됨
- 백엔드로 Confirm API 호출 → 결제 승인
- Toss가 실패 원인을 failUrl에 전달함
- 상품 목록 자동 렌더링
- 상품별 수량 증가/감소(+/-)
- 여러 상품을 동시에 선택 가능
- 선택된 상품 목록 미리보기
- “결제하기” 버튼 클릭 시:
- 주문 생성 API 호출
- TossPayments 결제창 실행
결제 흐름
프론트: 상품 선택 → 주문 생성 → Toss 결제 요청
백엔드: 승인 API 호출 → payment 상태 업데이트
Toss: Webhook → 주문/결제 상태 최종 동기화