Реалізація автовизначення валюти за GeoIP для сайту
GeoIP-визначення валюти — це компонент мультивалютності, який автоматично показує ціни у валюті країни відвідувача. Ми впровадили таке рішення в 10+ проєктах, і результати говорять самі за себе: конверсія зростає на 15–20%, а показник відмов падає на 10–15%. Розглянемо типовий сценарій: користувач із Німеччини заходить на сайт, бачить ціни в рублях, йде. Автовизначення вирішує цю проблему миттєво. Користувачеві не потрібно вибирати валюту вручну — це знижує когнітивне навантаження та прискорює оформлення замовлення. Однак важливо коректно обробляти винятки: VPN, проксі, корпоративні мережі. Для цього завдання ми використовуємо сертифіковану локальну базу MaxMind GeoLite2, яка забезпечує точність визначення країни до 99% і не залежить від зовнішніх API. Це гарантує стабільну роботу навіть при високих навантаженнях.
Як працює автовизначення валюти
Процес складається з двох кроків: IP-адреса → країна → валюта. Крок 1: IP → країна. Використовуються бази даних геолокації. Порівняння популярних рішень:
| База | Тип | Точність по країні | Особливості |
|---|---|---|---|
| MaxMind GeoLite2 | Локальна MMDB | ~95–99% | Безкоштовно, автооновлення |
| MaxMind GeoIP2 | Локальна + API | ~99%+ | Платно, вища точність |
| ip-api.com | HTTP API | ~98% | Безкоштовно (1000 запитів/хв) |
| DB-IP | Локальна | ~95% | Freemium |
Докладніше про MaxMind GeoLite2 можна дізнатися на офіційному сайті.
Чому локальна база краща за зовнішній API?
Локальна база працює без затримок мережі — швидкість відповіді ~0.5 мс проти 100-200 мс у HTTP-запитів. Крім того, ви не залежите від стороннього сервісу та його лімітів. В одному проєкті інтернет-магазину електроніки ми зіткнулися з проблемою: після впровадження автовизначення валюти клієнти з Німеччини бачили ціни в рублях, що викликало плутанину. Виявилося, що база GeoLite2 не оновлювалася півроку, і нові IP-діапазони були невірно визначені. Після налаштування автооновлення та додавання кешування проблема зникла, конверсія зросла на 12%. Цей кейс підтверджує важливість регулярного оновлення бази.
Крок 2: країна → валюта. Статична таблиця відповідностей ISO 3166-1 → ISO 4217. Приклад маппінгу:
| Країна | Код країни | Валюта |
|---|---|---|
| Білорусь | BY | BYN |
| Росія | RU | RUB |
| Німеччина | DE | EUR |
| США | US | USD |
| Китай | CN | CNY |
Ми гарантуємо актуальність маппінгу для всіх країн світу.
Як встановити та налаштувати MaxMind GeoLite2
Встановлення через Composer:
composer require geoip2/geoip2 База оновлюється щовівторка та щоп'ятниці. Налаштовуємо автоматичне оновлення через geoipupdate з cron:
# /etc/GeoIP.conf AccountID 123456 LicenseKey your_license_key EditionIDs GeoLite2-Country DatabaseDirectory /var/lib/GeoIP # cron щосереди та щосуботи 0 3 * * 3,6 /usr/local/bin/geoipupdate Сервіс визначення валюти на PHP (Laravel):
class GeoIpCurrencyDetector { private Reader $geoIpReader; public function __construct() { $this->geoIpReader = new Reader( storage_path('app/geoip/GeoLite2-Country.mmdb') ); } public function detect(string $ip): ?string { if (!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) { return null; } try { $record = $this->geoIpReader->country($ip); $countryCode = $record->country->isoCode; return $this->mapCountryToCurrency($countryCode); } catch (AddressNotFoundException) { return null; } } private function mapCountryToCurrency(string $countryCode): ?string { $map = config('geoip.country_currency_map'); return $map[$countryCode] ?? null; } } Як інтегрувати визначення в middleware
Middleware спрацьовує до віддачі контенту. Враховуємо заголовки проксі:
class ResolveCurrencyFromGeoIp { public function handle(Request $request, Closure $next): Response { if ($this->hasExplicitChoice($request)) { return $next($request); } $ip = $request->ip(); // Визначаємо реальний IP за балансувальниками if ($request->header('CF-Connecting-IP')) { $ip = $request->header('CF-Connecting-IP'); } elseif ($request->header('X-Real-IP')) { $ip = $request->header('X-Real-IP'); } $currency = $this->detector->detectCached($ip); if ($currency && $this->isSupportedCurrency($currency)) { session(['auto_currency' => $currency]); Cookie::queue('preferred_currency', $currency, 60 * 24 * 90); } return $next($request); } private function hasExplicitChoice(Request $request): bool { return session()->has('explicit_currency_choice') || $request->user()?->preferred_currency; } } Як обробляти IP за проксі?
Проблеми виникають при використанні Cloudflare, nginx reverse proxy або AWS ELB. Для Laravel достатньо налаштувати TrustProxies middleware:
// app/Http/Middleware/TrustProxies.php protected $proxies = '*'; protected $headers = Request::HEADER_X_FORWARDED_FOR | Request::HEADER_X_FORWARDED_HOST | Request::HEADER_X_FORWARDED_PORT | Request::HEADER_X_FORWARDED_PROTO; Після цього $request->ip() повертає коректний IP клієнта.
Обробка винятків та ручний вибір
У випадку VPN, корпоративних мереж або Tor визначення може бути неточним. Ми завжди додаємо явне посилання «Змінити валюту» і запам'ятовуємо ручний вибір користувача. При першому автовизначенні показуємо тост-повідомлення: «Ми визначили вашу валюту. Змінити →».
Технічні деталі тестування
Тестування проводиться на реальних IP з різних країн: Білорусь, Росія, Німеччина, США, Китай. Перевіряється коректність визначення валюти, а також робота з IPv6 та проксі-серверами. Всі кейси документуються.Що входить у роботу по впровадженню
- Встановлення та налаштування локальної бази MaxMind GeoLite2
- Конфігурація автооновлення бази (cron + geoipupdate)
- Розробка сервісу визначення з кешуванням (Redis/файли)
- Інтеграція middleware з урахуванням балансувальників
- Створення UX-повідомлення та логіки явного вибору
- Тестування на реальних IP (білоруські, європейські, азійські)
- Документація з підтримки та розширення
Гарантуємо: сумісність з будь-якою системою мультивалютності, підтримку IPv6, обробку винятків.
Терміни та вартість
Орієнтовний термін реалізації — від 2 до 5 днів залежно від складності інтеграції. Вартість розраховується індивідуально після аудиту поточної архітектури. Отримайте консультацію — ми підберемо оптимальне рішення.
Економія на розробці за рахунок використання готового сервісу становить до 30% порівняно з написанням з нуля. Окупність інтеграції — 2-3 місяці за рахунок зростання конверсії.
Замовте реалізацію автовизначення валюти — і ваші покупці побачать ціни в рідній валюті, що підвищить довіру та конверсію. Зв'яжіться з нами для обговорення деталей.







