WooCommerce не получает callback от LiqPay / WayForPay

Автор:vkuzyomko

WooCommerce не получает callback от LiqPay / WayForPay

Краткий ответ: если 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 или нет; если отправила, что ответил ваш сайт.

1. Проверьте заказ в WooCommerce

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

Ищите:

  • transaction ID;
  • payment complete;
  • callback received;
  • webhook received;
  • invalid signature;
  • amount mismatch;
  • currency mismatch;
  • payment failed;
  • status changed from Pending payment to Processing;
  • ошибки платёжного плагина.

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

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

Откройте:

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

Проверьте логи LiqPay, WayForPay, WooCommerce и системные логи оплаты.

В логах могут быть:

  • ответ платёжной системы;
  • HTTP-код callback;
  • ошибка подписи;
  • ошибка ключей;
  • ошибка поиска заказа;
  • неверный order_id;
  • неверная сумма;
  • несовпадение валюты;
  • PHP warning или fatal error;
  • timeout при обработке callback.

3. Проверьте кабинет LiqPay

В LiqPay важно проверить, какой URL передаётся как server_url. Именно туда LiqPay отправляет серверный callback после обработки платежа.

Проверьте:

  • передаётся ли server_url при создании платежа;
  • совпадает ли server_url с текущим доменом сайта;
  • используется ли HTTPS;
  • нет ли старого домена или тестового URL;
  • нет ли редиректа http → https → другой URL;
  • есть ли callback в истории платежа;
  • какой статус у платежа в LiqPay;
  • совпадает ли order_id с заказом WooCommerce.

4. Проверьте кабинет WayForPay

В WayForPay нужно проверить serviceUrl. Это серверный URL, на который WayForPay отправляет результат платежа напрямую магазину.

Проверьте:

  • указан ли serviceUrl;
  • не ведёт ли serviceUrl на старый сайт;
  • доступен ли serviceUrl без авторизации;
  • нет ли Basic Auth на сайте;
  • нет ли блокировки по IP или стране;
  • нет ли 403/404/500 в истории уведомлений;
  • есть ли повторные попытки отправки callback;
  • совпадает ли orderReference с ID заказа WooCommerce.

5. Проверьте доступность callback URL извне

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

Проверьте:

  • сайт работает по HTTPS;
  • SSL-сертификат действующий;
  • нет цепочки редиректов;
  • URL не закрыт паролем;
  • URL не блокируется Cloudflare;
  • URL не блокируется security-плагином;
  • сервер быстро отвечает;
  • нет ошибки 403, 404, 500, 502 или 504.

6. Проверьте WAF, ModSecurity и Cloudflare

Callback от LiqPay / WayForPay приходит как POST-запрос с техническими параметрами, подписью и данными платежа. Firewall может принять такой запрос за подозрительный и заблокировать.

Проверьте:

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

Если callback получает 403, проверьте также статью WordPress показывает ошибку 403.

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

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

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

Решение

Исправление зависит от того, где именно ломается callback: на стороне платёжной системы, на уровне сервера, в WordPress, в платёжном плагине или при проверке подписи.

1. Исправьте URL callback

Callback URL должен быть актуальным, публичным и стабильным.

  • используйте HTTPS;
  • не используйте временный домен;
  • не используйте staging URL;
  • не закрывайте URL паролем;
  • не ставьте редирект с callback URL на другую страницу;
  • не кешируйте callback URL;
  • не блокируйте POST-запросы;
  • проверьте, что URL соответствует документации платёжного плагина.

2. Проверьте ключи LiqPay / WayForPay

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

Проверьте:

  • public key;
  • private key;
  • merchant key;
  • secret key;
  • test/live режим;
  • совпадение ключей в кабинете и в WooCommerce;
  • нет ли пробелов до или после ключа;
  • не вставлены ли тестовые ключи в боевом режиме.

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

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

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

  • /checkout/;
  • /cart/;
  • /my-account/;
  • /order-received/;
  • /wc-api/*;
  • ?wc-ajax=*;
  • callback URL LiqPay;
  • serviceUrl WayForPay;
  • страницы возврата после оплаты.

4. Настройте WAF без полной деактивации защиты

Не нужно полностью отключать firewall на сайте. Лучше найти конкретное правило, которое блокирует callback, и сделать точечное исключение.

Что сделать:

  • найти событие блокировки по времени оплаты;
  • посмотреть URL, метод и IP запроса;
  • проверить User-Agent платёжной системы;
  • разрешить конкретный callback endpoint;
  • не отключать защиту для всего сайта;
  • после исключения сделать тестовую оплату.

5. Исправьте ошибки подписи

Если callback приходит, но WooCommerce его отклоняет, частая причина — неверная подпись.

Проверьте:

  • правильный private/secret key;
  • нет ли лишних пробелов в ключах;
  • правильно ли декодируется data;
  • совпадает ли order_id/orderReference;
  • не изменяет ли сервер тело POST-запроса;
  • не режет ли WAF часть данных;
  • не конфликтует ли кодировка;
  • совместим ли плагин с текущей версией PHP.

6. Проверьте платёжный плагин

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

  • проверьте версию плагина;
  • проверьте совместимость с текущей версией WooCommerce;
  • проверьте совместимость с PHP;
  • включите логирование плагина;
  • проверьте debug.log;
  • проверьте, не изменялся ли код плагина вручную;
  • проверьте, не конфликтует ли плагин с checkout editor, кешем, мультиязычностью или security-плагином.

Если стандартный модуль оплаты не закрывает вашу бизнес-логику, статусы, CRM или уведомления, лучше делать точечную доработку WooCommerce, а не править файлы плагина напрямую.

Код

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

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

После тестового callback проверьте:

/wp-content/debug.log

Логировать входящие callback-запросы

Куда вставлять: отдельный мини-плагин. Не оставляйте подробное логирование 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);

Логировать событие 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')
    );
});

Проверить LiqPay callback подпись

Куда использовать: только в диагностическом скрипте или в платёжном плагине, если вы точно понимаете логику 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 {
    // Подпись не совпала.
}

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

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

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

Если ответ 403, 404, 500, 502, 504 или есть длинная цепочка редиректов, платёжная система может не доставить callback.

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

Куда выполнять: 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 должен принимать его, проверять подпись, находить заказ и менять статус по реальному результату платежа.

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

  • callback URL доступен извне;
  • SSL работает корректно;
  • нет лишних редиректов;
  • WAF не блокирует callback;
  • callback не кешируется;
  • WooCommerce logs фиксируют уведомление;
  • подпись callback проходит проверку;
  • заказ получает transaction ID;
  • статус меняется с Pending payment на Processing или другой правильный статус;
  • письма WooCommerce отправляются;
  • debug.log не содержит PHP Fatal error;
  • платёжная система больше не показывает failed callback.

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

Проверить returnUrl отдельно от callback

returnUrl — это URL, куда возвращается клиент после оплаты. Callback/server_url/serviceUrl — это серверное уведомление для WooCommerce. Возврат клиента на сайт не означает, что WooCommerce получил callback.

Проверить тестовый и боевой режим

Если тестовый callback работает, а live нет, проверьте боевые ключи, активность магазина, валюту, merchant ID, домен и настройки live-аккаунта.

Проверить Basic Auth на staging

Если тестируете на staging-сайте с паролем, платёжная система не сможет отправить callback без авторизации. Для теста нужен публичный endpoint или временное исключение.

Проверить язык и мультиязычность

Если сайт использует языковые префиксы, callback не должен случайно попадать на URL, где плагин перевода добавляет редирект, меняет путь или отдаёт HTML вместо обработчика.

Проверить Action Scheduler

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

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

Проверить конфликт с CRM и Telegram

Если статус заказа меняется, но CRM или Telegram не получают событие, проблема уже не в callback LiqPay / WayForPay, а в дальнейшей интеграции после оплаты.

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

Путать returnUrl и callback

Клиент может вернуться на страницу “Спасибо”, но серверное уведомление может не прийти. Для смены статуса WooCommerce важен именно callback.

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

Callback должен попадать в живой PHP-обработчик. Кеш может вернуть старый HTML или неправильный ответ.

Блокировать POST-запросы firewall

Callback почти всегда приходит POST-запросом. Если WAF блокирует POST, WooCommerce не получит статус оплаты.

Не проверять подпись

Подпись нужна для защиты от поддельных уведомлений. Нельзя менять статус заказа только потому, что пришёл POST-запрос.

Менять статус заказа вручную и считать проблему решённой

Ручная смена статуса помогает одному заказу, но не чинит callback. Следующие оплаченные заказы снова могут зависнуть.

Править файлы платёжного плагина напрямую

После обновления правки пропадут. Лучше использовать hooks, мини-плагин или отдельную доработку.

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

В WooCommerce может быть пусто, а в кабинете LiqPay / WayForPay уже видно: callback не доставлен, 403, 500, timeout или invalid signature.

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

Проблема: WooCommerce не получает callback от LiqPay

Возможная причина: не передан server_url, URL недоступен, неверная подпись, WAF блокирует POST, ошибка PHP в обработчике.

Что делать: проверить server_url, POST data/signature, LiqPay logs, WooCommerce logs, debug.log, WAF и доступность callback URL.

Проблема: WooCommerce не получает callback от WayForPay

Возможная причина: неверный serviceUrl, callback закрыт firewall, неверная подпись, orderReference не совпадает с заказом.

Что делать: проверить serviceUrl, логи WayForPay, HTTP-код ответа сайта, WooCommerce logs, WAF, SSL и orderReference.

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

Возможная причина: Cloudflare, ModSecurity, Wordfence, country blocking, bot protection или запрет POST-запроса.

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

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

Возможная причина: неправильный endpoint, старый URL, сломанные постоянные ссылки, неактивный платёжный плагин.

Что делать: проверить callback URL, permalinks, .htaccess, активность плагина оплаты и документацию модуля.

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

Возможная причина: PHP Fatal error, несовместимость плагина с WooCommerce/PHP, ошибка в кастомном коде.

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

Проблема: callback пришёл, но заказ Pending payment

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

Что делать: проверить order_id/orderReference, amount, currency, transaction status, signature и order notes.

Проблема: callback приходит с задержкой

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

Что делать: проверить server response time, логи хостинга, WAF, timeout, нагрузку CPU/RAM и доступность сайта.

Проблема: статус меняется, но письма не уходят

Возможная причина: callback работает, но сломаны email WooCommerce или SMTP.

Что делать: проверить статус заказа, WooCommerce emails, SMTP, spam, wp_mail и email logs.

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

Почему WooCommerce не получает callback от LiqPay / WayForPay?

Чаще всего из-за неправильного server_url/serviceUrl, блокировки WAF, SSL-ошибки, редиректа, кеша, 403/404/500 ответа, неверной подписи, неправильных ключей или ошибки платёжного плагина.

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

Проверьте заказ, order notes, WooCommerce logs, кабинет LiqPay / WayForPay, callback URL, HTTP-код ответа сайта, WAF, SSL, debug.log и настройки платёжного плагина.

Чем callback отличается от returnUrl?

returnUrl возвращает клиента на сайт после оплаты. Callback/server_url/serviceUrl отправляет серверное подтверждение платежа в WooCommerce и нужен для смены статуса заказа.

Почему заказ остаётся Pending payment после успешной оплаты?

WooCommerce не получил или не обработал callback от платёжной системы, поэтому не подтвердил оплату и не сменил статус заказа.

FAQ

Что такое callback в LiqPay / WayForPay?

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

Почему LiqPay callback не доходит до WooCommerce?

Причина может быть в server_url, SSL, WAF, Cloudflare, ошибке подписи, неверном private key, 403/404/500 ответе сайта или проблеме платёжного плагина.

Почему WayForPay callback не доходит до WooCommerce?

Чаще всего из-за неверного serviceUrl, firewall, Basic Auth, SSL, редиректов, ошибки подписи, неправильного SecretKey или недоступности callback endpoint.

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

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

Что должен вернуть сайт на callback?

Сайт должен быстро вернуть корректный ответ, который ожидает платёжная система. Если сайт отвечает 403, 404, 500, timeout или HTML-страницей ошибки, callback может считаться неуспешным.

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

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

Может ли кеш сломать callback?

Да. Callback URL, checkout, cart, wc-api и страницы оплаты нужно исключать из кеша. Callback должен обрабатываться динамически.

Почему callback работает на тесте, но не работает в live?

Часто причина в разных ключах, режиме test/live, домене, SSL, merchant-настройках, боевом serviceUrl/server_url или ограничениях аккаунта платёжной системы.

Где смотреть ошибки callback?

В 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 и уведомления.

Об авторе

vkuzyomko administrator