Проблема: заказ не меняет статус после оплаты через внешние платежные системы
Многие разработчики сталкиваются с ситуацией, когда в WooCommerce заказ остаётся в статусе on-hold или pending после успешной оплаты через сторонние платежные шлюзы (например, Яндекс.Касса, Робокасса, PayPal). Это вызывает проблемы с логистикой и недовольство пользователей.
Основная причина — отсутствие корректной обработки уведомлений от платежной системы или неверная интеграция webhook, из-за чего WooCommerce не получает сигнал об успешной оплате и не меняет статус заказа автоматически.
Диагностика проблемы
- Проверьте логи платежной системы на предмет успешных уведомлений о платеже.
- Убедитесь, что URL webhook корректно настроен и доступен извне.
- Включите WP_DEBUG и посмотрите, есть ли ошибки в момент получения уведомления.
- Проверьте настройки статусов в WooCommerce: какие статусы назначаются по умолчанию после оплаты.
- Посмотрите, не блокирует ли .htaccess или firewall запросы от платежной системы.
Как автоматически менять статус заказа после оплаты в WooCommerce
Рассмотрим универсальный пример, как через хук woocommerce_payment_complete изменить статус заказа на processing (что означает, что оплата прошла и можно приступать к обработке заказа).
Добавьте следующий код в файл functions.php вашей темы (или лучше в плагин для кастомных функций):
add_action('woocommerce_payment_complete', 'custom_set_order_status_processing');
function custom_set_order_status_processing($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
// Проверяем, что статус не равен processing
if ($order && 'processing' !== $order->get_status()) {
$order->update_status('processing', 'Статус автоматически изменён после оплаты');
}
}Если ваш платежный шлюз не вызывает этот хук, нужно дополнительно реализовать обработку webhook, например, через init с проверкой параметров запроса и вызовом update_status().
Пример обработки webhook от платежной системы
add_action('init', 'custom_payment_gateway_webhook_handler');
function custom_payment_gateway_webhook_handler() {
if (isset($_GET['custom_payment_webhook'])) {
// Проверка подписи и параметров
$order_id = intval($_GET['order_id']);
$payment_status = sanitize_text_field($_GET['status']);
if ($payment_status === 'success' && $order_id) {
$order = wc_get_order($order_id);
if ($order && 'processing' !== $order->get_status()) {
$order->update_status('processing', 'Оплата подтверждена через webhook');
}
wp_send_json_success('Статус обновлён');
}
wp_send_json_error('Неверные данные');
}
}Проверка результата
- Совершите тестовую покупку через выбранный платежный шлюз.
- После оплаты убедитесь, что статус заказа в админке WooCommerce изменился на
processing. - Проверьте, что уведомления о статусе доходят корректно (логи платежной системы и WooCommerce).
- При использовании webhook попробуйте вызвать URL вручную с тестовыми параметрами и посмотрите ответ и изменения в заказе.
Частые ошибки и как исправить
- Хук не вызывается платежным шлюзом
Решение: реализуйте собственный обработчик webhook, как показано выше. - Webhook не доходит из-за блокировок сервера
Решение: проверьте настройки firewall, .htaccess, разрешите доступ IP платежной системы. - Статус заказа не меняется из-за кэширования
Решение: отключите кэширование для страниц админки и API, используйтеwp_cache_flush()при необходимости. - Ошибка валидации данных webhook
Решение: тщательно проверяйте подписи и параметры в запросах, чтобы избежать подделки.
Практические советы по безопасности и производительности
- Всегда проверяйте подписи и ключи безопасности в webhook-запросах.
- Используйте nonce или токены для защиты от CSRF при обработке запросов.
- Минимизируйте объем логирования в продакшене, чтобы не перегружать дисковое пространство.
- Для крупных магазинов рекомендуем обрабатывать вебхуки асинхронно через очереди или cron, чтобы не блокировать основной поток.
Сравнение способов автоматического изменения статуса заказа
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
Хук woocommerce_payment_complete | Простой, встроенный, работает с большинством шлюзов | Зависит от корректной реализации шлюза | Использовать, если платежный шлюз поддерживает |
| Обработка webhook вручную | Контроль над процессом, подходит для нестандартных шлюзов | Требует дополнительного кода и проверки безопасности | Использовать, если хук не вызывается |
| Плагины интеграторы платежей | Готовые решения, поддержка обновлений | Зависимость от стороннего кода, возможны конфликты | Использовать для популярных платежек |