WayForPay callback WooCommerce не работает

WordPress услуги
Нужна помощь с сайтом?
Исправим, настроим или улучшим сайт. Оставьте заявку — подскажем решение.
Оставить заявку
Автор:vkuzyomko

WayForPay callback WooCommerce не работает

Краткий ответ: если 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, даже если деньги фактически списались.

Основные причины:

  • неправильный serviceUrl / callback URL — WayForPay отправляет уведомление не на тот адрес;
  • перепутан returnUrl и serviceUrl — покупатель возвращается на сайт, но серверное подтверждение оплаты не обрабатывается;
  • ошибка merchantSignature — неверный secret key, неправильный порядок полей, другая сумма, валюта или orderReference;
  • сайт блокирует POST-запрос — WAF, ModSecurity, Cloudflare, security-плагин или firewall отдают 403;
  • callback получает 404 — endpoint платёжного плагина не существует, отключён плагин или сломаны постоянные ссылки;
  • callback получает 500 — PHP-ошибка внутри платёжного плагина, темы, кастомного кода или WooCommerce;
  • неверные ключи WayForPay — тестовые ключи в боевом режиме или боевые ключи в тестовом режиме;
  • SSL работает некорректно — WayForPay не может обратиться к HTTPS-адресу callback;
  • кеш вмешивается в оплату — кешируется checkout, страница возврата, REST/AJAX endpoint или callback URL;
  • плагин WayForPay устарел — несовместимость с новой версией WooCommerce, PHP, HPOS или темой;
  • заказ уже отменён — WooCommerce отменил неоплаченный заказ до прихода callback;
  • кастомный код перезаписывает статус — CRM, Telegram, склад, плагин статусов или сниппет меняет статус после оплаты;
  • callback приходит, но ответ сервера неправильный — WayForPay не получает корректный ответ и считает уведомление необработанным.

Диагностика

Начните с проверки цепочки: заказ создан → покупатель оплатил → 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, логи, откат на копии

Что проверить сразу

  • Создался ли заказ в WooCommerce?
  • Какой статус заказа после оплаты?
  • Есть ли оплата в кабинете WayForPay?
  • Есть ли примечания в заказе WooCommerce?
  • Есть ли лог WayForPay в WooCommerce → Статус → Журналы?
  • Какой serviceUrl или callback URL указан в настройках?
  • Получает ли callback URL ответ 200?
  • Нет ли ответов 403, 404, 500 или timeout?
  • Совпадает ли режим: test/live?
  • Совпадают ли merchantAccount, secret key, сумма, валюта и orderReference?
  • Не блокирует ли запрос Cloudflare, ModSecurity, WAF или security-плагин?
  • Не включён ли кеш для checkout, return URL, REST/AJAX или callback URL?

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

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

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

Решение

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

1. Проверьте serviceUrl / callback URL

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

Проверьте:

  • какой URL указан в настройках плагина WayForPay;
  • какой URL указан в кабинете WayForPay;
  • нет ли старого домена;
  • нет ли HTTP вместо HTTPS;
  • нет ли тестового домена, временного домена или staging-адреса;
  • не изменилась ли структура URL после обновления постоянных ссылок;
  • активен ли платёжный плагин, который принимает callback.

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

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

ReturnUrl отвечает за возврат покупателя на сайт. Но сам факт возврата клиента ещё не доказывает, что WooCommerce получил подтверждение оплаты.

Типичная ошибка: владелец видит страницу “Спасибо за заказ” и думает, что callback работает. На самом деле покупатель просто вернулся на сайт, а серверное подтверждение от WayForPay не обработалось.

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

Откройте:

  • WooCommerce → Статус → Журналы;
  • выберите лог, связанный с WayForPay;
  • проверьте записи за время тестовой оплаты.

Ищите:

  • callback
  • serviceUrl
  • Approved
  • Declined
  • Refunded
  • invalid signature
  • order not found
  • amount mismatch
  • currency mismatch
  • HTTP 403
  • HTTP 404
  • HTTP 500
  • timeout

4. Проверьте примечания заказа

Внутри заказа WooCommerce посмотрите примечания. Там может быть видно:

  • заказ создан и ожидает оплаты;
  • покупатель перенаправлен на WayForPay;
  • оплата подтверждена;
  • callback отклонён;
  • подпись не совпала;
  • статус был изменён вручную;
  • плагин оплаты вернул ошибку.

Если примечаний от WayForPay нет вообще, сайт, скорее всего, не получил callback.

5. Проверьте подпись merchantSignature

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

Проверьте:

  • правильный secret key;
  • merchantAccount;
  • orderReference;
  • amount;
  • currency;
  • transactionStatus;
  • кодировку данных;
  • тестовый или боевой режим;
  • не меняет ли плагин номер заказа перед отправкой в WayForPay;
  • не добавляет ли сайт префикс или суффикс к orderReference.

Если в WooCommerce заказ имеет ID 1234, а в WayForPay ушёл ORDER-1234, плагин должен уметь корректно сопоставить callback с заказом.

6. Проверьте SSL и редиректы

Callback должен открываться по стабильному HTTPS-адресу без лишних редиректов.

Проверьте:

  • SSL-сертификат действующий;
  • нет редиректа HTTPS → HTTP;
  • нет цикла редиректов;
  • домен в сертификате совпадает с доменом сайта;
  • сайт не закрыт Basic Auth;
  • сайт не находится в maintenance mode;
  • callback URL не требует авторизации WordPress;
  • нет блокировки по стране или IP.

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

WayForPay отправляет серверный POST-запрос. Защита сайта может принять его за подозрительный и вернуть 403.

Проверьте:

  • Cloudflare Firewall Events;
  • WAF rules;
  • ModSecurity logs на хостинге;
  • security-плагины WordPress;
  • country blocking;
  • IP-блокировки;
  • rate limiting;
  • Bot Fight Mode;
  • правила, блокирующие POST-запросы.

Не отключайте защиту полностью навсегда. Лучше найти конкретное правило и добавить точное исключение для callback URL или разрешённых IP, если это поддерживается.

8. Исключите оплату и callback из кеша

Кеш не должен вмешиваться в оплату и серверные уведомления.

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

  • /cart/
  • /checkout/
  • /my-account/
  • страницу возврата после оплаты;
  • callback / serviceUrl;
  • ?wc-ajax=*
  • REST endpoints платёжного плагина;
  • wc-api endpoints, если их использует плагин.

Проверьте плагин кеша, серверный кеш, CDN, Cloudflare, Object Cache, Redis/Memcached и оптимизацию JavaScript.

9. Проверьте PHP-ошибки

Если callback получает 500 или статус не меняется без видимой причины, включите debug.log и проверьте ошибки в момент тестовой оплаты.

Ищите:

  • PHP Fatal error
  • Uncaught Error
  • Allowed memory size exhausted
  • Call to undefined function
  • Class not found
  • TypeError
  • ошибки в файлах WayForPay-плагина;
  • ошибки в теме или кастомных сниппетах WooCommerce.

10. Проверьте статусы WooCommerce

Для физических товаров после успешной оплаты обычно нужен статус processing. Для виртуальных и загружаемых товаров может использоваться completed. Если плагин переводит заказ в on-hold, значит он считает оплату неподтверждённой или требует ручной проверки.

Проверьте настройки платёжного плагина:

  • какой статус ставить после успешной оплаты;
  • какой статус ставить после неуспешной оплаты;
  • что делать при ожидании подтверждения;
  • поддерживаются ли кастомные статусы;
  • не перезаписывает ли статус CRM, склад, Telegram или другой плагин.

Код

Важно: код ниже нужен для диагностики. Он может писать технические данные в логи WooCommerce. Не логируйте полные платёжные данные, подписи, телефоны, email, карты и персональные данные клиентов. Перед изменениями сделайте резервную копию. Лучше вставлять код в отдельный мини-плагин, а не в активную тему.

Включить 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-запросы WayForPay

Куда вставлять: отдельный мини-плагин или 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 не на тот URL;
  • returnUrl работает, но serviceUrl не настроен;
  • callback блокируется Cloudflare, WAF, ModSecurity или security-плагином;
  • callback получает 403, 404, 500 или timeout;
  • подпись merchantSignature не проходит проверку;
  • не совпадает orderReference, сумма или валюта;
  • плагин WayForPay несовместим с WooCommerce, PHP или HPOS;
  • кеш вмешивается в checkout или callback;
  • PHP-ошибка останавливает обработку callback;
  • кастомный код или CRM перезаписывает статус заказа;
  • WooCommerce получает оплату, но ставит не тот статус.

Правильный результат — тестовая оплата проходит, WayForPay отправляет callback, сайт отвечает корректно, WooCommerce меняет статус заказа, в примечаниях заказа есть запись об оплате, а письма и интеграции срабатывают как нужно.

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

Если callback не доходит вообще

Проверьте access log хостинга. Если в access log нет запроса от WayForPay в момент тестовой оплаты, значит проблема до WordPress: неправильный serviceUrl, DNS, SSL, Cloudflare, firewall или блокировка на уровне хостинга.

Если callback доходит, но заказ не найден

Проверьте orderReference. Некоторые плагины передают в WayForPay не чистый ID заказа, а номер с префиксом. Тогда callback должен правильно сопоставить этот номер с заказом WooCommerce.

Если callback получает 403

Смотрите Cloudflare Firewall Events, ModSecurity logs, security-плагин, IP-блокировки и country blocking. WayForPay может отправлять запрос с IP, который ваш сайт считает подозрительным.

Если callback получает 500

Включите debug.log и проверьте error_log хостинга. Ошибка 500 почти всегда означает, что код упал при обработке callback: платёжный плагин, тема, кастомный сниппет, CRM-интеграция или WooCommerce hook.

Если статус меняется только после ручной проверки

Проверьте настройки платёжного плагина. Возможно, плагин ставит on-hold, потому что считает платёж неподтверждённым, не доверяет подписи или ждёт финального статуса транзакции.

Если проблема только после обновления WooCommerce

Проверьте совместимость WayForPay-плагина с текущей версией WooCommerce, PHP и HPOS. После обновлений часто ломаются старые хуки, API endpoints, шаблоны и обработчики статусов.

Если WayForPay работает на одном сайте, но не работает на другом

Сравните окружение:

  • версия PHP;
  • версия WooCommerce;
  • версия платёжного плагина;
  • Cloudflare и WAF;
  • кеш;
  • SSL;
  • постоянные ссылки;
  • HPOS;
  • тема;
  • security-плагины;
  • кастомные хуки статусов.

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

  • Путать returnUrl и serviceUrl. Возврат клиента на сайт не равен серверному подтверждению оплаты.
  • Менять статус вручную и не чинить callback. Следующие заказы снова зависнут.
  • Принудительно ставить processing без проверки оплаты. Так можно подтвердить неоплаченный заказ.
  • Не смотреть WooCommerce logs. Платёжный плагин часто пишет туда точную ошибку.
  • Игнорировать WAF и Cloudflare. Callback может блокироваться до попадания в WordPress.
  • Кешировать checkout и callback URL. Оплата и серверные уведомления должны быть динамическими.
  • Использовать старый плагин оплаты. Он может не поддерживать новую версию WooCommerce, PHP или HPOS.
  • Не проверять SSL. Платёжная система может не отправлять уведомление на проблемный HTTPS-адрес.
  • Не сверять сумму и валюту. Плагин может отклонить callback из-за несовпадения данных.
  • Не делать тестовую оплату после исправления. Нужно проверить весь путь: checkout → WayForPay → callback → статус → письма.

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

Чеклист: WayForPay callback WooCommerce не работает

  1. Сделайте тестовый заказ минимальной суммой.
  2. Проверьте статус заказа в WooCommerce.
  3. Проверьте статус платежа в кабинете WayForPay.
  4. Проверьте примечания заказа WooCommerce.
  5. Проверьте WooCommerce → Статус → Журналы.
  6. Проверьте правильность serviceUrl / callback URL.
  7. Проверьте, не перепутан ли returnUrl с serviceUrl.
  8. Проверьте merchantAccount, secret key, test/live mode.
  9. Проверьте orderReference, сумму и валюту.
  10. Проверьте SSL и редиректы HTTPS.
  11. Проверьте Cloudflare, WAF, ModSecurity и security-плагины.
  12. Проверьте access log хостинга по callback URL.
  13. Проверьте debug.log и error_log хостинга.
  14. Исключите checkout, cart, my-account, callback и wc-api endpoints из кеша.
  15. Проверьте совместимость плагина WayForPay с WooCommerce, PHP и HPOS.
  16. Проверьте кастомный код, который меняет статусы заказов.
  17. После исправления повторите тестовую оплату и проверьте статус, письма и логи.

Что смотреть в логах

  • 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 получил событие успешной оплаты.

FAQ

Почему WayForPay callback не работает в WooCommerce?

Чаще всего из-за неправильного serviceUrl, ошибки подписи, SSL, WAF, Cloudflare, security-плагина, кеша, неверных ключей, режима test/live, PHP-ошибки или несовместимости платёжного плагина.

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

ReturnUrl возвращает покупателя на сайт после оплаты. ServiceUrl или callback нужен для серверного уведомления о статусе платежа. Для смены статуса заказа важен именно серверный callback.

Почему деньги списались, а заказ остался “Ожидается оплата”?

Платёж прошёл на стороне WayForPay, но WooCommerce не получил или не обработал callback. Проверьте serviceUrl, логи, подпись, WAF, SSL и настройки плагина.

Почему callback получает 403?

Его может блокировать Cloudflare, WAF, ModSecurity, security-плагин, IP-блокировка, country block или правило, запрещающее POST-запросы. Нужно смотреть firewall logs.

Почему callback получает 404?

Обычно URL неправильный, endpoint плагина не существует, плагин отключён или сломаны постоянные ссылки. Проверьте callback URL и активность WayForPay-плагина.

Почему callback получает 500?

Это похоже на PHP-ошибку во время обработки платежа. Проверьте debug.log, error_log хостинга, логи WooCommerce и совместимость плагина с текущей версией WooCommerce/PHP.

Какой статус должен быть после успешной оплаты WayForPay?

Для физических товаров обычно processing. Для виртуальных или загружаемых товаров может быть completed. Если стоит on-hold, плагин может ждать ручной проверки или считать оплату неподтверждённой.

Можно ли вручную перевести заказ в “Обработка”?

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

Можно ли кодом автоматически менять статус после возврата покупателя?

Нельзя делать это только по факту возврата на сайт. Покупатель мог вернуться без успешной оплаты. Статус нужно менять только после проверки серверного callback, подписи, суммы, валюты и статуса транзакции.

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

Да. Checkout, cart, my-account, return URL, callback/serviceUrl, wc-api, REST и AJAX endpoints нельзя кешировать как обычные страницы. Кеш может мешать оплате и смене статуса.

Что делать, если WayForPay работал раньше и сломался после обновления?

Проверьте обновления WooCommerce, PHP, WayForPay-плагина, темы, security-плагина, кеша и HPOS. Затем смотрите логи, callback URL и ошибки PHP.

Как понять, дошёл ли callback до WordPress?

Проверьте 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 без ручных костылей.

Об авторе

vkuzyomko administrator