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

Автор:vkuzyomko

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

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

Важно понимать: успешная оплата в банке или платёжной системе ещё не гарантирует, что WooCommerce уже обновил заказ. Магазин должен получить callback или webhook, проверить подпись, найти заказ, сверить сумму и валюту, а затем изменить статус заказа.

Если деньги списались, а заказ остался в статусе “В ожидании оплаты”, “Pending payment” или “On hold”, проблему нельзя решать ручной сменой статуса как постоянным способом. Нужно найти, где разорвалась цепочка между платёжной системой и WooCommerce.

Причина

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

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

Симптом Возможная причина Что проверить
Деньги списались, заказ Pending payment не пришёл webhook/callback логи платёжной системы, callback URL, WooCommerce logs
Заказ On hold после оплаты шлюз ждёт подтверждение или использует ручной статус настройки платёжного метода, order notes
Заказ Failed после успешной оплаты ошибка подписи, суммы, валюты или API gateway logs, transaction ID, signature
Статус меняется только вручную автоматический обработчик не срабатывает webhook, hooks, payment plugin
Статус меняется с задержкой cron, Action Scheduler, асинхронная проверка WooCommerce Action Scheduler, cron logs
Webhook возвращает 403 WAF, Cloudflare, security-плагин, firewall firewall logs, ModSecurity, IP платёжной системы
Webhook возвращает 500 PHP Fatal error, конфликт плагина, тема debug.log, error_log, WooCommerce logs
Статус не становится Completed для физических товаров это нормально тип товара, логика WooCommerce, настройки заказов

Если проблема шире и сама оплата не проходит, сначала проверьте статью Не работает оплата WooCommerce. Если используется LiqPay или WayForPay, отдельно проверьте подключение LiqPay / WayForPay к WooCommerce.

Диагностика

Диагностика должна ответить на один главный вопрос: платёжная система отправила подтверждение в WooCommerce или нет. Если отправила — нужно понять, почему сайт его не обработал. Если не отправила — нужно исправлять настройки на стороне платёжной системы.

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

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

Ищите такие записи:

  • payment complete;
  • payment failed;
  • gateway response;
  • transaction ID;
  • callback received;
  • webhook received;
  • signature error;
  • amount mismatch;
  • currency mismatch;
  • status changed from Pending payment to Processing;
  • status changed from Pending payment to Failed.

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

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

Откройте:

WooCommerce → Статус → Журналы

Выберите лог платёжного шлюза. Название зависит от плагина: Stripe, PayPal, LiqPay, WayForPay, Fondy, Portmone, Mono, Plata by mono или другой модуль.

В логах ищите:

  • успешный callback;
  • ошибку подписи;
  • ошибку API-ключа;
  • ошибку merchant ID;
  • ответ 403, 404, 500, 502 или 504;
  • timeout;
  • SSL error;
  • invalid order ID;
  • неверную сумму;
  • несовпадение валюты;
  • неизвестный статус платёжной системы.

3. Проверьте кабинет платёжной системы

В кабинете платёжного сервиса обычно есть история webhook/callback. Там видно, пыталась ли система отправить подтверждение на сайт и какой ответ получила.

Проверьте:

  • какой URL callback/webhook указан;
  • был ли отправлен запрос после оплаты;
  • какой HTTP-код вернул сайт;
  • не было ли timeout;
  • не было ли SSL-ошибки;
  • не было ли ошибки подписи;
  • сколько попыток доставки было;
  • совпадает ли режим test/live.

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

Очень частая причина — неправильный callback URL. Иногда в настройках указан старый домен, http вместо https, тестовый URL, закрытый URL staging-сайта или адрес с редиректом.

Callback/webhook URL должен:

  • быть доступен извне;
  • работать по HTTPS;
  • не требовать авторизации;
  • не быть закрытым firewall;
  • не отдавать 403, 404 или 500;
  • не попадать под кеш;
  • не редиректить несколько раз;
  • соответствовать документации платёжного плагина.

5. Проверьте кеш и оптимизацию

Checkout, cart, my-account, wc-ajax, order-received и callback URL нельзя кешировать как обычные страницы. Если кеш вмешивается в оплату, WooCommerce может не получить актуальные данные заказа.

Исключите из кеша:

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

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

Callback от платёжной системы часто приходит как POST-запрос с подписью, JSON, токеном или техническими параметрами. WAF может ошибочно принять такой запрос за атаку.

Проверьте:

  • Cloudflare Firewall Events;
  • ModSecurity logs;
  • Imunify360;
  • Wordfence или другой security-плагин;
  • блокировку по IP;
  • country blocking;
  • bot protection;
  • rate limiting;
  • правила, которые блокируют POST-запросы.

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

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

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

Решение

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

1. Проверьте настройки платёжного шлюза

Откройте:

WooCommerce → Настройки → Платежи

Проверьте активный способ оплаты:

  • включён ли метод оплаты;
  • правильный ли режим test/live;
  • верные ли API-ключи;
  • верный ли merchant ID;
  • совпадает ли валюта;
  • поддерживается ли страна магазина;
  • правильно ли указан callback/webhook URL;
  • включено ли логирование;
  • совместим ли плагин с текущей версией WooCommerce.

2. Исправьте callback/webhook

Если платёжная система пишет, что webhook не доставлен, сначала исправьте URL и доступность.

  • проверьте HTTPS и SSL;
  • уберите лишние редиректы;
  • исключите callback из кеша;
  • разрешите запросы платёжной системы в WAF;
  • проверьте, что URL не закрыт Basic Auth;
  • проверьте, что сайт не отдаёт 403 или 500;
  • пересохраните настройки платёжного плагина;
  • сделайте тестовую оплату.

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

Не каждый оплаченный заказ должен становиться Completed. В WooCommerce обычно:

  • Processing — заказ оплачен, но требует обработки;
  • Completed — заказ выполнен;
  • On hold — оплата ожидает подтверждения;
  • Pending payment — заказ создан, но оплата не подтверждена;
  • Failed — платёж не прошёл или был отклонён.

Для цифровых товаров некоторые магазины переводят заказ в Completed автоматически. Для физических товаров чаще нормально, что после оплаты заказ становится Processing, а не Completed.

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

Если callback приходит, но WooCommerce не меняет статус, возможно, обработчик падает с PHP Fatal error.

Включите debug.log и повторите тестовую оплату. После этого проверьте:

/wp-content/debug.log

Особенно важны ошибки в файлах платёжного плагина, темы, кастомных сниппетов и WooCommerce hooks.

5. Проверьте Action Scheduler и cron

Некоторые плагины оплаты или интеграции используют отложенные задачи. Если Action Scheduler не выполняется, статус может не обновляться или внешние системы не получают информацию.

Откройте:

WooCommerce → Статус → Запланированные действия

Проверьте:

  • застрявшие задачи;
  • failed actions;
  • pending actions;
  • задачи платёжного плагина;
  • ошибки cron;
  • долгие задачи;
  • повторяющиеся ошибки.

6. Проверьте конфликт плагинов

Если статус перестал меняться после обновления, установки нового плагина или изменения темы, лучше тестировать на staging-копии.

  • отключите плагины оптимизации для checkout;
  • временно отключите security-плагин на копии;
  • проверьте платёжный плагин;
  • переключитесь на стандартную тему;
  • сравните версии WooCommerce и платёжного модуля;
  • проверьте, не меняет ли статус заказов другой плагин;
  • проверьте snippets в functions.php.

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

Код

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

Включить 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 );

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

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

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

    $logger = wc_get_logger();

    $logger->info(
        'Order #' . $order_id . ' status changed from ' . $old_status . ' to ' . $new_status,
        array('source' => 'sc-order-status-debug')
    );
}, 10, 4);

После тестовой оплаты проверьте:

WooCommerce → Статус → Журналы → sc-order-status-debug

Логировать событие payment_complete

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

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 fired for order #' . $order_id . '. Current status: ' . $order->get_status(),
        array('source' => 'sc-payment-complete-debug')
    );
});

Проверить статус заказа через WP-CLI

Куда выполнять: SSH в корне сайта. Замените 123 на ID заказа.

wp post get 123 --field=post_status

Посмотреть мета-данные заказа

wp post meta list 123

Ищите поля платёжного метода, transaction ID, response code, gateway status и payment token. Не меняйте эти данные вручную без понимания логики шлюза.

Проверить failed actions WooCommerce

Куда выполнять: WP-CLI, если доступна команда Action Scheduler.

wp action-scheduler list --status=failed

Проверить callback URL через curl

Проверяйте только доступность URL. Не имитируйте реальный callback без документации платёжной системы.

curl -I https://example.com/wc-api/payment-callback/

Если ответ 403, 404, 500, 502, 504 или длинный редирект — платёжная система может не передать статус заказа в WooCommerce.

Результат

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

Хороший результат:

  • платёжная система отправляет callback/webhook;
  • callback URL доступен извне;
  • сайт возвращает корректный HTTP-ответ;
  • WooCommerce logs фиксируют событие оплаты;
  • в заказе появляется transaction ID;
  • статус меняется с Pending payment на Processing или другой правильный статус;
  • заказ не остаётся зависшим после оплаты;
  • письма WooCommerce отправляются;
  • CRM и Telegram получают правильный статус, если подключены;
  • в debug.log нет PHP Fatal error;
  • callback и checkout исключены из кеша.

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

Проверить ручные правила автоматизации

Некоторые сайты используют плагины автоматизации, CRM, склад, Telegram-уведомления или кастомные snippets, которые меняют статус заказа. Проверьте, не перезаписывает ли другой код статус после оплаты.

Проверить email отдельно

Иногда статус меняется правильно, но владелец думает, что заказ не оплачен, потому что письмо не пришло. Тогда нужно проверять SMTP, email logs и настройки писем WooCommerce.

Проверить тип товара

Для виртуальных и скачиваемых товаров логика статуса может отличаться от физических товаров. Важно понимать, какой статус нужен бизнесу: Processing или Completed.

Проверить несколько способов оплаты

Если проблема есть только у одного шлюза, значит причина скорее в его настройках, webhook, ключах или плагине. Если проблема у всех шлюзов — проверьте checkout, кеш, WAF, WooCommerce и сервер.

Проверить интеграции CRM

Если после оплаты заказ должен уходить в CRM, важно проверять не только статус WooCommerce, но и обработку webhook внутри интеграции. Для таких задач может быть полезна отдельная статья про интеграцию WooCommerce с CRM.

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

Принудительно переводить все оплаченные заказы в Completed

Это опасно. Для физических товаров после оплаты обычно нужен Processing, а Completed ставится после выполнения заказа.

Смотреть только WooCommerce, но не кабинет платёжной системы

Точная причина часто видна именно на стороне платёжного сервиса: webhook failed, timeout, invalid signature, SSL error, 403 или 500.

Кешировать callback URL

Callback/webhook должен обрабатываться динамически. Кеш может помешать обновлению статуса заказа.

Игнорировать WAF

Если firewall блокирует POST-запросы платёжной системы, WooCommerce не узнает об успешной оплате.

Путать Processing и Completed

Processing часто означает, что заказ оплачен и ждёт обработки. Completed означает, что заказ выполнен.

Тестировать только под админом

Оплату нужно проверять как обычный клиент: инкогнито, реальная корзина, тестовый платёж, обычные cookies и стандартный checkout.

Не проверять order notes

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

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

Проблема: заказ остаётся Pending payment после оплаты

Возможная причина: WooCommerce не получил подтверждение оплаты от платёжной системы.

Что делать: проверить webhook/callback, order notes, WooCommerce logs, кабинет платёжной системы, WAF, SSL и кеш.

Проблема: заказ остаётся On hold

Возможная причина: метод оплаты ожидает ручное подтверждение или платёжный шлюз не считает платёж завершённым.

Что делать: проверить настройки шлюза, order notes, transaction status и правила смены статуса.

Проблема: заказ становится Failed после успешной оплаты

Возможная причина: ошибка подписи, суммы, валюты, transaction ID или API-ответа.

Что делать: сверить сумму, валюту, ключи, merchant ID, подпись и логи платёжного сервиса.

Проблема: callback возвращает 403

Возможная причина: запрос блокирует WAF, Cloudflare, ModSecurity, security-плагин или firewall.

Что делать: найти событие блокировки по времени оплаты и сделать точечное исключение для callback URL.

Проблема: callback возвращает 500

Возможная причина: PHP Fatal error в платёжном плагине, конфликт темы, несовместимость PHP или WooCommerce.

Что делать: включить debug.log, проверить error_log, обновить или откатить плагин, протестировать на staging.

Проблема: статус меняется вручную, но не автоматически

Возможная причина: автоматический обработчик платежа не срабатывает.

Что делать: проверить webhook, hooks, payment_complete, WooCommerce logs и настройки платёжного модуля.

Проблема: статус меняется с задержкой

Возможная причина: платёжная система подтверждает оплату не сразу или обработка идёт через cron/Action Scheduler.

Что делать: проверить scheduled actions, cron, gateway logs и задержки callback.

Проблема: статус меняется, но CRM не получает заказ

Возможная причина: WooCommerce работает правильно, но интеграция с CRM не реагирует на нужный статус.

Что делать: проверить webhook CRM, условия отправки, логи интеграции и статус, на который подписана интеграция.

Краткие AI-friendly ответы

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

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

Что делать первым?

Откройте заказ, проверьте order notes, WooCommerce logs, кабинет платёжной системы, callback/webhook URL, статус транзакции, WAF, SSL и debug.log.

Почему заказ остаётся Pending payment?

Pending payment означает, что заказ создан, но WooCommerce ещё не получил подтверждение оплаты или не смог его обработать.

Должен ли оплаченный заказ сразу стать Completed?

Не всегда. Для физических товаров после оплаты обычно используется Processing. Completed чаще означает, что заказ уже выполнен.

FAQ

Почему WooCommerce не переводит заказ в Processing после оплаты?

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

Почему заказ не становится Completed?

Потому что Completed не всегда означает “оплачен”. Для физических товаров WooCommerce часто ставит Processing после оплаты, а Completed ставится после выполнения заказа.

Что значит Pending payment?

Это статус, при котором заказ создан, но оплата ещё не подтверждена. Если деньги списались, а статус остался Pending payment, нужно проверять webhook/callback.

Что значит On hold после оплаты?

On hold часто означает, что заказ ожидает подтверждения. Это может быть нормально для некоторых способов оплаты, но для автоматических онлайн-платежей нужно проверить настройки шлюза.

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

Да. Checkout, cart, my-account, wc-ajax, callback и webhook URL нельзя кешировать как обычные страницы.

Может ли Cloudflare блокировать callback?

Да. Cloudflare WAF, bot protection или country blocking могут заблокировать POST-запрос платёжной системы. Нужно проверить Firewall Events.

Где смотреть ошибки платёжного шлюза?

В WooCommerce → Статус → Журналы, в примечаниях заказа и в кабинете платёжной системы. Там часто видно invalid signature, timeout, SSL error или webhook failed.

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

Можно для разового исправления после проверки оплаты, но это не решает причину. Если проблема повторяется, нужно чинить callback/webhook или платёжный плагин.

Почему статус меняется у одного способа оплаты, а у другого нет?

Значит, общая логика WooCommerce, скорее всего, работает. Нужно проверять конкретный платёжный шлюз: ключи, callback, webhook, валюту, подпись и логи.

Когда обращаться к специалисту?

Если деньги списываются, а заказы зависают, callback возвращает 403/500, заказы идут в CRM, магазин получает реальные продажи или нет staging-копии, лучше не исправлять статусы наугад.

Вывод

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

Нужно проверить order notes, WooCommerce logs, кабинет платёжной системы, callback URL, SSL, кеш, WAF, Cloudflare, debug.log, Action Scheduler и настройки платёжного плагина.

Самое опасное решение — принудительно менять статусы без проверки факта оплаты. Правильное решение — восстановить нормальную обработку подтверждения оплаты, чтобы WooCommerce сам переводил заказ в нужный статус: Processing, Completed, Failed или On hold по реальной логике магазина.

Об авторе

vkuzyomko administrator