Диагностика проблемы: зачем отключать платёжные системы по геолокации
Во многих интернет-магазинах на WooCommerce возникает задача ограничить или отключить определённые платёжные методы для клиентов из конкретных стран или регионов. Это может понадобиться из-за юридических ограничений, высокой вероятности мошенничества или особенностей работы платёжных шлюзов.
Если в вашем магазине подключены несколько платёжных систем, и вы хотите управлять их доступностью в зависимости от местоположения пользователя, стандартных настроек WooCommerce для этого нет. Решение — программное отключение методов оплаты на этапе выбора способа оплаты.
Как определить геолокацию клиента в WooCommerce
WooCommerce имеет встроенную функцию геолокации — WC_Geolocation::geolocate_ip(), которая возвращает данные о стране и регионе клиента по IP-адресу.
use Automattic\WooCommerce\Internal\Packages\Framework\Geolocation\WC_Geolocation;
$location = WC_Geolocation::geolocate_ip();
$country_code = $location['country']; // например, 'RU'
Данный метод достаточно точен для базовых задач и не требует сторонних сервисов.
Пошаговое решение: отключение платёжных систем по стране
Для примера отключим платёжную систему «Cheque» (наличный расчёт) для пользователей из России и Беларуси.
add_filter('woocommerce_available_payment_gateways', 'disable_payment_gateways_by_geolocation');
function disable_payment_gateways_by_geolocation($available_gateways) {
if (is_admin()) return $available_gateways; // Отключаем в админке
$location = WC_Geolocation::geolocate_ip();
$country = $location['country'];
// Список стран, для которых отключаем платеж
$blocked_countries = array('RU', 'BY');
// Список платёжных систем для отключения
$gateways_to_disable = array('cheque');
if (in_array($country, $blocked_countries)) {
foreach ($gateways_to_disable as $gateway_id) {
if (isset($available_gateways[$gateway_id])) {
unset($available_gateways[$gateway_id]);
}
}
}
return $available_gateways;
}
Объяснение кода
- Фильтр
woocommerce_available_payment_gatewaysпозволяет изменить список доступных платёжных методов. - Мы получаем IP и определяем страну клиента через
WC_Geolocation::geolocate_ip(). - Если страна входит в список заблокированных, то удаляем указанные платёжные методы из массива доступных.
Проверка результата после внедрения
- Подключитесь к сайту через VPN с IP из России или Беларуси.
- Перейдите к оформлению заказа и проверьте список платёжных методов — «Cheque» должен отсутствовать.
- Подключитесь с IP из другой страны — метод должен отображаться.
- Для проверки можно использовать сервисы определения IP и VPN.
Частые ошибки и как их исправить
- Платёжный метод не отключается — проверьте правильность ID платёжного метода. Получить список можно так:
Посмотрите логи PHP и убедитесь, что используете правильный ID.add_action('woocommerce_available_payment_gateways', function($gateways) { error_log(print_r(array_keys($gateways), true)); return $gateways; }); - Геолокация не срабатывает или всегда возвращает одну страну — проверьте в настройках WooCommerce, что геолокация включена (
WooCommerce > Настройки > Общие > Определение местоположения). Возможна проблема с кэшем. - Функция отключения работает в админке — добавьте проверку
is_admin(), чтобы не мешать работе администратора.
Практические советы по безопасности и производительности
- Геолокация по IP не всегда точна. Для критичных сценариев используйте платные API (например, MaxMind GeoIP2).
- Не храните результаты геолокации в сессии без шифрования — это может привести к ошибкам при смене IP в прокси или VPN.
- Кэширование страниц с блокировками по геолокации может привести к тому, что пользователи увидят неправильные платёжные методы. Используйте исключения для страниц оформления заказа.
- Обновляйте список стран и платёжных методов централизованно, чтобы проще масштабировать решение.
Сравнение вариантов реализации отключения платёжных систем по геолокации
| Метод | Плюсы | Минусы |
|---|---|---|
Код на PHP с использованием woocommerce_available_payment_gateways | Гибко, без сторонних плагинов, точечное управление | Требует знаний PHP, возможны ошибки при неправильной реализации |
| Плагины геолокации и управления оплатой | Простота настройки, часто есть GUI | Дополнительные расходы, нагрузка на сайт, ограниченная кастомизация |
| Использование платных геолокационных API | Высокая точность определения | Стоимость, необходимость интеграции |