Диагностика проблемы с оплатой по ссылке в WooCommerce
В WooCommerce часто используют ссылки для оплаты заказов, отправляемые клиентам. Если заказ отменяется или становится неактивным, ссылка остаётся активной, что может привести к попыткам оплаты отменённых заказов. Это создаёт путаницу и может привести к ошибкам в учёте.
Проверить эту проблему можно так:
- Создайте заказ и сгенерируйте ссылку для оплаты (например, через стандартный механизм WooCommerce или плагин оплаты).
- Отмените заказ в админке WooCommerce.
- Попробуйте перейти по ссылке оплаты с другого браузера или инкогнито.
- Если оплата возможна — проблема налицо.
Пошаговое решение: автоматически отключать оплату по ссылке при смене статуса заказа
Основная идея: при смене статуса заказа на «отменён» или «отказ» отключать возможность оплаты по ссылке. Реализуем это через хук woocommerce_order_status_changed. Важно, чтобы ссылка оплаты проверяла статус заказа перед активацией — это стандартный механизм WooCommerce, но некоторые сторонние плагины могут игнорировать статус.
Пример кода для functions.php вашей темы или кастомного плагина:
add_action('woocommerce_order_status_changed', 'disable_payment_link_on_cancel', 10, 3);
function disable_payment_link_on_cancel($order_id, $old_status, $new_status) {
if (in_array($new_status, array('cancelled', 'failed'))) {
$order = wc_get_order($order_id);
if (!$order) return;
// Добавим мета-данные для блокировки оплаты по ссылке
$order->update_meta_data('_payment_link_disabled', 'yes');
$order->save();
}
}
Далее в обработчике оплаты вашего плагина или в шаблоне страницы оплаты добавьте проверку:
$order = wc_get_order($order_id); // ID заказа из ссылки
if ($order->get_meta('_payment_link_disabled') === 'yes') {
wp_die('Оплата по данной ссылке недоступна, заказ отменён.');
}
Альтернативный вариант — удалять ссылку оплаты из письма при отмене заказа
Если вы используете стандартное письмо с ссылкой, можно перехватить генерацию письма и убрать ссылку:
add_filter('woocommerce_email_order_meta', 'remove_payment_link_from_cancelled_order', 10, 3);
function remove_payment_link_from_cancelled_order($order_meta, $order, $email) {
if ($order->has_status('cancelled')) {
// Удаляем или заменяем ссылку оплаты
foreach ($order_meta as $key => $value) {
if (strpos($value, 'payment_link') !== false) {
unset($order_meta[$key]);
}
}
}
return $order_meta;
}
Проверка результата после внедрения
- Создайте заказ, сгенерируйте ссылку оплаты и убедитесь, что по ней можно оплатить.
- Отмените заказ в админке.
- Попробуйте открыть ссылку оплаты — должно появиться сообщение об ошибке или ссылка должна быть недоступна.
- Проверьте письма клиенту — ссылка оплаты не должна отображаться в письмах с отменёнными заказами.
Частые ошибки и как их исправить
- Отсутствие проверки статуса заказа в плагине оплаты: если сторонний плагин оплаты не проверяет статус заказа, ссылка останется активной. Решение — добавить фильтр и проверку вручную, как в примере выше.
- Мета-данные не сохраняются: убедитесь, что вызов
$order->save()есть после обновления мета. - Кэширование страниц оплаты: если используется кэширование, старые ссылки могут оставаться активными. Настройте исключения по URL в кэше.
- Удаление ссылки из письма не работает: убедитесь, что фильтр применяется к нужному письму (например,
woocommerce_email_order_metaиспользуется в правильном контексте).
Практические советы по безопасности и производительности
- Валидация на сервере: всегда проверяйте статус заказа на сервере при оплате, не полагайтесь только на клиентскую логику.
- Логирование изменений статусов: ведите логи изменения статусов заказов для аудита и устранения проблем.
- Кэширование: избегайте кэширования страниц оплаты, чтобы не показывать устаревшую информацию.
- Проверка в платежных шлюзах: некоторые шлюзы позволяют отменять платежи программно — интегрируйте такое при необходимости.
Сравнение вариантов решения
| Метод | Плюсы | Минусы |
|---|---|---|
| Добавление мета и проверка в коде оплаты | Гибкий контроль, работает с любыми платежами | Требует доработки кода оплаты |
| Удаление ссылки из письма | Простая реализация, влияет на UX | Не защищает от ручного перехода по ссылке |
| Использование плагинов для управления заказами | Готовые решения, поддержка | Зависимость от стороннего ПО, возможна избыточность |