Gateway 설정
Production 주소와 사이트 API 키를 준비합니다.
GUARDIAN FDS · API v1
test_site와 같은 흐름으로 Gateway 설정, 인증, 거래 전송, 비동기 상태 확인을 단계별로 안내합니다.
고객 서비스에 적용하기 전, test_site에서 같은 순서를 확인하세요.
Production 주소와 사이트 API 키를 준비합니다.
표준 Payload를 POST /v1/transactions로 보냅니다.
ingestion_id로 평가 완료를 확인합니다.
STEP 1 · CONFIGURE
사이트 코드를 URL이나 body에 넣지 않습니다. API 키가 사이트와 권한을 결정합니다.
GUARDIAN_API_URL=https://api.fdsguard.co.kr
GUARDIAN_API_KEY=발급받은_Production_API_키STEP 2 · SEND
test_site가 생성하는 공개 API v1 요청 구조입니다. 카드번호·계좌번호·CVC 대신 Token만 전송하세요.
curl -X POST "https://api.fdsguard.co.kr/v1/transactions" \
-H "Content-Type: application/json" \
-H "x-api-key: $GUARDIAN_API_KEY" \
-H "Idempotency-Key: pay_20260820_000001" \
-d @transaction.json{
"schema_version": "1.0",
"source_event_id": "tid_demo_20260820_000001",
"occurred_at": "2026-08-20T10:00:00+09:00",
"sent_at": "2026-08-20T10:00:01+09:00",
"source_system": "merchant-payment-server",
"event_type": "PAYMENT_CAPTURE",
"merchant_external_id": "merchant_10001",
"merchant": { "legal_name": "주식회사 유앤아이위아", "primary_domain": "shop.example.kr" },
"business": { "business_registration_no": "4558103507", "business_type": "CORPORATION" },
"transaction": { "source_event_id": "tid_demo_20260820_000001", "type": "PAYMENT", "status": "APPROVED", "occurred_at": "2026-08-20T10:00:00+09:00", "amount_minor": 18000, "currency": "KRW", "channel": "ECOMMERCE", "tid": "tid_demo_20260820_000001" },
"payment_method": { "type": "CARD", "token": "payment-method-token" }
}const accepted = await response.json(); // 202 = 원장 수신 완료
const status = await fetch(
`https://api.fdsguard.co.kr/v1/ingestions/${accepted.ingestion_id}`,
{ headers: { 'x-api-key': process.env.GUARDIAN_API_KEY! } },
).then((res) => res.json());
// ACCEPTED → STORED → EVALUATING → EVALUATED응답 이해하기
NODE.JS SDK
test_site의 Gateway 주소·API 키·멱등성 키 흐름을 SDK로 동일하게 구현합니다.
# private registry를 사용하는 경우
npm config set @guardian:registry https://fdsguard.co.kr/repository/npm-private/
pnpm add @guardian/fds-risk-sdkimport { GuardianFdsClient } from '@guardian/fds-risk-sdk';
const client = new GuardianFdsClient({
baseUrl: 'https://api.fdsguard.co.kr',
apiKey: process.env.GUARDIAN_API_KEY!,
// 기존 호환 API용 옵션입니다. /v1 호출은 API 키로 사이트가 결정됩니다.
siteCode: 'unused-for-v1',
timeoutMs: 3000,
retryAttempts: 5,
});
const now = new Date().toISOString();
const payload = {
schema_version: '1.0',
source_event_id: 'tid_demo_20260820_000001',
occurred_at: now,
sent_at: now,
source_system: 'merchant-payment-server',
event_type: 'PAYMENT_CAPTURE',
merchant_external_id: 'merchant_10001',
merchant: { legal_name: '주식회사 유앤아이위아', primary_domain: 'shop.example.kr' },
business: { business_registration_no: '4558103507', business_type: 'CORPORATION' },
transaction: { source_event_id: 'tid_demo_20260820_000001', type: 'PAYMENT', status: 'APPROVED', occurred_at: now, amount_minor: 18000, currency: 'KRW', channel: 'ECOMMERCE', tid: 'tid_demo_20260820_000001' },
payment_method: { type: 'CARD', token: 'customer-payment-method-token' },
};
const idempotencyKey = 'pay_20260820_000001';
const accepted = await client.submitTransactionV1(payload, idempotencyKey);
const status = await client.getIngestionV1((accepted as any).ingestion_id) as {
status?: string; evaluation_state?: string; ingestion_id?: string;
};
switch (status.status) {
case 'EVALUATED':
console.log('평가 완료:', status);
break;
case 'ACCEPTED':
case 'STORED':
case 'EVALUATING':
case 'FAILED_RETRYABLE':
// 아직 완료되지 않았습니다. 1~5초 간격으로 다시 조회합니다.
console.log('평가 진행/재시도 중:', status.status);
break;
case 'FAILED_FINAL':
case 'DLQ':
// 자동 재시도를 멈추고 ingestion_id를 운영자에게 전달합니다.
console.error('최종 실패:', status);
break;
default:
console.warn('알 수 없는 ingestion 상태:', status);
}pay_20260820_000001같은 결제를 네트워크 오류 등으로 다시 전송할 때 사용하는 고유 재시도 키입니다. 최초 요청과 모든 재시도에 동일한 값을 사용하면 Gateway는 같은 거래로 처리합니다. 다른 거래에는 반드시 새 값을 생성하세요. 예제에서는 원천 거래 ID와 같은 값을 사용했지만, 실제 서비스에서는 거래당 8~128자의 고유 문자열을 생성하면 됩니다.
429·5xx·네트워크 오류만 동일한 Idempotency-Key로 지수 백오프 재시도하세요. 400·401·403·409는 payload, API 키 또는 멱등성 키를 수정한 뒤 재요청해야 합니다.