Skip to content

토스 페이 연동하기

앱인토스에서 토스페이 결제를 연동하는 방법을 소개해요.

🚨 잠시만요

토스페이 사용을 위해서는 필수적으로 간편 로그인(토스 로그인)을 연동하셔야 해요.

시작하기

토스페이 사용을 위해서는 사전에 서류 준비 및 지류 계약이 필요해요.
채널톡을 통해 필요한 정보를 입력해 주세요. 이후 메일로 안내되는 서류를 전달받으시고 계약을 진행해주세요.
서류가 접수되면 내부 검수가 진행되고 토스페이 키 값을 받으실 수 있어요.
내부 검수는 보통 영업일 기준 7일~14일이 소요됩니다.

토스페이 키 값 등록하기

토스페이 계약이 완료되면 토스페이 키 값을 메일로 받으실 수 있어요.
워크스페이스의 연동 키 탭으로 이동해주세요.
등록 버튼을 누르면 토스페이 가맹점 키를 등록합니다.

테스트용 API 키는 "sk_test_w5lNQylNqa5lNQe013Nq" 로 입력해주세요.
다만, 결제 생성만 되고 승인 처리는 불가한 점 양해 부탁드립니다.

연동 프로세스 이해하기

통신 방화벽 확인하기

In/Out Bound 방화벽 관리를 하신다면 아래 IP를 방화벽에 등록해주세요.

가맹점이 허용해야하는 outbound IP 목록(가맹점 -> 앱인토스)

도메인IPport
pay-apps-in-toss-api-toss.im117.52.3.195, 211.115.96.195, 106.249.5.195443

API 공통규격 확인하기

도메인 정보

https://pay-apps-in-toss-api.toss.im

API 공통 응답

성공

json
// 성공일 경우 resultType이 SUCCESS로 설정되며 해당 API의 응답이 success 하위에 적재됩니다.
{
   "resultType":"SUCCESS",
   "success":{
      "sample":"data"
   }
}

실패

json
// 실패일 경우 resultType 이 FAIL로 설정되며 해당 실패 사유가 error 하위에 적재됩니다.
{
   "resultType":"FAIL",
   "error":{
      "errorCode":"INVALID_PARAMETER",
      "reason":"요청에 실패했습니다."
   }
}

개발하기

1. 결제 생성하기

결제 건을 생성합니다.

  • Content-type : application/json
  • Method : POST
  • URL : /api-partner/v1/apps-in-toss/pay/make-payment

요청 헤더

이름타입필수값 여부설명
x-toss-user-keystringY토스 로그인을 통해 획득한 userKey 값

요청 파라미터

이름타입필수설명
orderNoStringY가맹점의 주문번호
주문번호는 반드시 가맹점별로 매회 유니크해야 하며, 중복될 경우 결제 생성 요청이 실패합니다.
- ‘숫자, 영문자, 특수문자 _-:.^@’ 만 사용 가능하며, 50자 이내여야 합니다.
- 동일 주문번호는 구매자 인증 완료 이후 절대 재사용이 불가합니다.
- 최초 생성 후 2년이 지난 주문번호는 재사용할 수 없습니다.
- 테스트 환경과 라이브 환경 간의 주문번호 충돌 방지를 위해 가맹점 관리가 필요합니다.
productDescStringY상품 설명
상품 설명은 공백으로만 설정할 수 없고, 백슬래시 \ 와 따옴표 ,를 포함할 수 없으며 총 255자 이내여야 합니다. 이 값에 한글이 포함되었다면 인코딩에 유의해주세요.
토스 인코딩 방식은 UTF-8 형식을 사용합니다.
amountIntegerY총 결제 금액
금액과 관련된 모든 파라미터는 숫자 형태로 보내주셔야 에러가 발생하지 않습니다.
amountTaxFreeIntegerY결제 금액 중 비과세 금액
판매하시는 상품이 과세 품목이면 해당 값을 0으로 보내주세요.
비과세액은 필수값이니 빈 값으로 보내주시는 경우 에러가 발생합니다.
amountTaxableIntegerN결제 금액 중 과세 금액
별도의 과세액을 설정하지 않고, 비과세 금액을 0원으로 보내주시면 토스페이 서버에서 자동으로 과세와 부가세를 계산합니다.
amountVatIntegerN결제 금액 중 부가세
값이 없으면 환불할 과세 금액을 11로 나눈 후 소수점 첫째 자리에서 올림으로 계산합니다.
amountServiceFeeIntegerN결제 금액 중 봉사료
봉사료 금액입니다.
enablePayMethodsStringN결제수단 구분 변수
가맹점 필요에 따라 결제창에 노출하는 결제수단을 제어할 수 있습니다.
- TOSS_MONEY : 결제수단 중 토스머니만 노출
- CARD : 결제수단 중 카드만 노출
- null 또는 그 외의 값 : 상점에 설정된 기본 결제수단으로 노출
cashReceiptbooleanN현금영수증 발급 가능 여부
현금영수증 기능을 활용하시는 경우 true, 미사용의 경우 false 로 선언해 주시기 바랍니다.
반드시 true 또는 false 값을 전달해 주셔야 하고, null 과 같은 비정상 값을 전달할 경우 해당 필드는 명시적으로 false 로 처리됩니다.
cashReceiptTradeOptionStringN현금영수증 발급 타입
- GENERAL : 일반(기본 값)
- CULTURE : 문화비
- PUBLIC_TP : 교통비
installmentStringN할부 제한 타입
신용카드 결제 시, 사용자의 할부 선택을 제한할 수 있습니다.
- USE : 할부 사용 (기본값)
- NOT_USE : 할부 미사용
isTestPaymentbooleanY샌드박스 결제 요청이면 true, 라이브앱 결제 요청이면 false
curl --location 'https://{{domain}}/api-partner/v1/apps-in-toss/pay/make-payment' \
--header 'Content-Type: application/json' \
--header 'x-toss-user-key : 1234' \
--data '{
    "orderNo":"test-20250417-3",
    "productDesc":"test02",
    "amount":10,
    "amountTaxFree":0,
    "isTestPayment":true
}'

응답 파라미터

이름타입설명
payTokenString토스페이 토큰
매회 유니크한 토큰 값이 생성됩니다.
가맹점에서는 이 값을 반드시 저장하고 관리하셔야 합니다.
json
{
  "resultType": "SUCCESS",
  "success": {
    "payToken": "string"
  }
}

2. 결제 인증하기

SDK를 통해 연동해주세요.

토스페이 결제창을 띄우고, 사용자 인증을 수행해요.
인증이 완료되면 성공 여부를 반환해요.

checkoutPayment 함수는 결제창을 통해 사용자 인증만 해요.
실제 결제 처리는 인증 성공 후 서버에서 별도로 해야 해요.

시그니처
function checkoutPayment(options: CheckoutPaymentOptions): Promise<CheckoutPaymentResult>;

파라미터

이름타입필수값 여부설명
optionsstringY결제창을 띄울 때 필요한 옵션이에요

반환값
Promise<CheckoutPaymentResult>
인증 성공 여부를 포함한 결과를 반환해요.

tsx
import { TossPay } from "@apps-in-toss/framework";

async function handlePayment() {
  try {
    // 실제 구현 시 결제 생성 역할을 하는 API 엔드포인트로 대체해주세요.
    const { payToken } = await fetch("/my-api/payment/create").then((res) =>
      res.json()
    );

    const { success, reason } = await TossPay.checkoutPayment({ payToken });

    if (success) {
      // 실제 구현 시 결제를 실행하는 API 엔드포인트로 대체해주세요.
      await fetch("/my-api/payment/execute", {
        method: "POST",
        body: JSON.stringify({ payToken }),
        headers: { "Content-Type": "application/json" },
      });
    } else {
      console.log("인증 실패:", reason);
    }
  } catch (error) {
    console.error("결제 인증 중 오류가 발생했어요:", error);
  }
}

3. 결제 실행하기

구매자가 결제를 시도하면, 먼저 결제 정보를 생성하고 인증을 받아요.
이때 결제 상태는 '대기' 중이에요. 이후 결제를 실제로 승인하려면 주어진 주문번호와 결제 토큰을 사용해서 이 함수로 생성된 결제를 승인해요.
실제 승인이 완료되면, 구매자의 결제 수단(예: 카드, 계좌)에서 실제로 금액이 출금돼요.

  • Content-type : application/json
  • Method : POST
  • URL : /api-partner/v1/apps-in-toss/pay/execute-payment

요청 헤더

이름타입필수값 여부설명
x-toss-user-keystringY토스 로그인을 통해 획득한 userKey 값

요청 파라미터

이름타입필수설명
payTokenStringY토스페이 토큰
orderNoStringN가맹점 주문번호
isTestPaymentbooleanYpayToken 이 샌드박스에서 발급된 것이면 true, 라이브앱에서 발급된 것이면 false
curl --location 'https://{{domain}}/api-partner/v1/apps-in-toss/pay/execute-payment' \
--header 'Content-Type: application/json' \
--header 'x-toss-user-key : 1234' \
--data '{
    "payToken":"test-20250417-3",
    "orderNo":"test02",
    "isTestPayment":true
}'

응답

이름타입설명
modeString결제환경
- LIVE : 실거래용
- TEST : 테스트용
orderNoString승인된 상품 주문번호
amountInteger상품금액
approvalTimeString결제건의 승인 처리 시간
결제건의 승인 처리 시간 (yyyy-MM-dd HH:mm:ss)
요청에 따른 결제건 처리 시간입니다. 환불 시에도 동일한 변수로 리턴되므로 구분하여 관리하시기 바랍니다.
stateMsgString상태 응답 텍스트 값
정상 응답일 경우 “결제 완료” 로 내려감
discountedAmountInteger할인된 금액
할인된 금액이 리턴되며, 할인 적용이 없으면 0으로 리턴됩니다.
할인 금액에는 토스 앱에서 자동 적용되는 즉시할인과 토스 포인트 사용금액이 포함됩니다. 결제 상점에 따라 할인조건은 차이가 있을 수 있습니다.
paidAmountInteger지불수단 승인금액
총 금액 중 할인된 금액을 제외한 순수 지불수단 승인금액입니다. 현금영수증 자체 발행을 사용하는 가맹점은 이 값으로 발행 처리해 주시면 됩니다.
payMethodString결제수단
- TOSS_MONEY : 토스머니
- CARD : 카드
payTokenString토스페이 토큰
매회 유니크한 토큰 값이 생성됩니다.
가맹점에서는 이 값을 반드시 저장하고 관리하셔야 합니다.
transactionIdString거래 트랜잭션 아이디
결제의 거래구분을 위하여 토스 서버에서 유니크한 값을 생성해서 전달드립니다.
매출전표를 호출하거나 환불 진행 시 구분 값으로 활용할 수 있습니다.
cardCompanyCodeString승인 카드사 코드
cardCompanyNameString승인 카드사명
cardAuthorizationNoString구매자가 확인할 수 있는 카드사 승인번호
정상적인 카드사 승인번호는 라이브 키 결제에서 확인하실 수 있습니다.
spreadOutString사용자가 선택한 카드 할부개월
5만원 미만 금액 및 일시불 결제의 경우 0으로 리턴됩니다.
noInterestString카드 무이자 적용 여부
- ture : 무이자
- false : 일반
salesCheckLinkUrlString신용카드 매출전표 호출 URL
승인된 카드 결제건의 매출전표를 확인할 수 있는 URL 입니다.
구매자의 추가인증 완료 후 거래내역을 확인할 수 있습니다.
cardMethodTypeString카드 타입
승인된 카드의 타입을 구분할 수 있습니다. 예를 들어, 상점의 신용카드 결제 비율을 알고 싶다면 이 값을 활용해주세요.
- CREDIT : 신용카드
- CHECK : 체크카드
- PREPAYMENT : 선불카드
cardNumberString마스킹된 카드번호
카드번호 16자리 중 중간자리는 마스킹됩니다.
cardUserTypeString카드 사용자 구분
- PERSONAL : 본인카드
- PERSONAL_FAMILY : 가족카드
- CORP_PERSONAL : 법인지정 결제계좌 임직원
- CORP_PRIVATE : 법인 공용
- CORP_COMPANY : 법인지정 결제계좌 회사 (하나카드만)
cardNum4PrintString사용자가 선택한 카드의 끝 4자리
사용자가 선택한 결제수단( payMethod)이 ‘카드’ 인 경우 카드번호 끝 4자리를 전달합니다. (카드사에 따라 마스킹이 포함되어 있을 수 있습니다)
cardBinNumberString카드 BIN 넘버
카드사에서 준 카드 BIN 번호 (마스킹되어있을 수 있습니다)
100% 신뢰는 불가합니다.
cashReceiptMgtKeyString현금영수증 관리번호 식별값
국세청 승인번호는 아니며 토스페이에서 자체적으로 만든 식별값입니다. 해당 필드 존재로 현금영수증 발급 구분 가능합니다.
accountBankCodeString은행 코드
사용자가 선택한 결제수단( payMethod)이 ‘토스머니’인 경우 토스가 정의한 은행 코드를 전달합니다.
accountBankNameString은행 명
accountNumberString계좌번호
계좌번호는 일부 마스킹을 포함하고 있습니다.
msgString응답이 성공이 아닌 경우 설명 메시지
errorCodeString에러 코드
json
{
  "resultType": "SUCCESS",
  "success": {
    "code": 0,
      "mode": "TEST",
      "orderNo": "20250417-2",
      "amount": 10,
      "approvalTime": "2025-04-17 12:32:10",
      "stateMsg": "결제 완료",
      "discountedAmount": 0,
      "paidAmount": 10,
      "payMethod": "TOSS_MONEY",
      "payToken": "O1NZck9XME8ureeVJVJP67",
      "transactionId": "45a77cf4-5577-4d5c-8827-4d4dd328bf12",
      "cardCompanyCode": null,
      "cardCompanyName": null,
      "cardAuthorizationNo": null,
      "spreadOut": null,
      "noInterest": null,
      "salesCheckLinkUrl": null,
      "cardMethodType": null,
      "cardNumber": null,
      "cardUserType": null,
      "cardNum4Print": null,
      "cardBinNumber": null,
      "cashReceiptMgtKey": null,
      "accountBankCode": "092",
      "accountBankName": "토스뱅크",
      "accountNumber": "100******094",
      "msg": null,
      "errorCode": null
  }
}

4. 결제 환불하기

결제 건을 구매자에게 돌려줍니다.

  • Content-type : application/json
  • Method : POST
  • URL : /api-partner/v1/apps-in-toss/pay/refund-payment

요청 헤더

이름타입필수값 여부설명
x-toss-user-keystringY토스 로그인을 통해 획득한 userKey 값

요청 파라미터

이름타입필수설명
payTokenStringY토스페이 토큰
reasonStringY환불 사유
한글 및 숫자, 영문자, 특수문자 _ - : . ^ @ ( ) [ ] # / ! % ? & 만 허용합니다.
isTestPaymentbooleanYpayToken 이 샌드박스에서 발급된 것이면 true, 라이브앱에서 발급된 것이면 false

응답

이름타입설명
refundNoString환불 번호
approvalTimeString결제건의 환불 처리 시간 (yyyy-MM-dd HH:mm:ss)
cashReceiptMgtKeyString현금영수증 관리번호 식별
refundableAmountInteger환불 가능 금액
discountedAmountInteger할인된 금액
paidAmountInteger지불수단 승인금액
refundedAmountInteger환불요청 금액
refundedDiscountAmountInteger환불요청 금액 중 실 차감된 할인 금액
refundedPaidAmountInteger환불요청 금액 중 실 차감된 지불수단 금
payTokenString환불된 결제토큰
transactionIdString거래 트랜잭션 아이디
cardMethodTypeString카드 타입
- CREDIT : 신용카드
- CHECK : 체크카드
- PREPAYMENT : 선불카드
cardNumberString마스킹된 카드번호
cardUserTypeString카드 사용자 구분
- PERSONAL : 본인 카드
- PERSONAL_FAMILY : 가족카드
- CORP_PERSONAL : 법인지정 결제계좌 임직원
- CORP_PRIVATE : 법인 공용
- CORP_COMPANY : 법인지정 결제계좌 회사(하나카드만)
cardNum4PrintString사용자가 선택한 카드의 끝 4자리
cardBinNumberString카드 BIN 넘버
accountBankCodeString은행코드
사용자가 선택한 결제수단(payMethod)이 '토스머니'인 경우 토스가 정의한 은행 코드를 전달합니다.
accountBankNameString은행 명
accountNumberString마스킹된 계좌번호
json
{
  "resultType": "SUCCESS",
  "success": {
    "refundNo": "string",
    "approvalTime": "string",
    "cashReceiptMgtKey": "string",
    "refundableAmount": 0,
    "discountedAmount": 0,
    "paidAmount": 0,
    "refundedAmount": 0,
    "refundedDiscountAmount": 0,
    "refundedPaidAmount": 0,
    "payToken": "string",
    "transactionId": "string",
    "cardMethodType": "string",
    "cardNumber": "string",
    "cardUserType": "string",
    "cardNum4Print": "string",
    "cardBinNumber": "string",
    "accountBankCode": "string",
    "accountBankName": "string",
    "accountNumber": "string"
  }
}

5. 결제 상태 조회하기

생성된 결제건의 거래 상태와 거래 트랜잭션을 조회할 수 있습니다.
상황에 따라, 승인 혹은 환불 응답을 수신하지 못한 경우에도 활용 가능합니다.

  • Content-type : application/json
  • Method : POST
  • URL : /api-partner/v1/apps-in-toss/pay/get-payment-status

요청 헤더

이름타입필수값 여부설명
x-toss-user-keystringY토스 로그인을 통해 획득한 userKey 값

요청 파라미터

이름타입필수설명
payTokenStringY토스페이 토큰
orderNoStringY가맹점 주문번호
isTestPaymentbooleanYpayToken 이 샌드박스에서 발급된 것이면 true, 라이브앱에서 발급된 것이면 false

응답

이름타입설명
modeString결제환경
- LIVE : 실거래용
- TEST : 테스트용
payTokenString토스페이 토큰
orderNoString토스페이와 연계된 상점 주문번호
payStatusString결제상태
payMethodString결제수단
- TOSS_MONEY : 토스머니
- CARD : 카드
amountInteger가맹점이 토스로 전달한 결제 총 금액
discountedAmountInteger할인된 금액
discountAmountV2Integer즉시 할인 적용 금액
paidPointV2Integer토스 포인트 사용금액
paidAmountInteger지불수단 승인금액
refundableAmountInteger환불 가능 잔액
amountTaxableInteger총 결제 금액 중 적용된 과세 금액
amountTaxFreeInteger총 결제 금액 중 적용된 비과세 금액
amountVatInteger총 결제 금액 중 적용된 부가세 금액
amountServiceFeeInteger총 결제 금액 중 적용된 봉사료
disposableCupDepositInteger일회용 컵 보증금
accountBankCodeString은행코드
accountBankNameString은행명
accountNumberString마스킹된 계좌번호
cardObject카드 정보
noInterestBoolean카드 무이자 적용 여부
- true : 무이자
- false : 일반
spreadOutInteger사용자가 선택한 카드 할부개월
cardAuthorizationNoString구매자가 확인할 수 있는 카드사 승인번호
cardMethodTypeString카드 타입
- CREDIT : 신용카드
- CHECK : 체크카드
- PREPAYMENT : 선불카드
cardUserTypeString카드 사용자 구분
- PERSONAL : 본인 카드
- PERSONAL_FAMILY : 가족카드
- CORP_PERSONAL : 법인지정 결제계좌 임직원
- CORP_PRIVATE : 법인 공용
- CORP_COMPANY : 법인지정 결제계좌 회사(하나카드만)
cardNumberString마스킹된 카드번호
cardBinNumberString카드 BIN 넘버
cardNum4PrintString사용자가 선택한 카드의 끝 4자리
salesCheckLinkUrlString신용카드 매출전표 호출URL
cardCompanyNameString승인 카드사명
cardCompanyCodeInteger카드사 코드
transactionslist거래 트랜잭션
stepTypeString요청된 거래 타입
- PAY : 결제
- REFUND : 환불
transactionIdString거래 트랜잭션 아이디
결제의 거래구분을 위하여 유니크한 값을 생성하여 전달드립니다.
거래 대사 시, 이 값을 활용하시길 권장드립니다.
paidAmountInteger요청된 거래 타입(stepType) 중 적용된 지불수단 금액
transactionAmountInteger요청된 거래 타입(stepType)의 가맹점 전달금액
’환불’ 요청의 경우 -(마이너스) 금액이 리턴됩니다.
discountedAmountInteger요청된 거래 타입(stepType) 중 적용된 할인금액
할인 금액에는 토스 앱에서 자동 적용되는 즉시할인과 토스 포인트 사용금액이 포함됩니다.
pointAmountInteger요청된 거래 타입(stepType) 중 포인트 금액
regTsString요청 처리 시간
createdTsString결제 생성 시간
사용자 최초 결제 요청 시간
paidTsString결제 완료 처리 시간
json
{
  "resultType": "SUCCESS",
  "success": {
    "mode": "string",
    "payToken": "string",
    "orderNo": "string",
    "payStatus": "string",
    "payMethod": "string",
    "amount": 0,
    "discountedAmount": 0,
    "discountAmountV2": 0,
    "paidPointV2": 0,
    "paidAmount": 0,
    "refundableAmount": 0,
    "amountTaxable": 0,
    "amountTaxFree": 0,
    "amountVat": 0,
    "amountServiceFee": 0,
    "disposableCupDeposit": 0,
    "accountBankCode": "string",
    "accountBankName": "string",
    "accountNumber": "string",
    "card": {
      "noInterest": true,
      "spreadOut": 0,
      "cardAuthorizationNo": "string",
      "cardMethodType": "string",
      "cardUserType": "string",
      "cardNumber": "string",
      "cardBinNumber": "string",
      "cardNum4Print": "string",
      "salesCheckLinkUrl": "string",
      "cardCompanyName": "string",
      "cardCompanyCode": 0
    },
    "transactions": [
      {
        "stepType": "string",
        "transactionId": "string",
        "paidAmount": 0,
        "transactionAmount": 0,
        "discountedAmount": 0,
        "pointAmount": 0,
        "regTs": "string"
      }
    ],
    "createdTs": "string",
    "paidTs": "string"
  }
}

6. 코드 정리

결제상태 리스트

설명
PAY_STANDBY결제 대기 중
PAY_APPROVED구매자 인증 완료
PAY_CANCEL결제 취소
PAY_PROGRESS결제 진행 중
PAY_COMPLETE결제 완료
REFUND_PROGRESS환불 진행 중
REFUND_SUCCESS환불 성공
SETTLEMENT_COMPLETE정산 완료
SETTLEMENT_REFUND_COMPLETE환불 정산 완료

은행코드 리스트
토스머니 결제의 경우 사용자가 선택한 계좌의 정보를 함께 전달합니다.

은행 코드 (accountBankCode)은행 명 (accountBankName)
002KDB산업은행
003IBK기업은행
004KB국민은행
005KEB하나은행
007수협은행
011NH농협은행
020우리은행
023SC은행
027씨티은행
031대구은행
032부산은행
034광주은행
035제주은행
037전북은행
039경남은행
045MG새마을금고
048신협
050저축은행
064산림조합
071우체국
081하나은행
088신한은행
089케이뱅크
090카카오뱅크
092토스뱅크
103SBI저축은행
218KB증권
230미래에셋증권
238미래에셋증권
240삼성증권
243한국투자증권
247NH투자증권
261교보증권
262하이투자증권
263현대차투자증권
264키움증권
265이베스트증권
266SK증권
267대신증권
269한화투자증권
270하나증권
271토스증권
278신한투자증권
279DB금융투자
280유진투자
287메리츠증권
888토스머니
889토스포인트

카드사코드 리스트

카드사 이름카드(매입사) 코드
신한1
현대2
삼성3
국민4
롯데5
하나6
우리7
농협8
씨티(미지원)9
비씨(BC)10

에러 코드

설명
PAYMENT_EXISTING_PAYMENT이미 존재하는 결제입니다.
COMMON_INVALID_API_KEY바르지 않은 apiKey 입니다.
COMMON_BREAK_TIME_OF_BANK지금은 은행 점검 시간입니다. 점검이 끝난 후 사용해주세요.
그 외의 에러코드