WooCommerce не меняет статус заказа после оплаты

WordPress услуги
Нужна помощь с сайтом?
Исправим, настроим или улучшим сайт. Оставьте заявку — подскажем решение.
Оставить заявку
Автор:vkuzyomko

WooCommerce не меняет статус заказа после оплаты

Краткий ответ: если WooCommerce не меняет статус заказа после оплаты, чаще всего сайт не получил или не обработал подтверждение от платёжной системы. Нужно проверить webhook/callback, логи платёжного шлюза, примечания заказа, статус транзакции, SSL, WAF/ModSecurity, Cloudflare, кеш checkout, REST API, admin-ajax.php, PHP-ошибки, настройки статусов и совместимость платёжного плагина с WooCommerce.

Типичная ситуация: клиент оплатил заказ, деньги списались, но в WooCommerce заказ остался в статусе “Ожидается оплата”, “На удержании” или не перешёл в “Обработка”. Иногда письмо клиенту и администратору тоже не приходит, потому что WooCommerce не получил событие успешной оплаты.

Если заказ вообще не создаётся или checkout зависает до оплаты, сначала проверьте статью WooCommerce не оформляет заказ. Если проблема именно в платёжном модуле, API, callback или webhook, полезно также посмотреть материал WooCommerce не получает callback от LiqPay / WayForPay. Если нужна правка checkout, оплаты, доставки или статусов, подходит услуга доработка WooCommerce.

Причина

WooCommerce сам по себе не знает, что клиент реально оплатил заказ, пока платёжный шлюз не передаст сайту подтверждение. Это подтверждение может приходить через callback, webhook, REST endpoint, admin-ajax.php, IPN или отдельный URL платёжного плагина.

Если этот запрос не дошёл, был заблокирован или обработался с ошибкой, заказ остаётся в старом статусе.

Самые частые причины:

  • неверный callback / webhook URL — платёжная система отправляет подтверждение не туда;
  • сайт недоступен для платёжной системы — firewall, WAF, Cloudflare, Basic Auth, maintenance mode или блокировка страны/IP;
  • SSL работает неправильно — платёжный сервис не доверяет сертификату или не может открыть HTTPS-адрес;
  • ошибка подписи — callback приходит, но плагин отклоняет его из-за неправильного secret key, private key, signature или merchant data;
  • платёжный плагин несовместим с WooCommerce — старая версия, конфликт с HPOS, PHP или новой версией WooCommerce;
  • заказ остаётся в Pending payment — WooCommerce создал заказ, но подтверждение оплаты не было обработано;
  • статус меняется не туда — плагин переводит заказ в on-hold, completed или кастомный статус вместо processing;
  • кеширует checkout или callback — кеш, CDN или оптимизация вмешиваются в динамический запрос;
  • WAF/ModSecurity блокирует callback — запрос платёжной системы выглядит подозрительным для сервера;
  • PHP fatal error при обработке оплаты — плагин получает callback, но падает до смены статуса;
  • сумма или валюта не совпадает — плагин не подтверждает платёж из-за расхождения данных;
  • cron или отложенная обработка не сработали — часть платёжных модулей обрабатывает статусы через очереди;
  • кастомный код перехватывает статус — сниппет, тема, CRM-интеграция или плагин статусов меняет логику после оплаты;
  • заказ уже был отменён — истёк срок удержания неоплаченного заказа, а callback пришёл позже.

Диагностика

Начинать нужно не с ручной смены статуса, а с проверки цепочки: заказ создан → клиент оплатил → платёжная система отправила callback → сайт принял запрос → плагин проверил подпись → WooCommerce сменил статус → ушли письма и интеграции.

Симптом Вероятная причина Что проверить первым
Деньги списались, заказ остался “Ожидается оплата” callback/webhook не дошёл или не обработался логи платёжной системы, URL callback, WooCommerce logs
Callback есть, но статус не меняется ошибка подписи, сумма, валюта, order_id, PHP-ошибка логи плагина оплаты, order notes, debug.log
Заказ переходит в “На удержании” плагин считает оплату неподтверждённой или требует ручной проверки настройки платёжного метода, статус транзакции
Заказ сразу становится “Выполнен” настройки для виртуальных товаров или кастомный код статусов тип товаров, хуки статусов, плагин автозавершения
Заказ создаётся, но письма не приходят статус не изменился или не работает email/SMTP WooCommerce emails, SMTP logs, статус заказа
Callback получает 403 WAF, Cloudflare, security-плагин, IP-блокировка firewall logs, ModSecurity, Cloudflare events
Callback получает 500 PHP fatal error, плагин оплаты, тема, память debug.log, error_log хостинга, WooCommerce logs
Callback получает 404 неверный URL, permalink, REST endpoint, отключённый плагин URL webhook, постоянные ссылки, активность плагина
Проблема только у LiqPay / WayForPay ключи, signature, server_url/serviceUrl, SSL, callback настройки шлюза, кабинет платёжной системы, логи

Что проверить сразу

  • Создался ли заказ в WooCommerce?
  • Какой статус у заказа сейчас?
  • Есть ли оплата в кабинете платёжной системы?
  • Есть ли примечания в заказе WooCommerce?
  • Есть ли логи платёжного шлюза в WooCommerce → Статус → Журналы?
  • Какой URL callback/webhook указан в кабинете платёжной системы?
  • Возвращает ли callback URL ответ 200?
  • Не блокирует ли запрос Cloudflare, ModSecurity, WAF или security-плагин?
  • Есть ли ошибки в wp-content/debug.log?
  • Обновлялись ли WooCommerce, платёжный плагин, тема или PHP?
  • Не включён ли кеш для checkout, cart, my-account, payment return или webhook URL?

Нужно быстро решить проблему на сайте?

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

Оставить заявку

Решение

Исправление зависит от того, где ломается цепочка. Если просто вручную менять статус каждого заказа, проблема останется и будет повторяться.

1. Проверьте примечания заказа

Откройте заказ в WooCommerce и посмотрите блок примечаний. Там часто видно:

  • заказ создан;
  • пользователь перенаправлен на оплату;
  • оплата ожидалась;
  • платёжный шлюз вернул ошибку;
  • callback принят;
  • подпись не прошла проверку;
  • статус был изменён плагином или администратором.

Если в примечаниях нет следов оплаты, сайт, скорее всего, не получил подтверждение от платёжной системы.

2. Проверьте логи WooCommerce

Откройте:

  • WooCommerce → Статус → Журналы;
  • выберите лог платёжного плагина;
  • проверьте записи за время тестовой оплаты.

Ищите ошибки:

  • invalid signature;
  • callback failed;
  • webhook failed;
  • payment pending;
  • order not found;
  • amount mismatch;
  • currency mismatch;
  • HTTP 403, HTTP 404, HTTP 500;
  • timeout;
  • fatal error.

3. Проверьте callback/webhook URL

В кабинете платёжной системы должен быть указан правильный URL сайта. В зависимости от плагина это может быть:

  • REST API endpoint;
  • admin-ajax.php action;
  • специальный callback URL плагина;
  • URL возврата после оплаты;
  • server_url / serviceUrl / webhook URL.

Ошибки часто появляются после смены домена, перехода на HTTPS, переноса сайта, включения Cloudflare или изменения структуры постоянных ссылок.

4. Проверьте SSL

Платёжная система должна иметь возможность открыть callback URL по HTTPS. Проверьте:

  • сертификат действующий;
  • нет ошибки mixed content;
  • домен в сертификате совпадает с доменом сайта;
  • нет редиректа с HTTPS на HTTP;
  • нет бесконечного редиректа;
  • callback URL открывается без Basic Auth и maintenance mode.

5. Проверьте WAF, Cloudflare и security-плагины

Если callback получает 403 или вообще не доходит до WooCommerce, проверьте защиту.

Чаще всего блокируют:

  • ModSecurity;
  • Cloudflare WAF;
  • security-плагины WordPress;
  • IP-блокировки;
  • country blocking;
  • Bot Fight Mode;
  • rate limiting;
  • правила, запрещающие POST-запросы на системные URL.

Не отключайте защиту полностью навсегда. Лучше найти конкретное правило и добавить безопасное исключение для callback URL или IP платёжной системы, если это поддерживается.

6. Исключите checkout и callback из кеша

Кеш не должен вмешиваться в оформление заказа и подтверждение оплаты.

Исключите:

  • /cart/
  • /checkout/
  • /my-account/
  • страницы возврата после оплаты;
  • callback/webhook URL;
  • ?wc-ajax=*
  • REST/AJAX endpoints платёжного плагина.

Проверьте плагин кеша, серверный кеш, Object Cache, CDN, Cloudflare и минификацию JS. Иногда платёж прошёл, но сайт отдаёт старую кешированную страницу и кажется, что статус не изменился.

7. Проверьте настройки платёжного плагина

Проверьте:

  • merchant ID;
  • public key;
  • private key / secret key;
  • test/live mode;
  • валюту;
  • минимальную и максимальную сумму;
  • callback/webhook URL;
  • return/success/fail URL;
  • статус заказа после успешной оплаты;
  • статус заказа после неуспешной оплаты;
  • совместимость с HPOS, если он включён;
  • версию WooCommerce и PHP.

Частая ошибка — тестовый ключ в боевом режиме или боевой ключ в тестовом режиме. Внешне оплата может открываться, но подтверждение не будет обработано корректно.

8. Проверьте, какой статус должен быть после оплаты

Не каждый оплаченный заказ должен автоматически становиться “Выполнен”. В стандартной логике WooCommerce:

  • Processing / Обработка — оплата получена, но заказ ещё нужно выполнить;
  • Completed / Выполнен — заказ полностью выполнен, часто используется для виртуальных или загружаемых товаров;
  • On hold / На удержании — нужна ручная проверка, подтверждение или ожидание;
  • Pending payment / Ожидается оплата — заказ создан, но WooCommerce не подтвердил оплату.

Если вы продаёте физические товары, нормальный статус после успешной оплаты чаще всего “Обработка”, а не “Выполнен”.

9. Проверьте PHP-ошибки

Если callback приходит, но статус не меняется, включите debug.log и проверьте ошибки в момент тестовой оплаты.

Ищите:

  • PHP Fatal error;
  • Uncaught Error;
  • Allowed memory size exhausted;
  • Call to undefined function;
  • Class not found;
  • TypeError;
  • ошибки в файлах платёжного плагина;
  • ошибки в кастомном коде, который меняет статус заказа.

10. Проверьте кастомные хуки статусов

Если на сайте есть доработки, CRM-интеграция, Telegram-уведомления, складской учёт, кастомные статусы или автоматическая смена статуса, они могут перезаписывать результат платёжного плагина.

Проверьте код, который использует хуки:

  • woocommerce_payment_complete
  • woocommerce_order_status_changed
  • woocommerce_thankyou
  • woocommerce_checkout_order_processed
  • woocommerce_api_*
  • rest_api_init

Код

Важно: код ниже предназначен для диагностики. Он может влиять на логи, статусы заказов, checkout, оплату, письма и интеграции. Перед вставкой сделайте резервную копию. Лучше добавлять код в отдельный мини-плагин, а не в активную тему.

Включить debug.log в wp-config.php

Куда вставлять: файл wp-config.php, перед строкой /* That's all, stop editing! */.

define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
@ini_set('display_errors', 0);

Логировать факт успешной оплаты WooCommerce

Куда вставлять: отдельный мини-плагин или functions.php дочерней темы. Этот код не меняет статус, а только пишет в лог, сработал ли хук оплаты.

add_action('woocommerce_payment_complete', function ($order_id) {
    if (!function_exists('wc_get_logger')) {
        return;
    }

    $order = wc_get_order($order_id);

    if (!$order) {
        return;
    }

    wc_get_logger()->info(
        'Payment complete hook fired. Order ID: ' . $order_id . ', status: ' . $order->get_status() . ', payment method: ' . $order->get_payment_method(),
        array(
            'source' => 'custom-payment-status-debug',
        )
    );
});

Логировать изменение статуса заказа

Куда смотреть результат: WooCommerce → Статус → Журналы → custom-payment-status-debug.

add_action('woocommerce_order_status_changed', function ($order_id, $old_status, $new_status, $order) {
    if (!function_exists('wc_get_logger')) {
        return;
    }

    wc_get_logger()->info(
        'Order status changed. Order ID: ' . $order_id . ', from: ' . $old_status . ', to: ' . $new_status . ', payment method: ' . $order->get_payment_method(),
        array(
            'source' => 'custom-payment-status-debug',
        )
    );
}, 10, 4);

Логировать callback-запросы грубо через init

Важно: этот код пишет только факт входящего запроса с параметрами в URL. Не логируйте секретные ключи, подписи и персональные данные клиентов. Используйте временно для диагностики и удалите после проверки.

add_action('init', function () {
    if (!function_exists('wc_get_logger')) {
        return;
    }

    $request_uri = isset($_SERVER['REQUEST_URI']) ? sanitize_text_field(wp_unslash($_SERVER['REQUEST_URI'])) : '';

    if (
        strpos($request_uri, 'callback') === false
        && strpos($request_uri, 'webhook') === false
        && strpos($request_uri, 'wc-api') === false
        && strpos($request_uri, 'wc_ajax') === false
        && strpos($request_uri, 'wc-ajax') === false
    ) {
        return;
    }

    wc_get_logger()->info(
        'Possible payment callback request: ' . $request_uri,
        array(
            'source' => 'custom-payment-status-debug',
        )
    );
});

Не используйте слепую принудительную смену статуса

Важно: не стоит автоматически переводить все заказы из pending в processing без проверки факта оплаты. Это может создать оплаченные “на бумаге” заказы, хотя денег не было.

Неправильный подход:

// Плохая идея: так нельзя делать без проверки платежа.
add_action('woocommerce_thankyou', function ($order_id) {
    $order = wc_get_order($order_id);

    if ($order && $order->has_status('pending')) {
        $order->update_status('processing');
    }
});

Статус можно менять кодом только после проверки подписи, суммы, валюты, order_id, payment_id и реального статуса транзакции в платёжной системе.

Результат

После диагностики должно стать понятно, где именно ломается смена статуса:

  • платёжная система не отправляет callback;
  • callback отправляется на неправильный URL;
  • сайт блокирует callback через WAF, Cloudflare или security-плагин;
  • callback приходит, но подпись не проходит проверку;
  • callback получает 403, 404, 500 или timeout;
  • плагин оплаты падает с PHP-ошибкой;
  • заказ уже отменён до прихода подтверждения;
  • платёжный плагин несовместим с WooCommerce, PHP или HPOS;
  • кастомный код перезаписывает статус после оплаты;
  • статус меняется, но не на тот, который ожидает владелец магазина.

Правильный результат — клиент оплачивает заказ, платёжная система подтверждает оплату, WooCommerce получает подтверждение, заказ переходит в нужный статус, письма отправляются, а в примечаниях заказа и логах видно, что произошло.

Дополнительные способы

Если заказ остаётся “Ожидается оплата”

Проверьте callback/webhook. Это самый частый сценарий: заказ создан, покупатель оплатил, но сайт не получил подтверждение.

Проверьте:

  • URL callback в кабинете платёжной системы;
  • ответ сервера на callback;
  • логи платёжного шлюза;
  • SSL;
  • WAF/Cloudflare;
  • ошибки подписи;
  • совпадение суммы и валюты.

Если заказ переходит в “На удержании”

Иногда это нормальное поведение, если плагин не уверен в платеже или ждёт ручного подтверждения. Проверьте настройки платёжного модуля и статус транзакции в кабинете платёжной системы.

Если заказ сразу становится “Выполнен”

Для виртуальных и загружаемых товаров это может быть ожидаемо. Для физических товаров чаще нужен статус “Обработка”. Проверьте тип товаров, настройки плагина оплаты и код автозавершения заказов.

Если статус меняется только вручную

Это значит, что WooCommerce может менять статус, но автоматический сигнал оплаты не работает. Проверяйте callback, webhook, cron, логи оплаты и хуки платёжного плагина.

Если проблема появилась после обновления

Проверьте, что обновлялось: WooCommerce, платёжный модуль, тема, PHP, security-плагин, кеш или Cloudflare rules. После обновлений часто ломаются старые callback endpoints, шаблоны, hooks или совместимость с HPOS.

Если проблема только у одного способа оплаты

Если банковский перевод работает, а LiqPay / WayForPay / другой шлюз не меняет статус, причина почти точно в конкретном платёжном модуле или его callback-настройках.

Если статус меняется, но письма не отправляются

Проверьте настройки писем WooCommerce, SMTP, wp_mail(), статус заказа, email-шаблоны, спам, SPF, DKIM и DMARC. Письма зависят не только от оплаты, но и от статуса, на который перешёл заказ.

Частые ошибки

  • Менять статусы вручную и не искать причину. Новые заказы продолжат зависать.
  • Принудительно переводить все заказы в “Обработка”. Так можно подтвердить неоплаченные заказы.
  • Проверять только WooCommerce, но не кабинет платёжной системы. Нужно сверить статус транзакции на стороне оплаты.
  • Игнорировать order notes. В примечаниях заказа часто видно, что происходило с оплатой.
  • Не смотреть WooCommerce logs. Платёжный плагин может писать точную ошибку в журнал.
  • Не проверять WAF и Cloudflare. Callback может блокироваться до попадания в WordPress.
  • Кешировать callback или checkout. Динамические URL оплаты нельзя обрабатывать как обычные страницы.
  • Путать “Обработка” и “Выполнен”. Оплаченный физический товар обычно не должен сразу становиться выполненным.
  • Использовать старый платёжный плагин. Он может быть несовместим с новой версией WooCommerce, PHP или HPOS.
  • Не делать тестовый заказ после исправления. Нужно проверить всю цепочку: заказ, оплата, callback, статус, письма.

Диагностика проблем

Чеклист: WooCommerce не меняет статус после оплаты

  1. Откройте заказ и проверьте текущий статус.
  2. Проверьте примечания заказа.
  3. Проверьте статус транзакции в кабинете платёжной системы.
  4. Проверьте WooCommerce → Статус → Журналы.
  5. Проверьте callback/webhook URL.
  6. Проверьте, получает ли callback ответ 200.
  7. Проверьте SSL и редиректы HTTPS.
  8. Проверьте WAF, ModSecurity, Cloudflare и security-плагины.
  9. Проверьте кеш checkout, cart, payment return и webhook URL.
  10. Проверьте debug.log и error_log хостинга.
  11. Проверьте настройки payment gateway: ключи, режим, валюту, подпись, статусы.
  12. Проверьте совместимость плагина оплаты с WooCommerce, PHP и HPOS.
  13. Проверьте кастомный код, который меняет статусы заказов.
  14. Сделайте тестовую оплату минимальной суммой.
  15. Проверьте: статус заказа, письма, логи, примечания, возврат клиента после оплаты.

Что смотреть в логах

  • invalid signature — подпись callback не прошла проверку;
  • order not found — платёжный плагин не нашёл заказ по ID;
  • amount mismatch — сумма в заказе и платеже не совпадает;
  • currency mismatch — валюта заказа и платежа не совпадает;
  • payment pending — платёж ещё не подтверждён;
  • webhook failed — webhook не обработался;
  • HTTP 403 — callback заблокирован;
  • HTTP 404 — callback URL неправильный или endpoint не найден;
  • HTTP 500 — PHP или серверная ошибка при обработке;
  • timeout — сайт слишком долго отвечает платёжной системе.

Как проверить, дошёл ли callback

  • Сравните время оплаты в кабинете платёжной системы и время записей в логах WooCommerce.
  • Проверьте access log хостинга по callback URL.
  • Проверьте Cloudflare Firewall Events.
  • Проверьте ModSecurity logs.
  • Проверьте WooCommerce logs по названию платёжного плагина.
  • Проверьте примечания заказа.
  • Сделайте тестовый платёж и смотрите логи в момент оплаты.

FAQ

Почему WooCommerce не меняет статус заказа после оплаты?

Чаще всего сайт не получил или не обработал callback/webhook от платёжной системы. Также возможны ошибка подписи, WAF, SSL, кеш, PHP-ошибка, неверные ключи, несовместимый платёжный плагин или кастомный код статусов.

Какой статус должен быть у заказа после успешной оплаты?

Для физических товаров обычно “Обработка”. Для виртуальных или загружаемых товаров заказ может переходить в “Выполнен”. Если нужна ручная проверка, возможен статус “На удержании”.

Почему заказ остаётся в статусе “Ожидается оплата”?

Это обычно значит, что WooCommerce создал заказ, но не получил подтверждение оплаты. Проверяйте callback/webhook, логи платёжной системы, SSL, WAF, Cloudflare и настройки платёжного плагина.

Почему деньги списались, а заказ не изменился?

Платёж мог пройти на стороне банка или платёжного сервиса, но сайт не получил callback. Нужно сверить транзакцию в кабинете платёжной системы и логи WooCommerce.

Можно ли просто вручную сменить статус заказа?

Можно для одного заказа, если вы уверены, что платёж реально прошёл. Но это не исправляет автоматическую смену статусов. Новые заказы могут снова зависать.

Можно ли автоматически переводить все заказы в “Обработка”?

Нельзя делать это без проверки оплаты. Иначе WooCommerce будет считать неоплаченные заказы оплаченными. Автоматическая смена статуса должна происходить только после подтверждения транзакции.

Почему callback получает 403?

Чаще всего его блокирует WAF, ModSecurity, Cloudflare, security-плагин, IP-блокировка или country block. Нужно смотреть firewall logs и добавлять точное исключение, а не отключать защиту полностью.

Почему callback получает 500?

Причина может быть в PHP fatal error, несовместимом платёжном плагине, нехватке памяти, ошибке темы или кастомном коде. Проверьте debug.log и error_log хостинга.

Почему после оплаты заказ становится “На удержании”?

Платёжный плагин может ставить этот статус, если оплата требует подтверждения, есть риск, сумма не совпала или настройки шлюза выбраны неправильно. Проверьте статус транзакции и настройки плагина.

Почему статус меняется, но письмо не приходит?

Проверьте настройки писем WooCommerce, SMTP, wp_mail(), статус заказа, спам, DNS-записи SPF/DKIM/DMARC и логи отправки писем.

Что делать, если проблема только с LiqPay или WayForPay?

Проверьте server_url/serviceUrl, ключи, подпись, тестовый/боевой режим, SSL, callback URL, WAF, Cloudflare и логи платёжного модуля.

Может ли кеш мешать смене статуса заказа?

Да. Checkout, cart, my-account, payment return, callback/webhook и AJAX/REST endpoints нельзя кешировать как обычные страницы. Кеш может ломать сессии и обработку оплаты.

Вывод

Если WooCommerce не меняет статус заказа после оплаты, почти всегда нужно проверять не сам статус, а путь подтверждения оплаты: платёжная система → callback/webhook → сервер → платёжный плагин → WooCommerce order status → письма и интеграции.

Безопасный порядок такой: открыть заказ, проверить примечания, сверить транзакцию в кабинете оплаты, посмотреть WooCommerce logs, проверить callback URL, SSL, WAF, Cloudflare, кеш, debug.log, настройки платёжного плагина и кастомный код. Так можно исправить автоматическую смену статуса и не подтверждать неоплаченные заказы вручную.

Об авторе

vkuzyomko administrator