Permitir acesso ao site apenas em países de sua escolha. By: tectonny Date: 16 Julho 2015, 14:59
Ontem um cliente me solicitou um serviço que nunca tinha feito, restringir o acesso do site dele por país, ou seja apenas acessa os países de sua escolha.
Eu como estudante fui buscar soluções, demorei mais achei uma boa. Vamos a ela...
Pesquisando sobre o assunto achei esse site
http://ipinfo.io, esse site tem API que informa pelo IP o país de origem, mas detalhes sobre a API aqui
http://ipinfo.io/developers, essa API é gratuita a 1000 solicitações diárias.
Isso já meio caminha andando, rsrsr, afinal estava pensando em fazer por mascara de IPs, etc... Que seria trabalhoso, já que hoje tem vários IPs aqui no Brasil que já começa com 200, 201, 187, 189, 177, agora já temos IPs começando com 91, 5, 181, entre outros.
Bom, já sabendo da informação do IP, restava criar algo em PHP para fazer a magica acontecer sozinho.
A resposta da API do site acima e json, veja um exemplo:
http://ipinfo.io/187.126.245.106/json$ curl ipinfo.io
{
"ip": "187.126.245.106",
"hostname": "No Hostname",
"city": null,
"country": "BR",
"loc": "-23.5477,-46.6358",
"org": "AS7738 Telemar Norte Leste S.A."
}
Veja a resposta json tem o precisamos na resposta "country", a localização do Brasil em BR.
Não só programador formado nem avançado, pesquise como pegar essa resposta e achei que basta usar o json_decode().
Fiz assim...
Primeiro usar a api com o IP do visitante. Para pegar o IP de cada visitante é só usar o $_SERVER['REMOTE_ADDR'], então para usar ficaria assim:
$url = "http://ipinfo.io/{$_SERVER['REMOTE_ADDR']}/json";
Ou seja a url da API pegando o IP do visitante via php. Logo eu tenho na string $url a url já com o IP do visitante. (
http://ipinfo.io/187.126.245.106/json)Para pegar esse código pelo php podemo usar o curl ou file_get_contents(), eu usei file_get_contents por ser mais simples, mas se o servidor tem bloqueio pode usar o curl. Veja o código:
$json = file_get_contents($url,0,null,null);
Agora na string $json eu tenho o código fonte da resposta json da url.
Algo parecido com esse exemplo:$ curl ipinfo.io
{
"ip": "187.126.245.106",
"hostname": "No Hostname",
"city": null,
"country": "BR",
"loc": "-23.5477,-46.6358",
"org": "AS7738 Telemar Norte Leste S.A."
}
Agora que já temos todo o código fonte na string $json resta pegar somente o que queremos, a resposta do country, que no exemplo acima é o BR.
Para isso precisamos decodificar essa resposta json, com esse código:
$saida_json = json_decode($json);
Logo a string $saida_json vai ter todos os dados decodificado em json.
Para pegar o código que deseja faz assim:
$pais = $saida_json->country;
Com isso a nossa nova string $pais vai ter exatamente o que queremos em country, e sua resposta seria BR, ou quando aberto em outro país seria outro código, por exemplo, portugal seria PT, Alemanha seria DE, e por vai.
Então todo o código produto seria assim:
<?php
$url = "http://ipinfo.io/{$_SERVER['REMOTE_ADDR']}/json";
$json = file_get_contents($url,0,null,null);
$saida_json = json_decode($json);
$pais = $saida_json->country;
$permiti = array("BR", "PT");
if(in_array($pais, $permiti)) {
echo "Portugues";
}else{
echo "Internacional";
}
?>
Veja que eu criei uma array $permiti = array("BR", "PT"); onde informei quais países teriam acesso, veja o exemplo funcionando:
http://www.codigocanyon.net/brasil.phpPróximo servicinho aqui eu posto também.