2Checkout API: 결제 처리 완벽 통합 가이드 (2026년)

Ashley Innocent

Ashley Innocent

20 March 2026

2Checkout API: 결제 처리 완벽 통합 가이드 (2026년)

요약 (TL;DR)

2Checkout API(현재 Verifone)를 사용하면 개발자가 프로그래밍 방식으로 결제를 처리하고, 구독을 관리하며, 전자상거래 거래를 처리할 수 있습니다. API 키를 사용하여 JSON 기반 인증으로 주문, 고객, 제품 및 웹훅에 대한 RESTful 엔드포인트를 지원합니다. 이 가이드는 초기 설정부터 고급 웹훅 처리까지 모든 것을 다룹니다.

소개

결제 처리는 모든 온라인 비즈니스의 핵심입니다. 잘못 처리하면 수익을 잃게 됩니다. 제대로 처리하면 글로벌 시장을 열 수 있습니다. 2Checkout API(최근 Verifone으로 리브랜딩)는 전 세계 45,000개 이상의 판매자를 위해 결제를 처리하며, 매년 수십억 달러의 거래를 처리합니다.

현실은 이렇습니다: 쇼핑객의 67%가 결제 마찰로 인해 장바구니를 포기합니다. 견고한 결제 API 통합은 비즈니스 수익에 직접적인 영향을 미칩니다.

이 가이드는 완전한 2Checkout API 통합 과정을 안내합니다. 인증, 결제 처리, 구독 관리, 웹훅 처리 및 오류 문제 해결에 대해 배우게 될 것입니다. 끝까지 따라하면 상용 가능한 결제 통합을 갖추게 될 것입니다.

💡
Apidog는 API 통합 테스트를 더 간단하게 만듭니다. 하나의 작업 공간에서 2Checkout 엔드포인트를 테스트하고, 웹훅 페이로드를 검증하며, 인증 문제를 디버그하세요. 2Checkout OpenAPI 사양을 가져오고, 응답을 모의하고, 테스트 시나리오를 팀과 공유하세요.
button

2Checkout API란 무엇인가요?

2Checkout (현재 Verifone Digital Commerce로 운영)는 결제 처리 및 구독 관리를 위한 RESTful API를 제공합니다. 이 API는 다음을 처리합니다:

주요 기능

기능 설명
RESTful 설계 JSON 페이로드를 사용하는 표준 HTTP 메서드 (GET, POST, PUT, DELETE)
샌드박스 환경 실제 거래 처리 없이 결제 테스트
웹훅 지원 주문 이벤트에 대한 실시간 알림
토큰화 카드 정보를 저장하지 않고 안전한 결제 데이터 처리
글로벌 규정 준수 PCI DSS 레벨 1, GDPR, PSD2 및 3D Secure 2.0

API 아키텍처 개요

2Checkout은 버전 관리된 REST API 구조를 사용합니다:

https://api.2checkout.com/1/
https://api.2checkout.com/2/

버전 2는 개선된 구독 관리 및 웹훅 처리를 제공하는 현재 권장 버전입니다.

시작하기: 인증 설정

1단계: 2Checkout 계정 생성

API에 접근하려면 판매자 계정이 필요합니다:

  1. 2Checkout (Verifone) 가입 페이지 방문
  2. 사업자 인증 완료 (사업 서류 필요)
  3. 승인 대기 (일반적으로 24-48시간 소요)
  4. 제어판에 접속하여 API 자격 증명 검색

2단계: API 키 검색

제어판에서 통합(Integrations) > API 키(API Keys)로 이동합니다:

보안 참고: API 키를 버전 제어에 커밋하지 마십시오. 환경 변수를 사용하십시오:

# .env 파일
TWOCHECKOUT_PRIVATE_KEY="여기에_비공개_키_입력"
TWOCHECKOUT_PUBLIC_KEY="여기에_공개_키_입력"
TWOCHECKOUT_WEBHOOK_SECRET="여기에_웹훅_시크릿_입력"

3단계: 샌드박스 vs 프로덕션

2Checkout은 별도의 환경을 제공합니다:

환경 기본 URL 사용 사례
샌드박스 https://sandbox.2checkout.com/api/ 개발 및 테스트
프로덕션 https://api.2checkout.com/ 실제 거래

개발 중에는 샌드박스 자격 증명을 사용하세요. 실제 결제를 처리할 준비가 되었을 때만 프로덕션 키로 전환하세요.

4단계: 인증 방법

2Checkout은 두 가지 인증 방식을 지원합니다:

방법 1: API 키 인증 (권장)

요청 헤더에 비공개 키를 포함합니다:

const response = await fetch('https://api.2checkout.com/1/orders', {
  method: 'GET',
  headers: {
    'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY,
    'Content-Type': 'application/json',
    'Accept': 'application/json'
  }
});

방법 2: HMAC 서명 인증

강화된 보안을 위해 HMAC-SHA256으로 요청에 서명합니다:

const crypto = require('crypto');

function generateSignature(payload, privateKey) {
  const hash = crypto
    .createHmac('sha256', privateKey)
    .update(JSON.stringify(payload))
    .digest('hex');
  return hash;
}

// 사용 예시
const payload = { order_id: '12345', amount: 99.99 };
const signature = generateSignature(payload, privateKey);

const response = await fetch('https://api.2checkout.com/1/orders', {
  method: 'POST',
  headers: {
    'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY,
    'X-Signature': signature,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify(payload)
});

결제 처리: 핵심 엔드포인트

일회성 주문 생성

/orders 엔드포인트를 사용하여 단일 결제를 처리합니다:

const createOrder = async (customerData, productData) => {
  const payload = {
    currency: 'USD',
    customer: {
      email: customerData.email,
      first_name: customerData.firstName,
      last_name: customerData.lastName,
      phone: customerData.phone,
      billing_address: {
        address1: customerData.address,
        city: customerData.city,
        state: customerData.state,
        zip: customerData.zip,
        country: customerData.country
      }
    },
    items: [
      {
        name: productData.name,
        quantity: productData.quantity,
        price: productData.price,
        product_code: productData.sku
      }
    ],
    payment_method: {
      type: 'card',
      card_token: customerData.cardToken // 클라이언트 측 토큰화로부터
    }
  };

  const response = await fetch('https://api.2checkout.com/1/orders', {
    method: 'POST',
    headers: {
      'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify(payload)
  });

  return await response.json();
};

예상 응답

{
  "order_id": "ORD-2026-001234",
  "status": "approved",
  "amount": 99.99,
  "currency": "USD",
  "customer_id": "CUST-789456",
  "transaction_id": "TXN-9876543210",
  "created_at": "2026-03-20T10:30:00Z"
}

결제 오류 처리

항상 적절한 오류 처리를 구현하십시오:

try {
  const result = await createOrder(customer, product);

  if (result.error) {
    // 특정 오류 코드 처리
    switch (result.error.code) {
      case 'CARD_DECLINED':
        // 고객에게 다른 카드 요청
        break;
      case 'INSUFFICIENT_FUNDS':
        // 적절한 메시지 표시
        break;
      case 'INVALID_CVV':
        // CVV 재입력 요청
        break;
      default:
        // 로깅 및 일반 오류 표시
        console.error('결제 실패:', result.error);
    }
  }
} catch (error) {
  // 네트워크 또는 서버 오류
  console.error('API 요청 실패:', error);
}

일반적인 오류 코드

오류 코드 HTTP 상태 설명 해결책
CARD_DECLINED 402 카드 거부됨 다른 결제 수단 요청
INVALID_CARD 400 유효하지 않은 카드 번호 카드 입력 유효성 검사
EXPIRED_CARD 400 카드 만료됨 업데이트된 만료일 요청
INVALID_CVV 400 CVV 검증 실패 CVV 재요청
INSUFFICIENT_FUNDS 402 잔액 부족 대체 결제 수단 제안
DUPLICATE_ORDER 409 주문 이미 처리됨 중복 확인
INVALID_CURRENCY 400 지원되지 않는 통화 통화 코드 확인
API_KEY_INVALID 401 인증 실패 API 키 확인

고객 관리

고객 데이터 관리는 구독 비즈니스 및 재구매에 필수적입니다. 2Checkout은 완벽한 고객 API를 제공합니다.

고객 생성

const createCustomer = async (customerData) => {
  const payload = {
    email: customerData.email,
    first_name: customerData.firstName,
    last_name: customerData.lastName,
    phone: customerData.phone,
    company: customerData.company,
    billing_address: {
      address1: customerData.address,
      address2: customerData.address2 || '',
      city: customerData.city,
      state: customerData.state,
      zip: customerData.zip,
      country: customerData.country
    },
    shipping_address: customerData.shippingAddress || null,
    tax_exempt: false,
    language: 'en'
  };

  const response = await fetch('https://api.2checkout.com/1/customers', {
    method: 'POST',
    headers: {
      'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify(payload)
  });

  return await response.json();
};

고객 응답

{
  "customer_id": "CUST-2026-123456",
  "email": "john.doe@example.com",
  "first_name": "John",
  "last_name": "Doe",
  "created_at": "2026-03-20T10:00:00Z",
  "updated_at": "2026-03-20T10:00:00Z",
  "payment_methods": [],
  "subscriptions": [],
  "order_history": []
}

고객 세부 정보 검색

const getCustomer = async (customerId) => {
  const response = await fetch(
    `https://api.2checkout.com/1/customers/${customerId}`,
    {
      method: 'GET',
      headers: {
        'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY,
        'Content-Type': 'application/json'
      }
    }
  );

  return await response.json();
};

고객 정보 업데이트

const updateCustomer = async (customerId, updates) => {
  const response = await fetch(
    `https://api.2checkout.com/1/customers/${customerId}`,
    {
      method: 'PUT',
      headers: {
        'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify(updates)
    }
  );

  return await response.json();
};

고객 삭제

const deleteCustomer = async (customerId) => {
  const response = await fetch(
    `https://api.2checkout.com/1/customers/${customerId}`,
    {
      method: 'DELETE',
      headers: {
        'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY
      }
    }
  );

  return response.status === 204; // 성공 시 내용 없음 (No content)
};

참고: 활성 구독 또는 미지불 잔액이 있는 고객을 삭제하는 것은 실패합니다. 먼저 구독을 취소하십시오.

고급 통합 패턴

안전한 재시도를 위한 멱등성

결제 API는 중복 청구를 방지하기 위해 멱등 요청을 지원해야 합니다:

const createIdempotentOrder = async (payload, idempotencyKey) => {
  const response = await fetch('https://api.2checkout.com/1/orders', {
    method: 'POST',
    headers: {
      'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY,
      'Content-Type': 'application/json',
      'X-Idempotency-Key': idempotencyKey // 주문당 고유 키
    },
    body: JSON.stringify(payload)
  });

  return await response.json();
};

// 주문당 고유 키 생성 (데이터베이스에 저장)
const idempotencyKey = `order_${userId}_${Date.now()}`;

요청이 시간 초과되었지만 2Checkout이 이미 처리한 경우, 동일한 키로 재시도하면 두 번 청구하는 대신 원래 결과가 반환됩니다.

3D Secure 2.0 처리 (EU 규정 준수)

유럽 고객의 경우 PSD2에 따라 3D Secure 2.0 인증이 필수입니다:

const createOrderWith3DS = async (payload) => {
  const response = await fetch('https://api.2checkout.com/1/orders', {
    method: 'POST',
    headers: {
      'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      ...payload,
      three_ds: {
        enabled: true,
        challenge_required: 'preferred', // EU의 경우 'mandatory'
        notification_url: 'https://your-site.com/3ds-callback'
      }
    })
  });

  const result = await response.json();

  // 3DS 리디렉션 처리
  if (result.three_ds_redirect_url) {
    // 고객을 인증을 위해 은행으로 리디렉션
    res.redirect(result.three_ds_redirect_url);
  }

  return result;
};

다중 통화 가격

기본 통화로 결제하면서 현지 통화로 가격을 표시합니다:

const getLocalizedPrice = async (basePrice, targetCurrency) => {
  const response = await fetch(
    `https://api.2checkout.com/1/rates?from=USD&to=${targetCurrency}`,
    {
      headers: {
        'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY
      }
    }
  );

  const rates = await response.json();
  return basePrice * rates.rate;
};

// 사용법
const eurPrice = await getLocalizedPrice(99.99, 'EUR');
console.log(`가격: EUR ${eurPrice.toFixed(2)}`);

구독 업그레이드를 위한 비례 배분

고객이 중간에 업그레이드할 때, 비례 배분 요금을 계산합니다:

const upgradeSubscription = async (subscriptionId, newPlanId) => {
  const response = await fetch(
    `https://api.2checkout.com/1/subscriptions/${subscriptionId}/upgrade`,
    {
      method: 'POST',
      headers: {
        'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        plan_id: newPlanId,
        proration: 'immediate', // 지금 차액 청구
        invoice_proration: true  // 인보이스에 항목 표시
      })
    }
  );

  return await response.json();
};

일반적인 문제 해결

문제: 웹훅이 도착하지 않음

증상: 주문은 처리되지만 시스템이 업데이트되지 않습니다.

진단:

// 2Checkout 대시보드에서 웹훅 전송 로그 확인
// 실패한 전송 시도 또는 200이 아닌 응답 확인

해결책:

  1. 엔드포인트가 5초 이내에 200 OK를 반환하는지 확인
  2. SSL 인증서 유효성 확인 (HTTPS여야 함)
  3. 방화벽에서 2Checkout IP 범위 화이트리스트에 추가
  4. 웹훅 서명 확인 로직 검토
  5. 프로덕션 전 웹훅 시뮬레이터로 테스트

문제: 샌드박스에서 테스트 결제 실패

증상: 샌드박스 환경에서 모든 테스트 카드가 거부됩니다.

해결책:

  1. 샌드박스 API 키를 사용하는지 확인 (프로덕션 키 아님)
  2. 샌드박스 기본 URL 확인: https://sandbox.2checkout.com/api/
  3. 올바른 테스트 카드 번호 사용 (테스트 섹션 참조)
  4. 샌드박스 계정 상태 확인 (비활성 후 만료될 수 있음)

문제: 구독 갱신이 조용히 실패함

증상: 구독은 활성 상태로 표시되지만 갱신이 처리되지 않습니다.

진단:

// 구독 결제 내역 쿼리
const history = await fetch(
  `https://api.2checkout.com/1/subscriptions/${subId}/payments`,
  { headers: { 'X-Api-Key': privateKey } }
);

해결책:

  1. 고객 결제 수단 만료 확인
  2. 제어판에서 독촉(dunning) 설정 검토
  3. subscription.payment_failed에 대한 웹훅 전송 확인
  4. auto_renew 플래그가 활성화되어 있는지 확인

문제: 환율 변환 불일치

증상: 청구된 금액이 예상 변환과 다릅니다.

원인: 2Checkout은 매일 변동하는 환율을 사용합니다.

해결책:

문제: AVS (주소 인증) 실패

증상: 주소 불일치로 인해 유효한 카드가 거부됩니다.

해결책:

  1. 주소 자동 완성 사용 (Google Places, Lob)
  2. 결제 시 ZIP/우편 번호 필수 항목으로 설정
  3. 소프트 AVS 구현 (거부 대신 경고)
  4. 고객이 청구 주소를 업데이트하도록 허용

구독 관리

2Checkout은 반복 청구에 탁월합니다. 구독을 관리하는 방법은 다음과 같습니다:

구독 생성

const createSubscription = async (customerId, planId) => {
  const payload = {
    customer_id: customerId,
    plan_id: planId,
    start_date: new Date().toISOString(),
    billing_cycle: 'monthly', // 또는 'annual', 'weekly'
    payment_method: {
      type: 'card',
      card_token: 'tok_card_tokenized'
    },
    options: {
      trial_days: 14, // 선택 사항인 무료 평가판
      auto_renew: true
    }
  };

  const response = await fetch('https://api.2checkout.com/1/subscriptions', {
    method: 'POST',
    headers: {
      'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify(payload)
  });

  return await response.json();
};

구독 응답

{
  "subscription_id": "SUB-2026-567890",
  "status": "active",
  "plan_id": "PLAN-PREMIUM-MONTHLY",
  "customer_id": "CUST-789456",
  "current_period_start": "2026-03-20T00:00:00Z",
  "current_period_end": "2026-04-20T00:00:00Z",
  "trial_end": "2026-04-03T00:00:00Z",
  "amount": 29.99,
  "currency": "USD"
}

구독 업데이트

플랜 변경, 결제 수단 업데이트 또는 수량 수정:

const updateSubscription = async (subscriptionId, updates) => {
  const payload = {
    ...updates
    // 예시:
    // plan_id: 'PLAN-ENTERPRISE-MONTHLY',
    // quantity: 5,
    // payment_method: { card_token: 'new_token' }
  };

  const response = await fetch(
    `https://api.2checkout.com/1/subscriptions/${subscriptionId}`,
    {
      method: 'PUT',
      headers: {
        'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify(payload)
    }
  );

  return await response.json();
};

구독 취소

const cancelSubscription = async (subscriptionId, reason = '') => {
  const payload = {
    cancel_at_period_end: false, // true = 현재 기간 이후 취소, false = 즉시 취소
    reason: reason
  };

  const response = await fetch(
    `https://api.2checkout.com/1/subscriptions/${subscriptionId}/cancel`,
    {
      method: 'POST',
      headers: {
        'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify(payload)
    }
  );

  return await response.json();
};

웹훅 통합: 실시간 이벤트 처리

웹훅은 폴링 없이 결제 이벤트를 시스템에 알립니다. 이는 구독 갱신, 결제 실패 및 환불에 중요합니다.

1단계: 웹훅 엔드포인트 구성

2Checkout 제어판에서:

  1. 통합(Integrations) > 웹훅(Webhooks)으로 이동합니다.
  2. 엔드포인트 URL을 추가합니다 (HTTPS를 사용해야 합니다).
  3. 구독할 이벤트를 선택합니다.
  4. 저장하고 웹훅 시크릿을 기록합니다.

2단계: 웹훅 핸들러 생성

const express = require('express');
const crypto = require('crypto');
const app = express();

app.post('/webhooks/2checkout', express.raw({ type: 'application/json' }), async (req, res) => {
  const signature = req.headers['x-webhook-signature'];
  const payload = req.body;

  // 웹훅 서명 확인
  const isValid = verifyWebhookSignature(payload, signature, process.env.TWOCHECKOUT_WEBHOOK_SECRET);

  if (!isValid) {
    console.error('유효하지 않은 웹훅 서명');
    return res.status(401).send('Unauthorized');
  }

  const event = JSON.parse(payload.toString());

  // 적절한 핸들러로 라우팅
  switch (event.type) {
    case 'order.created':
      await handleOrderCreated(event.data);
      break;
    case 'order.approved':
      await handleOrderApproved(event.data);
      break;
    case 'order.declined':
      await handleOrderDeclined(event.data);
      break;
    case 'subscription.created':
      await handleSubscriptionCreated(event.data);
      break;
    case 'subscription.renewed':
      await handleSubscriptionRenewed(event.data);
      break;
    case 'subscription.cancelled':
      await handleSubscriptionCancelled(event.data);
      break;
    case 'refund.processed':
      await handleRefundProcessed(event.data);
      break;
    default:
      console.log('처리되지 않은 이벤트 유형:', event.type);
  }

  // 수신 확인
  res.status(200).send('OK');
});

function verifyWebhookSignature(payload, signature, secret) {
  const expectedSignature = crypto
    .createHmac('sha256', secret)
    .update(payload)
    .digest('hex');
  return crypto.timingSafeEqual(
    Buffer.from(signature, 'hex'),
    Buffer.from(expectedSignature, 'hex')
  );
}

주요 웹훅 이벤트

이벤트 유형 트리거 필요한 조치
order.created 새 주문 접수 확인 이메일 발송
order.approved 결제 성공 주문 처리, 액세스 권한 부여
order.declined 결제 실패 고객에게 알림, 재시도 로직
subscription.renewed 반복 결제 액세스 기간 연장
subscription.payment_failed 갱신 실패 독촉 절차 시작
subscription.cancelled 고객 취소 기간 종료 시 액세스 철회
refund.processed 환불 처리됨 사용자 잔액 업데이트
chargeback.received 분쟁 제기됨 증거 수집

웹훅 모범 사례

  1. 항상 서명 확인 - 위조된 웹훅 방지
  2. 200 OK를 빠르게 반환 - 2Checkout은 200이 아닌 응답 시 재시도
  3. 비동기적으로 처리 - 백그라운드 처리를 위해 이벤트를 큐에 추가
  4. 멱등성 구현 - 중복 웹훅 전송 처리
  5. 모든 것을 로깅 - 타임스탬프가 찍힌 로그로 결제 분쟁 디버그

통합 테스트

샌드박스 환경 사용

2Checkout의 샌드박스를 사용하면 실제 요금 없이 테스트할 수 있습니다:

// 샌드박스 기본 URL 사용
const BASE_URL = 'https://sandbox.2checkout.com/api/1';

// 테스트 카드 번호
const TEST_CARDS = {
  APPROVED: '4111111111111111',
  DECLINED: '4000000000000002',
  INSUFFICIENT_FUNDS: '4000000000009995',
  EXPIRED_CARD: '4000000000000069'
};

// 테스트 주소
const TEST_ADDRESS = {
  country: 'US',
  zip: '90210' // AVS 체크 트리거
};

로컬에서 웹훅 테스트

ngrok를 사용하여 로컬 서버를 노출시킵니다:

# ngrok 설치
npm install -g ngrok

# 포트 3000에서 서버 시작
node server.js

# 인터넷에 노출
ngrok http 3000

# ngrok URL을 2Checkout 웹훅 설정에 복사

API 테스트를 위한 Apidog

Apidog는 2Checkout API 테스트를 간소화합니다:

  1. OpenAPI 사양 가져오기 - 2Checkout의 API 정의 로드
  2. 테스트 시나리오 생성 - 각 엔드포인트에 대한 컬렉션 구축
  3. 응답 모의 - API에 요청 없이 테스트
  4. 웹훅 검증 - 페이로드 구조 검사
  5. 팀과 공유 - 통합 테스트 공동 작업

샌드박스 및 프로덕션 키에 대한 환경 변수를 생성한 다음 한 번의 클릭으로 컨텍스트를 전환합니다.

프로덕션 배포 체크리스트

실제 서비스 시작 전:

모니터링 및 경고

다음 지표를 추적합니다:

// 예시: 결제 성공률
const successRate = approvedOrders / totalOrders * 100;

if (successRate < 95) {
  // 결제 팀에 경고
  sendAlert('결제 성공률이 95% 미만으로 떨어졌습니다');
}

// 특정 오류 코드 추적
const errorBreakdown = errors.reduce((acc, err) => {
  acc[err.code] = (acc[err.code] || 0) + 1;
  return acc;
}, {});

// 특정 오류 급증 시 경고
if (errorBreakdown['CARD_DECLINED'] > threshold) {
  sendAlert('카드 거절 급증 감지');
}

실제 사용 사례

전자상거래 스토어 통합

패션 소매업체는 글로벌 결제를 처리하기 위해 2Checkout을 통합했습니다. 결과:

초기에 2Checkout의 호스팅된 결제 페이지를 사용하여 구현하는 데 3주가 걸렸고, 이후 사용자 정의 UX를 위해 직접 API 통합으로 마이그레이션했습니다.

SaaS 구독 비즈니스

프로젝트 관리 SaaS는 2Checkout 구독을 사용했습니다:

핵심 기능: 웹훅 기반 액세스 제어. subscription.renewed가 도착하면 즉시 사용자 액세스 기간을 연장합니다. subscription.cancelled가 도착하면 액세스 철회를 예약합니다.

결론

2Checkout API는 결제 처리 및 구독 관리에 필요한 모든 것을 제공합니다. 주요 요점:

button

FAQ 섹션

2Checkout API란 무엇인가요?

2Checkout API(현재 Verifone)는 결제를 처리하고, 구독을 관리하며, 환불을 처리하고, 전자상거래 거래를 자동화하기 위한 RESTful 인터페이스입니다. JSON 페이로드, HMAC 인증 및 실시간 웹훅을 지원합니다.

2Checkout과 Verifone은 동일한가요?

네. 2Checkout은 2020년 Verifone에 인수되었으며 Verifone Digital Commerce로 리브랜딩되었습니다. 일부 문서에서 Verifone을 언급하지만 API 엔드포인트와 기능은 동일하게 유지됩니다.

2Checkout API 키는 어떻게 얻나요?

2Checkout 제어판에 로그인하여 통합(Integrations) > API 키(API Keys)로 이동한 후 새 키를 생성하세요. 비공개 키(서버 측)와 공개 키(클라이언트 측 토큰화)를 받게 됩니다.

2Checkout에 샌드박스 환경이 있나요?

네. 테스트용으로 https://sandbox.2checkout.com/api/를 사용하세요. 별도의 샌드박스 계정을 생성하여 테스트 API 키를 받고 실제 요금 없이 테스트 거래를 처리할 수 있습니다.

2Checkout은 어떤 결제 수단을 지원하나요?

2Checkout은 신용카드(Visa, Mastercard, Amex, Discover), PayPal, Apple Pay, Google Pay, 은행 송금 및 100개 이상의 국가에서 현지 결제 수단을 지원합니다.

웹훅은 어떻게 안전하게 처리하나요?

웹훅 시크릿을 사용하여 HMAC-SHA256으로 X-Webhook-Signature 헤더를 항상 확인하십시오. 이벤트를 비동기적으로 처리하고 즉시 200 OK를 반환하여 재시도를 방지하세요.

구독 결제가 실패하면 어떻게 되나요?

2Checkout은 subscription.payment_failed 웹훅을 보냅니다. 재시도 로직(일반적으로 7일 동안 3회 시도)을 구현하고, 모든 재시도가 실패하면 subscription.cancelled 웹훅을 보냅니다.

2Checkout은 PCI DSS를 준수하나요?

네, 2Checkout은 PCI DSS 레벨 1 인증을 받았습니다. 클라이언트 측 토큰화를 사용하여 원시 카드 데이터를 처리하지 않도록 하면 PCI 규정 준수 범위를 줄일 수 있습니다.

샌드박스에서 구독을 테스트할 수 있나요?

네. 샌드박스는 평가판, 갱신, 업그레이드, 다운그레이드 및 취소를 포함한 전체 구독 수명 주기 테스트를 지원합니다. 성공적인 결제를 위해 테스트 카드 4111111111111111를 사용하십시오.

API를 통해 환불은 어떻게 처리하나요?

주문 ID와 환불 금액을 포함하여 /refunds로 POST 요청을 보냅니다. 2Checkout은 부분 또는 전체 환불을 처리하며 완료 시 refund.processed 웹훅을 보냅니다.

Apidog에서 API 설계-첫 번째 연습

API를 더 쉽게 구축하고 사용하는 방법을 발견하세요