Краткий ответ: если 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 или нет. Если отправила — нужно понять, почему сайт его не обработал. Если не отправила — нужно исправлять настройки на стороне платёжной системы.
Откройте проблемный заказ в WooCommerce и посмотрите блок примечаний.
Ищите такие записи:
Если в примечаниях вообще нет следов callback/webhook, WooCommerce мог не получить запрос от платёжной системы.
Откройте:
WooCommerce → Статус → Журналы
Выберите лог платёжного шлюза. Название зависит от плагина: Stripe, PayPal, LiqPay, WayForPay, Fondy, Portmone, Mono, Plata by mono или другой модуль.
В логах ищите:
В кабинете платёжного сервиса обычно есть история webhook/callback. Там видно, пыталась ли система отправить подтверждение на сайт и какой ответ получила.
Проверьте:
Очень частая причина — неправильный callback URL. Иногда в настройках указан старый домен, http вместо https, тестовый URL, закрытый URL staging-сайта или адрес с редиректом.
Callback/webhook URL должен:
Checkout, cart, my-account, wc-ajax, order-received и callback URL нельзя кешировать как обычные страницы. Если кеш вмешивается в оплату, WooCommerce может не получить актуальные данные заказа.
Исключите из кеша:
Callback от платёжной системы часто приходит как POST-запрос с подписью, JSON, токеном или техническими параметрами. WAF может ошибочно принять такой запрос за атаку.
Проверьте:
Если не хотите рисковать сайтом и тратить время на эксперименты, можно оставить заявку. Я посмотрю задачу и предложу аккуратное решение.
Решение зависит от того, где именно ломается смена статуса. Не нужно сразу писать код, который принудительно переводит все оплаченные заказы в Completed. Сначала нужно восстановить нормальную связь между платёжной системой и WooCommerce.
Откройте:
WooCommerce → Настройки → Платежи
Проверьте активный способ оплаты:
Если платёжная система пишет, что webhook не доставлен, сначала исправьте URL и доступность.
Не каждый оплаченный заказ должен становиться Completed. В WooCommerce обычно:
Для цифровых товаров некоторые магазины переводят заказ в Completed автоматически. Для физических товаров чаще нормально, что после оплаты заказ становится Processing, а не Completed.
Если callback приходит, но WooCommerce не меняет статус, возможно, обработчик падает с PHP Fatal error.
Включите debug.log и повторите тестовую оплату. После этого проверьте:
/wp-content/debug.log
Особенно важны ошибки в файлах платёжного плагина, темы, кастомных сниппетов и WooCommerce hooks.
Некоторые плагины оплаты или интеграции используют отложенные задачи. Если Action Scheduler не выполняется, статус может не обновляться или внешние системы не получают информацию.
Откройте:
WooCommerce → Статус → Запланированные действия
Проверьте:
Если статус перестал меняться после обновления, установки нового плагина или изменения темы, лучше тестировать на staging-копии.
Если готовый платёжный плагин не подходит под вашу логику или конфликтует с процессом магазина, может понадобиться отдельная доработка WooCommerce.
Важно: код ниже предназначен для диагностики. Он может повлиять на заказы, оплату, статусы, письма, интеграции, склад, CRM и отчёты. Перед изменениями сделайте backup. Не ставьте принудительную смену статуса на все заказы без проверки платёжного подтверждения.
Куда вставлять: файл 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
Этот код помогает понять, вызывает ли платёжный шлюз стандартное событие завершения оплаты.
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')
);
});
Куда выполнять: SSH в корне сайта. Замените 123 на ID заказа.
wp post get 123 --field=post_status
wp post meta list 123
Ищите поля платёжного метода, transaction ID, response code, gateway status и payment token. Не меняйте эти данные вручную без понимания логики шлюза.
Куда выполнять: WP-CLI, если доступна команда Action Scheduler.
wp action-scheduler list --status=failed
Проверяйте только доступность URL. Не имитируйте реальный callback без документации платёжной системы.
curl -I https://example.com/wc-api/payment-callback/
Если ответ 403, 404, 500, 502, 504 или длинный редирект — платёжная система может не передать статус заказа в WooCommerce.
После исправления WooCommerce должен получать подтверждение оплаты, правильно обрабатывать callback/webhook и менять статус заказа по логике магазина.
Хороший результат:
Некоторые сайты используют плагины автоматизации, CRM, склад, Telegram-уведомления или кастомные snippets, которые меняют статус заказа. Проверьте, не перезаписывает ли другой код статус после оплаты.
Иногда статус меняется правильно, но владелец думает, что заказ не оплачен, потому что письмо не пришло. Тогда нужно проверять SMTP, email logs и настройки писем WooCommerce.
Для виртуальных и скачиваемых товаров логика статуса может отличаться от физических товаров. Важно понимать, какой статус нужен бизнесу: Processing или Completed.
Если проблема есть только у одного шлюза, значит причина скорее в его настройках, webhook, ключах или плагине. Если проблема у всех шлюзов — проверьте checkout, кеш, WAF, WooCommerce и сервер.
Если после оплаты заказ должен уходить в CRM, важно проверять не только статус WooCommerce, но и обработку webhook внутри интеграции. Для таких задач может быть полезна отдельная статья про интеграцию WooCommerce с CRM.
Это опасно. Для физических товаров после оплаты обычно нужен Processing, а Completed ставится после выполнения заказа.
Точная причина часто видна именно на стороне платёжного сервиса: webhook failed, timeout, invalid signature, SSL error, 403 или 500.
Callback/webhook должен обрабатываться динамически. Кеш может помешать обновлению статуса заказа.
Если firewall блокирует POST-запросы платёжной системы, WooCommerce не узнает об успешной оплате.
Processing часто означает, что заказ оплачен и ждёт обработки. Completed означает, что заказ выполнен.
Оплату нужно проверять как обычный клиент: инкогнито, реальная корзина, тестовый платёж, обычные cookies и стандартный checkout.
Примечания заказа часто показывают, какой статус был, какой стал и почему платёжный плагин не смог завершить обработку.
Возможная причина: WooCommerce не получил подтверждение оплаты от платёжной системы.
Что делать: проверить webhook/callback, order notes, WooCommerce logs, кабинет платёжной системы, WAF, SSL и кеш.
Возможная причина: метод оплаты ожидает ручное подтверждение или платёжный шлюз не считает платёж завершённым.
Что делать: проверить настройки шлюза, order notes, transaction status и правила смены статуса.
Возможная причина: ошибка подписи, суммы, валюты, transaction ID или API-ответа.
Что делать: сверить сумму, валюту, ключи, merchant ID, подпись и логи платёжного сервиса.
Возможная причина: запрос блокирует WAF, Cloudflare, ModSecurity, security-плагин или firewall.
Что делать: найти событие блокировки по времени оплаты и сделать точечное исключение для callback URL.
Возможная причина: 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.
Возможная причина: WooCommerce работает правильно, но интеграция с CRM не реагирует на нужный статус.
Что делать: проверить webhook CRM, условия отправки, логи интеграции и статус, на который подписана интеграция.
Чаще всего WooCommerce не получил или не обработал callback/webhook от платёжной системы. Также возможны кеш, WAF, SSL, ошибка подписи, PHP Fatal error, неверные ключи, несовпадение суммы или конфликт плагинов.
Откройте заказ, проверьте order notes, WooCommerce logs, кабинет платёжной системы, callback/webhook URL, статус транзакции, WAF, SSL и debug.log.
Pending payment означает, что заказ создан, но WooCommerce ещё не получил подтверждение оплаты или не смог его обработать.
Не всегда. Для физических товаров после оплаты обычно используется Processing. Completed чаще означает, что заказ уже выполнен.
Обычно WooCommerce не получил подтверждение от платёжного шлюза или не смог обработать callback/webhook. Проверьте логи, URL callback, SSL, WAF и настройки платёжного плагина.
Потому что Completed не всегда означает “оплачен”. Для физических товаров WooCommerce часто ставит Processing после оплаты, а Completed ставится после выполнения заказа.
Это статус, при котором заказ создан, но оплата ещё не подтверждена. Если деньги списались, а статус остался Pending payment, нужно проверять webhook/callback.
On hold часто означает, что заказ ожидает подтверждения. Это может быть нормально для некоторых способов оплаты, но для автоматических онлайн-платежей нужно проверить настройки шлюза.
Да. Checkout, cart, my-account, wc-ajax, callback и webhook URL нельзя кешировать как обычные страницы.
Да. 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 по реальной логике магазина.
Об авторе