Проблема: автоматическая обработка платежей в WooCommerce мешает интеграции с кастомными системами
По умолчанию WooCommerce обрабатывает платежи сразу после подтверждения заказа. При интеграции с внешними платежными шлюзами или кастомной логикой иногда требуется отключить автоматическую обработку, чтобы вручную контролировать состояние заказа и запускать собственные действия.
Диагностика проблемы
Если вы замечаете, что статус заказа в WooCommerce меняется автоматически без участия вашего кода или сторонних сервисов, вероятно, работает встроенный механизм автообработки платежей. Это может приводить к конфликтам, например:
- Двойная обработка транзакций
- Неправильное выставление статуса заказа
- Отсутствие возможности вставить кастомную проверку оплаты
Чтобы убедиться, что автообработка включена, проверьте наличие вызова payment_complete() в коде вашего платежного шлюза или используйте отладчик, чтобы следить за изменениями статуса заказа.
Пошаговое решение: отключение автообработки и внедрение собственного хука
1. Отключаем вызов $order->payment_complete() в кастомном шлюзе
Если вы используете собственный класс платежного шлюза, найдите вызов $order->payment_complete() и закомментируйте его или удалите. Это остановит автоматическую смену статуса заказа.
public function process_payment( $order_id ) {
$order = wc_get_order( $order_id );
// $order->payment_complete(); // отключаем автоматическую обработку
return [
'result' => 'success',
'redirect' => $this->get_return_url( $order )
];
}2. Создаём собственный хук для контроля статуса оплаты
Добавьте в functions.php или в свой плагин следующий код для обработки собственного события оплаты:
add_action( 'my_custom_payment_complete', function( $order_id ) {
if ( ! $order_id ) {
return;
}
$order = wc_get_order( $order_id );
if ( ! $order ) {
return;
}
// Меняем статус вручную
$order->update_status( 'processing', 'Оплата подтверждена вручную через кастомный хук.' );
// Здесь можно добавить дополнительные действия, например отправку письма
});3. Запуск собственного хука при подтверждении оплаты
В нужном месте вашего кода (например, после успешного ответа от платежного шлюза) вызовите:
do_action( 'my_custom_payment_complete', $order_id );Проверка результата
Чтобы убедиться, что автообработка отключена и ваш хук срабатывает:
- Создайте тестовый заказ и оплатите его через ваш кастомный шлюз.
- Проверьте, что статус заказа не меняется автоматически после оплаты.
- Вызовите вручную
do_action( 'my_custom_payment_complete', $order_id )и проверьте, что статус изменился наprocessing. - Убедитесь, что дополнительные действия (например, уведомления) выполняются.
Частые ошибки и как их исправить
- Ошибка: Автообработка не отключилась, статус меняется автоматически.
Причина: В другом месте кода или в стороннем плагине вызываетсяpayment_complete().
Решение: Используйте поиск по проекту, чтобы найти все вызовыpayment_complete()и отключить/заменить их. - Ошибка: Собственный хук не срабатывает.
Причина: Хук вызывается до создания заказа или с неверным ID.
Решение: Проверьте корректность параметров и порядок вызовов. - Ошибка: Статус заказа не меняется.
Причина: Ошибка в коде обновления статуса или недостаточно прав.
Решение: Проверяйте возвращаемые ошибки, используйтеerror_log()и убедитесь, что заказ существует.
Практические советы по безопасности и производительности
- При ручном обновлении статусов всегда проверяйте, что пользователь или система имеет право на это действие.
- Минимизируйте количество вызовов обновления статуса, чтобы избежать лишней нагрузки на базу данных.
- Используйте транзакции базы данных, если обновляете несколько связанных сущностей.
- Логируйте изменения статусов для последующего аудита и отладки.
Сравнение вариантов отключения автообработки платежей
| Метод | Плюсы | Минусы |
|---|---|---|
Закомментировать payment_complete() в кастомном шлюзе | Простой и быстрый способ полного контроля | Требует доступа к коду шлюза, возможно конфликт с обновлениями |
| Использовать фильтры WooCommerce для перехвата статуса | Не требует изменения кода шлюза, гибкость | Сложнее в реализации, может влиять на другие плагины |
| Использовать сторонние плагины для управления статусами | Готовые решения без программирования | Зависимость от стороннего кода, лишняя нагрузка |