Skip to main content

개요

Dodo Payments API는 API 요청의 성공 또는 실패를 나타내기 위해 표준 HTTP 상태 코드와 사용자 정의 오류 코드를 사용합니다. 오류가 발생하면 API는 적절한 HTTP 상태 코드와 오류에 대한 자세한 정보를 포함하는 JSON 응답을 반환합니다. 각 오류 응답에는 다음이 포함됩니다:
  • 오류의 일반적인 범주를 나타내는 HTTP 상태 코드
  • 오류의 정확한 성격을 식별하는 특정 오류 코드
  • 무엇이 잘못되었는지 설명하는 사람이 읽을 수 있는 오류 메시지
  • 해당하는 경우 오류에 대한 추가 세부정보
이러한 오류 코드와 그 의미를 이해하는 것은 다음과 같은 데 중요합니다:
  • 통합 문제 디버깅
  • 애플리케이션에서 적절한 오류 처리 구현
  • 최종 사용자에게 의미 있는 피드백 제공
  • 강력한 결제 처리 시스템 유지
이것들은 API 및 비즈니스 로직 오류입니다. 실패한 결제 시 반환되는 카드 거절 사유(예: INSUFFICIENT_FUNDS 또는 CARD_DECLINED)는 거래 실패 참조를 대신 참조하세요.

표준 API 오류 코드

오류 응답 형식

오류가 발생하면 API는 다음 구조의 JSON 응답을 반환합니다:

오류 코드 참조

아래의 오류 코드는 관련된 API 영역별로 그룹화되어 있습니다. 각 항목은 트리거 조건과 API 반환 메시지를 나열합니다.

인증 및 계정

  • UNAUTHORIZED
    • Trigger: API 키 없음 또는 잘못된 토큰 / 범위
    • Message: 이 작업을 수행할 권한이 없습니다
  • MERCHANT_NOT_LIVE
    • Trigger: 비즈니스가 아직 Test Mode에 있음
    • Message: 가맹점이 아직 라이브 상태가 아님
  • BUSINESS_ARCHIVED
    • Trigger: 보관 처리된 비즈니스에 대한 모든 고객 대상 요청(checkout, payment link, storefront, Customer Portal 또는 license key)
    • Message: 이 비즈니스는 보관 처리되었으며 더 이상 요청을 받지 않습니다

결제 및 Checkout

  • CHECKOUT_SESSION_CONSUMED
    • Trigger: Checkout 세션에서 이미 결제가 생성됨
    • Message: Checkout 세션이 이미 사용되었습니다
  • NO_ELIGIBLE_PAYMENT_METHODS
    • Trigger: 필터링 후 남은 항목이 없음
    • Message: 사용 가능한 결제 수단을 찾을 수 없습니다
  • PAYMENT_NOT_SUCCEEDED
    • Trigger: 실패한 결제를 환불하거나 처리하려고 시도함
    • Message: 제공된 결제가 성공하지 않았습니다
  • PREVIOUS_PAYMENT_PENDING
    • Trigger: 이전 결제가 non-terminal 상태인 동안 charge를 생성하려고 시도함
    • Message: 이전 결제가 아직 성공하지 않았으므로 새 charge를 생성할 수 없습니다
  • UNSUCCESSFUL_PAYMENT_ID
    • Trigger: Payment ID가 실패한 결제를 참조함
    • Message: Payment ID의 상태가 성공하지 않았습니다.

Connectors 및 BYOP

이 오류는 merchant 소유 결제 connector(Bring Your Own Processor)와 관련이 있습니다.
  • BYOP_CONNECTOR_DISABLED
    • Trigger: 비활성화된 BYOP connector를 통해 라우팅된 subscription의 결제 수단을 업데이트함
    • Message: subscription이 현재 비활성화된 merchant 자체(BYOP) connector를 통해 라우팅되고 있습니다
  • BYOP_CUSTOM_INVOICE_ADDRESS_MISSING
    • Trigger: merchant가 라우팅한(BYOP) 결제에 필요한 custom invoice address가 누락됨
    • Message: 결제가 merchant의 connector를 통해 라우팅되는 경우 BYOP custom invoice address가 필요합니다
  • CONNECTOR_LABEL_ALREADY_EXISTS
    • Trigger: 이미 존재하는 label로 connector를 생성함
    • Message: 이 label을 사용하는 connector가 이미 존재합니다. 다른 label을 선택하세요.

환불

  • EXISTING_REFUND_REQUEST_PROCESSING
    • Trigger: 이전 환불 요청이 아직 처리 중임
    • Message: 상태가 “Pending”인 환불 요청이 아직 처리 중입니다
  • LINE_ITEM_FULLY_REFUNDED
    • Trigger: 이미 전액 환불된 line item을 환불하려고 시도함
    • Message: Line item 이(가) 전액 환불되어 추가로 환불할 수 없습니다.
  • LINE_ITEM_NOT_FOUND
    • Trigger: Item ID가 참조된 결제에 포함되지 않음
    • Message: 결제에서 line item 을(를) 찾을 수 없습니다
  • LINE_ITEM_PRORATED
    • Trigger: prorated line에 대해 환불 또는 업데이트를 시도함
    • Message: Line item 은(는) prorated이므로 환불할 수 없습니다
  • LINE_ITEM_REFUND_AMOUNT_TOO_HIGH
    • Trigger: 환불 금액 > 결제 금액(세금 포함)
    • Message: Line item 에 요청된 세금 포함 환불 금액 이(가) 결제 금액 보다 큽니다
  • LINE_ITEM_REFUND_AMOUNT_TOO_LOW
    • Trigger: 환불 금액이 최소 기준 미만임
    • Message: Line item 에 요청된 환불 금액 이(가) 너무 낮습니다
  • NOTHING_TO_REFUND
    • Trigger: 환불 가능한 금액이 남아 있지 않음. 모든 양수 line item이 이미 전액 환불됨
    • Message: 남은 환불 가능 금액이 없습니다. 모든 양수 line item이 전액 환불되었습니다.
  • PARTIAL_REFUND_NOT_ALLOWED
    • Trigger: 전액 환불만 지원하는 결제 수단에 대해 부분 환불을 시도함
    • Message: 이 결제 수단에서는 부분 환불이 허용되지 않습니다
  • PAYMENT_ALREADY_REFUNDED
    • Trigger: 중복 환불
    • Message: 이 결제는 이미 환불되었습니다
  • PAYMENT_HAS_BEEN_REFUNDED
    • Trigger: 결제가 전액 환불됨
    • Message: Payment ID가 전액 환불되었습니다.
  • REFUND_AMOUNT_EXCEEDS_PAID_AMOUNT
    • Trigger: 총 환불 금액 > 결제 금액
    • Message: 계산된 환불 금액이 결제 금액보다 큽니다
  • REFUND_WINDOW_EXPIRED
    • Trigger: 허용된 환불 기간을 벗어남
    • Message: 결제 생성 후 일이 지나면 환불을 시작할 수 없습니다. support@dodopayments.com으로 문의하세요.
  • ZERO_AMOUNT_PAYMENT_REFUND_NOT_ALLOWED
    • Trigger: 금액이 0인 결제를 환불하려고 시도함
    • Message: 통화 금액이 0인 결제는 환불할 수 없습니다

Subscription 및 Add-on

  • ADDONS_IN_USAGE_BASED_BILLING_NOT_SUPPORTED
    • Trigger: usage-based billing subscription에 addon을 추가하려고 시도함
    • Message: Usage Based Billing에서는 Subscription의 addon을 지원하지 않습니다
  • ADDONS_NOT_ALLOWED_FOR_ON_DEMAND
    • Trigger: on-demand subscription에 addon을 추가하려고 시도함
    • Message: on demand subscription에는 addon을 추가할 수 없습니다
  • CANCEL_SCHEDULED_PLAN_CHANGE_FOR_CUSTOMER_PORTAL_DISABLED
    • Trigger: 비즈니스에서 해당 작업을 비활성화한 상태에서 Customer Portal이 예약된 plan 변경을 취소하려고 시도함
    • Message: Customer Portal에서 예약된 plan 변경 취소가 비활성화되어 있습니다.
  • CHARGE_NOT_ALLOWED_FOR_SCHEDULED_CANCELLATION
    • Trigger: 취소가 예약된 subscription에 charge를 시도함
    • Message: Subscription 취소가 예약되어 있습니다
  • CUSTOMER_HAS_EXISTING_SUBSCRIPTION
    • Trigger: 여러 subscription을 허용하지 않는 경우, 이미 subscription이 있는 customer에 대해 subscription을 생성함
    • Message: Customer 에게 기존 subscription이 있습니다. customer당 여러 subscription을 허용하려면 business settings를 변경하세요
  • DO_NOT_BILL_NOT_ALLOWED_IN_CUSTOMER_PORTAL
    • Trigger: Customer Portal plan 변경에서 do_not_bill proration mode를 사용함
    • Message: do_not_bill proration mode는 customer portal에서 허용되지 않습니다
  • DUPLICATE_ADDON_IDS_IN_REQUEST
    • Trigger: 동일한 addon_id이(가) 요청에 두 번 이상 나타남
    • Message: 중복 addon ID는 허용되지 않습니다
  • INACTIVE_SUBSCRIPTION_PLAN_CHANGE_NOT_SUPPORTED
    • Trigger: 비활성 subscription에서 plan을 변경함
    • Message: 비활성 subscription에서는 plan 변경을 지원하지 않습니다
  • INVALID_PRORATION_MODE_WITH_NEXT_BILLING_DATE
    • Trigger: effective_at: next_billing_date와 함께 full_immediately 이외의 proration mode를 사용함
    • Message: effective_at: next_billing_date에는 full_immediately proration mode만 허용됩니다
  • MISSING_ADDON_IDS
    • Trigger: addon_id 목록이 비어 있거나 알 수 없는 ID를 포함함
    • Message: 하나 이상의 product ID가 존재하지 않습니다:
  • ON_DEMAND_PLAN_CHANGE_NOT_SUPPORTED
    • Trigger: on-demand에 대한 plan 교체가 허용되지 않음
    • Message: on demand subscription에서는 plan 변경을 지원하지 않습니다
  • ON_DEMAND_USAGE_BASED_BILLING_NOT_SUPPORTED
    • Trigger: usage-based billing에서 on-demand를 사용하려고 시도함
    • Message: Usage Based Billing에서는 On Demand Subscription을 지원하지 않습니다
  • ONE_TIME_PRODUCTS_NOT_ALLOWED_FOR_ON_DEMAND
    • Trigger: 일회성 product를 on-demand subscription에 추가함
    • Message: on demand subscription에는 일회성 product를 추가할 수 없습니다
  • PENDING_PLAN_CHANGE_EXISTS
    • Trigger: 이전 plan 변경이 아직 결제를 기다리는 동안 새 plan 변경을 요청함
    • Message: 이 subscription에 대해 대기 중인 plan 변경이 이미 존재합니다. 현재 결제가 완료될 때까지 기다리세요.
  • PLAN_CHANGE_FOR_CUSTOMER_PORTAL_DISABLED
    • Trigger: 비즈니스에서 비활성화한 상태에서 Customer Portal을 통해 plan을 변경함
    • Message: Customer Portal의 subscription plan 변경이 비활성화되어 있습니다.
  • PLAN_CHANGE_NOT_ALLOWED_FOR_SCHEDULED_CANCELLATION
    • Trigger: 취소가 예약된 subscription에서 plan 변경을 시도함
    • Message: Subscription 취소가 예약되어 있습니다
  • SCHEDULE_PLAN_CHANGE_FOR_CUSTOMER_PORTAL_DISABLED
    • Trigger: 비즈니스에서 비활성화한 상태에서 Customer Portal을 통해 plan 변경을 예약함
    • Message: 이 비즈니스에서는 plan 변경 예약이 비활성화되어 있습니다.
  • SCHEDULED_PLAN_CHANGE_EXISTS
    • Trigger: 이미 존재하는 예약된 plan 변경을 생성함
    • Message: 이 subscription에 대해 예약된 plan 변경이 이미 존재합니다. 새 변경을 생성하기 전에 기존 예약 변경을 취소하세요.
  • SCHEDULED_PLAN_CHANGE_NOT_FOUND
    • Trigger: 존재하지 않는 예약된 plan 변경을 참조하거나 취소함
    • Message: 이 subscription에 대한 예약된 plan 변경을 찾을 수 없습니다.
  • SUBSCRIPTION_EXPIRED
    • Trigger: expires_at 이후 청구
    • Message: Subscription이 만료되어 새 charge를 생성할 수 없습니다
  • SUBSCRIPTION_INACTIVE
    • Trigger: 상태 ≠ active
    • Message: Subscription이 active 상태가 아닙니다
  • SUBSCRIPTION_NOT_ON_DEMAND
    • Trigger: on-demand를 예상했지만 fixed interval을 받음
    • Message: Subscription이 이미 on demand가 아닙니다
  • SUBSCRIPTION_PAYMENT_RETRY_LIMIT_EXCEEDED
    • Trigger: Subscription 결제 재시도가 최대 시도 횟수를 초과함
    • Message: 이 subscription의 최대 재시도 한도인 10회를 초과했습니다

Product, Cart 및 Brand

  • BRAND_ALREADY_ARCHIVED
    • Trigger: 이미 보관 처리된 brand를 보관 처리함
    • Message: Brand가 이미 보관 처리되었습니다
  • BRAND_ARCHIVED
    • Trigger: 보관 처리된 brand를 업데이트하거나, verification을 위해 제출하거나, 새 product, product collection 또는 subscription을 연결함
    • Message: Brand가 보관 처리되어 업데이트할 수 없습니다
  • BRAND_ARCHIVE_TARGET_REQUIRED
    • Trigger: product, 활성 subscription 또는 product collection을 보유한 brand를 move_products_to target 없이 보관 처리함
    • Message: Brand에 product가 12개 있습니다. 해당 product의 tag를 다시 지정하려면 move_products_to를 target brand로 설정하세요.
  • BRAND_MISMATCH
    • Trigger: Cart item이 서로 다른 brand에 속함
    • Message: product cart의 모든 item은 동일한 brand에 속해야 합니다
  • BRAND_NOT_ENABLED
    • Trigger: Brand가 비활성화되었거나 active 상태가 아님
    • Message: 제공된 brand가 활성화되어 있지 않습니다
  • BRAND_SUBMISSION_NOT_ENABLED
    • Trigger: Brand verification 재제출 기능이 활성화되지 않음
    • Message: Brand verification 재제출이 활성화되어 있지 않습니다
  • CANNOT_ARCHIVE_PRIMARY_BRAND
    • Trigger: brand ID가 business ID인 primary brand를 보관 처리함
    • Message: Primary brand는 보관 처리할 수 없습니다
  • FILE_IN_USE
    • Trigger: 활성 entitlement grant에서 여전히 참조하는 digital product file을 삭제함
    • Message: Digital file이 활성 grant에서 참조되고 있습니다
  • INVALID_BRAND_ARCHIVE_TARGET
    • Trigger: move_products_to이(가) 보관 처리 중인 brand, 보관 처리된 brand 또는 다른 business의 brand를 지정함
    • Message: move_products_to는 이 business에 속하며 보관 처리되지 않은 brand여야 합니다
  • INVALID_SUGGESTED_PRICE
    • Trigger: PWYW price < 허용된 최소 price
    • Message: Suggested Price는 minimum price보다 낮을 수 없습니다. pay what you want의 경우 price는 허용되는 최소 금액으로 간주됩니다
  • LOCALIZED_PRICE_ALREADY_EXISTS
    • Trigger: 이 product와 country/currency에 대한 localized price가 이미 존재함
    • Message: 이 product 및 country/currency에 대한 localized price가 이미 존재합니다
  • LOCALIZED_PRICE_DUPLICATES_BASE
    • Trigger: Localized price가 product의 base currency/country와 중복됨
    • Message: Localized price가 product의 base currency/country와 중복됩니다
  • LOCALIZED_PRICE_SHAPE_MISMATCH
    • Trigger: Localized price 형식이 product의 pricing_mode과 일치하지 않음
    • Message: Localized price 형식이 product의 pricing_mode와 일치하지 않습니다
  • MISSING_PRODUCT_INFORMATION
    • Trigger: Product는 존재하지만 필수 정보가 누락됨
    • Message: Product 은(는) 존재하지만 다른 필수 정보가 누락되었거나 유효하지 않습니다
  • PAY_AS_YOU_WANT_AMOUNT_REQUIRED
    • Trigger: PWYW product의 price가 누락됨
    • Message: pay as you want product에는 amount가 필수입니다
  • PRODUCT_CART_EMTPY
    • Trigger: 빈 product cart를 제출함
    • Message: product_cart가 비어 있습니다(오류 코드는 API가 반환하는 정확한 값과 일치하도록 의도적으로 EMTPY로 표기되었습니다)
  • PRODUCT_COLLECTION_IS_DELETED
    • Trigger: 삭제된 product collection에서 작업함
    • Message: 메시지 없음
  • PRODUCT_COLLECTION_MUST_HAVE_PRODUCTS
    • Trigger: collection에서 마지막 product(또는 product가 포함된 마지막 group)를 제거함
    • Message: Collection의 마지막 product는 삭제할 수 없습니다. 대신 collection을 보관 처리하세요.
  • PRODUCT_IS_DELETED
    • Trigger: Product가 soft-delete됨
    • Message: 메시지 없음
  • PRODUCT_PRICING_MODE_REQUIRED
    • Trigger: product의 pricing_mode이 설정되기 전에 localized price를 추가함
    • Message: Localized price를 추가하기 전에 product pricing_mode를 설정해야 합니다
  • SLUG_ALREADY_TAKEN
    • Trigger: 요청한 product slug / short URL이 이미 사용 중임
    • Message: Slug가 이미 사용 중입니다
  • UNABLE_TO_EDIT_PRIMARY_BRAND
    • Trigger: 일반 API를 통해 primary brand를 업데이트하려고 시도함
    • Message: 이 API endpoint를 통해서는 primary brand를 업데이트할 수 없습니다.

할인

  • DISCOUNT_ALREADY_USED_ON_SUBSCRIPTION
    • Trigger: 이 subscription에서 이미 사용한 discount를 다시 적용함
    • Message: 이 subscription에서는 이 discount가 이미 사용되었습니다
  • DISCOUNT_CODE_ALREADY_EXISTS
    • Trigger: 중복 discount code를 생성함
    • Message: Discount Code가 이미 존재합니다
  • DISCOUNT_CODE_EXPIRED
    • Trigger: expires_at date가 지난 discount code
    • Message: Discount code가 만료되었습니다
  • DISCOUNT_CODE_USAGE_LIMIT_EXCEEDED
    • Trigger: usage_limit에 도달한 후 discount를 재사용함
    • Message: Usage limit은 times_used보다 작을 수 없습니다 / Discount code가 usage limit에 도달했습니다
    • Note: Terminal — code가 모두 소진되었습니다. 재시도하지 마세요.
  • DISCOUNT_CONCURRENT_REDEMPTION
    • Trigger: 동일한 code의 다른 redemption이 usage-limit row lock을 너무 오래 유지함
    • Message: Discount가 동시에 사용되고 있습니다. 다시 시도하세요
    • Note: 일시적인 오류입니다. Code에 아직 사용 가능 횟수가 남아 있을 수 있으므로 요청을 안전하게 재시도할 수 있습니다. 고객에게 “code exhausted”로 표시하지 마세요.
  • DISCOUNT_CURRENCY_OPTION_INVALID
    • Trigger: 생성 또는 업데이트 시 잘못된 currency_options
    • Message: Flat discount에는 확인 가능한 default가 있는 currency option이 하나 이상 필요합니다 / 중복 currency option은 허용되지 않습니다 / default로 표시할 수 있는 currency option은 하나뿐입니다
  • DISCOUNT_CUSTOMER_NOT_ELIGIBLE
    • Trigger: Customer가 code의 customer_eligibility을 충족하지 않음(first_time, existing 또는 specific code의 allow list에 포함되지 않음)
    • Message: Customer는 이 discount code를 사용할 수 없습니다
  • DISCOUNT_MINIMUM_SUBTOTAL_NOT_MET
    • Trigger: Cart subtotal이 checkout currency에 설정된 minimum_subtotal보다 낮음
    • Message: Cart subtotal이 discount에 필요한 최소 subtotal보다 낮습니다
  • DISCOUNT_NOT_YET_ACTIVE
    • Trigger: starts_at date 전에 code를 사용함
    • Message: Discount code가 아직 활성화되지 않았습니다(starts_at이 미래입니다)
  • DISCOUNT_PER_CUSTOMER_USAGE_LIMIT_EXCEEDED
    • Trigger: Customer가 이미 per_customer_usage_limit회 code를 사용함
    • Message: 이 discount code의 customer별 사용 한도를 초과했습니다
  • DISCOUNT_NOT_APPLICABLE_TO_NEW_PRODUCT
    • Trigger: 기존 discount가 적용되지 않는 product로 plan을 변경함
    • Message: Discount가 새 plan의 product에 적용되지 않습니다
  • DISCOUNT_NOT_AVAILABLE_FOR_ON_DEMAND
    • Trigger: on-demand subscription에 code를 적용함
    • Message: Discount coupon은 on demand subscription에서 사용할 수 없습니다
  • DISCOUNT_NOT_AVAILABLE_FOR_PRODUCT
    • Trigger: 관련 없는 product에 code를 적용함
    • Message: Discount coupon은 이 product에서 사용할 수 없습니다
  • INVALID_DISCOUNT_CODE
    • Trigger: Code가 존재하지 않거나 적용할 수 없음
    • Message: 유효하지 않은 Discount Code / Cart의 어떤 product에도 Discount Code를 적용할 수 없습니다
  • INVALID_PERCENTAGE
    • Trigger: Percent amount > 100%(또는 10,000 basis points)
    • Message: Percentage amount는 10000을 초과할 수 없습니다 / Discount code amount는 100%를 초과할 수 없습니다
  • UNSUPPORTED_DISCOUNT_TYPE
    • Trigger: 지원되지 않는 discount type입니다. percentageflat은(는) 모두 지원되지만, unit당 amount discount는 지원되지 않습니다.
    • Message: Percentage 및 flat discount code만 지원됩니다

License Key

  • ACTIVATION_LIMIT_LESS_THAN_CURRENT_AMOUNT
    • Trigger: License-key activation: 새 limit < 기존 instance 수
    • Message: 새 activation limit은 현재 instance 수보다 작을 수 없습니다
  • INACTIVE_LICENSE_KEY
    • Trigger: Key status ≠ active
    • Message: License key가 active 상태가 아닙니다
  • LICENSE_KEY_LIMIT_REACHED
    • Trigger: Activations = limit
    • Message: License key activation limit에 도달했습니다
  • LICENSE_KEY_NOT_FOUND
    • Trigger: Instance ID 또는 key ID가 유효하지 않음
    • Message: License key instance를 찾을 수 없거나 이 license key에 속하지 않습니다
  • NO_EXPIRY_ON_SUBSCRIPTION_LICENSE_KEYS
    • Trigger: Subscription 기반 key에 expiry를 설정하려고 시도함
    • Message: Subscription 기반 license key에는 expiry date를 설정할 수 없습니다

Usage-Based Billing 및 Meter

  • DUPLICATE_METER_IDS_IN_REQUEST
    • Trigger: 동일한 meter ID가 요청에 여러 번 나타남
    • Message: 중복 Meter Id는 허용되지 않습니다
  • INVALID_QUANTITY
    • Trigger: Usage-based pricing에 대해 유효하지 않은 quantity를 지정함
    • Message: Usage based price product에서는 quantity 1개만 허용됩니다
  • METER_IS_DELETED
    • Trigger: 삭제된 meter를 사용하려고 시도함
    • Message: Meter가 이미 삭제되었습니다
  • MISSING_METER_IDS
    • Trigger: Meter ID 목록이 비어 있거나 유효하지 않은 ID를 포함함
    • Message: 하나 이상의 meter ID가 존재하지 않습니다:

Credit-Based Billing

  • CREDIT_ENTITLEMENT_IS_DELETED
    • Trigger: 삭제된 credit entitlement에서 작업함
    • Message: Credit entitlement가 이미 삭제되었습니다
  • CREDIT_ENTITLEMENT_NAME_ALREADY_EXISTS
    • Trigger: 이미 존재하는 name으로 credit entitlement를 생성함
    • Message: 이 name을 사용하는 credit entitlement가 이미 존재합니다
  • OVERAGE_LIMIT_EXCEEDED
    • Trigger: 사용량 또는 credit deduction이 설정된 overage limit을 초과함
    • Message: Overage limit을 초과했습니다

Wallet

  • INSUFFICIENT_WALLET_FUNDS
    • Trigger: Wallet balance < debit amount
    • Message: Wallet에 자금이 부족합니다
  • NEGATIVE_BALANCE_ADJUSTMENT
    • Trigger: Wallet balance를 음수로 만들려고 시도함
    • Message: Wallet balance는 음수가 될 수 없습니다

Currency, Tax 및 Region

  • EXCHANGE_RATE_NOT_FOUND
    • Trigger: from → to currency pair에 대한 FX rate가 없음
    • Message: Currency에서 Currency로 변환할 exchange rate를 찾을 수 없습니다
  • INVALID_TAX_ID
    • Trigger: VAT/GST/TIN validation 실패
    • Message: Tax Id가 유효하지 않습니다
  • REQUEST_AMOUNT_BELOW_MINIMUM
    • Trigger: Amount < product minimum
    • Message: Amount는 product에 지정된 minimum amount보다 작을 수 없습니다
  • TOTAL_PAYMENT_AMOUNT_BELOW_MINIMUM_AMOUNT
    • Trigger: Combined cart total < gateway minimum
    • Message: 결제를 처리하려면 최소 이(가) 필요합니다
  • UNSUPPORTED_BILLING_CURRENCY
    • Trigger: 요청한 billing currency가 이 subscription에서 지원되지 않음
    • Message: Subscription에서는 USD 이외의 billing currency를 지원하지 않습니다
  • UNSUPPORTED_COUNTRY
    • Trigger: Geo가 아직 지원되지 않음
    • Message: Country 은(는) 현재 지원되지 않습니다
  • UNSUPPORTED_CURRENCY
    • Trigger: Product 또는 addon currency가 Dodo Payments에서 charge할 수 있는 currency가 아님. Base price는 charge 가능한 모든 currency로 설정할 수 있으므로, 이는 일반적으로 currency code가 유효하지 않거나 아직 지원되지 않음을 의미합니다.
    • Message: Currency가 현재 지원되지 않습니다 / 현재 USD 및 INR product만 지원됩니다 / Addon price에는 USD 및 INR만 지원됩니다 / billing_currency에는 USD 또는 INR만 요청할 수 있습니다 / 지원되지 않는 Currency / Indian card subscription에 예기치 않은 currency
  • UNSUPPORTED_TAX_CATEGORY
    • Trigger: Tax category 문자열이 enum에 없음
    • Message: Category 은(는) 현재 지원되지 않습니다

Validation 및 Requests

  • DUPLICATE_LINE_ITEMS_IN_REQUEST
    • Trigger: 동일한 item_id이(가) items[]에 두 번 나타남
    • Message: items array에 중복 item_ids가 지정되었습니다
  • INVALID_QUERY_PARAMS
    • Trigger: 상호 배타적이거나 잘못된 query parameter
    • Message: Query params에는 time_frame 또는 (start, end) 중 하나만 포함되어야 합니다
  • INVALID_REQUEST_BODY
    • Trigger: 잘못된 JSON 또는 schema 위반
    • Message: 요청 body가 유효하지 않습니다. request headers와 object를 확인하세요.
  • INVALID_REQUEST_PARAMETERS
    • Trigger: 의미가 잘못됨(예: 과거 날짜)
    • Message: next_billing_date를 과거 시간으로 변경할 수 없습니다
  • MAXIMUM_KEYS_REACHED
    • Trigger: Metadata / custom-fields가 50개 쌍을 초과함
    • Message: 50개의 key-value 쌍을 초과했습니다

일반 및 시스템

  • INTEGER_CONVERSION_FAILURE
    • Trigger: 서버 측에서 integer ↔ string/decimal 변환이 실패하는 모든 경우
    • Message: Integer 변환 실패
  • INTERNAL_SERVER_ERROR
    • Trigger: 처리되지 않은 exception; 서버 측에서 세부 정보를 기록해야 함
    • Message: 공개 메시지 없음(일반적인 500)
  • NOT_FOUND
    • Trigger: 누락된 모든 resource에 대한 일반적인 404
    • Message: Item을 찾을 수 없습니다 (또는 더 구체적인 메시지)
  • TOO_MANY_REQUESTS
    • Trigger: 429 rate-limit
    • Message: 메시지 없음
  • UNSUPPORTED_ACTION
    • Trigger: Resource type에 지원되지 않는 action
    • Message: Usage based subscription의 plan 변경은 지원되지 않습니다

모범 사례

  1. 애플리케이션에서 항상 오류를 적절히 처리하세요
  2. 적절한 오류 로깅을 구현하세요
  3. 최종 사용자에게 적절한 오류 메시지를 사용하세요
  4. 일시적인 오류에 대한 재시도 로직을 구현하세요
  5. 해결되지 않는 문제는 support에 문의하세요

지원

오류 코드 또는 integration 문제에 대한 추가 도움이 필요하면 support@dodopayments.com으로 지원 팀에 문의하세요.
마지막 수정일 2026년 8월 21일