Реалізація автовизначення валюти за 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 | USD |
| Німеччина | 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 місяці за рахунок зростання конверсії.
Замовте реалізацію автовизначення валюти — і ваші покупці побачать ціни в рідній валюті, що підвищить довіру та конверсію. Зв'яжіться з нами для обговорення деталей.







