Анатомия банковского отказа: как читать коды ошибок и тайминги как рентген

Good Carder

Professional
Messages
517
Reaction score
411
Points
63

Введение: почему код ошибки важнее самой карты​

Начинающий видит фразу «Your card was declined» и впадает в ступор. Профи за доли секунды смотрит на три числа: HTTP статус, текстовый код ответа и время отклика (TTFB). По ним он определяет, где именно сломалось: карта мертва, прокси в черном списке, антифред магазина сработал или банк эмитента просто пустил транзакцию в песок.

В этой статье мы разберем внутреннюю кухню платежных шлюзов. Вы научитесь расшифровывать более 20 кодов ошибок, отличать отказ эмитента от отказа антифрода, пользоваться консолью браузера как профессиональным инструментом.

Часть 1. Как устроен путь платежа: три фильтра, которые отклоняют транзакцию​

Прежде чем читать коды, поймите последовательность проверок. Запрос от вашего браузера до банка-эмитента проходит через три барьера:
Code:
[Ваш браузер] 
→ 1. Валидация на стороне магазина (формат данных, базовый антифрод) 
→ 2. Платежный шлюз (Stripe, Adyen и др.) – проверяет fingerprint, прокси, BIN-листы 
→ 3. Банк-эмитент (банк, выпустивший карту) – проверяет баланс, стоп-листы, 3DS

Какой барьер отклонил – определяют по времени задержки и коду:
БарьерТипичное время ответаХарактерные коды
1. Магазин0–500 мс400 Bad Request, invalid_number, expired_card
2. Шлюз500 мс – 2 секfraudulent, blocked, generic_decline
3. Банк1–6 секdo_not_honor, insufficient_funds, pick_up_card, call_issuer

Ключевой навык: вы видите задержку – уже знаете, в какой трети искать проблему.

Часть 2. Полный словарь кодов ошибок (20+ вариантов с расшифровкой)​

Все коды ниже приведены в том виде, в каком их отдают платежные шлюзы (Stripe, Braintree, Adyen, Square). Они могут незначительно отличаться текстом, но смысл един.

Группа А. Ошибки формата данных (магазин или шлюз, < 1 сек)​

Код (текст)HTTPРасшифровкаЧто делать
invalid_number400Номер карты не проходит алгоритм Луна или не соответствует BINПроверьте карту визуально; возможно продавец подсунул рандом
invalid_expiry_month / invalid_expiry_year400Неверный месяц или год (прошлый, или 99)Сверьте срок с картой
invalid_cvc400CVV/CVC не той длины или неверныйПерепроверьте; если всё верно – карта может быть без CVV (редкость)
expired_card402Срок истёкКарта – утиль
incorrect_number400Частный случай invalid_numberТо же
missing_payment_information400Не заполнено одно из полей (имя, адрес, страна)Автоматизация сломалась; проверьте скрипт
invalid_request400Неверный формат запроса к API (не ваш случай, если вы через браузер)Проблема в интеграции магазина, не ваша

Группа Б. Отказы эмитента (банка карты) – время 1–6 сек​

КодHTTPТипичная задержкаСмыслДействие
do_not_honor4020.8–2 секКарта в стоп-листе банка (украдена, просрочена, заблокирована за фрод)Карту – в корзину. Не тратьте время
insufficient_funds4021.5–3 секБаланса меньше суммы чекаУменьшите сумму до $1-5 для теста; если не проходит – карта пуста
lost_card402< 1 секДержатель заявил о потереАналогично do_not_honor
stolen_card402< 1 секКарта помечена как украденнаяНе используйте этот BIN вообще
pick_up_card4021–2 секБанк просит банкомат изъять карту (компрометация)Опасный BIN; магазины могут забанить ваш IP
call_issuer4022–5 секБанк хочет голосового подтвержденияБесполезно для кардинга
transaction_not_allowed4031–3 секКарта заблокирована для данного типа транзакций (например, только снятие в ATM)Ищите карты с флагом Consumer или Retail
restricted_card4031–2 секКарта имеет ограничения по странам или каналамТребуется BIN без ограничений
invalid_transaction4021–3 секНеверная сумма или валюта для данной картыСмените валюту на USD/EUR/GBP в зависимости от BIN
withdrawal_limit_exceeded4021–2 секПревышен суточный лимитОтложите карту на 24 часа
hard_decline4020.5–1 секОбобщённый отказ без деталей (старые шлюзы)Вероятно, карта мертва

Группа В. Отказы антифрода (шлюз или магазин) – время 0.5–3 сек​

КодHTTPЗадержкаСмыслДействие
fraudulent4031–2 секСработало правило антифрода (Stripe Radar, Kount)Меняйте прокси, антидетект, fingerprint
blocked4030.5–1 секIP, BIN или email в чёрном списке магазинаСмените прокси и email
generic_decline4022–6 секОтказ без причины – обычно из-за скорингаКомплексно чистите среду
do_not_honor (но задержка >3 сек)4023–5 секСмешанный случай: антифрод магазина отправил запрос, но банк ответил отказомАнализируйте оба аспекта
processing_error5002–10 секОшибка на стороне шлюза (редко)Повторите через минуту
invalid_account4030.5–1 секМагазин не настроен на приём карт данного BINНе ваш косяк

Группа Г. 3D Secure​

КодHTTPЗадержкаСмыслДействие
authentication_required4023–8 секКарта требует прохождения 3DSБез обхода – тупик
3d_secure_failed4024–10 секПопытка прошла, но аутентификация проваленаКарта жива, но 3DS не пройти стандартными методами

Часть 3. Как отличить отказ эмитента от отказа антифрода по таймингу и паттернам​

Это главный навык. Сравните две ситуации:

Ситуация А (отказ эмитента):
  • Время ответа: 1.8 сек
  • Код: do_not_honor
  • Предыстория: карта свежая, BIN 414720 (Chase), прокси резидентный США.
    Вывод: банк Chase заблокировал карту (украдена). Меняем карту.

Ситуация Б (отказ антифрода):
  • Время ответа: 0.9 сек
  • Код: fraudulent
  • Предыстория: прокси дешёвый дата-центр, не отключен WebRTC.
    Вывод: Stripe Radar зарезал по fingerprint. Меняем прокси и настройки антидетекта.

Как определить точно, если код неоднозначный (например, generic_decline)?
Проведите A/B-тест:
  1. Сделайте ту же попытку с заведомо живой картой (например, вашей собственной дебетовой с небольшим балансом).
    • Если ваша карта проходит – проблема в чужой карте.
    • Если ваша карта тоже получает generic_decline – проблема в среде (прокси/антидетект).
  2. Сделайте попытку с тем же профилем, но на другом сайте (с тем же шлюзом, например, два магазина на Stripe).
    • Отказ везде одинаковый → среда плохая.
    • Отказ только на одном сайте → магазин банит ваш BIN или IP.

Эмпирическое правило:
  • Задержка < 1.5 сек и код из группы А или В → антифрод магазина/шлюза.
  • Задержка > 1.5 сек и код из группы Б → банк эмитента.
  • Исключение: insufficient_funds может прийти быстро, если баланс проверяется локальным кэшем шлюза (но редко).

Часть 4. Таблица соответствия HTTP статусов + текстовых сообщений для популярных шлюзов​

Один и тот же реальный отказ разные шлюзы могут называть по-разному. Ниже – сводная таблица для Stripe, Adyen, Braintree, Square.
Реальная причинаStripe (текст)AdyenBraintreeSquareHTTP
Неверный номерinvalid_numberInvalid Card Number2000 (код в ответе)INVALID_CARD400
Неверный CVVinvalid_cvcInvalid CVC2001CVV_FAILURE400
Недостаточно средствinsufficient_fundsNot Enough Balance2004INSUFFICIENT_FUNDS402
Карта украденаdo_not_honorStolen Card2005CARD_DECLINED402
АнтифродfraudulentRisk Score Too High2016 (fraud)DECLINED_RISK403
3DS требуетсяauthentication_required3DS2 Required2038THREEDS_REQUIRED402
Общий отказgeneric_declineDeclined2000 (общий)GENERIC_DECLINE402
Просроченаexpired_cardExpired Card2003EXPIRED_CARD402
Изъять картуpick_up_cardPick Up Card2006PICK_UP_CARD402
Лимит превышенwithdrawal_limit_exceededLimit Exceeded2010LIMIT_EXCEEDED402

Как пользоваться таблицей:
Увидели на сайте (Square) сообщение CARD_DECLINED и задержку 0.5 сек – смотрите в таблице: это аналог do_not_honor Stripe, то есть карта в стоп-листе.

Часть 5. Практика: читаем консоль Network как рентген​

5.1. Где искать запрос платежа​

  1. Откройте сайт с формой оплаты.
  2. Нажмите F12 → вкладка Network (Сеть).
  3. Очистите логи (кнопка 🚫).
  4. Заполните форму карты и нажмите Pay.
  5. В логах появится множество запросов. Найдите тот, который содержит:
    • payments, create-payment-intent, charge, transactions, authorize
    • Или метод POST с ответом 402, 400, 403.

Пример для Stripe: ищите запрос к https://api.stripe.com/v1/payment_intents/.../confirm или https://m.stripe.com/6.

5.2. Что смотреть в деталях запроса​

Кликните на нужный запрос → откроются вкладки:
  • Headers → смотрите Status Code (например, 402 Payment Required).
  • Preview или Response – здесь лежит текстовый код ошибки и сообщение.

Скриншот (описание):
Вкладка Headers показывает:
Status: 402 Payment Required
Вкладка Response:
{ "error": { "code": "insufficient_funds", "message": "Your card has insufficient funds." } }

Плюс вкладка Timing показывает точное время: Waiting (TTFB): 2.3 sec. Это и есть задержка.

5.3. Расшифровка реального примера​

Пример 1 (отказ эмитента):
  • Запрос: POST /v1/payment_intents/pi_123/confirm
  • Status: 402
  • Response: {"error":{"code":"do_not_honor","decline_code":"do_not_honor"}}
  • Timing: TTFB: 1.2 sec

Диагноз: отказ банка эмитента по причине стоп-листа. Карта мертва.

Пример 2 (антифрод Stripe):
  • Запрос: POST /v1/payment_intents/pi_456/confirm
  • Status: 403
  • Response: {"error":{"code":"fraudulent","message":"Your payment was blocked by Radar."}}
  • Timing: TTFB: 0.6 sec

Диагноз: сработал антифрод шлюза. Проблема в среде (прокси, fingerprint).

Пример 3 (3DS):
  • Запрос: POST /payments
  • Status: 402
  • Response: {"error":{"code":"authentication_required","payment_intent":{"next_action":{"type":"redirect_to_url"}}}}
  • Timing: TTFB: 4.1 sec

Диагноз: карта требует 3DS. Без обхода – не пройти.

5.4. Продвинутый приём: смотрим заголовки запроса​

В том же Network перейдите вкладку HeadersRequest Headers. Обратите внимание на:
  • User-Agent – соответствует ли вашему профилю антидетекта?
  • Accept-Language – совпадает ли со страной прокси? (например, en-US,en;q=0.9 для США)
  • Origin и Referer – должны вести на тот же сайт.
  • CF-Ray (если сайт за Cloudflare) – наличие этого заголовка говорит, что Cloudflare проверил вас. Если после отказа вы видите CF-Ray и время около 0.3 сек – вас заблокировал Cloudflare WAF, даже не доходя до платежного шлюза.

Часть 6. Чек-лист диагностики по коду и времени​

Распечатайте или сохраните. При отказе выполняйте последовательно:
  1. Зафиксируйте HTTP статус и текстовый код (из Response).
  2. Замерьте TTFB (из Timing).
  3. Сопоставьте с таблицей выше:
    • 4xx (400, 402, 403) – ошибка клиента/платежа.
    • 5xx – проблема на стороне сервера (ваш прокси может быть ни при чём).
  4. Определите группу:
    • Время < 1 сек и код из группы А (invalid_number, expired_card) → ошибка ввода или карта-фуфло.
    • Время 1-3 сек и код do_not_honor/insufficient_funds → отказ эмитента.
    • Время < 1.5 сек и код fraudulent/blocked → антифрод шлюза.
  5. Подтвердите тестом:
    • Смените карту на заведомо живую (свою) – если ошибка та же, проблема не в карте.
    • Смените прокси на резидентный и повторите – если ошибка ушла, проблема была в прокси.

Часть 7. Ошибки новичков при чтении кодов​

Ошибка 1: видят generic_decline и думают «карта плохая». На самом деле generic_decline с задержкой 3 сек часто означает, что антифред магазина не пустил платёж, не утруждая себя точным кодом.

Ошибка 2: игнорируют время ответа. Один и тот же код do_not_honor за 0.8 сек и за 4 сек – абсолютно разные истории. Первое – карта в чёрном списке банка. Второе – банк долго думал, возможно, баланс был на грани, но потом всё равно отказал.

Ошибка 3: не проверяют decline_code в Stripe. Stripe часто возвращает два поля: code (общий) и decline_code (конкретный от банка). Например, code: generic_decline, decline_code: insufficient_funds – это настоящая причина. Смотрите всегда decline_code, если он есть.

Заключение: превращаем отказ в диагноз​

Теперь вы умеете:
  • По коду и времени определять, кто именно отклонил платёж: магазин, шлюз или банк.
  • Различать 20+ типов отказов и знать, что делать в каждом случае.
  • Пользоваться консолью Network для точного сбора данных.
  • Отличать антифрод от недостатка средств.

В следующей статье (по вашему выбору) разберём, как проверять карту микро-платежами и создавать свой чекер.

А пока – сохраните эту статью как шпаргалку. При каждом отказе открывайте её и сверяйте. Через 20–30 попыток чтение кодов станет для вас автоматическим.

Быстрая памятка на одну строку:
«Время <1с + invalid/expired → кривые руки или фуфло; 1-3с + do_not_honor → карта мертва; <1.5с + fraudulent → грязная среда; >3с + generic_decline → антифред магазина»
 
Top