Краткий ответ: если WooCommerce не получает callback от LiqPay / WayForPay, заказ может остаться в статусе Pending payment, On hold или Failed даже после успешной оплаты. Нужно проверить URL callback, server_url/serviceUrl, доступность сайта извне, SSL, редиректы, WAF/ModSecurity, Cloudflare, кеш, логи платёжной системы, WooCommerce logs, debug.log, подпись callback и обработчик платёжного плагина.
Callback — это серверное уведомление от платёжной системы в WooCommerce. Клиент может успешно оплатить заказ и вернуться на страницу “Спасибо”, но если LiqPay или WayForPay не смогли отправить callback на сайт, WooCommerce не узнает, что платёж завершён.
Поэтому проблему нельзя решать только ручной сменой статуса заказа. Нужно найти, почему платёжная система не доставляет callback или почему WooCommerce не может его обработать.
У LiqPay и WayForPay есть похожая логика: клиент оплачивает заказ, платёжная система обрабатывает транзакцию, а затем отправляет серверное уведомление на URL магазина. Этот URL должен быть доступен извне, не закрыт авторизацией, не заблокирован firewall и не отдавать ошибку.
Если callback не доходит, WooCommerce не получает финальный статус платежа. В результате заказ может зависнуть, хотя деньги уже списаны.
| Симптом | Возможная причина | Что проверить |
|---|---|---|
| Оплата прошла, заказ Pending payment | callback не пришёл в WooCommerce | server_url/serviceUrl, логи платёжной системы |
| Callback возвращает 403 | WAF, ModSecurity, Cloudflare, security-плагин | firewall logs, IP платёжной системы, POST-запрос |
| Callback возвращает 404 | неверный URL, старый endpoint, сломанные permalinks | URL callback, rewrite rules, .htaccess |
| Callback возвращает 500 | PHP Fatal error в платёжном плагине | debug.log, error_log, WooCommerce logs |
| Callback есть, но статус не меняется | ошибка подписи, суммы, валюты или order_id | signature, amount, currency, order reference |
| Работает в тесте, но не в live | неверные live-ключи или режим магазина | public/private key, merchant key, test/live |
| Работало раньше, потом сломалось | обновление плагина, WAF, кеш, смена PHP | changelog, debug.log, последний update |
| Callback приходит с задержкой | повторные попытки платёжной системы или timeout | логи сервиса, server response time |
Если заказ уже оплачен, но статус не обновляется, дополнительно проверьте статью WooCommerce заказ не меняет статус после оплаты. Если проблема шире и сама оплата не проходит, смотрите Не работает оплата WooCommerce.
Диагностика должна ответить на два вопроса: платёжная система отправила callback или нет; если отправила, что ответил ваш сайт.
Откройте проблемный заказ и посмотрите примечания заказа.
Ищите:
Если в заказе вообще нет следов callback, WooCommerce, скорее всего, не получил уведомление от платёжной системы.
Откройте:
WooCommerce → Статус → Журналы
Проверьте логи LiqPay, WayForPay, WooCommerce и системные логи оплаты.
В логах могут быть:
В LiqPay важно проверить, какой URL передаётся как server_url. Именно туда LiqPay отправляет серверный callback после обработки платежа.
Проверьте:
В WayForPay нужно проверить serviceUrl. Это серверный URL, на который WayForPay отправляет результат платежа напрямую магазину.
Проверьте:
Callback URL должен быть доступен не только из вашего браузера, но и с серверов платёжной системы.
Проверьте:
Callback от LiqPay / WayForPay приходит как POST-запрос с техническими параметрами, подписью и данными платежа. Firewall может принять такой запрос за подозрительный и заблокировать.
Проверьте:
Если callback получает 403, проверьте также статью WordPress показывает ошибку 403.
Если не хотите рисковать сайтом и тратить время на эксперименты, можно оставить заявку. Я посмотрю задачу и предложу аккуратное решение.
Исправление зависит от того, где именно ломается callback: на стороне платёжной системы, на уровне сервера, в WordPress, в платёжном плагине или при проверке подписи.
Callback URL должен быть актуальным, публичным и стабильным.
Если ключи неверные, callback может приходить, но WooCommerce не будет считать его настоящим.
Проверьте:
Callback нельзя кешировать. Платёжная система должна попасть в живой обработчик WooCommerce, а не получить старый HTML или кешированную страницу.
Исключите из кеша:
Не нужно полностью отключать firewall на сайте. Лучше найти конкретное правило, которое блокирует callback, и сделать точечное исключение.
Что сделать:
Если callback приходит, но WooCommerce его отклоняет, частая причина — неверная подпись.
Проверьте:
Если callback доходит до сайта, но статус заказа не меняется, проблема может быть в самом плагине оплаты.
Если стандартный модуль оплаты не закрывает вашу бизнес-логику, статусы, CRM или уведомления, лучше делать точечную доработку WooCommerce, а не править файлы плагина напрямую.
Важно: код ниже предназначен для диагностики. Он может повлиять на оплату, заказы, callback, статусы, сессии, безопасность и логи. Перед изменениями сделайте backup. На рабочем магазине лучше сначала тестировать на staging-копии.
Куда вставлять: файл 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 );
После тестового callback проверьте:
/wp-content/debug.log
Куда вставлять: отдельный мини-плагин. Не оставляйте подробное логирование POST-данных включённым навсегда, потому что в запросах могут быть чувствительные данные.
add_action('init', function () {
if (empty($_SERVER['REQUEST_URI'])) {
return;
}
$request_uri = sanitize_text_field(wp_unslash($_SERVER['REQUEST_URI']));
$is_possible_callback = false;
if (stripos($request_uri, 'liqpay') !== false) {
$is_possible_callback = true;
}
if (stripos($request_uri, 'wayforpay') !== false) {
$is_possible_callback = true;
}
if (stripos($request_uri, 'wc-api') !== false) {
$is_possible_callback = true;
}
if (!$is_possible_callback) {
return;
}
if (!function_exists('wc_get_logger')) {
return;
}
$logger = wc_get_logger();
$logger->info(
'Possible payment callback request. URI: ' . $request_uri . ' | Method: ' . ($_SERVER['REQUEST_METHOD'] ?? ''),
array('source' => 'sc-payment-callback-debug')
);
});
После теста проверьте:
WooCommerce → Статус → Журналы → sc-payment-callback-debug
Куда вставлять: functions.php дочерней темы или отдельный мини-плагин.
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 #' . $order_id . ' status changed from ' . $old_status . ' to ' . $new_status,
array('source' => 'sc-order-status-debug')
);
}, 10, 4);
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')
);
});
Куда использовать: только в диагностическом скрипте или в платёжном плагине, если вы точно понимаете логику LiqPay. Не выводите private key и callback data в публичный экран.
$data = isset($_POST['data']) ? sanitize_text_field(wp_unslash($_POST['data'])) : '';
$signature = isset($_POST['signature']) ? sanitize_text_field(wp_unslash($_POST['signature'])) : '';
$private_key = 'your_private_key';
$expected_signature = base64_encode(sha1($private_key . $data . $private_key, true));
if (hash_equals($expected_signature, $signature)) {
// Callback LiqPay подлинный.
} else {
// Подпись не совпала.
}
Куда выполнять: терминал или SSH. Проверяйте только доступность URL. Не имитируйте реальный платёж без документации LiqPay / WayForPay.
curl -I https://example.com/wc-api/payment-callback/
Если ответ 403, 404, 500, 502, 504 или есть длинная цепочка редиректов, платёжная система может не доставить callback.
Куда выполнять: SSH в корне сайта. Замените 123 на ID заказа.
wp post get 123 --field=post_status
wp post meta list 123
Ищите payment method, transaction ID, gateway response, LiqPay order_id, WayForPay orderReference и другие поля платёжного модуля. Не меняйте эти данные вручную без понимания логики шлюза.
После правильного исправления LiqPay / WayForPay должны отправлять callback на сайт, WooCommerce должен принимать его, проверять подпись, находить заказ и менять статус по реальному результату платежа.
Хороший результат:
returnUrl — это URL, куда возвращается клиент после оплаты. Callback/server_url/serviceUrl — это серверное уведомление для WooCommerce. Возврат клиента на сайт не означает, что WooCommerce получил callback.
Если тестовый callback работает, а live нет, проверьте боевые ключи, активность магазина, валюту, merchant ID, домен и настройки live-аккаунта.
Если тестируете на staging-сайте с паролем, платёжная система не сможет отправить callback без авторизации. Для теста нужен публичный endpoint или временное исключение.
Если сайт использует языковые префиксы, callback не должен случайно попадать на URL, где плагин перевода добавляет редирект, меняет путь или отдаёт HTML вместо обработчика.
Некоторые плагины оплаты могут обрабатывать часть действий через фоновые задачи. Если Action Scheduler завис, заказ может не обновиться или не отправить уведомления.
WooCommerce → Статус → Запланированные действия
Если статус заказа меняется, но CRM или Telegram не получают событие, проблема уже не в callback LiqPay / WayForPay, а в дальнейшей интеграции после оплаты.
Клиент может вернуться на страницу “Спасибо”, но серверное уведомление может не прийти. Для смены статуса WooCommerce важен именно callback.
Callback должен попадать в живой PHP-обработчик. Кеш может вернуть старый HTML или неправильный ответ.
Callback почти всегда приходит POST-запросом. Если WAF блокирует POST, WooCommerce не получит статус оплаты.
Подпись нужна для защиты от поддельных уведомлений. Нельзя менять статус заказа только потому, что пришёл POST-запрос.
Ручная смена статуса помогает одному заказу, но не чинит callback. Следующие оплаченные заказы снова могут зависнуть.
После обновления правки пропадут. Лучше использовать hooks, мини-плагин или отдельную доработку.
В WooCommerce может быть пусто, а в кабинете LiqPay / WayForPay уже видно: callback не доставлен, 403, 500, timeout или invalid signature.
Возможная причина: не передан server_url, URL недоступен, неверная подпись, WAF блокирует POST, ошибка PHP в обработчике.
Что делать: проверить server_url, POST data/signature, LiqPay logs, WooCommerce logs, debug.log, WAF и доступность callback URL.
Возможная причина: неверный serviceUrl, callback закрыт firewall, неверная подпись, orderReference не совпадает с заказом.
Что делать: проверить serviceUrl, логи WayForPay, HTTP-код ответа сайта, WooCommerce logs, WAF, SSL и orderReference.
Возможная причина: Cloudflare, ModSecurity, Wordfence, country blocking, bot protection или запрет POST-запроса.
Что делать: найти событие в firewall logs и сделать точечное исключение для callback URL.
Возможная причина: неправильный endpoint, старый URL, сломанные постоянные ссылки, неактивный платёжный плагин.
Что делать: проверить callback URL, permalinks, .htaccess, активность плагина оплаты и документацию модуля.
Возможная причина: PHP Fatal error, несовместимость плагина с WooCommerce/PHP, ошибка в кастомном коде.
Что делать: включить debug.log, проверить error_log, обновить или откатить плагин, протестировать на staging.
Возможная причина: подпись не прошла проверку, сумма/валюта не совпали, не найден заказ, статус платежа не финальный.
Что делать: проверить order_id/orderReference, amount, currency, transaction status, signature и order notes.
Возможная причина: платёжная система повторяет запросы после ошибок, сервер отвечает медленно или временно недоступен.
Что делать: проверить server response time, логи хостинга, WAF, timeout, нагрузку CPU/RAM и доступность сайта.
Возможная причина: callback работает, но сломаны email WooCommerce или SMTP.
Что делать: проверить статус заказа, WooCommerce emails, SMTP, spam, wp_mail и email logs.
Чаще всего из-за неправильного server_url/serviceUrl, блокировки WAF, SSL-ошибки, редиректа, кеша, 403/404/500 ответа, неверной подписи, неправильных ключей или ошибки платёжного плагина.
Проверьте заказ, order notes, WooCommerce logs, кабинет LiqPay / WayForPay, callback URL, HTTP-код ответа сайта, WAF, SSL, debug.log и настройки платёжного плагина.
returnUrl возвращает клиента на сайт после оплаты. Callback/server_url/serviceUrl отправляет серверное подтверждение платежа в WooCommerce и нужен для смены статуса заказа.
WooCommerce не получил или не обработал callback от платёжной системы, поэтому не подтвердил оплату и не сменил статус заказа.
Это серверное уведомление от платёжной системы на сайт магазина. В нём передаётся результат оплаты, подпись и данные заказа, чтобы WooCommerce мог обновить статус заказа.
Причина может быть в server_url, SSL, WAF, Cloudflare, ошибке подписи, неверном private key, 403/404/500 ответе сайта или проблеме платёжного плагина.
Чаще всего из-за неверного serviceUrl, firewall, Basic Auth, SSL, редиректов, ошибки подписи, неправильного SecretKey или недоступности callback endpoint.
Можно для разового исправления после проверки оплаты, но это не решает проблему. Нужно восстановить callback, иначе следующие заказы снова будут зависать.
Сайт должен быстро вернуть корректный ответ, который ожидает платёжная система. Если сайт отвечает 403, 404, 500, timeout или HTML-страницей ошибки, callback может считаться неуспешным.
Да. Cloudflare WAF, bot protection, country blocking или rate limiting могут заблокировать POST-запрос платёжной системы.
Да. Callback URL, checkout, cart, wc-api и страницы оплаты нужно исключать из кеша. Callback должен обрабатываться динамически.
Часто причина в разных ключах, режиме test/live, домене, SSL, merchant-настройках, боевом serviceUrl/server_url или ограничениях аккаунта платёжной системы.
В WooCommerce → Статус → Журналы, примечаниях заказа, debug.log, error_log хостинга и кабинете LiqPay / WayForPay.
Если деньги списываются, а заказы зависают, callback возвращает 403/500, магазин получает реальные продажи или платёжный плагин конфликтует с WooCommerce, лучше не чинить оплату наугад.
Если WooCommerce не получает callback от LiqPay / WayForPay, проблема почти всегда находится в связке: платёжная система → callback URL → сервер → платёжный плагин → WooCommerce order status.
Нужно проверить server_url/serviceUrl, SSL, редиректы, WAF, Cloudflare, кеш, подпись, ключи, WooCommerce logs, debug.log, order notes и кабинет платёжной системы.
Главное — не путать возврат клиента на сайт с серверным callback. Клиент может увидеть успешную оплату, но WooCommerce не изменит статус заказа, если серверное уведомление не дошло или было отклонено. Правильное решение — восстановить обработку callback и только после этого проверять статусы, письма, CRM и уведомления.
Об авторе