Краткий ответ: если WayForPay callback в WooCommerce не работает, заказ обычно остаётся в статусе “Ожидается оплата”, хотя клиент уже оплатил. Чаще всего причина в неправильном serviceUrl, ошибке подписи, SSL, Cloudflare, WAF/ModSecurity, security-плагине, кеше, неверных ключах, тестовом/боевом режиме, PHP-ошибке или несовместимости платёжного плагина с WooCommerce.
Важно не путать returnUrl и callback / serviceUrl. ReturnUrl возвращает покупателя на сайт после оплаты. Callback или serviceUrl нужен для серверного подтверждения оплаты, чтобы WooCommerce понял: деньги получены, заказ можно перевести в нужный статус.
Если проблема шире и после оплаты не меняется статус любого платёжного метода, сначала посмотрите статью WooCommerce не меняет статус заказа после оплаты. Если callback не приходит не только от WayForPay, но и от LiqPay, полезен общий разбор WooCommerce не получает callback от LiqPay / WayForPay. Для исправления checkout, оплаты, callback и статусов подходит услуга доработка WooCommerce.
WayForPay после оплаты должен отправить серверное уведомление на URL магазина. В WooCommerce этот запрос принимает платёжный плагин. Он проверяет данные платежа, подпись, orderReference, сумму, валюту и статус транзакции. Если всё правильно, заказ переводится из pending в processing, completed или другой заданный статус.
Если callback не доходит или не проходит проверку, заказ остаётся неоплаченным в WooCommerce, даже если деньги фактически списались.
Основные причины:
Начните с проверки цепочки: заказ создан → покупатель оплатил → WayForPay отправил callback → сайт принял POST-запрос → плагин проверил подпись → WooCommerce изменил статус заказа.
| Симптом | Вероятная причина | Что проверить первым |
|---|---|---|
| Деньги списались, заказ остался “Ожидается оплата” | callback не дошёл или не обработался | serviceUrl, логи WayForPay, WooCommerce logs |
| Покупатель вернулся на сайт, но статус не изменился | работает returnUrl, но не работает serviceUrl | callback URL, endpoint плагина, order notes |
| Callback получает 403 | WAF, Cloudflare, security-плагин, ModSecurity | firewall logs, Cloudflare Events, security logs |
| Callback получает 404 | неверный URL, отключён плагин, сломаны постоянные ссылки | URL callback, активность плагина, permalinks |
| Callback получает 500 | PHP fatal error, конфликт плагина, нехватка памяти | debug.log, error_log, WooCommerce logs |
| Callback есть, но статус не меняется | ошибка подписи, суммы, валюты, orderReference | merchantSignature, ключи, сумма, валюта, ID заказа |
| Статус меняется не туда | настройки платёжного плагина или кастомный код | статусы в настройках, хуки, snippets, CRM |
| Проблема появилась после обновления | несовместимость WooCommerce, PHP, темы или плагина | версии, changelog, логи, откат на копии |
serviceUrl или callback URL указан в настройках?200?403, 404, 500 или timeout?Если не хотите рисковать сайтом и тратить время на эксперименты, можно оставить заявку. Я посмотрю задачу и предложу аккуратное решение.
Не меняйте статус заказа вручную как постоянное решение. Ручная смена поможет закрыть один заказ, но следующий платёж снова зависнет. Нужно найти, почему callback не проходит автоматически.
В WayForPay серверное уведомление об оплате должно уходить на URL, который обрабатывает ваш платёжный плагин WooCommerce.
Проверьте:
Если в настройках есть отдельные поля для Return URL и Service URL, не используйте один вместо другого без понимания логики плагина.
ReturnUrl отвечает за возврат покупателя на сайт. Но сам факт возврата клиента ещё не доказывает, что WooCommerce получил подтверждение оплаты.
Типичная ошибка: владелец видит страницу “Спасибо за заказ” и думает, что callback работает. На самом деле покупатель просто вернулся на сайт, а серверное подтверждение от WayForPay не обработалось.
Откройте:
Ищите:
callbackserviceUrlApprovedDeclinedRefundedinvalid signatureorder not foundamount mismatchcurrency mismatchHTTP 403HTTP 404HTTP 500timeoutВнутри заказа WooCommerce посмотрите примечания. Там может быть видно:
Если примечаний от WayForPay нет вообще, сайт, скорее всего, не получил callback.
Если callback приходит, но плагин его отклоняет, часто виновата подпись.
Проверьте:
Если в WooCommerce заказ имеет ID 1234, а в WayForPay ушёл ORDER-1234, плагин должен уметь корректно сопоставить callback с заказом.
Callback должен открываться по стабильному HTTPS-адресу без лишних редиректов.
Проверьте:
WayForPay отправляет серверный POST-запрос. Защита сайта может принять его за подозрительный и вернуть 403.
Проверьте:
Не отключайте защиту полностью навсегда. Лучше найти конкретное правило и добавить точное исключение для callback URL или разрешённых IP, если это поддерживается.
Кеш не должен вмешиваться в оплату и серверные уведомления.
Исключите из кеша:
/cart//checkout//my-account/?wc-ajax=*wc-api endpoints, если их использует плагин.Проверьте плагин кеша, серверный кеш, CDN, Cloudflare, Object Cache, Redis/Memcached и оптимизацию JavaScript.
Если callback получает 500 или статус не меняется без видимой причины, включите debug.log и проверьте ошибки в момент тестовой оплаты.
Ищите:
PHP Fatal errorUncaught ErrorAllowed memory size exhaustedCall to undefined functionClass not foundTypeErrorДля физических товаров после успешной оплаты обычно нужен статус processing. Для виртуальных и загружаемых товаров может использоваться completed. Если плагин переводит заказ в on-hold, значит он считает оплату неподтверждённой или требует ручной проверки.
Проверьте настройки платёжного плагина:
Важно: код ниже нужен для диагностики. Он может писать технические данные в логи WooCommerce. Не логируйте полные платёжные данные, подписи, телефоны, email, карты и персональные данные клиентов. Перед изменениями сделайте резервную копию. Лучше вставлять код в отдельный мини-плагин, а не в активную тему.
Куда вставлять: файл 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 дочерней темы. Код не обрабатывает оплату, а только помогает понять, доходит ли запрос до WordPress.
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'])) : '';
$request_method = isset($_SERVER['REQUEST_METHOD']) ? sanitize_text_field(wp_unslash($_SERVER['REQUEST_METHOD'])) : '';
$content_type = isset($_SERVER['CONTENT_TYPE']) ? sanitize_text_field(wp_unslash($_SERVER['CONTENT_TYPE'])) : '';
$remote_addr = isset($_SERVER['REMOTE_ADDR']) ? sanitize_text_field(wp_unslash($_SERVER['REMOTE_ADDR'])) : '';
$is_possible_wayforpay_callback =
stripos($request_uri, 'wayforpay') !== false
|| stripos($request_uri, 'wfp') !== false
|| stripos($request_uri, 'callback') !== false
|| stripos($request_uri, 'service') !== false
|| stripos($request_uri, 'wc-api') !== false
|| stripos($request_uri, 'wc_ajax') !== false
|| stripos($request_uri, 'wc-ajax') !== false;
if (!$is_possible_wayforpay_callback) {
return;
}
wc_get_logger()->info(
'Possible WayForPay callback reached WordPress. Method: ' . $request_method . ', URI: ' . $request_uri . ', Content-Type: ' . $content_type . ', IP: ' . $remote_addr,
array(
'source' => 'custom-wayforpay-callback-debug',
)
);
});
Куда смотреть результат: WooCommerce → Статус → Журналы → custom-wayforpay-status-debug.
add_action('woocommerce_order_status_changed', function ($order_id, $old_status, $new_status, $order) {
if (!function_exists('wc_get_logger')) {
return;
}
$payment_method = $order ? $order->get_payment_method() : '';
if (stripos($payment_method, 'wayforpay') === false && stripos($payment_method, 'wfp') === false) {
return;
}
wc_get_logger()->info(
'WayForPay order status changed. Order ID: ' . $order_id . ', from: ' . $old_status . ', to: ' . $new_status . ', payment method: ' . $payment_method,
array(
'source' => 'custom-wayforpay-status-debug',
)
);
}, 10, 4);
Если этот лог не появляется после тестовой оплаты, значит WooCommerce не получил событие успешной оплаты или платёжный плагин его не вызвал.
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(
'WooCommerce payment_complete fired. Order ID: ' . $order_id . ', status: ' . $order->get_status() . ', payment method: ' . $order->get_payment_method(),
array(
'source' => 'custom-wayforpay-status-debug',
)
);
});
Важно: нельзя автоматически переводить все заказы WayForPay из 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');
}
});
Такой код может отметить неоплаченный заказ как оплаченный. Статус нужно менять только после подтверждения от WayForPay и проверки данных платежа.
После диагностики должно быть понятно, где ломается WayForPay callback:
Правильный результат — тестовая оплата проходит, WayForPay отправляет callback, сайт отвечает корректно, WooCommerce меняет статус заказа, в примечаниях заказа есть запись об оплате, а письма и интеграции срабатывают как нужно.
Проверьте access log хостинга. Если в access log нет запроса от WayForPay в момент тестовой оплаты, значит проблема до WordPress: неправильный serviceUrl, DNS, SSL, Cloudflare, firewall или блокировка на уровне хостинга.
Проверьте orderReference. Некоторые плагины передают в WayForPay не чистый ID заказа, а номер с префиксом. Тогда callback должен правильно сопоставить этот номер с заказом WooCommerce.
Смотрите Cloudflare Firewall Events, ModSecurity logs, security-плагин, IP-блокировки и country blocking. WayForPay может отправлять запрос с IP, который ваш сайт считает подозрительным.
Включите debug.log и проверьте error_log хостинга. Ошибка 500 почти всегда означает, что код упал при обработке callback: платёжный плагин, тема, кастомный сниппет, CRM-интеграция или WooCommerce hook.
Проверьте настройки платёжного плагина. Возможно, плагин ставит on-hold, потому что считает платёж неподтверждённым, не доверяет подписи или ждёт финального статуса транзакции.
Проверьте совместимость WayForPay-плагина с текущей версией WooCommerce, PHP и HPOS. После обновлений часто ломаются старые хуки, API endpoints, шаблоны и обработчики статусов.
Сравните окружение:
debug.log и error_log хостинга.Approved — платёж подтверждён на стороне WayForPay;Declined — платёж отклонён;Refunded — платёж возвращён;invalid signature — ошибка подписи;order not found — плагин не нашёл заказ по orderReference;amount mismatch — сумма не совпадает;currency mismatch — валюта не совпадает;HTTP 403 — callback заблокирован;HTTP 404 — callback URL не найден;HTTP 500 — PHP или серверная ошибка;timeout — сайт не ответил вовремя;payment_complete — WooCommerce получил событие успешной оплаты.Чаще всего из-за неправильного serviceUrl, ошибки подписи, SSL, WAF, Cloudflare, security-плагина, кеша, неверных ключей, режима test/live, PHP-ошибки или несовместимости платёжного плагина.
ReturnUrl возвращает покупателя на сайт после оплаты. ServiceUrl или callback нужен для серверного уведомления о статусе платежа. Для смены статуса заказа важен именно серверный callback.
Платёж прошёл на стороне WayForPay, но WooCommerce не получил или не обработал callback. Проверьте serviceUrl, логи, подпись, WAF, SSL и настройки плагина.
Его может блокировать Cloudflare, WAF, ModSecurity, security-плагин, IP-блокировка, country block или правило, запрещающее POST-запросы. Нужно смотреть firewall logs.
Обычно URL неправильный, endpoint плагина не существует, плагин отключён или сломаны постоянные ссылки. Проверьте callback URL и активность WayForPay-плагина.
Это похоже на PHP-ошибку во время обработки платежа. Проверьте debug.log, error_log хостинга, логи WooCommerce и совместимость плагина с текущей версией WooCommerce/PHP.
Для физических товаров обычно processing. Для виртуальных или загружаемых товаров может быть completed. Если стоит on-hold, плагин может ждать ручной проверки или считать оплату неподтверждённой.
Можно для конкретного заказа, если вы проверили оплату в кабинете WayForPay. Но это не чинит callback. Новые заказы могут снова оставаться в ожидании оплаты.
Нельзя делать это только по факту возврата на сайт. Покупатель мог вернуться без успешной оплаты. Статус нужно менять только после проверки серверного callback, подписи, суммы, валюты и статуса транзакции.
Да. Checkout, cart, my-account, return URL, callback/serviceUrl, wc-api, REST и AJAX endpoints нельзя кешировать как обычные страницы. Кеш может мешать оплате и смене статуса.
Проверьте обновления WooCommerce, PHP, WayForPay-плагина, темы, security-плагина, кеша и HPOS. Затем смотрите логи, callback URL и ошибки PHP.
Проверьте access log хостинга, WooCommerce logs, Cloudflare Events, ModSecurity logs и добавьте временное логирование callback-запросов. Если в логах нет входящего запроса, проблема до WordPress.
Если WayForPay callback WooCommerce не работает, нужно проверять не только сам платёжный плагин, а всю цепочку: checkout, serviceUrl, returnUrl, подпись, SSL, WAF, Cloudflare, кеш, PHP-ошибки, WooCommerce logs, статус заказа и кастомные хуки.
Самая частая логика поломки такая: деньги списались, покупатель вернулся на сайт, но серверный callback не дошёл или не прошёл проверку. Поэтому заказ остаётся в статусе “Ожидается оплата”. Исправление должно обеспечить нормальный приём callback, корректную проверку данных WayForPay и автоматическую смену статуса WooCommerce без ручных костылей.
Рекомендуем услугу: исправление WayForPay callback
Об авторе