ClickTo SDK 개발 문서
ClickTo SDK는 외부 쇼핑몰 플랫폼(카페24, 제노레이 등)에 정기구독·렌탈·리스·할부 결제 버튼을 손쉽게 삽입할 수 있는 JavaScript SDK입니다.
동작 방식
- 가맹점 페이지에서
/api/sdk.js?siteKey=스크립트를 로드합니다. 메인 SDK + CSS + Provider SDK가 한 번에 로드됩니다. bclickto.initialize(config)를 호출하면 Provider가 초기화되고 결제 버튼이 렌더링됩니다.- 페이지 내
#clicktoButtonBox영역에 구독 버튼이 자동 렌더링됩니다. - 사용자가 버튼을 클릭하면
checkout()이 실행되어 결제 창이 열립니다. - 체크아웃 성공 시
oncheckout콜백이 호출되어 GTM 등 이벤트 트래킹을 수행합니다.
빠른 시작
<!-- 1. SDK 삽입 -->
<script src="https://clickto.benecent.org/api/sdk.js?siteKey=your_site_key"></script>
<!-- 2. 버튼 컨테이너 -->
<div id="clicktoButtonBox"></div>
<!-- 3. 초기화 -->
<script>
bclickto.initialize({
siteKey: 'your_site_key',
setting: {
contract_type: 'subscription',
button_type: 'subscribe_v2',
subscription_plans: ['monthly-1'],
},
customer: {
name: '홍길동',
email: 'user@example.com',
phone: '01012345678',
},
// 체크아웃 성공 시 GTM 등 이벤트 트래킹용 콜백
oncheckout: async (data) => {
window.dataLayer?.push({
event: 'clickto_checkout',
checkout_uuid: data.checkout_uuid,
});
},
});
</script>
설치
별도 npm 패키지 없이 <script> 태그 한 줄로 SDK와 플랫폼 전용 스크립트를 한 번에 로드합니다. siteKey 파라미터에 발급받은 가맹점 키를 지정하세요.
<script src="https://clickto.benecent.org/api/sdk.js?siteKey=your_site_key"></script>
로드 후 전역 변수 window.bclickto로 SDK에 접근합니다. SDK 스크립트, CSS, 플랫폼 전용 Provider가 모두 포함되어 별도의 추가 로딩이 필요하지 않습니다.
맞춤형 SDK
ClickTo SDK는 모든 가맹점이 동일한 스크립트 URL을 사용하며, siteKey 파라미터에 따라 해당 플랫폼에 맞는 SDK가 자동으로 구성됩니다.
가맹점별 연동 방식
가맹점 관리자 페이지에서 발급받은 siteKey를 스크립트 URL에 포함합니다.
<!-- 발급받은 siteKey를 URL에 포함 -->
<script src="https://clickto.benecent.org/api/sdk.js?siteKey=your_site_key"></script>
설치 절차
- ClickTo 관리자 페이지에서 가맹점 등록 후
siteKey를 발급받습니다. - 발급된
siteKey가 포함된 SDK 스크립트 태그를 쇼핑몰 상품 상세 페이지에 삽입합니다. bclickto.initialize(config)를 호출하여 초기화합니다. 서버 주소는 자동으로 설정됩니다.
전체 설치 예시
<!-- 1. 버튼이 표시될 영역 -->
<div id="clicktoButtonBox"></div>
<!-- 2. SDK 로드 -->
<script src="https://clickto.benecent.org/api/sdk.js?siteKey=your_site_key"></script>
<!-- 3. 초기화 -->
<script>
bclickto.initialize({
siteKey: 'your_site_key',
setting: {
contract_type: 'subscription',
subscription_plans: ['monthly-1'],
},
customer: {
name: '홍길동',
phone: '01012345678',
email: 'user@example.com',
},
delivery: {
recipient_name: '홍길동',
phone: '01012345678',
postcode: '06234',
address1: '서울시 강남구 테헤란로 123',
address2: '4층',
},
});
</script>
초기화가 완료되면 #clicktoButtonBox 영역에 결제 버튼이 자동으로 렌더링됩니다. 각 파라미터의 상세 설정은 initialize(config)를 참조하세요.
siteKey는 해당 가맹점 전용입니다. 유효하지 않은 siteKey를 사용하면 SDK 로드에 실패합니다.
initialize(config)
SDK를 초기화합니다. 반드시 checkout() 호출 이전에 실행해야 합니다.
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
| siteKey | string | 필수 | 플랫폼 키. cafe24 또는 genoray |
| setting | object | 권장 | Setting 참조 |
| customer | object | 선택 | Customer 참조 |
| delivery | object | 선택 | Delivery 참조 |
| oncheckout | async function | 선택 | oncheckout 콜백 참조 |
| apiUrl | string | 선택 | ClickTo API 서버 URL. 기본값: SDK script 태그의 origin 자동 감지 |
Setting
| 필드 | 타입 | 필수 | 기본값 | 설명 |
|---|---|---|---|---|
| contract_type | string | 필수 | 'subscription' | 계약 타입. 계약 타입 참조 |
| button_type | string | 선택 | 'subscribe_v2' | 버튼 스타일. 버튼 커스텀 참조. button_selector 사용 시 무시됨 |
| button_selector | string | 선택 | null | 가맹점 커스텀 버튼의 CSS selector. 지정 시 SDK 기본 버튼 미렌더링. 커스텀 디자인 참조 |
| subscription_plans | array | 선택 | [] | 정기구독 플랜 목록. 계약 타입에서 상세 설명 참조 |
| rental_plans | array | 선택 | [] | 렌탈 플랜 목록 (개월 수) |
| lease_plans | array | 선택 | [] | 리스 플랜 목록 (개월 수) |
| installment_plans | array | 선택 | [] | 할부 플랜 목록 (개월 수) |
| shipping_type | string | 선택 | 'physical' | 배송 유형. physical(실물 배송) 또는 digital(디지털 상품) |
Customer
구매자 정보입니다. 모든 필드는 선택 사항이며, 입력하지 않은 정보는 체크아웃 화면에서 직접 입력할 수 있습니다.
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
| name | string | 권장 | 구매자 이름 |
| string | 선택 | 구매자 이메일 | |
| phone | string | 권장 | 구매자 연락처 (숫자만, 예: '01012345678') |
Delivery
배송 정보입니다. 모든 필드는 선택 사항이며, 체크아웃 화면에서 입력할 수 있습니다. shipping_type이 digital인 경우 배송 정보는 불필요합니다.
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
| recipient_name | string | 선택 | 수령인 이름 |
| phone | string | 선택 | 수령인 연락처 |
| address1 | string | 선택 | 기본 주소 |
| address2 | string | 선택 | 상세 주소 |
| postcode | string | 선택 | 우편번호 |
| delivery_fee | number | 선택 | 배송비 (원). 기본값: 0 |
계약 타입
setting.contract_type으로 계약 방식을 지정합니다. 각 계약 타입에 해당하는 플랜 배열을 함께 설정해야 합니다.
subscription — 정기구독
일정 주기마다 자동 결제되는 정기구독 방식입니다. 소프트웨어 월간 구독, 건강식품 정기 배송, 화장품 리필 서비스 등에 적합합니다.
setting: {
contract_type: 'subscription',
subscription_plans: ['monthly-1'], // 매월 결제
}
subscription_plans 값 설명
subscription_plans는 문자열 배열로, '주기-반복수' 형식입니다.
| 값 | 결제 주기 | 설명 |
|---|---|---|
'monthly-1' | 매월 | 1개월마다 자동 결제 |
'monthly-2' | 2개월 | 2개월마다 자동 결제 |
'monthly-3' | 3개월 | 3개월마다 자동 결제 (분기) |
'monthly-6' | 6개월 | 6개월마다 자동 결제 (반기) |
'yearly-1' | 매년 | 1년마다 자동 결제 |
// 여러 플랜을 제공하면 고객이 체크아웃 시 선택 가능
setting: {
contract_type: 'subscription',
subscription_plans: ['monthly-1', 'monthly-3', 'yearly-1'],
}
subscription-delivery — 정기배송 구독
정기구독에 실물 배송이 포함된 방식입니다. 생수·사료 정기배송, 신선식품 구독 박스, 소모품 자동 보충 등 실물 상품을 주기적으로 배송하는 서비스에 적합합니다.
subscription과 동일한 subscription_plans를 사용하며, 배송 정보(Delivery)를 함께 설정합니다.
setting: {
contract_type: 'subscription-delivery',
subscription_plans: ['monthly-1'],
shipping_type: 'physical',
},
delivery: {
recipient_name: '홍길동',
address1: '서울시 강남구 ...',
phone: '01012345678',
}
rental — 렌탈
계약 기간 동안 제품을 대여하는 방식입니다. 정수기 렌탈, 의료장비 대여, 사무기기 렌탈 등에 적합합니다.
rental_plans는 렌탈 기간(개월 수)의 숫자 배열입니다.
setting: {
contract_type: 'rental',
rental_plans: [12], // 12개월 렌탈
}
// 여러 기간 옵션 제공
setting: {
contract_type: 'rental',
rental_plans: [12, 24, 36], // 12·24·36개월 중 선택
}
lease — 리스
리스 계약 방식입니다. 고가 장비 리스, 차량 리스 등 장기 계약에 적합합니다.
lease_plans는 리스 기간(개월 수)의 숫자 배열입니다.
setting: {
contract_type: 'lease',
lease_plans: [24], // 24개월 리스
}
// 여러 기간 옵션 제공
setting: {
contract_type: 'lease',
lease_plans: [24, 36, 48], // 24·36·48개월 중 선택
}
installment — 할부
상품 금액을 분할납부하는 방식입니다. 고가 상품의 무이자 할부, 분할 결제 등에 적합합니다.
installment_plans는 할부 기간(개월 수)의 숫자 배열입니다.
setting: {
contract_type: 'installment',
installment_plans: [6], // 6개월 할부
}
// 여러 할부 옵션 제공
setting: {
contract_type: 'installment',
installment_plans: [3, 6, 12], // 3·6·12개월 중 선택
}
계약금·보증금·위약금 안내
oncheckout 콜백 (이벤트 트래킹)
체크아웃이 성공적으로 생성된 직후, 결제 창이 열리기 전에 호출되는 비동기 함수입니다. GTM(Google Tag Manager), Facebook Pixel, GA4 등 광고·분석 스크립트의 이벤트를 발생시키는 데 사용합니다.
콜백 시그니처
oncheckout: async (data) => {
// data.checkout_uuid — 체크아웃 고유 ID (string)
// data.products — 결제 대상 상품 배열
// data.contract — 계약 타입 정보 { type, plan }
// data.setting — SDK 설정 정보
}
| 필드 | 타입 | 설명 |
|---|---|---|
| checkout_uuid | string | 생성된 체크아웃의 고유 식별자 |
| products | array | 결제 대상 상품 목록 (이름, 가격, 수량 등) |
| contract | object | 계약 타입 정보 (type, plan) |
| setting | object | SDK 설정 정보 (contract_type, shipping_type 등) |
GTM (Google Tag Manager) 연동 예시
oncheckout: async (data) => {
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
event: 'clickto_checkout',
checkout_uuid: data.checkout_uuid,
product_count: data.products.length,
contract_type: data.contract.type,
total_price: data.products.reduce((sum, p) => sum + (p.price * p.quantity), 0),
});
}
Facebook Pixel 연동 예시
oncheckout: async (data) => {
if (typeof fbq === 'function') {
fbq('track', 'InitiateCheckout', {
content_ids: data.products.map(p => p.code),
content_type: 'product',
num_items: data.products.length,
value: data.products.reduce((sum, p) => sum + (p.price * p.quantity), 0),
currency: 'KRW',
});
}
}
GA4 이벤트 연동 예시
oncheckout: async (data) => {
if (typeof gtag === 'function') {
gtag('event', 'begin_checkout', {
transaction_id: data.checkout_uuid,
items: data.products.map(p => ({
item_id: p.code,
item_name: p.name,
price: p.price,
quantity: p.quantity,
})),
});
}
}
플랫폼 연동 가이드
플랫폼별 Provider SDK는 siteKey에 따라 자동으로 로드됩니다. 각 SDK는 해당 플랫폼의 상품 정보를 자동으로 수집합니다.
| 플랫폼 | 지원 상태 |
|---|---|
| 카페24 (Cafe24) | 지원 |
| 메이크샵 (Makeshop) | 지원 예정 |
| 아임웹 (Imweb) | 지원 예정 |
| 개인/독립몰 | 개별 지원 예정 |
카페24 연동
사전 요구 사항
- CAFE24 API 앱이 설치되어 있어야 합니다.
window.CAFE24API객체가 존재해야 합니다.- 상품 상세 페이지에서만 동작합니다.
연동 예시
<!-- 상품 상세 페이지 내 -->
<div id="clicktoButtonBox"></div>
<script src="https://clickto.benecent.org/api/sdk.js?siteKey=your_site_key"></script>
<script>
bclickto.initialize({
siteKey: 'your_site_key',
setting: {
contract_type: 'subscription',
button_type: 'subscribe_v2',
subscription_plans: ['monthly-1'],
},
});
</script>
지원 상품 유형
| 유형 | 감지 방식 | 지원 상태 |
|---|---|---|
| 일반 상품 | JSON-LD 구조화 데이터 + 메타 태그에서 추출 | 지원 |
| 옵션 조합 상품 | window.option_stock_data 존재 시 자동 감지 | 지원 |
| 셋트 상품 | window.set_product_data 존재 시 | 구현 예정 |
application/ld+json) 데이터와 meta[property="product:productId"] 태그에서 상품 정보를 자동으로 읽어옵니다. 별도의 상품 데이터 설정이 필요하지 않습니다.
지원 예정 플랫폼
아래 플랫폼에 대한 Provider SDK가 개발 예정입니다.
- 메이크샵 (Makeshop) — 지원 예정
- 아임웹 (Imweb) — 지원 예정
- 개인/독립몰 — 개별 지원 예정. 별도 문의가 필요합니다.
에러 처리
checkout()은 내부적으로 에러를 throw합니다. 버튼 클릭 핸들러에서 try/catch로 자동 처리되며, 에러는 브라우저 콘솔에 기록됩니다.
// SDK 내부 처리 (자동)
try {
await bclickto.checkout();
} catch (error) {
console.error('Checkout error:', error);
}
공통 에러
| 에러 메시지 | 원인 | 해결 방법 |
|---|---|---|
| initialize()를 먼저 호출하세요. | checkout() 전에 initialize()가 실행되지 않음 |
페이지 로드 시 bclickto.initialize(config)를 먼저 호출하세요. |
| Provider {siteKey} SDK not loaded | SDK 스크립트 로드 시 siteKey가 유효하지 않거나 네트워크 오류 |
스크립트 태그의 ?siteKey= 값이 올바른지 확인하세요. 브라우저 네트워크 탭에서 SDK 스크립트 응답 상태(404 등)를 점검합니다. |
| No products available for checkout | Provider가 상품 정보를 수집하지 못함 | 상품 상세 페이지에서 SDK가 실행되고 있는지 확인하세요. 아래 플랫폼별 에러도 참고하세요. |
| ClickTo checkout failed | API 서버 오류 또는 응답 형식 불일치 | 네트워크 탭에서 /api/checkout 요청의 응답을 확인하세요. |
| Unsupported contract type: {type} | setting.contract_type에 잘못된 값이 지정됨 |
계약 타입에서 지원되는 값을 확인하세요. |
카페24 (Cafe24) 에러
| 에러 메시지 | 원인 | 해결 방법 |
|---|---|---|
| ld+json 스크립트 태그를 찾을 수 없습니다 | 상품 페이지에 JSON-LD 구조화 데이터가 없음 | 상품 상세 페이지에서 SDK를 실행하고 있는지 확인하세요. 카페24 테마에서 JSON-LD가 활성화되어 있어야 합니다. |
| 상품 ID 메타 태그를 찾을 수 없습니다 | <meta property="product:productId"> 태그 부재 |
카페24 상품 상세 페이지 템플릿에 상품 메타 태그가 포함되어 있는지 확인하세요. |
제노레이 (Genoray) 에러
| 에러 메시지 | 원인 | 해결 방법 |
|---|---|---|
| 상품 번호를 URL에서 추출할 수 없습니다 | URL 경로에서 상품 번호를 찾지 못함 | 상품 상세 페이지 URL이 올바른 형식인지 확인하세요. |
| 상품 가격을 찾을 수 없습니다 | 가격 DOM 요소를 찾지 못함 | 제노레이 상품 페이지의 가격 영역이 표준 selector(.summary_price .price)에 해당하는지 확인하세요. |
네트워크 / CORS 에러
브라우저 콘솔에 CORS 관련 에러가 표시되면, SDK 스크립트를 로드하는 도메인이 ClickTo 서버의 허용 목록에 등록되어 있는지 확인하세요. 가맹점 등록 시 도메인이 자동 등록됩니다.
체크아웃 플로우
SDK를 통한 결제는 다음 단계로 진행됩니다.
전체 결제 흐름
┌─────────────────────────────────────────────────────────────┐
│ 1. SDK 로드 (1-step) │
│ <script src=".../api/sdk.js?siteKey=your_site_key"></script> │
│ → 메인 SDK + CSS + Provider SDK 한 번에 로드 │
│ → window.bclickto 사용 가능 │
├─────────────────────────────────────────────────────────────┤
│ 2. 초기화 │
│ bclickto.initialize(config) │
│ → Provider 초기화 + 결제 버튼 렌더링 │
├─────────────────────────────────────────────────────────────┤
│ 3. 버튼 클릭 │
│ → checkout() 자동 호출 │
├─────────────────────────────────────────────────────────────┤
│ 4. 상품 정보 수집 │
│ → Provider SDK가 페이지 DOM에서 상품 데이터 자동 추출 │
│ → 상품명, 가격, 수량, 옵션 등 │
├─────────────────────────────────────────────────────────────┤
│ 5. 체크아웃 생성 │
│ → POST /api/checkout (상품, 설정, 고객, 배송 정보 전송) │
│ → 서버에서 체크아웃 UUID 발급 │
├─────────────────────────────────────────────────────────────┤
│ 6. oncheckout 콜백 실행 │
│ → GTM, Facebook Pixel 등 이벤트 트래킹 │
│ → 콜백 에러 시에도 결제 흐름 계속 진행 │
├─────────────────────────────────────────────────────────────┤
│ 7. 결제 창 열림 │
│ → 새 브라우저 탭에서 체크아웃 페이지 표시 │
│ → 고객이 결제 정보 입력 및 결제 진행 │
└─────────────────────────────────────────────────────────────┘
정기결제 동작 원리
정기구독, 정기배송, 렌탈 등 반복 결제가 필요한 계약 타입은 다음과 같이 동작합니다.
- 최초 체크아웃: 고객이 SDK를 통해 결제를 완료하면 계약(Contract)이 생성됩니다.
- 결제수단 등록: 최초 결제 시 고객의 결제수단(카드 등)이 자동으로 등록됩니다.
- 자동 결제 스케줄링: 계약 타입과 플랜에 따라 정기결제 엔진(RecurringBilling)이 후속 결제를 자동으로 스케줄링합니다.
- 반복 결제 실행: 예약된 날짜에 등록된 결제수단으로 자동 결제가 이루어집니다.
subscription_plans에서 설정한 값에 따라 결정됩니다. 예를 들어 'monthly-1'은 매월, 'monthly-3'은 3개월마다 자동 결제됩니다.
최초 결제 자동 결제 자동 결제
│ │ │
▼ ▼ ▼
┌──────┐ 1개월 후 ┌──────┐ 1개월 후 ┌──────┐
│ 결제 │ ──────────────→ │ 결제 │ ────────────→ │ 결제 │ ──→ ...
└──────┘ └──────┘ └──────┘
│
├── 계약 생성
├── 결제수단 등록
└── 정기결제 스케줄 등록
할부 결제 흐름
할부(installment)는 정기결제와 유사하지만, 지정된 횟수만큼 결제가 완료되면 자동으로 종료됩니다.
1회차 2회차 3회차 ... N회차
│ │ │ │
▼ ▼ ▼ ▼
┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐
│ 결제 │ → │ 결제 │ → │ 결제 │ → ... → │ 결제 │ → 계약 완료
└──────┘ └──────┘ └──────┘ └──────┘