Skip to content

Payment API

Toss POS의 결제 정보를 관리하는 API예요. 다양한 결제 수단을 지원하며, 각각의 결제 유형에 따라 다른 정보를 처리해요.

결제 유형

  • CARD: 카드 결제 정보
  • CASH: 현금 결제 정보
  • EXTERNAL: 외부 결제 정보
    • 플러그인 내부에서 결제하는 경우 사용
    • CARD, CASH 타입의 결제 취소는 Toss POS를 통해 처리

Types

PluginPaymentDto

결제 생성을 위한 데이터 전송 객체(DTO)예요. Toss POS에서만 결제를 생성할 수 있어요.

ts
{
    /** 결제수단 */
    sourceType: 'CARD';
    orderId: string;
    /** 지불액 */
    amountMoney: number;
    /** 부가가치세 */
    taxMoney: number;
    /** 승인번호 */
    approvedNo: string;
    /** 승인일시 */
    approvedAt: string;
    /** 플러그인에서 발행시킨 payment의 unique한 값 중복되지 않도록 주의해주세요 */
    paymentKey: string;
    /** 공급가액 */
    supplyMoney: number;
    /** 봉사료 */
    tipMoney: number;
    /** 면세 금액. 값을 지정하지 않으면 기본으로 0원이 지정됨 */
    taxExemptMoney?: number;
    /**
     * 완료처리여부
     * default: true
     * 테이블 주문인 경우 결제가 완료되면 주문이 완료처리되어 테이블이 자동으로 비워집니다
     * false로 설정하면 결제가 완료되어도 테이블은 비워지지 않습니다
     */
    autocomplete?: boolean;
    cardDetails: {
        /** 할부개월 수 */
        installmentMonth: PluginPaymentInstallment;
        cardType: 'CREDIT' | 'DEBIT' | 'PREPAID' | 'FOREIGN';
        /** 발급사명 */
        cardBrand: string;
        /** 발급사 코드 */
        cardBrandId?: string;
        /** 카드번호 */
        cardNo: string;
        /** 매입사명 */
        source?: string;
        /** 매입사 코드 */
        sourceId?: string;
        /** 선불카드일 때 잔액 */
        balance?: number;
        /** VAN사 */
        van?: VanType;
    };
}
ts
{
    /** 결제수단 */
    sourceType: 'CASH';
    orderId: string;
    /** 지불액 */
    amountMoney: number;
    /** 부가가치세 */
    taxMoney: number;
    /** 승인번호 */
    approvedNo: string;
    /** 승인일시 */
    approvedAt: string;
    /** 플러그인에서 발행시킨 payment의 unique한 값 중복되지 않도록 주의해주세요 */
    paymentKey: string;
    /** 공급가액 */
    supplyMoney: number;
    /** 봉사료 */
    tipMoney: number;
    /** 면세 금액. 값을 지정하지 않으면 기본으로 0원이 지정됨 */
    taxExemptMoney?: number;
    /**
     * 완료처리여부
     * default: true
     * 테이블 주문인 경우 결제가 완료되면 주문이 완료처리되어 테이블이 자동으로 비워집니다
     * false로 설정하면 결제가 완료되어도 테이블은 비워지지 않습니다
     */
    autocomplete?: boolean;
    /** 현금영수증 정보 */
    cashReceipt?: {
        /** 현금영수증 식별번호 */
        identityNumber: string;
        /**
         * 현금영수증 발급 유형
         * CONSUMER: 개인
         * BUSINESSES: 사업자
         */
        issuerType: 'CONSUMER' | 'BUSINESSES';
        /**
         * PHONE: 휴대폰번호
         * BUSINESS_NUMBER: 사업자번호
         * CARD: 현금영수증 카드
         */
        issuanceType: 'PHONE' | 'BUSINESS_NUMBER' | 'CARD';
        /** 자진 발급 여부 */
        selfIssuance: boolean;
    };
}
ts
{
    /** 결제수단 */
    sourceType: 'EXTERNAL';
    orderId: string;
    /** 지불액 */
    amountMoney: number;
    /** 부가가치세 */
    taxMoney: number;
    /** 승인번호 */
    approvedNo: string;
    /** 승인일시 */
    approvedAt: string;
    /** 플러그인에서 발행시킨 payment의 unique한 값 중복되지 않도록 주의해주세요 */
    paymentKey: string;
    /** 공급가액 */
    supplyMoney: number;
    /** 봉사료 */
    tipMoney: number;
    /** 면세 금액. 값을 지정하지 않으면 기본으로 0원이 지정됨 */
    taxExemptMoney?: number;
    /**
     * 완료처리여부
     * default: true
     * 테이블 주문인 경우 결제가 완료되면 주문이 완료처리되어 테이블이 자동으로 비워집니다
     * false로 설정하면 결제가 완료되어도 테이블은 비워지지 않습니다
     */
    autocomplete?: boolean;
}

PluginPayment

POS에서 생성된 결제 정보를 나타내는 객체예요.

ts
{
  /** 결제수단 */
  sourceType: 'CARD';
  id: string;
  orderId: string;
  /** 결제상태 */
  state: 'APPROVED' | 'COMPLETED' | 'CANCELLED';
  /** 지불액 */
  amountMoney: number;
  /** 부가가치세 */
  taxMoney: number;
  /** 공급가액 */
  supplyMoney: number;
  /** 봉사료 */
  tipMoney: number;
  /** 면세 금액. 값을 지정하지 않으면 기본으로 0원이 지정됨 */
  taxExemptMoney?: number;
  /** 승인번호 */
  approvedNo: string;
  /** 승인일시 */
  approvedAt: string;
  /** 취소거래인 경우에만 값 존재 */
  cancelledAt?: string;
  /** 플러그인에서 발행시킨 payment의 unique한 값 중복되지 않도록 주의해주세요 */
  paymentKey: string;
  /** 현금영수증 정보. 계좌이체가 추가되면서 현금 결제가 아니어도 발행될 수 있어요 */
  cashReceipt?: {
    /** 현금영수증 식별번호 */
    identityNumber: string;
    /** CONSUMER: 개인, BUSINESSES: 사업자 */
    issuerType: 'CONSUMER' | 'BUSINESSES';
    /** PHONE: 휴대폰번호, BUSINESS_NUMBER: 사업자번호, CARD: 현금영수증 카드 */
    issuanceType: 'PHONE' | 'BUSINESS_NUMBER' | 'CARD';
    /** 자진 발급 여부 */
    selfIssuance: boolean;
  };
  cardDetails: {
    /** 할부개월 수 */
    installmentMonth: PluginPaymentInstallment;
    cardType: 'CREDIT' | 'DEBIT' | 'PREPAID' | 'FOREIGN';
    /** 발급사명 */
    cardBrand: string;
    /** 발급사 코드 */
    cardBrandId?: string;
    /** 카드번호 */
    cardNo: string;
    /** 매입사명 */
    source?: string;
    /** 매입사 코드 */
    sourceId?: string;
    /** 선불카드일 때 잔액 */
    balance?: number;
    /** VAN사 */
    van?: VanType;
  };
}
ts
{
  /** 결제수단 */
  sourceType: 'CASH';
  id: string;
  orderId: string;
  /** 결제상태 */
  state: 'APPROVED' | 'COMPLETED' | 'CANCELLED';
  /** 지불액 */
  amountMoney: number;
  /** 부가가치세 */
  taxMoney: number;
  /** 공급가액 */
  supplyMoney: number;
  /** 봉사료 */
  tipMoney: number;
  /** 면세 금액. 값을 지정하지 않으면 기본으로 0원이 지정됨 */
  taxExemptMoney?: number;
  /** 승인번호 */
  approvedNo: string;
  /** 승인일시 */
  approvedAt: string;
  /** 취소거래인 경우에만 값 존재 */
  cancelledAt?: string;
  /** 플러그인에서 발행시킨 payment의 unique한 값 중복되지 않도록 주의해주세요 */
  paymentKey: string;
  /** 현금영수증 정보. 계좌이체가 추가되면서 현금 결제가 아니어도 발행될 수 있어요 */
  cashReceipt?: {
    /** 현금영수증 식별번호 */
    identityNumber: string;
    /** CONSUMER: 개인, BUSINESSES: 사업자 */
    issuerType: 'CONSUMER' | 'BUSINESSES';
    /** PHONE: 휴대폰번호, BUSINESS_NUMBER: 사업자번호, CARD: 현금영수증 카드 */
    issuanceType: 'PHONE' | 'BUSINESS_NUMBER' | 'CARD';
    /** 자진 발급 여부 */
    selfIssuance: boolean;
  };
}
ts
{
  /** 결제수단 */
  sourceType: 'EXTERNAL';
  id: string;
  orderId: string;
  /** 결제상태 */
  state: 'APPROVED' | 'COMPLETED' | 'CANCELLED';
  /** 지불액 */
  amountMoney: number;
  /** 부가가치세 */
  taxMoney: number;
  /** 공급가액 */
  supplyMoney: number;
  /** 봉사료 */
  tipMoney: number;
  /** 면세 금액. 값을 지정하지 않으면 기본으로 0원이 지정됨 */
  taxExemptMoney?: number;
  /** 승인번호 */
  approvedNo: string;
  /**
   * 승인일시
   */
  approvedAt: string;
  /** 취소거래인 경우에만 값 존재 */
  cancelledAt?: string;
  /** 플러그인에서 발행시킨 payment의 unique한 값 중복되지 않도록 주의해주세요 */
  paymentKey: string;
  /** 현금영수증 정보. 계좌이체가 추가되면서 현금 결제가 아니어도 발행될 수 있어요 */
  cashReceipt?: {
    /** 현금영수증 식별번호 */
    identityNumber: string;
    /** CONSUMER: 개인, BUSINESSES: 사업자 */
    issuerType: 'CONSUMER' | 'BUSINESSES';
    /** PHONE: 휴대폰번호, BUSINESS_NUMBER: 사업자번호, CARD: 현금영수증 카드 */
    issuanceType: 'PHONE' | 'BUSINESS_NUMBER' | 'CARD';
    /** 자진 발급 여부 */
    selfIssuance: boolean;
  };
  externalDetails: {
    /** 결제가 발생 된 플러그인 or 기타결제 원천 (ex ZERO PAY...) */
    source?: string;
    /** 결제수단 */
    sourceId?: string;
  };
}
ts
{
  /** 결제수단. VAN을 통한 바코드/QR 간편결제 */
  sourceType: 'BARCODE';
  id: string;
  orderId: string;
  /** 결제상태 */
  state: 'APPROVED' | 'COMPLETED' | 'CANCELLED';
  /** 지불액 */
  amountMoney: number;
  /** 부가가치세 */
  taxMoney: number;
  /** 공급가액 */
  supplyMoney: number;
  /** 봉사료 */
  tipMoney: number;
  /** 면세 금액. 값을 지정하지 않으면 기본으로 0원이 지정됨 */
  taxExemptMoney?: number;
  /** 승인번호 */
  approvedNo: string;
  /** 승인일시 */
  approvedAt: string;
  /** 취소거래인 경우에만 값 존재 */
  cancelledAt?: string;
  /** 플러그인에서 발행시킨 payment의 unique한 값 중복되지 않도록 주의해주세요 */
  paymentKey: string;
  /** 현금영수증 정보. 계좌이체가 추가되면서 현금 결제가 아니어도 발행될 수 있어요 */
  cashReceipt?: {
    /** 현금영수증 식별번호 */
    identityNumber: string;
    /** CONSUMER: 개인, BUSINESSES: 사업자 */
    issuerType: 'CONSUMER' | 'BUSINESSES';
    /** PHONE: 휴대폰번호, BUSINESS_NUMBER: 사업자번호, CARD: 현금영수증 카드 */
    issuanceType: 'PHONE' | 'BUSINESS_NUMBER' | 'CARD';
    /** 자진 발급 여부 */
    selfIssuance: boolean;
  };
  externalDetails: {
    /** 할부개월 수 */
    installmentMonth: PluginPaymentInstallment;
    /** 발급사명 (예: 토스페이, 네이버체크, 카카오페이머니) */
    source: string;
    /** 간편결제 구분자 (예: KKF, SG2, ZRP) */
    sourceId: string;
    sourceType?: 'CARD' | 'BANK_TRANSFER' | 'OTHER_GIFT_CARD' | 'POINT' | 'COUPON' | 'OTHER';
    /** 매입사명 */
    cardBrand?: string;
    cardNo?: string;
  };
}
ts
{
  /** 결제수단 */
  sourceType: 'ACCOUNT_TRANSFER';
  id: string;
  orderId: string;
  /** 결제상태 */
  state: 'APPROVED' | 'COMPLETED' | 'CANCELLED';
  /** 지불액 */
  amountMoney: number;
  /** 부가가치세 */
  taxMoney: number;
  /** 공급가액 */
  supplyMoney: number;
  /** 봉사료 */
  tipMoney: number;
  /** 면세 금액. 값을 지정하지 않으면 기본으로 0원이 지정됨 */
  taxExemptMoney?: number;
  /** 승인번호 */
  approvedNo: string;
  /** 승인일시 */
  approvedAt: string;
  /** 취소거래인 경우에만 값 존재 */
  cancelledAt?: string;
  /** 플러그인에서 발행시킨 payment의 unique한 값 중복되지 않도록 주의해주세요 */
  paymentKey: string;
  /** 현금영수증 정보. 계좌이체가 추가되면서 현금 결제가 아니어도 발행될 수 있어요 */
  cashReceipt?: {
    /** 현금영수증 식별번호 */
    identityNumber: string;
    /** CONSUMER: 개인, BUSINESSES: 사업자 */
    issuerType: 'CONSUMER' | 'BUSINESSES';
    /** PHONE: 휴대폰번호, BUSINESS_NUMBER: 사업자번호, CARD: 현금영수증 카드 */
    issuanceType: 'PHONE' | 'BUSINESS_NUMBER' | 'CARD';
    /** 자진 발급 여부 */
    selfIssuance: boolean;
  };
  accountTransfer: {
    /** 은행코드 */
    bankCode: number;
    /** 계좌번호 */
    accountNumber: string;
  };
}

PluginPaymentInstallment

할부개월 수를 나타내는 두 자리 문자열이에요. '00'부터 '99'까지 쓸 수 있어요.

ts
type PluginPaymentInstallment = '00' | '01' | ... | '99';
설명
'00'일시불. 현금IC의 경우 일반거래
'01'1개월 할부. 현금IC의 경우 간소화 거래(비밀번호 입력 생략)
'02' 이상해당 개월 수의 할부

VanType

카드 결제를 처리한 VAN사예요. PluginPaymentDtoPluginPaymentcardDetails.van이 이 타입을 사용해요.

ts
type VanType = 'NICE' | 'KIS' | 'SMARTRO' | 'KOVAN';

Methods

add

주문에 결제 정보를 추가해요. 결제가 완료된 후 실행해요.

ts
import { posPluginSdk } from '@tossplace/pos-plugin-sdk';

const order = { id: orderId };
const pluginPayment = await posPluginSdk.payment.add(order, paymentDto);

Parameters

파라미터타입필수설명
order.idstringO결제를 추가할 주문의 ID
paymentDtoPluginPaymentDtoO등록할 결제 정보

Response

Promise<PluginPayment> — 등록된 결제 정보예요. 생성할 수 있는 결제는 CARD·CASH·EXTERNAL 세 가지라서, 반환값도 이 중 하나의 형태로 내려와요.

getPayment

결제 정보를 조회해요.

ts
import { posPluginSdk } from '@tossplace/pos-plugin-sdk';

const payment = await posPluginSdk.payment.getPayment(paymentId);

Parameters

파라미터타입필수설명
paymentIdstringO조회할 결제의 ID

Response

Promise<PluginPayment> — 조회한 결제 정보예요. POS에서 만들어진 결제까지 조회되므로 BARCODE·ACCOUNT_TRANSFER 형태도 내려올 수 있어요.

cancel

주문의 결제를 취소해요.

ts
import { posPluginSdk } from '@tossplace/pos-plugin-sdk';

const order = { id: orderId };
const payment = { id: paymentId };
await posPluginSdk.payment.cancel(order, payment);

Parameters

파라미터타입필수설명
order.idstringO취소할 결제가 속한 주문의 ID
payment.idstringO취소할 결제의 ID

Response

반환값이 없어요.

on

결제 상태 변경 이벤트를 수신하기 위한 핸들러를 등록해요.

Parameters

파라미터타입필수설명
event'paid' | 'cancel' | 'before-cancel'O구독할 이벤트
callback(paymentId: string, orderId: string) => voidOpaid·cancel 이벤트의 콜백
callback(payload: { order: PluginOrder; payment: PluginPayment }) => Promise<void>Obefore-cancel 이벤트의 콜백

Response

반환값이 없어요.

  • 결제가되었을 때 실행돼요.
  • order의 결제가 완료되었을때 발생되는 것이 아닌 order에 결제가 발생할때 마다 발생해요.
    • 한 주문을 3번에 나누어 분할결제했다면 paid가 3번 발생해요.
  • order.paymentPrice.paymentUnpaidValue가 0원이라면 전체 결제가 완료된 건이에요.
ts
import { posPluginSdk } from '@tossplace/pos-plugin-sdk';

posPluginSdk.payment.on('paid', (paymentId: string, orderId: string) => {
    // 결제 처리 로직
});

cancel

  • 결제가 취소되었을 때 실행돼요.
  • order가 취소되었을때 발생되는 것이 아닌 결제가 취소가 되었을 때 발생해요.
    • 한 주문을 3번에 나누어 분할결제했고 3건을 모두 취소한다면 cancel 이벤트가 3번 발생해요.
  • order.paymentPrice.paymentPaidValue가 0원이라면 전체 취소가 완료된 건이에요.
ts
import { posPluginSdk } from '@tossplace/pos-plugin-sdk';

posPluginSdk.payment.on('cancel', (paymentId: string, orderId: string) => {
    // 결제 취소 처리 로직
});

before-cancel

협력사 전용 기능

before-cancel 이벤트는 허락된 협력사만 사용할 수 있어요. 이 기능을 사용하려면 토스플레이스에 문의해주세요.

  • 결제가 취소되기 직전에 실행돼요.
  • 콜백은 Promise<void>를 반환하며, 반환된 Promise가 완료된 후 실제 취소가 진행돼요.
    • 취소 전에 처리해야 하는 로직(외부 결제 취소 등)을 여기에서 수행할 수 있어요.
  • 콜백에는 paymentId, orderId 대신 order(PluginOrder), payment(PluginPayment) 객체가 함께 전달돼요.
ts
import { posPluginSdk } from '@tossplace/pos-plugin-sdk';

posPluginSdk.payment.on('before-cancel', async ({ order, payment }) => {
    // 결제 취소 전 처리 로직
});