MPI/API/QRCodeDinamico
De uTech Tecnologia
Tabela de conteúdo |
Após configurar seu dispositivo pata utilizar QR Code dinâmicos, é necessário utilizar um algoritmo para gerá-lo.
Requisitos
Requisitos que do integrador:
- O integrador deverá gerar uma chave privada (senha) e guardá-la para utilização e geração dos QR Codes para este usuário.
- Ex: 1234
- Guardar o valor da Validade de QRCODE Dinâmico, configurado no porteiro IP / Catraca, ou outro dispositivo uTech, o qual será utilizado para gerar o QR Code dinâmico. Valor inteiro/segundos.
- . Ex. 30
- Ter acesso de administrador na API de integração do porteiro IP / Leitor / Catraca. Ver configurações em configuração da integração, no Leitor em configuração da integração ou na catraca IP em configuração da integração
- Endereço IP, pota, usuário e senha.
Como funciona
Algoritmo
Gerando o Índice:
INDICE = (TimestampInicial - TimestampAtual) / Validade.
NOTA: O índice DEVE ser um número inteiro. Caso a divisão retornar resto, descarte.
|
Onde:
- TimestampInicial: timestamp da crianção do usuário dinâmico.
- TimestampAtual: timestamp da geração do QR Code dinâmico.
- validade: Validade de QRCODE Dinâmico, configurado no porteiro ou catraca.
Exemplo:
- int((1536869400 - 1536869499 ) / 30)
- Resultado = 3;
Gerando o QR Code:
Após ter o índice em mãos, vamos gerar o QR Code. O QR Code será o hash SHA1 gerado pela concatenação dos dados senha + : + índice. Onde senha é a senha que o integrador definirá para o usuário que está sendo criado.
Exemplo: (No caso da senha = 1234 e indice = 0).
QR Code = sha1("1234:0");
O QR Code será: d752ec9ed0e0e43aaa51313a5683ab118ddea00f
Códigos exemplos
PHP
<?php /* Chave privada. definida pelo integrador para cada usuário de QR Code dinâmico. */ $minhachave = "1234567890"; /* Configurado no Proteiro como "Validade de QRCODE Dinâmico" - Tempo em segundos */ $validade = 30; /* Dados de acesso e autenticação a API do porteiro/catraca (Ver menu Geral/Itegração) */ /* Link para doc: http://wiki.utech.com.br/wiki/index.php/MPI/ConfiguracaoWEB#Integra.C3.A7.C3.A3o */ $auth = array( "user" => "admin", "pass" => "admin", "host" => "10.0.0.49", "port" => "8080" ); function add_new_user($auth, $userdata) { $basic_auth = $auth['user'] . ":" . $auth['pass']; $url = $auth['host'] . ":" . $auth['port'] . "?request=adduser"; $data_string = json_encode($userdata); $ch = curl_init($url); curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($ch, CURLOPT_USERPWD, $basic_auth); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Content-Length: ' . strlen($data_string)) ); $result = curl_exec($ch); if(!$result) { return null; } $fs = preg_replace("/<html><body>/", "", "$result"); $rc = preg_replace("/<\/body><\/html>/", "", "$fs"); return $rc; } function get_datetime($auth) { $basic_auth = $auth['user'] . ":" . $auth['pass']; $url = $auth['host'] . ":" . $auth['port'] . "?request=getdatetime"; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($ch, CURLOPT_USERPWD, $basic_auth); $result = curl_exec($ch); if(!$result) { return null; } return json_decode($result, true); } /* Pegando a TIMESTAMP do porteiro/catraca! */ /* DEVE ser guardado na base de dados do integrador, para gerar os QR codes dinamicos. */ $datetime = get_datetime($auth); if($datetime == null) { echo "Get datetime error!\n"; exit(1); } /* Adicionando o novo usuáio para acesso com QR code dinamico. */ /* Utiliar os parametros: */ /* ==> qrcode: TIMESTAMP (Utilizar o timestamp salvo na base do integrador. */ /* ==> key : Chave privado do integrador. */ $data = array( "qrcode" => $datetime['timestamp'], "key" => $minhachave ); /* Adicionando um usuáio com QR code dinamico: */ $r = add_new_user($auth, $data); if($r == null) { echo "Add user erro! Errno: $r\n\n"; exit(2); } ////////////////////////////////////////////////////////// // Agora vamos gerar os QR codes dinamicos! ////////////////////////////////////////////////////////// /* index = (Timestamp Atual - Timestamp salvo na base do integrador) / Validade de QRCODE conf. no porteiro. */ /* qrcode = SHA1 ( <Minha chave provida> : <index> ) */ $now = get_datetime($auth); // Pegando timestamp atual $index = intval((($now['timestamp'] - $datetime['timestamp'])/ $validade)); /* Gerando o indice - DEVE ser um inteiro */ $qrcode = sha1("$minhachave:$index"); /* gerando o QR Code dinamico */ printf("NOVO QR CODE: $qrcode\n"); /* Abaixo a simulaçao gerando o QR a cada 45 segundos... */ $count = 10; while($count) { $now = null; $now = get_datetime($auth); // Pegando timestamp atual $index = intval((($now['timestamp'] - $datetime['timestamp'])/ $validade)); // Gerando o indice - DEVE ser um inteiro. $qrcode = sha1("$minhachave:$index"); // gerando o QR Code dinamico. printf("NOVO QR CODE: $qrcode\n"); $count--; sleep(45); } |