Как я могу получить местную валюту на пользователя - PullRequest
0 голосов
/ 23 мая 2019

Я использую Laravel 5.6 с Vue.js для внешнего интерфейса. Мне нужно автоматически зарегистрировать пользователя с его кодом валюты. Есть предложения?

Я перепробовал много пакетов (geoip, geolocal), но ни один из них не работает для меня.

$location = geoip()->getLocation();

1 Ответ

0 голосов
/ 23 мая 2019

Я использую пару сервисов для получения кода страны.Если кто-то не работает по какой-либо причине (например, превышен лимит), он пытается воспользоваться следующей услугой:

/**
* Make cUrl request.
*/
private static function _getCurl(string $url, int $timeout = 400):?string {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, $timeout);     // If it takes too long just try the next api
    curl_setopt($ch, CURLOPT_TIMEOUT_MS, $timeout);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $output = curl_exec($ch);
    curl_close($ch);
    return $output;
}

/**
* Try to get the country code of the current user based on it's ip.
*/
public static function getCountryCode():?string {
    // https://hostip.info/  - unlimited? requests per day
    // https://ipinfo.io/    - 1000 requests per day
    // https://ipdata.co/    - 1500 requests per day
    // https://ipstack.com/  - 10000 requests per month (not used at the moment)

        // Get country code:
        $ip = $_SERVER['HTTP_CLIENT_IP']);

        $countryCode = null;
        if (!$countryCode) {    // Try hostip.info
            try {
                $output = self::_getCurl('https://api.hostip.info/get_json.php?ip=' . $ip);
                $output = json_decode($output);
                $countryCode = ($output->country_code == 'XX') ? null : $output->country_code;
            }
            catch (Throwable $t) {}
        }
        if (!$countryCode) {    // Try ipinfo.io
            try {
                $output = self::_getCurl('http://ipinfo.io/' . $ip . '/json?token=[ipinfo.io TOKEN HERE]');
                $output = json_decode($output);
                $countryCode = ($output->country == 'XX') ? null : $output->country;
            }
            catch (Throwable $t) {}
        }
        if (!$countryCode) {    // Try ipdata.co
            try {
                $output = self::_getCurl('https://api.ipdata.co/' . $ip . '?api-key=[ipdata.co TOKEN HERE]');
                $output = json_decode($output);
                $countryCode = ($output->country_code == 'XX') ? null : $output->country_code;
            }
            catch (Throwable $t) {}
        }

    return $countryCode;
}

Это урезанный класс из более крупного класса, поэтому вам, возможно, потребуется кое-что настроить здесь и там.Для ipinfo.io и ipdata.co нужны токены api, поэтому сначала их нужно получить с их сайтов (оба бесплатны).

...