Краткий ответ: если 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 платёжного плагина.
Если этот запрос не дошёл, был заблокирован или обработался с ошибкой, заказ остаётся в старом статусе.
Самые частые причины:
on-hold, completed или кастомный статус вместо processing;Начинать нужно не с ручной смены статуса, а с проверки цепочки: заказ создан → клиент оплатил → платёжная система отправила 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 | настройки шлюза, кабинет платёжной системы, логи |
wp-content/debug.log?Если не хотите рисковать сайтом и тратить время на эксперименты, можно оставить заявку. Я посмотрю задачу и предложу аккуратное решение.
Исправление зависит от того, где ломается цепочка. Если просто вручную менять статус каждого заказа, проблема останется и будет повторяться.
Откройте заказ в 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.В кабинете платёжной системы должен быть указан правильный URL сайта. В зависимости от плагина это может быть:
admin-ajax.php action;Ошибки часто появляются после смены домена, перехода на HTTPS, переноса сайта, включения Cloudflare или изменения структуры постоянных ссылок.
Платёжная система должна иметь возможность открыть callback URL по HTTPS. Проверьте:
Если callback получает 403 или вообще не доходит до WooCommerce, проверьте защиту.
Чаще всего блокируют:
Не отключайте защиту полностью навсегда. Лучше найти конкретное правило и добавить безопасное исключение для callback URL или IP платёжной системы, если это поддерживается.
Кеш не должен вмешиваться в оформление заказа и подтверждение оплаты.
Исключите:
/cart//checkout//my-account/?wc-ajax=*Проверьте плагин кеша, серверный кеш, Object Cache, CDN, Cloudflare и минификацию JS. Иногда платёж прошёл, но сайт отдаёт старую кешированную страницу и кажется, что статус не изменился.
Проверьте:
Частая ошибка — тестовый ключ в боевом режиме или боевой ключ в тестовом режиме. Внешне оплата может открываться, но подтверждение не будет обработано корректно.
Не каждый оплаченный заказ должен автоматически становиться “Выполнен”. В стандартной логике WooCommerce:
Если вы продаёте физические товары, нормальный статус после успешной оплаты чаще всего “Обработка”, а не “Выполнен”.
Если callback приходит, но статус не меняется, включите debug.log и проверьте ошибки в момент тестовой оплаты.
Ищите:
PHP Fatal error;Uncaught Error;Allowed memory size exhausted;Call to undefined function;Class not found;TypeError;Если на сайте есть доработки, CRM-интеграция, Telegram-уведомления, складской учёт, кастомные статусы или автоматическая смена статуса, они могут перезаписывать результат платёжного плагина.
Проверьте код, который использует хуки:
woocommerce_payment_completewoocommerce_order_status_changedwoocommerce_thankyouwoocommerce_checkout_order_processedwoocommerce_api_*rest_api_initВажно: код ниже предназначен для диагностики. Он может влиять на логи, статусы заказов, checkout, оплату, письма и интеграции. Перед вставкой сделайте резервную копию. Лучше добавлять код в отдельный мини-плагин, а не в активную тему.
Куда вставлять: файл 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_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);
Важно: этот код пишет только факт входящего запроса с параметрами в 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 и реального статуса транзакции в платёжной системе.
После диагностики должно стать понятно, где именно ломается смена статуса:
Правильный результат — клиент оплачивает заказ, платёжная система подтверждает оплату, WooCommerce получает подтверждение, заказ переходит в нужный статус, письма отправляются, а в примечаниях заказа и логах видно, что произошло.
Проверьте callback/webhook. Это самый частый сценарий: заказ создан, покупатель оплатил, но сайт не получил подтверждение.
Проверьте:
Иногда это нормальное поведение, если плагин не уверен в платеже или ждёт ручного подтверждения. Проверьте настройки платёжного модуля и статус транзакции в кабинете платёжной системы.
Для виртуальных и загружаемых товаров это может быть ожидаемо. Для физических товаров чаще нужен статус “Обработка”. Проверьте тип товаров, настройки плагина оплаты и код автозавершения заказов.
Это значит, что WooCommerce может менять статус, но автоматический сигнал оплаты не работает. Проверяйте callback, webhook, cron, логи оплаты и хуки платёжного плагина.
Проверьте, что обновлялось: WooCommerce, платёжный модуль, тема, PHP, security-плагин, кеш или Cloudflare rules. После обновлений часто ломаются старые callback endpoints, шаблоны, hooks или совместимость с HPOS.
Если банковский перевод работает, а LiqPay / WayForPay / другой шлюз не меняет статус, причина почти точно в конкретном платёжном модуле или его callback-настройках.
Проверьте настройки писем WooCommerce, SMTP, wp_mail(), статус заказа, email-шаблоны, спам, SPF, DKIM и DMARC. Письма зависят не только от оплаты, но и от статуса, на который перешёл заказ.
debug.log и error_log хостинга.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/webhook от платёжной системы. Также возможны ошибка подписи, WAF, SSL, кеш, PHP-ошибка, неверные ключи, несовместимый платёжный плагин или кастомный код статусов.
Для физических товаров обычно “Обработка”. Для виртуальных или загружаемых товаров заказ может переходить в “Выполнен”. Если нужна ручная проверка, возможен статус “На удержании”.
Это обычно значит, что WooCommerce создал заказ, но не получил подтверждение оплаты. Проверяйте callback/webhook, логи платёжной системы, SSL, WAF, Cloudflare и настройки платёжного плагина.
Платёж мог пройти на стороне банка или платёжного сервиса, но сайт не получил callback. Нужно сверить транзакцию в кабинете платёжной системы и логи WooCommerce.
Можно для одного заказа, если вы уверены, что платёж реально прошёл. Но это не исправляет автоматическую смену статусов. Новые заказы могут снова зависать.
Нельзя делать это без проверки оплаты. Иначе WooCommerce будет считать неоплаченные заказы оплаченными. Автоматическая смена статуса должна происходить только после подтверждения транзакции.
Чаще всего его блокирует WAF, ModSecurity, Cloudflare, security-плагин, IP-блокировка или country block. Нужно смотреть firewall logs и добавлять точное исключение, а не отключать защиту полностью.
Причина может быть в PHP fatal error, несовместимом платёжном плагине, нехватке памяти, ошибке темы или кастомном коде. Проверьте debug.log и error_log хостинга.
Платёжный плагин может ставить этот статус, если оплата требует подтверждения, есть риск, сумма не совпала или настройки шлюза выбраны неправильно. Проверьте статус транзакции и настройки плагина.
Проверьте настройки писем WooCommerce, SMTP, wp_mail(), статус заказа, спам, DNS-записи SPF/DKIM/DMARC и логи отправки писем.
Проверьте 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, настройки платёжного плагина и кастомный код. Так можно исправить автоматическую смену статуса и не подтверждать неоплаченные заказы вручную.
Рекомендуем услугу: доработка оплаты WooCommerce
Об авторе