Skip to main content

Tổng Quan

Dodo Payments API sử dụng mã trạng thái HTTP tiêu chuẩn và mã lỗi tùy chỉnh để chỉ ra sự thành công hoặc thất bại của các yêu cầu API. Khi xảy ra lỗi, API sẽ trả về mã trạng thái HTTP phù hợp và một phản hồi JSON chứa thông tin chi tiết về lỗi. Mỗi phản hồi lỗi bao gồm:
  • Mã trạng thái HTTP chỉ ra danh mục chung của lỗi
  • Mã lỗi cụ thể xác định chính xác bản chất của lỗi
  • Thông điệp lỗi dễ hiểu giải thích điều gì đã sai
  • Thông tin chi tiết bổ sung về lỗi khi có thể
Hiểu các mã lỗi này và ý nghĩa của chúng là rất quan trọng cho:
  • Gỡ lỗi các vấn đề tích hợp
  • Triển khai xử lý lỗi đúng cách trong ứng dụng của bạn
  • Cung cấp phản hồi có ý nghĩa cho người dùng cuối
  • Duy trì một hệ thống xử lý thanh toán vững chắc
Đây là các lỗi API và logic kinh doanh. Đối với các lý do từ chối thẻ trả về khi thanh toán thất bại (như INSUFFICIENT_FUNDS hoặc CARD_DECLINED), hãy xem tham khảo Giao Dịch Thất Bại thay thế.

Mã Lỗi API Tiêu Chuẩn

Định Dạng Phản Hồi Lỗi

Khi xảy ra lỗi, API trả về một phản hồi JSON với cấu trúc sau:

Tham Khảo Mã Lỗi

Các mã lỗi dưới đây được nhóm theo khu vực của API mà chúng liên quan. Mỗi mục liệt kê điều kiện kích hoạt và thông điệp API trả về.

Authentication & Account

  • UNAUTHORIZED
    • Kích hoạt: Không có API key hoặc token/phạm vi không hợp lệ
    • Thông điệp: Bạn không được phép thực hiện hành động này
  • MERCHANT_NOT_LIVE
    • Trigger: Doanh nghiệp vẫn đang ở Test Mode
    • Message: Merchant chưa được kích hoạt chính thức
  • BUSINESS_ARCHIVED
    • Trigger: Bất kỳ yêu cầu nào hướng đến khách hàng (checkout, payment link, storefront, Customer Portal hoặc license key) đối với một doanh nghiệp đã được lưu trữ
    • Message: Doanh nghiệp này đã được lưu trữ và không còn chấp nhận yêu cầu

Payments & Checkout

  • CHECKOUT_SESSION_CONSUMED
    • Trigger: Checkout session đã tạo payment
    • Message: Checkout session đã được sử dụng
  • NO_ELIGIBLE_PAYMENT_METHODS
    • Trigger: Không còn gì sau khi lọc
    • Message: Không tìm thấy phương thức thanh toán đủ điều kiện
  • PAYMENT_NOT_SUCCEEDED
    • Trigger: Cố gắng hoàn tiền/xử lý payment không thành công
    • Message: Payment được cung cấp chưa thành công
  • PREVIOUS_PAYMENT_PENDING
    • Trigger: Cố gắng tạo charge trong khi charge trước đó đang ở trạng thái chưa kết thúc
    • Message: Không thể tạo charge mới vì payment trước đó chưa thành công
  • UNSUCCESSFUL_PAYMENT_ID
    • Trigger: Payment ID tham chiếu đến payment không thành công
    • Message: Payment ID có trạng thái không thành công.

Connectors & BYOP

Các lỗi này liên quan đến payment connector do merchant sở hữu (Bring Your Own Processor).
  • BYOP_CONNECTOR_DISABLED
    • Trigger: Cập nhật payment method trên subscription được định tuyến qua BYOP connector đã bị vô hiệu hóa
    • Message: Subscription được định tuyến qua connector riêng của merchant (BYOP), hiện đang bị vô hiệu hóa
  • BYOP_CUSTOM_INVOICE_ADDRESS_MISSING
    • Trigger: Payment do merchant định tuyến (BYOP) thiếu địa chỉ invoice tùy chỉnh bắt buộc
    • Message: Cần có địa chỉ invoice tùy chỉnh BYOP khi payment được định tuyến qua connector của merchant
  • CONNECTOR_LABEL_ALREADY_EXISTS
    • Trigger: Tạo connector với label đã tồn tại
    • Message: Connector với label này đã tồn tại. Vui lòng chọn label khác.

Refunds

  • EXISTING_REFUND_REQUEST_PROCESSING
    • Trigger: Yêu cầu refund trước đó vẫn đang được xử lý
    • Message: Yêu cầu refund với trạng thái “Pending” vẫn đang được xử lý
  • LINE_ITEM_FULLY_REFUNDED
    • Trigger: Cố gắng refund line item đã được refund hoàn toàn
    • Message: Line item đã được refund hoàn toàn và không thể refund thêm.
  • LINE_ITEM_NOT_FOUND
    • Trigger: Item ID không thuộc payment được tham chiếu
    • Message: Không tìm thấy line item trong payment
  • LINE_ITEM_PRORATED
    • Trigger: Cố gắng refund hoặc cập nhật một line đã phân bổ theo tỷ lệ
    • Message: Không thể refund line item vì line item này được phân bổ theo tỷ lệ
  • LINE_ITEM_REFUND_AMOUNT_TOO_HIGH
    • Trigger: Số tiền refund > số tiền đã thanh toán (đã bao gồm tax)
    • Message: Số tiền refund được yêu cầu cho line item , bao gồm tax, là , vượt quá số tiền đã thanh toán
  • LINE_ITEM_REFUND_AMOUNT_TOO_LOW
    • Trigger: Số tiền refund thấp hơn ngưỡng tối thiểu
    • Message: Số tiền refund được yêu cầu cho line item , quá thấp
  • NOTHING_TO_REFUND
    • Trigger: Không còn số tiền có thể refund; tất cả line item dương đã được refund hoàn toàn
    • Message: Không còn số tiền có thể refund. Tất cả line item dương đã được refund hoàn toàn.
  • PARTIAL_REFUND_NOT_ALLOWED
    • Trigger: Cố gắng refund một phần bằng payment method chỉ hỗ trợ refund toàn bộ
    • Message: Không cho phép refund một phần với payment method này
  • PAYMENT_ALREADY_REFUNDED
    • Trigger: Refund trùng lặp
    • Message: Payment này đã được refund
  • PAYMENT_HAS_BEEN_REFUNDED
    • Trigger: Payment đã được refund hoàn toàn
    • Message: Payment ID đã được refund hoàn toàn.
  • REFUND_AMOUNT_EXCEEDS_PAID_AMOUNT
    • Trigger: Tổng số tiền refund > số tiền đã thanh toán
    • Message: Số tiền refund được tính toán lớn hơn số tiền đã thanh toán
  • REFUND_WINDOW_EXPIRED
    • Trigger: Ngoài khoảng thời gian refund cho phép
    • Message: Không thể bắt đầu refund sau ngày kể từ khi tạo payment. Liên hệ support@dodopayments.com.
  • ZERO_AMOUNT_PAYMENT_REFUND_NOT_ALLOWED
    • Trigger: Cố gắng refund payment có số tiền bằng 0
    • Message: Không thể refund payment có số tiền bằng 0

Subscriptions & Add-ons

  • ADDONS_IN_USAGE_BASED_BILLING_NOT_SUPPORTED
    • Trigger: Cố gắng thêm addons vào subscription tính phí theo mức sử dụng
    • Message: Addons trong Subscriptions không được hỗ trợ cho Usage Based Billing
  • ADDONS_NOT_ALLOWED_FOR_ON_DEMAND
    • Trigger: Cố gắng thêm addons vào subscription on-demand
    • Message: Không cho phép addons trong subscription on demand
  • CANCEL_SCHEDULED_PLAN_CHANGE_FOR_CUSTOMER_PORTAL_DISABLED
    • Trigger: Customer Portal cố gắng hủy thay đổi plan đã lên lịch trong khi doanh nghiệp đã vô hiệu hóa thao tác này
    • Message: Tính năng hủy thay đổi plan đã lên lịch bị vô hiệu hóa cho customer portal.
  • CHARGE_NOT_ALLOWED_FOR_SCHEDULED_CANCELLATION
    • Trigger: Cố gắng charge subscription đã được lên lịch hủy
    • Message: Subscription đã được lên lịch hủy
  • CUSTOMER_HAS_EXISTING_SUBSCRIPTION
    • Trigger: Tạo subscription cho customer đã có subscription, khi không cho phép nhiều subscription trên mỗi customer
    • Message: Customer đã có subscription. Để cho phép nhiều subscription trên mỗi customer, hãy thay đổi business settings
  • DO_NOT_BILL_NOT_ALLOWED_IN_CUSTOMER_PORTAL
    • Trigger: Chế độ proration do_not_bill được sử dụng trong thay đổi plan trên Customer Portal
    • Message: Chế độ proration do_not_bill không được phép trên customer portal
  • DUPLICATE_ADDON_IDS_IN_REQUEST
    • Trigger: addon_id xuất hiện nhiều hơn một lần trong request
    • Message: Không cho phép addon ID trùng lặp
  • INACTIVE_SUBSCRIPTION_PLAN_CHANGE_NOT_SUPPORTED
    • Trigger: Thay đổi plan trên subscription không hoạt động
    • Message: Không hỗ trợ thay đổi plan cho subscription không hoạt động
  • INVALID_PRORATION_MODE_WITH_NEXT_BILLING_DATE
    • Trigger: Sử dụng chế độ proration khác full_immediately với effective_at: next_billing_date
    • Message: Chỉ cho phép chế độ proration full_immediately với effective_at: next_billing_date
  • MISSING_ADDON_IDS
    • Trigger: Danh sách addon_id trống hoặc chứa ID không xác định
    • Message: Một hoặc nhiều product ID không tồn tại:
  • ON_DEMAND_PLAN_CHANGE_NOT_SUPPORTED
    • Trigger: Không cho phép đổi plan đối với on-demand
    • Message: Không hỗ trợ thay đổi plan cho subscription on demand
  • ON_DEMAND_USAGE_BASED_BILLING_NOT_SUPPORTED
    • Trigger: Cố gắng sử dụng on-demand với Usage Based Billing
    • Message: On Demand Subscriptions không được hỗ trợ cho Usage Based Billing
  • ONE_TIME_PRODUCTS_NOT_ALLOWED_FOR_ON_DEMAND
    • Trigger: Thêm product one-time vào subscription on-demand
    • Message: Không cho phép product one-time trong subscription on demand
  • PENDING_PLAN_CHANGE_EXISTS
    • Trigger: Yêu cầu thay đổi plan mới trong khi thay đổi trước đó vẫn đang chờ payment
    • Message: Đã có thay đổi plan đang chờ xử lý cho subscription này. Vui lòng đợi payment hiện tại hoàn tất.
  • PLAN_CHANGE_FOR_CUSTOMER_PORTAL_DISABLED
    • Trigger: Thay đổi plan qua Customer Portal trong khi doanh nghiệp đã vô hiệu hóa tính năng này
    • Message: Thay đổi plan subscription cho customer portal bị vô hiệu hóa.
  • PLAN_CHANGE_NOT_ALLOWED_FOR_SCHEDULED_CANCELLATION
    • Trigger: Cố gắng thay đổi plan trên subscription đã được lên lịch hủy
    • Message: Subscription đã được lên lịch hủy
  • SCHEDULE_PLAN_CHANGE_FOR_CUSTOMER_PORTAL_DISABLED
    • Trigger: Lên lịch thay đổi plan qua Customer Portal trong khi doanh nghiệp đã vô hiệu hóa tính năng này
    • Message: Tính năng lên lịch thay đổi plan bị vô hiệu hóa cho doanh nghiệp này.
  • SCHEDULED_PLAN_CHANGE_EXISTS
    • Trigger: Tạo thay đổi plan đã lên lịch khi đã có một thay đổi khác tồn tại
    • Message: Đã có thay đổi plan đã lên lịch cho subscription này. Vui lòng hủy thay đổi đã lên lịch hiện tại trước khi tạo thay đổi mới.
  • SCHEDULED_PLAN_CHANGE_NOT_FOUND
    • Trigger: Tham chiếu hoặc hủy thay đổi plan đã lên lịch nhưng không tồn tại
    • Message: Không tìm thấy thay đổi plan đã lên lịch cho subscription này.
  • SUBSCRIPTION_EXPIRED
    • Trigger: Tính phí sau expires_at
    • Message: Subscription đã hết hạn, không thể tạo charge mới
  • SUBSCRIPTION_INACTIVE
    • Trigger: Status ≠ active
    • Message: Subscription không hoạt động
  • SUBSCRIPTION_NOT_ON_DEMAND
    • Trigger: Dự kiến on-demand nhưng nhận được fixed interval
    • Message: Subscription hiện không còn là on demand
  • SUBSCRIPTION_PAYMENT_RETRY_LIMIT_EXCEEDED
    • Trigger: Số lần thử lại payment subscription đã vượt quá số lần tối đa
    • Message: Subscription đã vượt quá giới hạn thử lại tối đa là 10 lần

Products, Cart & Brands

  • BRAND_ALREADY_ARCHIVED
    • Trigger: Lưu trữ brand đã được lưu trữ
    • Message: Brand đã được lưu trữ
  • BRAND_ARCHIVED
    • Trigger: Cập nhật brand đã lưu trữ, gửi brand để xác minh hoặc gắn product, product collection hoặc subscription mới vào brand đó
    • Message: Brand đã được lưu trữ và không thể cập nhật
  • BRAND_ARCHIVE_TARGET_REQUIRED
    • Trigger: Lưu trữ brand vẫn còn product, subscription đang hoạt động hoặc product collection mà không có target move_products_to
    • Message: Brand có 12 product. Đặt move_products_to thành một brand đích để gắn lại chúng.
  • BRAND_MISMATCH
    • Trigger: Các mặt hàng trong cart thuộc các brand khác nhau
    • Message: Tất cả mặt hàng trong product cart phải thuộc cùng một brand
  • BRAND_NOT_ENABLED
    • Trigger: Brand bị vô hiệu hóa hoặc không hoạt động
    • Message: Brand được cung cấp chưa được bật
  • BRAND_SUBMISSION_NOT_ENABLED
    • Trigger: Tính năng gửi lại xác minh brand chưa được bật
    • Message: Tính năng gửi lại xác minh brand chưa được bật
  • CANNOT_ARCHIVE_PRIMARY_BRAND
    • Trigger: Lưu trữ brand chính, có brand ID là business ID
    • Message: Không thể lưu trữ brand chính
  • FILE_IN_USE
    • Trigger: Xóa file digital product vẫn được các entitlement grant đang hoạt động tham chiếu
    • Message: File digital được các grant đang hoạt động tham chiếu
  • INVALID_BRAND_ARCHIVE_TARGET
    • Trigger: move_products_to chỉ định brand đang được lưu trữ, brand đã lưu trữ hoặc brand của doanh nghiệp khác
    • Message: move_products_to phải là brand của doanh nghiệp này và chưa được lưu trữ
  • INVALID_SUGGESTED_PRICE
    • Trigger: Giá PWYW < giá tối thiểu cho phép
    • Message: Suggested Price không thể thấp hơn giá tối thiểu. Với pay what you want, giá được xem là số tiền tối thiểu được chấp nhận
  • LOCALIZED_PRICE_ALREADY_EXISTS
    • Trigger: Đã tồn tại localized price cho product và quốc gia/loại tiền tệ này
    • Message: Đã tồn tại localized price cho product và quốc gia/loại tiền tệ này
  • LOCALIZED_PRICE_DUPLICATES_BASE
    • Trigger: Localized price trùng với base currency/country của product
    • Message: Localized price trùng với base currency/country của product
  • LOCALIZED_PRICE_SHAPE_MISMATCH
    • Trigger: Cấu trúc localized price không khớp với pricing_mode của product
    • Message: Cấu trúc localized price không khớp với pricing_mode của product
  • MISSING_PRODUCT_INFORMATION
    • Trigger: Product tồn tại nhưng thiếu thông tin bắt buộc
    • Message: Product tồn tại nhưng thông tin bắt buộc khác bị thiếu hoặc không hợp lệ
  • PAY_AS_YOU_WANT_AMOUNT_REQUIRED
    • Trigger: Product PWYW thiếu price
    • Message: Amount là bắt buộc đối với product pay as you want
  • PRODUCT_CART_EMTPY
    • Trigger: Product cart trống được gửi đi
    • Message: product_cart trống (error code được cố ý viết là EMTPY để khớp với giá trị chính xác API trả về)
  • PRODUCT_COLLECTION_IS_DELETED
    • Trigger: Thao tác trên product collection đã bị xóa
    • Message: Không có message
  • PRODUCT_COLLECTION_MUST_HAVE_PRODUCTS
    • Trigger: Xóa product cuối cùng (hoặc group cuối cùng có product) khỏi collection
    • Message: Không thể xóa product cuối cùng trong collection. Thay vào đó, hãy lưu trữ collection.
  • PRODUCT_IS_DELETED
    • Trigger: Product bị xóa mềm
    • Message: Không có message
  • PRODUCT_PRICING_MODE_REQUIRED
    • Trigger: Thêm localized price trước khi pricing_mode của product được thiết lập
    • Message: Phải thiết lập pricing_mode của product trước khi thêm localized price
  • SLUG_ALREADY_TAKEN
    • Trigger: Product slug / short URL được yêu cầu đã được sử dụng
    • Message: Slug đã được sử dụng
  • UNABLE_TO_EDIT_PRIMARY_BRAND
    • Trigger: Cố gắng cập nhật brand chính qua API thông thường
    • Message: Không thể cập nhật brand chính qua API endpoint này.

Discounts

  • DISCOUNT_ALREADY_USED_ON_SUBSCRIPTION
    • Trigger: Áp dụng lại discount đã được sử dụng cho subscription này
    • Message: Discount này đã được sử dụng cho subscription này
  • DISCOUNT_CODE_ALREADY_EXISTS
    • Trigger: Tạo discount code trùng lặp
    • Message: Discount Code đã tồn tại
  • DISCOUNT_CODE_EXPIRED
    • Trigger: Discount code đã quá ngày expires_at
    • Message: Discount code đã hết hạn
  • DISCOUNT_CODE_USAGE_LIMIT_EXCEEDED
    • Trigger: Discount được sử dụng lại sau khi đạt usage_limit
    • Message: Usage limit không thể nhỏ hơn times_used / Discount code đã đạt usage limit
    • Note: Terminal — code đã hết lượt sử dụng. Không thử lại.
  • DISCOUNT_CONCURRENT_REDEMPTION
    • Trigger: Một lần đổi code khác đã giữ row lock của usage limit quá lâu
    • Message: Discount đang được đổi đồng thời; vui lòng thử lại
    • Note: Tạm thời. Code vẫn có thể còn lượt sử dụng, vì vậy request an toàn để thử lại. Không hiển thị lỗi này cho customer dưới dạng “code exhausted”.
  • DISCOUNT_CURRENCY_OPTION_INVALID
    • Trigger: currency_options không hợp lệ khi create hoặc update
    • Message: Flat discount yêu cầu ít nhất một currency option có default có thể phân giải / Không cho phép currency option trùng lặp / Chỉ một currency option có thể được đánh dấu là default
  • DISCOUNT_CUSTOMER_NOT_ELIGIBLE
    • Trigger: Customer không đáp ứng customer_eligibility của code (first_time, existing hoặc không nằm trong allow list của code specific)
    • Message: Customer không đủ điều kiện sử dụng discount code này
  • DISCOUNT_MINIMUM_SUBTOTAL_NOT_MET
    • Trigger: Cart subtotal thấp hơn minimum_subtotal được cấu hình cho checkout currency
    • Message: Cart subtotal thấp hơn subtotal tối thiểu yêu cầu của discount
  • DISCOUNT_NOT_YET_ACTIVE
    • Trigger: Code được sử dụng trước ngày starts_at
    • Message: Discount code chưa hoạt động (starts_at nằm trong tương lai)
  • DISCOUNT_PER_CUSTOMER_USAGE_LIMIT_EXCEEDED
    • Trigger: Customer đã đổi code per_customer_usage_limit lần
    • Message: Đã vượt quá usage limit trên mỗi customer cho discount code này
  • DISCOUNT_NOT_APPLICABLE_TO_NEW_PRODUCT
    • Trigger: Thay đổi plan sang product mà discount hiện tại không áp dụng
    • Message: Discount không áp dụng cho product của plan mới
  • DISCOUNT_NOT_AVAILABLE_FOR_ON_DEMAND
    • Trigger: Code được áp dụng cho subscription on-demand
    • Message: Discount coupon không khả dụng cho subscription on demand
  • DISCOUNT_NOT_AVAILABLE_FOR_PRODUCT
    • Trigger: Code được áp dụng cho các product không liên quan
    • Message: Discount coupon không khả dụng cho product này
  • INVALID_DISCOUNT_CODE
    • Trigger: Code không tồn tại / không áp dụng được
    • Message: Discount Code không hợp lệ / Không thể áp dụng Discount Code cho bất kỳ product nào trong cart
  • INVALID_PERCENTAGE
    • Trigger: Giá trị phần trăm > 100% (hoặc 10.000 basis points)
    • Message: Giá trị phần trăm không thể lớn hơn 10000 / Giá trị discount code không thể lớn hơn 100%
  • UNSUPPORTED_DISCOUNT_TYPE
    • Trigger: Loại discount không được hỗ trợ. percentageflat đều được hỗ trợ; discount theo số tiền trên mỗi unit không được hỗ trợ.
    • Message: Chỉ hỗ trợ discount code theo phần trăm và flat

License Keys

  • ACTIVATION_LIMIT_LESS_THAN_CURRENT_AMOUNT
    • Trigger: Kích hoạt license key: giới hạn mới < số instance hiện tại
    • Message: Giới hạn kích hoạt mới không thể nhỏ hơn số instance hiện tại
  • INACTIVE_LICENSE_KEY
    • Trigger: Trạng thái key ≠ active
    • Message: License key không hoạt động
  • LICENSE_KEY_LIMIT_REACHED
    • Trigger: Số lần kích hoạt = giới hạn
    • Message: Đã đạt giới hạn kích hoạt license key
  • LICENSE_KEY_NOT_FOUND
    • Trigger: Instance ID hoặc key ID không hợp lệ
    • Message: Không tìm thấy instance của license key hoặc instance không thuộc license key này
  • NO_EXPIRY_ON_SUBSCRIPTION_LICENSE_KEYS
    • Trigger: Cố gắng đặt ngày hết hạn cho key dựa trên subscription
    • Message: Không thể đặt ngày hết hạn cho license key dựa trên subscription

Usage-Based Billing & Meters

  • DUPLICATE_METER_IDS_IN_REQUEST
    • Trigger: Cùng một meter ID xuất hiện nhiều lần trong request
    • Message: Không cho phép Meter Id trùng lặp
  • INVALID_QUANTITY
    • Trigger: Quantity không hợp lệ được chỉ định cho pricing theo mức sử dụng
    • Message: Chỉ cho phép quantity bằng 1 trong product có usage based price
  • METER_IS_DELETED
    • Trigger: Cố gắng sử dụng meter đã bị xóa
    • Message: Meter đã bị xóa
  • MISSING_METER_IDS
    • Trigger: Danh sách Meter ID trống hoặc chứa ID không hợp lệ
    • Message: Một hoặc nhiều meter ID không tồn tại:

Credit-Based Billing

  • CREDIT_ENTITLEMENT_IS_DELETED
    • Trigger: Thao tác trên credit entitlement đã bị xóa
    • Message: Credit entitlement đã bị xóa
  • CREDIT_ENTITLEMENT_NAME_ALREADY_EXISTS
    • Trigger: Tạo credit entitlement với name đã tồn tại
    • Message: Credit entitlement với name này đã tồn tại
  • OVERAGE_LIMIT_EXCEEDED
    • Trigger: Việc sử dụng hoặc khấu trừ credit sẽ vượt quá overage limit đã cấu hình
    • Message: Đã vượt quá overage limit

Wallet

  • INSUFFICIENT_WALLET_FUNDS
    • Trigger: Số dư wallet < số tiền debit
    • Message: Không đủ tiền trong wallet
  • NEGATIVE_BALANCE_ADJUSTMENT
    • Trigger: Cố gắng khiến số dư wallet âm
    • Message: Không cho phép số dư wallet trở thành số âm

Currency, Tax & Region

  • EXCHANGE_RATE_NOT_FOUND
    • Trigger: Không có FX rate cho cặp tiền tệ from → to
    • Message: Không tìm thấy exchange rate để chuyển đổi từ Currency sang Currency
  • INVALID_TAX_ID
    • Trigger: VAT/GST/TIN không vượt qua validation
    • Message: Tax Id không hợp lệ
  • REQUEST_AMOUNT_BELOW_MINIMUM
    • Trigger: Amount < mức tối thiểu của product
    • Message: Amount không thể thấp hơn amount tối thiểu được chỉ định cho product
  • TOTAL_PAYMENT_AMOUNT_BELOW_MINIMUM_AMOUNT
    • Trigger: Tổng cart kết hợp < mức tối thiểu của gateway
    • Message: Cần số tiền tối thiểu để xử lý payment
  • UNSUPPORTED_BILLING_CURRENCY
    • Trigger: Billing currency được yêu cầu không được hỗ trợ cho subscription này
    • Message: Không hỗ trợ billing currency khác USD cho subscription
  • UNSUPPORTED_COUNTRY
    • Trigger: Geo chưa được hỗ trợ
    • Message: Quốc gia hiện chưa được hỗ trợ
  • UNSUPPORTED_CURRENCY
    • Trigger: Currency của product hoặc addon không phải là currency mà Dodo Payments có thể charge. Base prices có thể được đặt bằng bất kỳ currency nào có thể charge, vì vậy điều này thường có nghĩa là currency code không hợp lệ hoặc chưa được hỗ trợ.
    • Message: Currency hiện chưa được hỗ trợ / Hiện chỉ hỗ trợ product USD và INR / Chỉ hỗ trợ USD và INR cho addon price / Chỉ có thể yêu cầu USD hoặc INR cho billing_currency / Currency Not Supported / Unexpected currency for Indian card subscriptions
  • UNSUPPORTED_TAX_CATEGORY
    • Trigger: Chuỗi tax category không thuộc enum
    • Message: Category hiện chưa được hỗ trợ

Validation & Requests

  • DUPLICATE_LINE_ITEMS_IN_REQUEST
    • Trigger: Cùng một item_id xuất hiện hai lần trong items[]
    • Message: item_ids trùng lặp được chỉ định trong mảng items
  • INVALID_QUERY_PARAMS
    • Trigger: Query parameters loại trừ lẫn nhau / không đúng định dạng
    • Message: Query params chỉ được chứa time_frame hoặc (start, end)
  • INVALID_REQUEST_BODY
    • Trigger: JSON không đúng định dạng hoặc vi phạm schema
    • Message: Request body của bạn không hợp lệ. Vui lòng kiểm tra request headers và object.
  • INVALID_REQUEST_PARAMETERS
    • Trigger: Ngữ nghĩa không đúng (ví dụ: ngày trong quá khứ)
    • Message: Không thể thay đổi next_billing_date thành thời điểm trong quá khứ
  • MAXIMUM_KEYS_REACHED
    • Trigger: Metadata / custom-fields vượt quá 50 cặp
    • Message: Vượt quá 50 cặp key-value

General & System

  • INTEGER_CONVERSION_FAILURE
    • Trigger: Bất kỳ chuyển đổi integer ↔ string/decimal nào không thành công ở phía server
    • Message: Lỗi chuyển đổi Integer
  • INTERNAL_SERVER_ERROR
    • Trigger: Ngoại lệ chưa được xử lý; bạn nên ghi log chi tiết ở phía server
    • Message: Không có message công khai (generic 500)
  • NOT_FOUND
    • Trigger: 404 generic cho mọi resource không tồn tại
    • Message: Không tìm thấy item (hoặc thông báo cụ thể hơn)
  • TOO_MANY_REQUESTS
    • Trigger: 429 rate-limit
    • Message: Không có message
  • UNSUPPORTED_ACTION
    • Trigger: Action không được hỗ trợ cho loại resource
    • Message: Không hỗ trợ thay đổi plan cho subscription usage based

Best Practices

  1. Luôn xử lý lỗi một cách phù hợp trong application của bạn
  2. Triển khai error logging đúng cách
  3. Sử dụng message lỗi phù hợp cho người dùng cuối
  4. Triển khai logic retry cho các lỗi tạm thời
  5. Liên hệ support đối với các vấn đề chưa được giải quyết

Support

Để được hỗ trợ thêm về error code hoặc vấn đề tích hợp, vui lòng liên hệ đội ngũ support của chúng tôi tại support@dodopayments.com.
Lần sửa đổi cuối 21 tháng 8, 2026