NHN KCP

NHN KCP 연동 방법을 안내합니다.

채널 설정하기

사전 계약 안내

아래 기능을 사용하시려면 KCP에 사전 신청 후 계약이 완료되어야 합니다. 그렇지 않은 상태에서 해당 기능 이용시 결제 승인에 실패하거나, 승인에 성공하더라도 의도한 바와는 다른 응답(ex. 결제창에서 에스크로 결제를 했으나 비-에스크로 결제 응답을 받음)을 얻게 될 수 있으니 주의해주시기 바랍니다.

  • API를 통한 수기 결제 (가상계좌, 카드)
  • API를 통한 빌링키 발급
  • 에스크로 결제
  • 상점분담무이자 설정
  • 부가세 및 비과세 금액 직접 설정
  • 부분무이자 설정
  • 휴대폰 결제 익월 환불

가능한 결제 수단

  • 결제창 일반 결제

    payMethod 파라미터를 결제 수단에 따라 아래와 같이 설정해야 합니다.

    • 카드 : CARD
    • 계좌이체 : TRANSFER
    • 가상계좌 : VIRTUAL_ACCOUNT
    • 상품권 : GIFT_CERTIFICATE
    • 휴대폰 소액 결제 : MOBILE
    • 간편결제 : EASY_PAY
  • 결제창 빌링키 발급

    billingKeyMethod 파라미터를 결제 수단에 따라 아래와 같이 설정해야 합니다.

    • 카드: CARD
  • API 수기(키인) 결제

    method 파라미터를 결제 수단에 따라 아래와 같이 설정해야 합니다.

    • 카드: card 로 설졍하여 카드 관련 파라미터 입력
    • 가상계좌: virtualAccount 로 설정하여 가상계좌 관련 파라미터 입력

    자세한 파라미터 구성은 REST API Docs 를 참고해주시기 바랍니다.

  • API 빌링키 발급

    method 파라미터를 결제 수단에 따라 아래와 같이 설정해야 합니다.

    • 카드: card 로 설졍하여 카드 관련 파라미터 입력

    자세한 파라미터 구성은 REST API Docs를 참고해주시기 바랍니다.

SDK 결제 요청하기

결제 요청 시에는 requestPayment 함수를 호출해야 합니다. channelKey파라미터에 결제 채널 연동 후 생성된 채널 키값을 지정하여 KCP 채널 사용을 명시해주세요.

KCP 기준으로 작성한 예시 코드는 아래와 같습니다.

import * as PortOne from "@portone/browser-sdk/v2";
function requestPayment() {
  PortOne.requestPayment({
    storeId: "store-4ff4af41-85e3-4559-8eb8-0d08a2c6ceec", // 고객사 storeId로 변경해주세요.
    channelKey: "channel-key-9987cb87-6458-4888-b94e-68d9a2da896d", // 콘솔 결제 연동 화면에서 채널 연동 시 생성된 채널 키를 입력해주세요.
    paymentId: `payment${crypto.randomUUID()}`,
    orderName: "나이키 와플 트레이너 2 SD",
    totalAmount: 1000,
    currency: "CURRENCY_KRW",
    payMethod: "CARD",
    customer: {
      fullName: "포트원",
      phoneNumber: "010-0000-1234",
      email: "test@portone.io",
    },
  });
}

주요 파라미터

storeId: string

스토어 아이디

포트원 계정에 생성된 상점을 식별하는 고유한 값으로 관리자 콘솔에서 확인할 수 있습니다.

paymentId: string

고객사 주문 고유 번호

고객사에서 채번하는 주문 고유 번호로 매번 고유하게 채번되어야 합니다. 이미 승인 완료된 paymentId로 결제를 시도하는 경우 에러가 발생합니다. KCP의 경우 최대 40자 까지 허용합니다.

orderName: string

주문명

주문명으로 고객사에서 자유롭게 입력합니다. KCP의 경우 최대 100Byte까지 허용합니다.

channelKey: string

채널 키

포트원 콘솔 내 [연동 관리] > [연동 정보] > [채널 관리] 화면에서 채널 추가 시 생성되는 값입니다. 결제 호출 시 채널을 지정할 때 사용됩니다.

totalAmount: number

결제 금액

결제 금액으로 결제를 원하는 통화(currency)별 scale factor(소수점 몇번째 자리까지 유효한지)를 고려한 number 형식만 허용됩니다.

currency: string

결제 통화

결제통화로 원화 결제 시 KRW로 입력해야 합니다.

payMethod: string

결제수단 구분코드

결제 호출 시 결제수단을 지정할 때 사용됩니다.

  • 신용카드 : CARD
  • 실시간 계좌이체 : TRANSFER
  • 가상계좌 : VIRTUAL_ACCOUNT
  • 휴대폰 소액결제 : MOBILE
  • 간편 결제 : EASY_PAY
customer?: object

고객 정보

fullName?: string

구매자 전체 이름

firstName?: string

구매자 이름

lastName?: string

구매자 성

phoneNumber?: string

구매자 연락처

email?: string

구매자 이메일

bypass?: oneof object

PG사 결제창 호출 시 PG사로 그대로 bypass할 파라미터들의 모음

kcp_v2?: object

KCP에서 제공하는 파라미터 모음

site_logo?: string

결제창에 삽입할 메인 로고 url

  • 결제창 왼쪽 상단에 표시됩니다.
  • 이미지 사이즈는 150*50 미만으로 설정해야 하며, GIF, JPG 파일만 지원됩니다.
skin_indx?: integer

결제창 색상

  • PC로 결제창 호출 시 결제창 색상을 변경합니다.
  • 1~12까지 설정 가능합니다.
kcp_pay_title?: string

결제창 상단 문구

  • 결제창의 상단 문구를 변경합니다.
shop_user_id?: string

기관에 따라 리스크 관리 조치를 위한 쇼핑몰 관리 ID

  • 상품권, 휴대폰 결제 시 필수로 입력해야 합니다.
site_name?: string

카드사 다이렉트 호출 시 결제창에 표기될 상호명

  • PC의 경우 신한, 현대, 삼성, 농협, 하나, 외환, 롯데, 씨티, 우리카드사에 대해 다이렉트 호출 시 필수로 입력해야 합니다.
  • 모바일의 경우 필수로 입력해야 합니다.
disp_tax_yn?: string

결제창 현금영수증 노출 여부

  • 결제창에서 현금영수증 노출 여부를 설정할 수 있습니다. 실시간 계좌이체 또는 가상계좌 결제 시 사용할 수 있습니다.
  • Y: 노출
  • N: 노출하지 않음
  • R: 소득공제로 노출
  • E: 지출증빙으로 노출
deli_term?: string

에스크로 결제 예상 배송 소요일

  • 에스크로 결제 시, 결제 상품의 예상 배송 소요일입니다. KCP측에서 에스크로 결제 사용 시 입력을 권장하고 있습니다.
  • 미입력 시 '00'으로 입력됩니다.
  • 입력 형식은 두 자리 수로 입력되어야 합니다. ex. 예상 배송 소요기간이 3일인 경우,03으로 입력

예제

bypass 파라미터 예시
{ "bypass": { "kcp_v2": { "site_logo": "https://portone.io/assets/portone.jpg", "skin_indx": 6, "shop_user_id": "user_id1", "site_name": "포트원 고객사" } } }

SDK 결제 - 유의사항

공통

카드 결제

간편 결제

계좌이체

가상계좌 결제

상품권 결제

휴대폰 소액 결제

에스크로 결제

SDK 빌링키 발급 요청하기

빌링키 발급 요청 시에는 requestIssueBillingKey 함수를 호출해야 합니다. channelKey 파라미터에 결제 채널 연동 후 생성된 채널 키값을 지정하여 KCP 채널 사용을 명시해주세요.

KCP 기준으로 작성한 예시 코드는 아래와 같습니다.

import * as PortOne from "@portone/browser-sdk/v2";
function requestIssueBillingKey() {
  PortOne.requestIssueBillingKey({
    storeId: "store-4ff4af41-85e3-4559-8eb8-0d08a2c6ceec", // 고객사 storeId로 변경해주세요.
    channelKey: "channel-key-3b37819a-1c72-4deb-a245-8c810af5403d", // 콘솔 결제 연동 화면에서 채널 연동 시 생성된 채널 키를 입력해주세요.
    billingKeyMethod: "CARD",
    issueId: "test-issueId",
    issueName: "test-issueName",
    customer: {
      fullName: "포트원",
      phoneNumber: "010-0000-1234",
      email: "test@portone.io",
    },
  });
}

주요 파라미터


storeId: string

스토어 아이디

포트원 계정에 생성된 상점을 식별하는 고유한 값으로 관리자 콘솔에서 확인할 수 있습니다.

channelKey: string

채널 키

포트원 콘솔 내 [연동 관리] > [연동 정보] > [채널 관리] 화면에서 채널 추가 시 생성되는 값입니다. 결제 호출 시 채널을 지정할 때 사용됩니다.

billingKeyMethod: string

빌링키 발급수단

KCP는 빌링키 발급 수단으로 카드만을 지원하므로 해당 파라미터는 CARD로 고정해야 합니다.

issueId: string

빌링키 발급 건 고유 ID

  • 고객사에서 채번하여 사용해야 합니다.
  • KCP의 경우 필수 입력해야 합니다. // 추후 수정 필요, 포트원 내부 채번으로 수정할 예정
issueName: string

빌링키 발급 시 결제창에 표시되는 제목

  • 모바일 발급의 경우 필수 입력해야 합니다.
customer?: object

고객 정보

fullName?: string

구매자 전체 이름

firstName?: string

구매자 이름

lastName?: string

구매자 성

phoneNumber?: string

구매자 연락처

email?: string

구매자 이메일

offerPeriod?: object

제공 기간

bypass?: oneof object

PG사 결제창 호출 시 PG사로 그대로 bypass할 파라미터들의 모음

kcp_v2?: object

KCP에서 제공하는 파라미터 모음

batch_soc_choice?: 'percard' | 'cocard'

결제창에서 주민번호/사업자 번호 고정여부 설정

  • S: 주민번호만 표시
  • C: 사업자번호만 표시

SDK 빌링키 발급 - 유의사항

API 수기(키인)결제 요청하기

수기(키인) 결제 요청 시 POST /payments/${PAYMENT_ID_HERE}/instant API를 호출해야 합니다.

KCP 기준으로 작성한 예시 코드는 아래와 같습니다.

// ... 수기(키인) 결제
const issueResponse = await axios({
  url: `https://api.portone.io/payments/${PAYMENT_ID_HERE}/instant`,
  method: "post",
  headers: { Authorization: `PortOne ${PORTONE_API_SECRET}` },
  data: {
    channelKey: "channel-key-9987cb87-****-****-****-********896d", // 콘솔 결제 연동 화면에서 채널 연동 시 생성된 채널 키를 입력해주세요.
    orderName: "나이키 와플 트레이너 2 SD",
    amount: {
      total: 10000,
    },
    currency: "KRW",
    customer: {
      name: {
        full: "홍길동",
      },
      email: "test@test.com",
      phoneNumber: "010-1234-0000",
    },
    method: {
      card: {
        credential: {
          nuber: "1234123400001234", // 카드 번호 입력 시 숫자만 입력해주세요.
          expiryYear: "26", // 유효기간 만료 연도 2자리
          expiryMonth: "12", // 유효기간 만료 월 2자리
          birthOrBusinessRegistrationNumber: "900101", // 카드 소유주 생년월일 또는 사업자 등록번호
          passwordTwoDigits: "00", // 카드 비밀번호 앞 2자리
        },
      },
    },
  },
});
// ... 수기(키인) 결제
const issueResponse = await axios({
  url: `https://api.portone.io/payments/${PAYMENT_ID_HERE}/instant`,
  method: "post",
  headers: { Authorization: `PortOne ${PORTONE_API_SECRET}` },
  data: {
    channelKey: "channel-key-9987cb87-****-****-****-********896d", // 콘솔 결제 연동 화면에서 채널 연동 시 생성된 채널 키를 입력해주세요.
    orderName: "나이키 와플 트레이너 2 SD",
    amount: {
      total: 10000,
    },
    currency: "KRW",
    customer: {
      name: {
        full: "홍길동",
      },
      email: "test@test.com",
      phoneNumber: "010-1234-0000",
    },
    method: {
      virtualAccount: {
        bank: `SHINHAN`,
        expiry: {
          dueDate: `2024-11-12T00:00:00+09+00`, //입금기한은 미래시간만 가능합니다.
        },
        cashReceipt: {
          type: `PERSONAL`,
          customerIdentityNumber: `010-1234-0000`,
        },
        remitteeName: `테스트`,
      },
    },
  },
});

주요 파라미터

paymentId: string

고객사 주문 고유 번호

고객사에서 채번하는 주문 고유 번호로 매번 고유하게 채번되어야 합니다. 이미 승인 완료된 paymentId로 결제를 시도하는 경우 에러가 발생합니다. KCP의 경우 최대 40자까지 허용합니다.

orderName: string

주문명

주문명으로 고객사에서 자유롭게 입력합니다. KCP의 경우 최대 100 바이트까지 허용합니다.

channelKey: string

채널 키

포트원 콘솔 내 [연동 관리] > [연동 정보] > [채널 관리] 화면에서 채널 추가 시 생성되는 값입니다. 결제 호출 시 채널을 지정할 때 사용됩니다.

amount: object

결제 금액

total: number

총 결제 금액

결제 금액으로 결제를 원하는 통화(currency)별 scale factor(소수점 몇번째 자리까지 유효한지)를 고려한 number 형식만 허용됩니다.

taxFree?: number

면세액

결제 금액으로 결제를 원하는 통화(currency)별 scale factor(소수점 몇번째 자리까지 유효한지)를 고려한 number 형식만 허용됩니다.

currency: string

결제 통화

결제통화로 원화 결제 시 KRW로 입력해야 합니다.

method: object

결제수단 정보

virtualAccount?: object

가상계좌 결제 시 파라미터

bank: string

발급 은행

expiry: object

입금 만료 기한 validHours 또는 dueDate 필드 중 하나를 지정합니다.

validHours?: integer

유효 시간

dueDate?: string

만료 시점

시간은 RFC 3339 date-time 형식으로 입력해야 합니다.

option: object

가상계좌 발급 방식

type: string

가상계좌 발급 유형 회전식 가상계좌만 지원하므로 NORMAL로 입력합니다.

cashReceipt: object

현금영수증 정보

type: string

발급 유형 PERSONAL 또는 CORPORATE로 입력합니다.

  • 소득공제용 : PERSONAL
  • 지출증빙용 : CORPORATE
customerIdentityNumber: string

현금영수증 식별 번호

  • 소득공제인 경우 주민등록번호 혹은 휴대폰 번호를 입력해야 합니다.
  • 지출증빙인 경우 사업자등록번호를 입력해야 합니다.
card?: object

카드 결제 시 파라미터

credential: object

인증 관련 정보

number: string

카드 번호

expiryYear: string

유효 기간 만료 연도 (YY 형식 ex. 24)

expiryMonth: string

유효기간 만료 월 (MM 형식 ex. 05)

birthOrBusinessRegistrationNumber: string

생년월일 또는 사업자 등록 번호

passwordTwoDigits: string

비밀번호 앞 두자리

customer?: object

고객 정보

name?: object

고객 이름

full?: string

한 줄 이름 형식 (ex. 김포트)

separated?: object

분리된 이름

first: string

이름

last: string

phoneNumber?: string

구매자 연락처

email?: string

구매자 이메일

유의사항

카드 결제

가상계좌 결제

API 빌링키 발급 요청하기

빌링키를 발급 요청 시 POST /billing-keys를 호출해야 합니다.

KCP 기준으로 작성한 예시 코드는 아래와 같습니다.

const issueResponse = await axios({
  url: "https://api.portone.io/billing-keys",
  method: "post",
  headers: { Authorization: `PortOne ${PORTONE_API_SECRET}` },
  data: {
    channelKey: "channel-key-9987cb87-****-****-****-********896d", // 콘솔 결제 연동 화면에서 채널 연동 시 생성된 채널 키를 입력해주세요.
    customer: {
      id: "customer-1234", // 고객사에서 관리하는 고객 고유번호
    },
    method: {
      card: {
        credential: {
          number: "1111111111111111",
          expiryMonth: "01",
          expiryYear: "20",
          birthOrBusinessRegistrationNumber: "900101",
          passwordTwoDigits: "00",
        },
      },
    },
  },
});

주요 파라미터

channelKey: string

채널 키

포트원 콘솔 내 [연동 관리] > [연동 정보] > [채널 관리] 화면에서 채널 추가 시 생성되는 값입니다. 결제 호출 시 채널을 지정할 때 사용됩니다.

method: object

결제수단 정보

card?: object

카드 빌링키 발급 시 파라미터

credential: object

인증 관련 정보

number: string

카드 번호

expiryYear: string

유효 기간 만료 연도 (YY 형식 ex. 24)

expiryMonth: string

유효기간 만료 월 (MM 형식 ex. 05)

birthOrBusinessRegistrationNumber?: string
  • KCP의 경우 필수로 입력해야 합니다.
passwordTwoDigits?: string

비밀번호 앞 두자리

  • KCP의 경우 필수로 입력해야 합니다.
customer: object

고객 정보

name: object

고객 이름

full?: string

한 줄 이름 형식 (ex. 김포트)

separated?: object

분리된 이름

first: string

이름

last: string

phoneNumber: string

구매자 연락처

email: string

구매자 이메일

API 빌링키 단건 결제 요청하기

발급된 빌링키로 단건 결제 요청 시 POST /payments/${PAYMENT_ID_HERE}/billing-key API를 호출해야 합니다.

KCP 기준으로 작성한 예시 코드는 아래와 같습니다.

const response = await axios({
  url: `https://api.portone.io/payments/${PAYMENT_ID_HERE}/billing-key`,
  method: "post",
  headers: { Authorization: `PortOne ${PORTONE_API_SECRET}` },
  data: {
    payment: {
      billingKey: "billing-key-1", // 빌링키 발급 API를 통해 발급받은 빌링키
      orderName: "후불 결제",
      customer: {
        id: "customer-1234", // 고객사에서 관리하는 고객 고유번호
        phoneNumber: "010-1234-5678",
        email: "test@test.com",
      },
      amount: {
        total: 10000,
      },
      currency: "KRW",
    },
  },
});

주요 파라미터

paymentId: string

결제 주문 번호

  • 고객사에서 채번하여 사용하는 주문번호로 고유한 값이여야 합니다.
  • URL path에 포함하여 요청해야 합니다.
billingKey: string

빌링키 결제에 사용할 빌링키

orderName: string

주문명

amount: object

결제 금액

total: number

총 결제 금액

결제 금액으로 결제를 원하는 통화(currency)별 scale factor(소수점 몇번째 자리까지 유효한지)를 고려한 number 형식만 허용됩니다.

taxFree?: number

면세액

결제 금액으로 결제를 원하는 통화(currency)별 scale factor(소수점 몇번째 자리까지 유효한지)를 고려한 number 형식만 허용됩니다.

currency: string

결제 통화

결제통화로 원화 결제 시 KRW로 입력해야 합니다.

customer: object

고객 정보

name: object

고객 이름

full?: string

한 줄 이름 형식 (ex. 김포트)

separated?: object

분리된 이름

first: string

이름

last: string

phoneNumber: string

구매자 연락처

email: string

구매자 이메일

productCount?: integer

상품 개수

API 빌링키 예약/반복 결제 요청하기

예약 결제를 하기 위해서는 POST /payments/${PAYMENT_ID_HERE}/schedule 를 이용하여 결제를 예약합니다.

KCP 기준으로 작성한 예시 코드는 아래와 같습니다.

const response = await axios({
  url: `https://api.portone.io/payments/${PAYMENT_ID_HERE}/schedule`,
  method: "post",
  headers: { Authorization: `PortOne ${PORTONE_API_SECRET}` },
  data: {
    payment: {
      billingKey: "billing-key-1", // 빌링키 발급 API를 통해 발급받은 빌링키
      orderName: "월간 이용권 정기결제",
      customer: {
        id: "customer-1234", // 고객사에서 관리하는 고객 고유번호
      },
      amount: {
        total: 10000,
      },
      currency: "KRW",
    },
    timeToPay: "2023-01-01T00:00:00+09:00", // 결제 예정 시점. RFC 3339 형식으로 입력해야 합니다.
  },
});

주요 파라미터

paymentId: string

결제 주문 번호

  • 고객사에서 채번하여 사용하는 주문번호로 고유한 값이여야 합니다.
  • URL path에 포함하여 요청해야 합니다.
payment: object

빌링키 결제 요청 입력정보

billingKey: string

빌링키 결제에 사용할 빌링키

orderName: string

주문명

amount: object

결제 금액

total: number

총 결제 금액

결제 금액으로 결제를 원하는 통화(currency)별 scale factor(소수점 몇번째 자리까지 유효한지)를 고려한 number 형식만 허용됩니다.

taxFree?: number

면세액

결제 금액으로 결제를 원하는 통화(currency)별 scale factor(소수점 몇번째 자리까지 유효한지)를 고려한 number 형식만 허용됩니다.

currency: string

결제 통화

결제통화로 원화 결제 시 KRW로 입력해야 합니다.

customer: object

고객 정보

name: object

고객 이름

full?: string

한 줄 이름 형식 (ex. 김포트)

separated?: object

분리된 이름

first: string

이름

last: string

phoneNumber: string

구매자 연락처

email: string

구매자 이메일

timeToPay: string

결제 예정 시점