휴대폰 소유확인 연동

결제 SDK 처럼 키 발급 → 서버에서 세션 생성 → 프론트 위젯 → 결과 수신 4단계. 위젯은 임베드·레이어드 팝업·새 윈도우·리다이렉트를 모두 지원합니다.

전체 흐름

[고객 서버]  POST /v1/verifications (secret)  ──▶  { verificationKey, callNumber, dtmfCode }
                                                         │
[고객 프론트] CallPass.verify({ verificationKey, clientKey, callNumber, dtmfCode, mode })
                                                         │
[사용자]     1877-6421 로 전화 (코드 자동/입력)  ──▶  발신번호로 회선 소유 확인
                                                         │
[결과]       ① webhook(HMAC) 또는 ② 위젯 폴링  ──▶  POST /v1/verifications/{key}/confirm (멱등)
🔑 client key 는 공개키(프론트 노출 OK). secret key 는 서버 전용 — 절대 프론트/깃에 두지 마세요.

1. 키 발급

고객 포털에서 회원가입(휴대폰·이메일 인증) 후 직접 키를 발급합니다. 발급되는 키는 모두 실서비스(live) 입니다. 발급 즉시 API 키 탭에서 추가 발급·secret 재발급도 셀프로 가능합니다.

용도노출
ck_live_… (client key)프론트 위젯 init·상태 폴링공개 가능
sk_live_… (secret key)서버에서 세션 생성·confirm서버 전용

2. 서버에서 세션 생성

사용자가 인증을 시작하면 고객 서버가 secret key 로 세션을 생성합니다.

# 요청 (서버 → 콜패스)
curl -X POST https://callpass.kr/v1/verifications \
  -H "Authorization: Basic $(echo -n 'sk_live_xxx:' | base64)" \
  -H "Content-Type: application/json" \
  -d '{ "phone": "01012345678", "orderId": "order-1001", "webhookUrl": "https://shop.example.com/callpass/webhook" }'

# 응답
{ "verificationKey": "vk_live_AbC…", "callNumber": "1877-6421",
  "dtmfCode": "837465", "status": "ready", "ttl": 300 }

응답의 verificationKey / callNumber / dtmfCode 를 프론트로 전달해 위젯에 넘깁니다.

선택: code 를 직접 지정하면(6자리) 고객 OTP·기억 비밀번호로 쓸 수 있습니다. 미지정 시 서버가 발급합니다.

3. 프론트 위젯 연동

SDK 한 줄을 로드하고 CallPass.verify() 를 호출합니다. mode 로 연동 방식을 고릅니다.

<script src="https://callpass.kr/widget/callpass.js"></script>

① 임베드 — 페이지 안에 직접

지정한 컨테이너 안에 위젯을 렌더합니다. 가입 폼 옆에 그대로 노출할 때.

<div id="callpass-box"></div>
<script>
CallPass.verify({
  verificationKey: "vk_live_AbC…",   // 서버 응답
  clientKey: "ck_live_xxx",
  callNumber: "1877-6421", dtmfCode: "837465",
  mode: "inline", container: "#callpass-box",
  onSuccess: function(d){ location.href = "/signup/done"; },
  onFail: function(d){ alert("발신번호가 일치하지 않습니다"); },
  onExpire: function(){ alert("시간이 초과되었습니다"); }
});
</script>

② 레이어드 팝업 — 화면 위 오버레이

버튼 클릭 시 화면 중앙에 모달로 띄웁니다. 기본 모드입니다.

document.querySelector("#verify-btn").addEventListener("click", function(){
  CallPass.verify({
    verificationKey: "vk_live_AbC…", clientKey: "ck_live_xxx",
    callNumber: "1877-6421", dtmfCode: "837465",
    mode: "modal",
    onSuccess: function(d){ /* 서버 confirm 후 진행 */ },
    onClose: function(){ /* 사용자가 닫음 */ }
  });
});

③ 새 윈도우 — 별도 창

새 창에서 진행하고 결과를 postMessage 로 부모창에 전달합니다.

CallPass.verify({
  verificationKey: "vk_live_AbC…", clientKey: "ck_live_xxx",
  callNumber: "1877-6421", dtmfCode: "837465",
  mode: "popup",
  onSuccess: function(d){ console.log("verified", d.verificationKey); },
  onFail: function(d){}, onExpire: function(){}
});
// 결과는 SDK 가 window.postMessage 로 수신해 콜백을 호출합니다.

④ 리다이렉트 — 전체 페이지 이동

위젯 페이지로 이동했다가 returnUrl 로 복귀합니다. 결과는 쿼리스트링으로 옵니다.

CallPass.verify({
  verificationKey: "vk_live_AbC…", clientKey: "ck_live_xxx",
  callNumber: "1877-6421", dtmfCode: "837465",
  mode: "redirect",
  returnUrl: "https://shop.example.com/signup/callpass-return"
});

// 복귀 시: https://shop.example.com/signup/callpass-return?callpass_status=verified&callpass_key=vk_live_AbC…
// 서버에서 callpass_key 로 confirm 하여 최종 확정하세요.
모바일은 tel:1877-6421,,<코드> 로 코드가 자동 입력되고, PC 는 QR 로 휴대폰 전화를 유도합니다 — 모든 모드 공통입니다.

4. 결과 수신 & 최종 확정

방법 A. Webhook (권장)

세션 생성 시 webhookUrl 을 주면, 결과가 확정될 때 HMAC 서명된 POST 가 갑니다.

POST {webhookUrl}
X-CallPass-Signature: <HMAC-SHA256(webhookSecret, body)>
{ "eventId": "evt_…", "type": "verification.verified",
  "verificationKey": "vk_live_AbC…", "phone": "01012345678", "orderId": "order-1001" }

방법 B. 폴링

서버에서 GET /v1/verifications/{key} (secret) 로 상태를 조회합니다. 위젯은 내부적으로 공개 status 를 폴링해 콜백을 호출합니다.

최종 확정 (멱등)

curl -X POST https://callpass.kr/v1/verifications/vk_live_AbC…/confirm \
  -H "Authorization: Basic $(echo -n 'sk_live_xxx:' | base64)"
# → { "verificationKey":"vk_live_AbC…", "status":"verified", "confirmed":true }
⚠️ 신뢰할 결과는 서버에서 confirm 한 값입니다. 프론트 콜백만으로 가입을 확정하지 마세요(위변조 방지).

API 레퍼런스 (요약)

메서드 · 경로인증설명
POST /v1/verificationssecret세션 생성 → verificationKey·dtmfCode
GET /v1/verifications/{key}secret상태 조회(만료 lazy 처리)
POST /v1/verifications/{key}/confirmsecret멱등 최종 확정
GET /v1/widget/verifications/{key}?clientKey=client위젯 폴링(status 만, CORS)
GET /v1/callssecret통화기록 목록(녹음 조회)
GET /v1/calls/{id}/recordingsecret녹음 파일 다운로드
📞 인증콜은 품질·분쟁 대비를 위해 녹음되며(콜 시작 시 고지), 고객 포털에서 조회·다운로드할 수 있습니다. 보관기간 경과 시 자동 삭제됩니다.