헤드리스 체크아웃 API 문서

REST API를 통해 한국 결제 처리를 애플리케이션에 통합하세요. 결제 처리, 컴플라이언스 및 한국 시장 요구사항은 저희가 처리하는 동안 커스텀 체크아웃 경험을 구축하세요.

📋 사전 요구사항

  • 대시보드에서 발급받은 API 키
  • 웹훅을 위한 HTTPS 엔드포인트
  • REST API에 대한 기본 이해
  • 한국 사업자 등록 (실제 결제 시)

기본 URL

운영: https://api.koreacheckout.com
테스트: https://sandbox-api.koreacheckout.com

기본 통합 플로우

1. 체크아웃 세션 생성

주문 정보로 체크아웃 세션을 생성하여 시작하세요:

curl -X POST https://api.koreacheckout.com/api/checkout/create-session \
  -H "x-api-key: sk_live_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "platform": "headless",
    "platformOrderId": "order_123",
    "items": [
      {
        "name": "Sample Product",
        "price": 29000,
        "quantity": 1,
        "productId": "prod_123"
      }
    ],
    "customer": {
      "name": "홍길동",
      "email": "customer@example.com",
      "phone": "+82-10-1234-5678"
    },
    "totalAmount": 29000,
    "currency": "KRW",
    "returnUrl": "https://yourstore.com/success",
    "cancelUrl": "https://yourstore.com/cancel",
    "webhookUrl": "https://yourstore.com/webhooks/checkout"
  }'

2. 고객 리다이렉트

반환된 체크아웃 URL을 사용하여 고객을 리다이렉트하세요:

// Response from session creation
{
  "success": true,
  "sessionId": "cs_1234567890abcdef",
  "checkoutUrl": "https://checkout.koreacheckout.com/cs_1234567890abcdef",
  "expiresAt": "2024-01-01T12:00:00Z"
}

// Redirect customer to checkout
window.location.href = response.checkoutUrl;

3. 웹훅 이벤트 처리

웹훅을 통해 결제 완료를 수신하세요:

// Your webhook endpoint
app.post('/webhooks/checkout', (req, res) => {
  const { event, data } = req.body;
  
  if (event === 'payment.completed') {
    // Update order status in your database
    updateOrderStatus(data.sessionId, 'paid');
    fulfillOrder(data.platformOrderId);
  }
  
  res.status(200).send('OK');
});

워드프레스 플러그인 통합

워드프레스 플러그인은 한국 결제 수단, 주소 검색 및 커스터마이징 가능한 체크아웃 경험과 함께 WooCommerce와의 완벽한 통합을 제공합니다. 한국 이커머스 사이트를 구축하는 개발자에게 이상적입니다.

🔧 개발자 기능

  • • 주문 동기화와 함께 완전한 WooCommerce 통합
  • • 한국 주소 검색 (다음 우편번호 API)
  • • 커스터마이징 가능한 체크아웃 폼 및 스타일링
  • • 커스터마이징을 위한 WordPress 훅 및 필터
  • • 한국 결제 수단 지원 (카드, 가상계좌)
  • • 주문 상태 업데이트를 위한 웹훅 처리

설치 및 설정

# 1. Download plugin from your dashboard
# 2. Upload to WordPress via Plugins > Add New > Upload
# 3. Configure in WooCommerce > Korea Checkout

// Required Configuration
API URL: https://api.koreacheckout.com
API Key: sk_live_your_key_here  
Order Status Mapping: Automatic

개발자 커스터마이징

// Filter checkout fields
add_filter('korea_checkout_fields', function($fields) {
    // Add custom fields or modify existing ones
    $fields['custom_field'] = array(
        'type' => 'text',
        'label' => 'Custom Field',
        'required' => false
    );
    return $fields;
});

// Hook into payment completion  
add_action('korea_checkout_payment_complete', function($order_id, $payment_data) {
    // Custom logic after successful payment
    $order = wc_get_order($order_id);
    
    // Send custom emails, update inventory, etc.
    do_action('custom_order_processing', $order, $payment_data);
}, 10, 2);

// Customize checkout appearance
add_filter('korea_checkout_css_vars', function($vars) {
    $vars['--primary-color'] = '#your-brand-color';
    $vars['--button-radius'] = '8px';
    return $vars;
});

💡 워드프레스 모범 사례

  • • 라이브 운영 전에 샌드박스 모드에서 테스트하세요
  • • 플러그인 파일 수정 대신 워드프레스 훅을 사용하세요
  • • 결제 실패에 대한 적절한 오류 처리를 구현하세요
  • • API 응답 캐싱을 위해 워드프레스 트랜지언트를 사용하세요
  • • 커스터마이징 시 워드프레스 코딩 표준을 따르세요

API 키

API 키는 API에 대한 모든 요청을 인증하는 데 사용됩니다. 보안을 유지하고 클라이언트 측 코드에 노출하지 마세요.

통합 API 키

  • • 모든 결제 수단과 기능을 위한 단일 키
  • • 자동 게이트웨이 감지 및 라우팅
  • • 내장된 사기 감지 및 분석
  • • 모든 이벤트를 위한 통합 웹훅 엔드포인트

⚠️ 보안 모범 사례

  • • 프런트엔드 JavaScript에서 API 키를 사용하지 마세요
  • • 키가 노출된 경우 즉시 재발급하세요
  • • API 요청 시 항상 HTTPS를 사용하세요

🔑 API 키 형식

모든 API 키는 운영환경의 경우 sk_live_, 샌드박스 모드의 경우 sk_test_로 시작합니다

sk_live_1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef

인증

API 요청은 API 키를 사용하여 인증됩니다. 모든 요청의 x-api-key 헤더에 API 키를 포함하세요.

curl -X GET https://api.koreacheckout.com/api/checkout/session/cs_123 \
  -H "x-api-key: sk_live_your_key_here" \
  -H "Content-Type: application/json"

🔐 보안 참고사항

  • • API 키를 안전하게 보관하고 클라이언트 사이드 코드에 노출하지 마세요
  • • 환경 변수를 사용하여 API 키를 저장하세요
  • • 보안 강화를 위해 정기적으로 키를 회전하세요
  • • 샌드박스와 운영 환경에는 서로 다른 키를 사용하세요

기본 URL 및 환경

환경에 따라 적절한 기본 URL을 선택하세요. 프로덕션에 배포하기 전에 항상 샌드박스에서 테스트하세요.

🚀 운영

https://api.koreacheckout.com

실제 결제, 라이브 한국 결제 게이트웨이

🧪 샌드박스

https://sandbox-api.koreacheckout.com

테스트 결제, 모의 응답

🔄 요청 제한

  • • 운영: API 키당 분당 1000 요청
  • • 샌드박스: API 키당 분당 100 요청
  • • 모든 응답에 요청 제한 헤더 포함

세션 API

결제 처리를 위한 체크아웃 세션을 생성하고 관리합니다. 세션에는 구매를 완료하는 데 필요한 모든 정보가 포함되어 있습니다.

세션 생성

POST /api/checkout/create-session

curl -X POST https://api.koreacheckout.com/api/checkout/create-session \
  -H "x-api-key: sk_live_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "platform": "custom",
    "platformOrderId": "order_123",
    "items": [
      {
        "name": "Sample Product",
        "price": 29000,
        "quantity": 1,
        "description": "Product description"
      }
    ],
    "customer": {
      "name": "홍길동",
      "email": "customer@example.com",
      "phone": "+82-10-1234-5678"
    },
    "totalAmount": 29000,
    "currency": "KRW",
    "returnUrl": "https://yourstore.com/success",
    "cancelUrl": "https://yourstore.com/cancel",
    "metadata": {
      "internal_order_id": "12345"
    }
  }'

세션 조회

GET /api/checkout/session/{{sessionId}}

curl -X GET https://api.koreacheckout.com/api/checkout/session/cs_1234567890abcdef \
  -H "x-api-key: sk_live_your_key_here"
  
// Response
{{
  "success": true,
  "data": {{
    "sessionId": "cs_1234567890abcdef",
    "status": "completed", 
    "platformOrderId": "order_123",
    "totalAmount": 29000,
    "currency": "KRW",
    "customer": {{
      "name": "홍길동",
      "email": "customer@example.com"
    }},
    "createdAt": "2024-01-01T10:00:00Z",
    "expiresAt": "2024-01-02T10:00:00Z",
    "completedAt": "2024-01-01T10:30:00Z"
  }}
}}

세션 관리

복잡한 체크아웃 플로우, 세션 업데이트 및 만료 처리를 위한 고급 세션 관리 기능입니다.

세션 업데이트

PATCH /api/checkout/session/{{sessionId}}

{{
  "customer": {{
    "name": "김철수",
    "email": "updated@example.com"
  }},
  "metadata": {{
    "updated_reason": "customer_info_change"
  }}
}}

세션 만료

세션 생명주기

  • • 세션은 기본적으로 24시간 후 만료됩니다
  • • 사용자 정의 만료 시간 설정 가능 (최대 7일)
  • • 만료된 세션은 결제에 사용할 수 없습니다
  • • 세션 만료 시 웹훅이 전송됩니다

결제 통합

결제 처리는 한국 결제 게이트웨이(토스, KCP, 이니시스)를 통해 안전하게 처리됩니다. PCI 준수를 위해 카드 데이터는 저희 서버를 통과하지 않습니다.

🔒 안전한 결제 플로우

  1. API를 통해 체크아웃 세션 생성
  2. 고객을 호스팅된 체크아웃 페이지로 리다이렉트
  3. 고객이 결제 게이트웨이에 직접 결제 정보 입력
  4. 결제 게이트웨이가 안전하게 결제 처리
  5. 웹훅이 서버에 결제 결과 알림
  6. 세션 API를 통해 결제 상태 확인

결제 상태 확인

// Check if payment completed via session status
GET /api/checkout/session/{{sessionId}}

// Response when payment completed
{{
  "success": true,
  "data": {{
    "sessionId": "cs_1234567890abcdef",
    "status": "completed",
    "totalAmount": 29000,
    "currency": "KRW",
    "paymentMethod": "card",
    "gateway": "toss",
    "gatewayTransactionId": "toss_tx_123456",
    "completedAt": "2024-01-01T10:05:00Z"
  }}
}}

환불 요청

POST /api/checkout/session/{{sessionId}}/refund

{{
  "amount": 10000,  // Partial refund (optional, defaults to full)
  "reason": "고객 요청 환불",
  "notify_customer": true
}}

// Response
{{
  "refundId": "ref_1234567890abcdef",
  "status": "processing",
  "amount": 10000,
  "reason": "고객 요청 환불",
  "processedAt": "2024-01-01T11:00:00Z"
}}

결제 상태 값

  • pending - 세션 생성됨, 결제 시작 안됨
  • processing - 고객이 결제 진행 중
  • completed - 결제가 성공적으로 처리됨
  • failed - 결제 실패 또는 거절됨
  • cancelled - 고객이 결제 취소함
  • expired - 결제 전 세션 만료됨
  • refunded - 결제가 환불됨 (전액)
  • partially_refunded - 결제가 부분 환불됨

결제 처리

결제 처리, 오류 시나리오 처리 및 애플리케이션에서 안정적인 결제 처리를 보장하기 위한 모범 사례입니다.

결제 플로우 모범 사례

  • • 웹훅과 API 호출을 통해 항상 결제 상태를 확인하세요
  • • 결제 요청에 대한 멱등성을 구현하세요
  • • 사용자 친화적인 메시지로 결제 실패를 우아하게 처리하세요
  • • 환불 및 분쟁 처리를 위해 결제 ID를 저장하세요
  • • 장시간 실행되는 결제에 대한 타임아웃 처리를 구현하세요

결제 상태 모니터링

// Monitor payment status after creating session
const monitorPayment = async (sessionId) => {{
  try {{
    const response = await fetch(`/api/checkout/session/${sessionId}`, {{
      headers: {{
        'x-api-key': process.env.API_KEY
      }}
    }});
    
    const session = await response.json();
    
    if (!response.ok) {{
      throw new Error(session.error.message);
    }}
    
    // Handle different payment statuses
    switch (session.status) {{
      case 'completed':
        handlePaymentSuccess(session);
        break;
      case 'failed':
        handlePaymentFailure(session);
        break;
      case 'cancelled':
        handlePaymentCancellation(session);
        break;
      case 'expired':
        handleSessionExpiry(session);
        break;
      case 'processing':
        // Continue polling
        setTimeout(() => monitorPayment(sessionId), 2000);
        break;
    }}
    
    return session;
  }} catch (error) {{
    console.error('Payment monitoring error:', error);
    throw error;
  }}
}};

// Webhook handler for real-time updates
app.post('/webhooks/payment', (req, res) => {{
  const event = req.body;
  
  switch (event.event) {{
    case 'payment.completed':
      handlePaymentSuccess(event.data);
      break;
    case 'payment.failed':
      handlePaymentFailure(event.data);
      break;
  }}
  
  res.status(200).send('OK');
}});

상점 API

상점 정보, 설정 및 구성을 관리합니다. 상점 API를 사용하면 계정 하에서 여러 상점 프로필을 생성하고 관리할 수 있습니다.

상점 생성

POST /api/shops

{{
  "name": "My Korean Store",
  "description": "Premium Korean products",
  "website": "https://mystore.com",
  "business_info": {{
    "business_number": "123-45-67890",
    "business_name": "My Store Co., Ltd.",
    "ceo_name": "김철수",
    "address": "Seoul, Gangnam-gu, Teheran-ro 123"
  }},
  "contact": {{
    "email": "contact@mystore.com",
    "phone": "+82-2-1234-5678"
  }},
  "settings": {{
    "currency": "KRW",
    "timezone": "Asia/Seoul",
    "language": "ko"
  }}
}}

상점 세부정보 조회

GET /api/shops/{{shopId}}

// Response
{{
  "id": "shop_1234567890abcdef",
  "name": "My Korean Store",
  "status": "active",
  "business_info": {{
    "business_number": "123-45-67890",
    "verified": true
  }},
  "payment_methods": [
    "card",
    "virtual_account",
    "kakao_pay",
    "naver_pay"
  ],
  "created_at": "2024-01-01T00:00:00Z"
}}

상점 설정 업데이트

PATCH /api/shops/{{shopId}}

{{
  "settings": {{
    "webhook_url": "https://mystore.com/webhooks",
    "notification_email": "admin@mystore.com",
    "auto_refund_enabled": true,
    "payment_timeout": 1800
  }}
}}

🏪 멀티 상점 기능

  • • 상점별 개별 결제 설정
  • • 개별 웹훅 엔드포인트
  • • 상점별 분석 및 리포팅
  • • 다양한 브랜딩 및 체크아웃 테마
  • • 독립적인 거래 내역

커스텀 도메인

커스텀 도메인을 사용하여 브랜딩을 강화하고 체크아웃 경험을 향상시키세요. 고객은 전체 결제 과정에서 귀하의 도메인에 머물며, 신뢰도와 전환율을 높일 수 있습니다.

🌐 커스텀 도메인 혜택

  • 브랜딩 강화 - 전체 체크아웃 과정에서 귀하의 브랜드 유지
  • 신뢰도 향상 - 고객이 신뢰할 수 있는 도메인에서 결제
  • 전환율 증가 - 일관된 사용자 경험으로 이탈률 감소
  • SEO 개선 - 모든 결제 관련 트래픽이 귀하의 도메인으로

설정 방법

1단계: 대시보드에서 도메인 추가

대시보드의 커스텀 도메인 섹션에서 도메인을 추가하고 DNS 설정을 완료하세요:

예시 도메인: checkout.yourstore.com

DNS A 레코드:76.76.19.123
DNS CNAME 레코드:cname.vercel-dns.com

2단계: 도메인 인증

도메인 소유권을 확인하기 위해 TXT 레코드를 추가하세요:

# DNS TXT Record for verification
# Name: _vercel-challenge.checkout
# Value: provided-verification-code-from-dashboard

# Example:
Name: _vercel-challenge.checkout.yourstore.com
Type: TXT
Value: vc-domain-verify-abc123xyz456

3단계: API 통합 확인

도메인이 인증되면 체크아웃 세션이 자동으로 커스텀 도메인을 사용합니다:

// API Response with custom domain
{
  "success": true,
  "sessionId": "cs_1234567890abcdef",
  "checkoutUrl": "https://checkout.yourstore.com/checkout/cs_1234567890abcdef",
  "expiresAt": "2024-01-01T12:00:00Z"
}

// WordPress Plugin automatically uses custom domain
// No code changes required!

고급 설정

도메인 상태 확인

GET /api/shops/{shopId}

// Response includes custom domain status
{
  "id": "shop_123",
  "name": "My Store",
  "custom_domain": "checkout.yourstore.com",
  "domain_verification_status": "verified", // pending, verified, failed
  "domain_configuration_status": "configured", // pending, configured, failed
  "created_at": "2024-01-01T00:00:00Z"
}

수동 도메인 설정

PATCH /api/shops/{shopId}/custom-domain
Content-Type: application/json
x-api-key: sk_live_your_key_here

{
  "domain": "checkout.yourstore.com"
}

// Response
{
  "success": true,
  "domain": "checkout.yourstore.com",
  "verification_records": [
    {
      "type": "TXT",
      "name": "_vercel-challenge.checkout",
      "value": "vc-domain-verify-abc123xyz456"
    }
  ]
}

⚠️ 중요 사항

  • • 도메인 인증 완료까지 최대 24시간 소요될 수 있습니다
  • • SSL 인증서는 자동으로 발급되고 갱신됩니다
  • • 도메인이 인증되기 전까지는 기본 도메인이 사용됩니다
  • • 서브도메인만 지원됩니다 (예: checkout.yourstore.com)

성공 사례

커스텀 도메인 설정 후 고객은 checkout.yourstore.com에서 결제를 완료하고, 성공/실패 페이지도 동일한 도메인에서 표시됩니다. WordPress 플러그인 사용자는 코드 수정 없이 자동으로 커스텀 도메인이 적용됩니다.

쿠폰 시스템 API

할인 쿠폰을 프로그래밍 방식으로 관리합니다. 체크아웃 플로우에서 쿠폰 생성, 검증 및 사용량을 추적합니다.

🎫 지원되는 쿠폰 유형

  • percentage - 퍼센트 할인 (예: 10% 할인)
  • fixed_amount - 고정금액 할인 (예: ₩5,000 할인)
  • free_shipping - 무료배송 쿠폰
  • product_specific - 특정 상품 할인

쿠폰 생성

POST /api/coupons/create

curl -X POST https://api.koreacheckout.com/api/coupons/create \
  -H "x-api-key: sk_live_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "code": "WELCOME10",
    "name_ko": "신규 고객 할인",
    "name_en": "New Customer Discount",
    "type": "percentage",
    "discount_value": 10,
    "valid_from": "2024-01-01T00:00:00Z",
    "valid_until": "2024-12-31T23:59:59Z",
    "usage_limit": 1000,
    "usage_limit_per_customer": 1,
    "minimum_order_amount": 50000,
    "applies_to": "cart_total"
  }'

세션에 쿠폰 적용

POST /api/coupons/apply

{
  "sessionId": "cs_1234567890abcdef",
  "couponCode": "WELCOME10"
}

// Response
{
  "success": true,
  "discount": {
    "type": "percentage",
    "value": 10,
    "amount": 2900
  },
  "newTotal": 26100
}

통합 예제 (Node.js)

// Create a welcome coupon for new customers
const welcomeCoupon = await fetch('https://api.koreacheckout.com/api/coupons/create', {
  method: 'POST',
  headers: {
    'x-api-key': process.env.KOREA_CHECKOUT_API_KEY,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    code: 'WELCOME15',
    name_ko: '신규 가입 할인',
    type: 'percentage',
    discount_value: 15,
    valid_from: new Date().toISOString(),
    valid_until: new Date(Date.now() + 30*24*60*60*1000).toISOString(), // 30 days
    usage_limit_per_customer: 1,
    minimum_order_amount: 30000
  })
});

// Apply coupon during checkout
const applyCoupon = async (sessionId, couponCode) => {
  const response = await fetch('https://api.koreacheckout.com/api/coupons/apply', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      sessionId,
      couponCode
    })
  });
  
  return response.json();
};

💡 쿠폰 모범 사례

  • • 남용을 방지하기 위해 합리적인 사용 제한을 설정하세요
  • • 고액 할인에는 최소 주문 금액을 사용하세요
  • • 먼저 샌드박스 모드에서 쿠폰 검증을 테스트하세요
  • • 분석 API를 통해 쿠폰 성과를 추적하세요
  • • 프로모션 캠페인에 명확한 만료일을 설정하세요

웹훅

결제 이벤트에 대한 실시간 알림을 받습니다. 웹훅은 이벤트가 발생할 때 서버로 전송되는 HTTP POST 요청입니다.

📡 이벤트 유형

  • payment.completed - 결제가 성공적으로 처리됨
  • payment.failed - 결제 실패 또는 거절됨
  • payment.refunded - 결제가 환불됨
  • session.expired - 체크아웃 세션 만료됨

웹훅 페이로드

{
  "event": "payment.completed",
  "data": {
    "sessionId": "cs_1234567890abcdef",
    "platformOrderId": "order_123",
    "totalAmount": 29000,
    "currency": "KRW",
    "paymentMethod": "card",
    "customer": {
      "name": "홍길동",
      "email": "customer@example.com"
    },
    "completedAt": "2024-01-01T12:00:00Z"
  }
}

웹훅 처리

app.post('/webhooks/checkout', express.raw({type: 'application/json'}), (req, res) => {
  const payload = req.body;
  const signature = req.headers['x-korea-checkout-signature'];
  
  // Verify webhook signature (recommended)
  if (!verifySignature(payload, signature)) {
    return res.status(400).send('Invalid signature');
  }
  
  const event = JSON.parse(payload);
  
  switch (event.event) {
    case 'payment.completed':
      handlePaymentCompleted(event.data);
      break;
    case 'payment.failed':
      handlePaymentFailed(event.data);
      break;
    default:
      console.log('Unknown event type:', event.event);
  }
  
  res.status(200).send('OK');
});

한국 결제 수단

신용카드, 계좌이체, 모바일 결제를 포함한 모든 주요 한국 결제 수단을 지원합니다.

💳 신용카드

  • • Visa, MasterCard, JCB
  • • 한국 국내카드 (BC, 삼성, 현대)
  • • 할부 결제
  • • 법인카드 지원

🏦 계좌이체

  • • 가상계좌
  • • 실시간 계좌이체
  • • 모든 주요 한국 은행
  • • 자동 정산

📱 모바일 결제

KakaoPay, NaverPay, Samsung Pay 및 기타 인기 있는 한국 모바일 결제 솔루션이 통합 API를 통해 지원됩니다.

오류 처리

API는 요청의 성공 또는 실패를 나타내기 위해 기존 HTTP 응답 코드를 사용합니다. 오류 응답에는 문제를 디버깅하는 데 도움이 되는 자세한 정보가 포함됩니다.

🚨 일반적인 오류 코드

  • 400 - 잘못된 요청 (유효하지 않은 매개변수)
  • 401 - 인증되지 않음 (유효하지 않은 API 키)
  • 404 - 찾을 수 없음 (세션 또는 리소스를 찾을 수 없음)
  • 429 - 요청 제한 (너무 많은 요청)
  • 500 - 내부 서버 오류

오류 응답 형식

{
  "error": {
    "code": "invalid_session",
    "message": "The specified session ID is invalid or has expired",
    "details": {
      "sessionId": "cs_invalid123",
      "field": "sessionId"
    }
  }
}