이 문서는 결제 요청·승인·취소 과정에서 발생하는 PG 연동 에러 코드를 분류별로 정리해요.
API 호출이 실패하면 응답의 error_code 를 먼저 보고, 이 표에서 원인과 대처법을 찾아요.
커머스 오류 코드는 별도
고객·상품·주문·구독 커머스 API 에러 코드는 커머스 오류코드 에서 봐요.
자주 만나는 에러 TOP 6
연동 중 가장 많이 마주치는 에러와 해결법이에요.
1APP_AT_AUTHORIZE_HEADER_BLANK Authorization 헤더 누락/오류
흔한 원인: Basic Auth 헤더가 없거나 형식이 올바르지 않아요.
// 올바른 예 — SDK 사용 시 자동 처리
Bootpay.setConfiguration({
client_key: 'YOUR_CLIENT_KEY',
secret_key: 'YOUR_SECRET_KEY'
})
const receipt = await Bootpay.receiptPayment(receiptId)
// 직접 호출 시 — Basic Auth 헤더 추가
const BASIC_AUTH = 'Basic ' + btoa(`${CLIENT_KEY}:${SECRET_KEY}`)javascript2RC_PRICE_MISMATCH 요청 금액과 승인 금액 불일치
흔한 원인: 프론트엔드에서 보낸 금액과 서버 DB의 금액이 달라요. 할인·쿠폰 적용 후 금액 동기화를 빠뜨린 경우가 가장 많아요.
// 잘못된 예 — 프론트엔드 금액을 그대로 신뢰
const price = req.body.price
// 올바른 예 — 서버 DB에서 직접 계산한 금액과 결제 금액 비교
const order = await db.orders.findByPk(orderId)
if (receipt.price !== order.total_amount) {
// 금액 불일치 → 결제 취소 또는 승인 거절
}javascript3APP_SK_NOT_MATCHED Secret KEY 불일치
흔한 원인: 테스트 키와 운영 키를 헷갈렸거나 .env 에 잘못된 키를 복사한 경우예요.
- 관리자 > 개발자 설정 > API 연동키 (결제) 에서 Private Key 를 다시 복사해요.
- 테스트·운영 환경의 키가 다르면
BOOTPAY_SANDBOX설정을 확인해요.
4RC_ALREADY_CANCELLED 이미 취소 처리됨
흔한 원인: 웹훅과 프론트엔드에서 동시에 취소 요청을 보내거나 취소 전에 결제 상태를 확인하지 않는 경우예요.
// 올바른 예 — 취소 전 결제 상태와 가맹점 DB 상태 확인
const receipt = await Bootpay.receiptPayment(receiptId)
const order = await db.orders.findByPk(orderId)
if (receipt.status === 20 || order.status === 'refunded') {
return res.json({ error: '이미 취소된 결제입니다' })
}
// 취소 진행...javascript5AUTHENTICITY_TOKEN_EXPIRE 인증 오류
흔한 원인: Client Key 또는 Secret Key 가 올바르지 않아요. 관리자 > 개발자 설정 에서 키를 다시 확인해요.
6RC_NOT_FOUND 영수증 정보 없음
흔한 원인: receipt_id 오타, 다른 프로젝트의 결제 건 조회, 테스트·운영 환경 혼동 중 하나예요.
에러 응답 형식
HTTP/1.1 400 Bad Request
Content-Type: application/json{
"error_code": "RC_ALREADY_CANCELLED",
"message": "요청하신 결제는 이미 취소처리가 되었습니다."
}json| 필드 | 타입 | 설명 |
|---|---|---|
| error_code | String | 에러 코드 텍스트 |
| message | String | 에러 메시지 (한국어) |
| payload | Object | 추가 데이터 (에러에 따라 포함, 없으면 생략) |
| pg_error_code | String | PG사 에러 코드 (결제 관련 에러에서만 포함) |
error_code 와 코드표의 관계
이 문서는 결제 API에서 확인해야 하는 텍스트형 에러 코드를 기준으로 정리해요. 응답의 error_code를 그대로 검색하면 원인과 대처 방법을 찾을 수 있어요.
인증 관련 에러 {#인증-관련-에러}
| 코드 | 메시지 | 대처 방법 |
|---|---|---|
AUTHENTICITY_TOKEN_EXPIRE |
인증 정보가 올바르지 않다 | Client Key 또는 Secret Key 를 관리자 > 개발자 설정 에서 다시 확인해요 |
APP_KEY_NOT_FOUND |
Client Key 를 찾지 못했다 | 관리자 > 개발자 설정 > API 연동키 에서 키를 확인해요 |
APP_KEY_PLATFORM_NOT_MATCH |
요청한 Platform Type 과 SDK Platform Type 이 일치하지 않는다 | Client Key 의 플랫폼 타입(Web/Android/iOS)을 확인해요 |
APP_KEY_NOT_REST |
요청한 Client Key가 REST API 키가 아니다 | REST API용 Client Key 를 사용해요 |
APP_FIREWALL_BLOCKED |
접근이 허가된 IP 가 아니다 | 관리자 > 개발자 설정 > 보안 정책 에서 IP 보안 설정을 확인해요 |
APP_SK_NOT_MATCHED |
Secret Key 가 올바르지 않다 | 관리자 > 개발자 설정 에서 Secret Key 를 다시 확인해요 |
APP_AT_AUTHORIZE_TYPE_INVALID |
Authorization 인증 타입이 올바르지 않다 | Authorization: Basic {base64} 형식인지 확인해요 |
APP_AT_AUTHORIZE_HEADER_BLANK |
Authorization 헤더가 비어 있다 | Authorization: Basic {base64(client_key:secret_key)} 형식으로 헤더를 추가해요 |
APP_API_SCOPE_NOT_MATCHED |
현재 사용 중인 API 키에 필요한 권한이 없다 | 관리자 > 개발자 설정 > API 연동키 에서 API Scope 권한을 추가해요 |
ONLY_INTERNAL_SERVER |
부트페이 내부용 API다. 외부에서는 사용할 수 없다 | 외부에서 호출 가능한 API 엔드포인트를 사용해요 |
SESSION_RESULT_BLANK |
세션 정보가 비어 있다 | 다시 로그인하거나 API 인증 정보를 확인해요 |
SERVICE_WALLET_REQUIRED |
서비스 이용료 결제 등록이 필요하다 | 관리자 > 이용요금 > 결제수단 관리 에서 지갑을 추가해요 |
CURRENCY_DATA_INVALIDATE |
통화·시간 데이터 형식이 잘못되었다 | ISO 8601 표준시 포맷으로 보낸다 |
DB_ERROR |
데이터베이스 오류가 발생했다 | 잠시 후 재시도하거나 관리자에 문의해요 |
REST_API_ERROR |
REST API 처리 중 오류가 발생했다 | 요청 파라미터를 확인하고 재시도해요 |
공통 에러
| 코드 | 메시지 | 대처 방법 |
|---|---|---|
DB_ERROR |
데이터베이스 오류가 발생했다 | 잠시 후 재시도하거나 관리자에 문의해요 |
EX_UID_DUPLICATED |
이미 존재하는 ex_uid 이다 | 다른 ex_uid 를 사용해요 |
PROCESS_DUPLICATED |
이미 처리된 요청이다 (중복 요청) | 중복 요청인지 확인해요 |
결제 관련 에러
결제 요청, 승인, 취소 과정에서 발생하는 에러예요.
| 코드 | 메시지 | 대처 방법 |
|---|---|---|
RC_NOT_FOUND |
영수증 정보를 찾지 못했다 | receipt_id 를 확인해요 |
RC_PG_NOT_FOUND |
PG 정보를 찾지 못했다 | PG 설정을 확인해요 |
RC_PM_NOT_FOUND |
결제수단 정보를 찾지 못했다 | 결제수단 설정을 확인해요 |
RC_NAME_BLANK |
상품명을 입력한다 | name 파라미터를 입력해요 |
RC_PRICE_LEAST_LT |
100원보다 큰 금액을 결제해야 한다 | price 를 100원 이상으로 설정해요 |
RC_O_ID_BLANK |
order_id 값을 입력한다 | order_id 파라미터를 입력해요 |
RC_UUID_BLANK |
UUID 값이 비어있다 | UUID 를 확인해요 |
RC_SK_BLANK |
SK 값이 비어있다 | Secret Key 를 확인해요 |
RC_ITEM_NAME_BLANK |
세부 상품명이 비어 있다 | 상품명을 입력해요 |
RC_ITEM_QTY_INVALID |
세부 상품 구매 qty 가 0보다 커야 한다 | qty 를 1 이상으로 설정해요 |
RC_ITEM_ID_BLANK |
세부 상품 고유 ID 값이 비어있다 | item_id 를 입력해요 |
RC_ITEM_PRICE_INVALID |
세부 상품 금액이 0보다 작을 수 없다 | 가격을 확인해요 |
RC_ITEM_TOTAL_PRICE_INVALID |
세부 상품 총 구매합이 결제 요청 금액과 불일치한다 | 아이템 합계를 확인해요 |
RC_NOT_READY |
결제 시작 대기 상태가 아니다 | 결제를 다시 요청해요 |
RC_PG_NOT_SELECTED |
PG 가 선택되지 않았다 | PG 를 선택한다 |
RC_PM_NOT_SELECTED |
결제 수단이 선택되지 않았다 | 결제수단을 선택한다 |
RC_RESOURCE_NOT_CONFIG |
결제수단이 허가/설정되지 않았다 | 관리자에서 결제수단을 설정해요 |
RC_WINDOW_CLOSE |
선택한 PG 는 부트페이에서 구현되지 않았다 | 다른 PG 를 선택한다 |
RC_REQUEST_ERROR |
결제 요청 중 오류가 발생했다 | 결제 정보를 확인 후 재시도해요 |
RC_PROCESS_CANCELLED |
결제창이 닫혔다 | 사용자가 결제를 취소한 경우이다 |
RC_NOT_CONFIRM_READY |
결제 승인 대기 상태가 아니다 | 결제 상태를 확인해요 |
RC_CONFIRM_NOT_PERMIT |
application_id 가 결제 요청과 불일치한다 | application_id 를 확인해요 |
RC_CONFIRM_METHOD_NOT_FOUND |
결제 승인 함수가 구현되지 않았다 | 관리자에 문의해요 |
RC_CONFIRM_FAILED |
결제 승인에 실패했다 | 결제 정보를 확인 후 재시도해요 |
RC_ALREADY_CANCELLED |
이미 취소 처리된 결제이다 | 주문 상태를 확인해요 |
RC_NOT_ABLE_CANCEL |
결제 완료 상태가 아니라 취소할 수 없다 | 결제 상태를 확인해요 |
RC_CANCEL_ID_ALREADY_EXIST |
동일한 cancel_id 로 이미 취소 요청되었다 | cancel_id 를 확인해요 |
RC_PM_CANCEL_NOT_SUPPORT |
해당 PG 결제수단은 취소 API를 지원하지 않는다 | PG 취소 지원 여부를 확인해요 |
RC_PM_P_CANCEL_NOT_SUPPORT |
해당 PG 결제수단은 부분취소를 지원하지 않는다 | 전액취소를 진행해요 |
RC_CANCEL_SERVER_ERROR |
결제 취소 오류이다 | 재시도하거나 관리자에 문의해요 |
RC_CANCEL_METHOD_NOT_FOUND |
취소 구현이 되지 않은 PG 이다 | 관리자에 문의해요 |
RC_APP_NOT_FOUND |
결제에 저장된 프로젝트 정보를 찾을 수 없다 | 프로젝트 설정을 확인해요 |
RC_PROVIDER_NOT_FOUND |
결제에 저장된 가맹점 정보를 찾을 수 없다 | 가맹점 정보를 확인해요 |
RC_NOT_ALLOW |
해당 계정의 결제 정보가 아니다 | 인증 정보를 확인해요 |
RC_NOT_ISSUED |
가상계좌 입금 대기 상태가 아니다 | 가상계좌 상태를 확인해요 |
RC_PERMISSION_LOW |
결제에 대한 작업 진행 권한이 없다 | API 인증 권한을 확인해요 |
RC_WEBHOOK_UNABLE |
웹훅 전송 가능 상태가 아니다 | 결제완료/취소 상태인지 확인해요 |
RC_CANCEL_FAILED |
결제취소 실패 | 재시도하거나 관리자에 문의해요 |
RC_CANCEL_PRICE_NOT_ZERO |
취소금액이 0보다 커야 한다 | cancel_price 를 확인해요 |
RC_CANCEL_PRICE_OVER |
취소 요청 금액이 결제 금액을 초과한다 | 남은 취소 가능 금액을 확인해요 |
RC_CANCEL_TAX_FREE_OVER |
면세 취소 요청 금액이 결제 금액을 초과한다 | 면세 취소 가능 금액을 확인해요 |
RC_NOT_SUBSCRIBE |
정기결제 요청 정보가 아니다 | 빌링키 결제를 사용해요 |
RC_ONLY_REST_API |
REST API 로만 요청 가능한 결제수단이다 | REST API 로 요청해요 |
RC_USER_EMAIL_INVALID |
user 필드의 이메일 포맷이 잘못되었다 | 이메일 형식을 확인해요 |
RC_USER_PHONE_INVALID |
user 필드의 전화번호 포맷이 잘못되었다 | 전화번호 형식을 확인해요 |
RC_CONFIRM_READY_PRICE_INVALID |
최초 요청 금액과 승인된 금액이 다르다 | price 값을 확인해요 |
RC_CONFIRM_PRICE_INVALID |
최초 요청 금액과 승인 완료 금액이 다르다 | price 값을 확인해요 |
RC_REQUEST_OVER_ON_IP |
동일 IP 에서 여러 번 결제 요청할 수 없다 | 잠시 후 다시 시도한다 |
RC_USER_TOKEN_INVALID |
UserToken 값이 잘못되었거나 다른 프로젝트에서 발급된 값이다 | UserToken 을 다시 확인해요 |
RC_REDIRECT_URL_INVALID |
redirect 모드에서 redirect_url 이 필요하다 | redirect_url 을 입력해요 |
RC_REQUIRE_LEAST_PRICE |
PG 최소 결제 금액 미만이다 | 최소 금액 이상으로 결제한다 |
RC_TIMEOUT |
결제 유효시간이 지났다 | 다시 결제를 요청해요 |
RC_COMPLETED |
이미 결제 진행이 완료된 건이다 | 주문 상태를 확인해요 |
RC_CONFIRM_CRITICAL_FAILED |
복구 금액이 취소 금액을 초과하거나 0원 이하이다 | 금액을 확인해요 |
RC_CANCEL_CRITICAL_ERROR |
결제 취소 중 치명적 오류가 발생했다 | 관리자에 문의해요 |
RC_PROVIDER_PAYMENT_NOT_ALLOW |
서비스 이용료 미납으로 결제 진행 불가하다 | 관리자에 문의해요 |
RC_PROVIDER_NOT_ALLOW |
가맹점이 탈퇴/차단 상태이다 | 관리자에 문의해요 |
RC_PRICE_MISMATCH |
요청 금액과 승인 금액이 일치하지 않는다 | 금액을 다시 확인해요 |
RC_WIDGET_BLANK |
위젯 정보가 필요하다 | 위젯에서 시작된 결제인지 확인해요 |
정기결제(빌링) 관련 에러
| 코드 | 메시지 | 대처 방법 |
|---|---|---|
SUBSCRIBE_NEED_PG_METHOD |
정기결제 요청에는 pg 와 method 정보가 필수이다 | pg, method 파라미터를 추가해요 |
SUBSCRIBE_REQUEST_FAILED |
빌링키 발급 요청이 실패했다 | 결제 정보를 확인 후 재시도해요 |
SUBSCRIBE_PUBLISH_READY_FAILED |
빌링키 발급 승인 전 요청이 실패했다 | 결제 정보를 확인해요 |
SUBSCRIBE_PUBLISH_NOT_READY |
빌링키 발급 대기 상태가 아니다 | 빌링키 상태를 확인해요 |
SUBSCRIBE_PUBLISH_M_NOT_FOUND |
빌링키 발급 기능이 없는 PG 이다 | 다른 PG 를 사용해요 |
SUBSCRIBE_NOT_SUCCESS |
빌링키 발급이 완료된 건이 아니다 | 빌링키 상태를 확인해요 |
SUBSCRIBE_BK_NOT_FOUND |
빌링키 발급 내역을 찾지 못했다 | billing_key 를 확인해요 |
SUBSCRIBE_BK_EXPIRED |
빌링키 사용 유효기간이 지났다 | 새로운 빌링키를 발급받아요 |
SUBSCRIBE_CARD_NO_BLANK |
카드 번호를 입력한다 | card_no 파라미터를 입력해요 |
SUBSCRIBE_CARD_PW_BLANK |
카드 비밀번호 앞 2자리를 입력한다 | card_pw 파라미터를 입력해요 |
SUBSCRIBE_CARD_IDENTITY_BLANK |
생년월일 또는 사업자등록번호를 입력한다 | identity_no 파라미터를 입력해요 |
SUBSCRIBE_CARD_EX_YEAR_BLANK |
카드 만료 년도를 입력한다 | expire_year 를 입력해요 |
SUBSCRIBE_CARD_EX_MONTH_BLANK |
카드 만료 월을 입력한다 | expire_month 를 입력해요 |
SUBSCRIBE_ALREADY_PUBLISHED |
이미 발급된 빌링키이다 | 기존 빌링키를 사용해요 |
계좌자동이체 관련 에러
| 코드 | 메시지 | 대처 방법 |
|---|---|---|
SUBSCRIBE_AT_BLANK_NOT_FOUND |
은행 코드/은행명이 올바르지 않다 | 지원하는 은행 코드를 확인해요 |
SUBSCRIBE_AT_USERNAME_BLANK |
은행 예금주명을 입력한다 | username 파라미터를 입력해요 |
SUBSCRIBE_AT_BANK_ACCOUNT_BLANK |
은행 계좌번호를 입력한다 | bank_account 파라미터를 입력해요 |
SUBSCRIBE_AT_IDENTITY_NO_BLANK |
생년월일 또는 사업자등록번호를 입력한다 | identity_no 를 입력해요 |
SUBSCRIBE_AT_PHONE_BLANK |
휴대폰 번호를 입력한다 | phone 파라미터를 입력해요 |
SUBSCRIBE_AT_BANK_CODE_BLANK |
은행코드가 올바르지 않거나 비어있다 | bank_code 를 확인해요 |
본인인증 관련 에러
| 코드 | 메시지 | 대처 방법 |
|---|---|---|
AUTH_NEED_PG_METHOD |
본인인증 요청에는 pg 와 method 정보가 필수이다 | pg, method 파라미터를 추가해요 |
AUTH_REQUEST_FAILED |
본인인증 요청이 실패했다 | 결제 정보를 확인 후 재시도해요 |
AUTH_ALREADY_AUTHENTICATED |
이미 본인인증이 완료된 건이다 | 인증 상태를 확인해요 |
AUTH_NOT_READY |
본인인증 준비 상태가 아니다 | 인증을 다시 요청해요 |
AUTH_CONFIRM_FAILED |
본인인증 승인이 실패했다 | 재시도하거나 관리자에 문의해요 |
AUTH_NOT_FOUND |
본인인증 정보를 찾지 못했다 | receipt_id 를 확인해요 |
AUTH_NOT_CONFIRMED |
아직 승인되지 않은 본인인증이다 | 인증을 완료해요 |
AUTH_EXPIRED |
본인인증 확인 유효시간(30분)이 지났다 | 인증을 다시 요청해요 |
예약결제 관련 에러
| 코드 | 메시지 | 대처 방법 |
|---|---|---|
SR_RESERVE_TIME_PAST |
예약 결제 시간이 과거이다 | 미래 시간으로 설정해요 |
SR_BK_RESERVE_OVER |
빌링키당 예약건이 10건을 초과했다 | 기존 예약을 취소한다 |
SR_ON_BLANK |
자동결제 예약 상품명을 입력한다 | order_name 을 입력해요 |
BS_NOT_FOUND |
예약결제 정보를 찾지 못했다 | 예약 ID 를 확인해요 |
BS_NOT_READY |
예약결제 대기 상태가 아니다 | 예약 상태를 확인해요 |
SR_EXIST |
동일 빌링키에 중복 order_id 가 있다 | 다른 order_id 를 사용해요 |
SR_PRICE_LT_100 |
예약 결제 금액은 100원 이상이어야 한다 | price 를 100원 이상으로 설정해요 |
SR_WEBHOOK_URL_BLANK |
웹훅 URL 을 입력하거나 관리자에서 등록한다 | webhook_url 을 설정해요 |
에스크로 관련 에러
| 코드 | 메시지 | 대처 방법 |
|---|---|---|
RC_ESCROW_NOT_READY |
에스크로 대기 상태가 아니면 배송 시작 불가하다 | 에스크로 상태를 확인해요 |
RC_ESCROW_SHIPPING_START_FAILED |
배송시작 API 수행에 실패했다 | 재시도해요 |
RC_NOT_ESCROW |
에스크로 결제건이 아니다 | 에스크로 결제인지 확인해요 |
RC_ESCROW_LOGIS_CODE_INVALID |
택배회사 코드가 올바르지 않다 | 3자리 택배사 코드를 확인해요 |
RC_TRACKING_NUMBER_BLANK |
운송장 번호를 입력한다 | tracking_number 를 입력해요 |
RC_DELIVERY_CORP_BLANK |
택배회사를 입력한다 | delivery_corp 를 입력해요 |
현금영수증 관련 에러
| 코드 | 메시지 | 대처 방법 |
|---|---|---|
RC_CASH_RECEIPT_FAILED |
현금영수증 발행에 실패했다 | 재시도하거나 관리자에 문의해요 |
RC_CASH_RECEIPT_METHOD_NOT_FOUND |
해당 PG 는 현금영수증 발행을 지원하지 않는다 | 다른 PG 를 사용해요 |
RC_CASH_RECEIPT_ALREADY_CANCELLED |
이미 취소 처리된 현금영수증이다 | 취소 상태를 확인해요 |
RC_NOT_CASH_RECEIPT |
현금영수증 처리건이 아니다 | receipt_id 를 확인해요 |
RC_CASH_RECEIPT_PUBLISHED |
현금영수증이 이미 발행되었다 | 기존 발행 내역을 확인해요 |
RC_CASH_RECEIPT_NEED_USERNAME |
구매자 명이 필요하다 | username 을 입력해요 |
RC_CASH_RECEIPT_NEED_IDENTITY_NO |
전화번호, 현금영수증 카드번호, 또는 사업자번호가 필요하다 | identity_no 를 입력해요 |
프론트엔드 에러 코드
| 코드 | 메시지 | 원인 |
|---|---|---|
RC_WINDOW_CLOSE |
결제창이 닫혔다 | 사용자가 결제를 중단 |
RC_PROCESS_CANCELLED |
결제가 취소되었다 | 사용자가 취소 버튼 클릭 |
RC_TIMEOUT |
결제 유효시간이 지났다 | 결제 시간 초과 |
서버 에러 코드
| 코드 | 메시지 | 대처 방법 |
|---|---|---|
BOOTPAY_CANT_ACCESS |
Bootpay 서버에 접근할 수 없다 | 잠시 후 재시도해요 |
BOOTPAY_PAYMENT_REQUEST_FAILED |
Bootpay 결제 요청이 실패했다 | 결제 정보 확인 후 재시도해요 |
BOOTPAY_CANCEL_REQUEST_FAILED |
결제 취소 요청이 서버 오류로 실패했다 | 관리자에 문의해요 |
코드표 (Enum)
PG사·결제수단·카드사·은행·통화 등 코드값은 별도 페이지에서 봐요.
