<API 이용 안내

KPC 허브 포인트를 외부 서비스(투표시스템, 영상부스, 쇼핑몰 등)에서 결제수단으로 사용하려면 아래 API로 연동합니다. API Key/Secret 발급은 협업 문의를 통해 받으실 수 있습니다.

1. 인증 방식

모든 요청에 아래 3개 헤더가 필요합니다.

X-API-Key: kpch_xxxxxxxxxxxxxxxx
X-Timestamp: 1737000000        (현재 UNIX 타임스탬프, 5분 이내만 허용)
X-Signature: HMAC-SHA256(secret, "{timestamp}.{body}")

body는 POST 요청은 raw JSON 문자열, GET 요청은 쿼리스트링(예: code=xxxx)입니다. 서명은 반드시 hash_hmac('sha256', "{timestamp}.{body}", secret)와 동일한 방식으로 생성해야 합니다.

2. 결제요청 생성

POST https://kpchub.ginienm.com/api/payments_create.php

요청 본문(JSON):

{
  "merchant_order_id": "order-1234",   // 가맹점 측 주문번호(고유값, 1~100자)
  "amount": 1000,                       // 포인트 금액(정수, 1~10,000,000)
  "item_name": "투표권 10장"            // 선택
}

응답:

{
  "success": true,
  "data": {
    "payment_code": "a1b2c3...",
    "pay_url": "https://kpchub.ginienm.com/pay.php?code=a1b2c3...",
    "qr_text": "https://kpchub.ginienm.com/pay.php?code=a1b2c3...",
    "status": "pending",
    "expires_at": "2026-09-15 12:10:00",
    "idempotent_replay": false
  }
}

같은 merchant_order_id로 다시 요청하면 새로 만들지 않고 기존 결제를 그대로 반환합니다(멱등성 보장). pay_url을 QR코드로 만들어 보여주면 사용자가 KPC 허브 앱에서 스캔해 결제합니다. 결제 유효시간은 10분입니다.

3. 결제상태 조회

GET https://kpchub.ginienm.com/api/payments_status.php?code=xxxx

서명 대상 문자열은 "code=xxxx"입니다. 웹훅을 못 받았을 때 재확인용으로 사용하세요.

{
  "success": true,
  "data": {
    "payment_code": "a1b2c3...",
    "merchant_order_id": "order-1234",
    "amount": 1000,
    "item_name": "투표권 10장",
    "status": "paid",       // pending | paid | expired | canceled
    "paid_at": "2026-09-15 12:05:00",
    "expires_at": "2026-09-15 12:10:00"
  }
}

4. 웹훅(결제 완료 통보)

결제 상태가 바뀌면 등록하신 콜백 URL로 KPC 허브가 아래 형식으로 POST합니다.

POST {callback_url}
Content-Type: application/json
X-Signature: HMAC-SHA256(secret, "{timestamp}.{body}")
X-Timestamp: 1737000000

{
  "event": "payment.paid",
  "payment_code": "a1b2c3...",
  "merchant_order_id": "order-1234",
  "amount": 1000,
  "item_name": "투표권 10장",
  "status": "paid",
  "paid_at": "2026-09-15 12:05:00"
}

수신 측은 동일한 방식으로 서명을 재계산해 X-Signature와 비교(반드시 hash_equals 등 타이밍 공격에 안전한 방식 사용) 검증해야 합니다. 2xx 응답을 주지 않으면 실패로 기록되고 자동으로 최대 5회까지 재시도합니다. 200~299 외 응답이거나 타임아웃이면 실패 처리됩니다.

5. 서명 생성 예시 (PHP)

$timestamp = (string) time();
$body = json_encode(['merchant_order_id' => 'order-1234', 'amount' => 1000]);
$signature = hash_hmac('sha256', $timestamp . '.' . $body, $apiSecret);

$ch = curl_init('https://kpchub.ginienm.com/api/payments_create.php');
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => $body,
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/json',
        'X-API-Key: ' . $apiKey,
        'X-Timestamp: ' . $timestamp,
        'X-Signature: ' . $signature,
    ],
    CURLOPT_RETURNTRANSFER => true,
]);
$response = curl_exec($ch);

추가 문의는 협업 문의로 남겨주세요.