Manual de Integração - AverbePorto
Manual de Integração - AverbePorto
Manual de Integração - AverbePorto
Porto Seguro
Manual de Envio de XML para Averbação
Nota - 04/2022
Aos usuários que já utilizam a API, observar que o endpoint correto deve iniciar com apis ou
api - Por motivos técnicos, o acesso via www ou wws será desativado em breve.
Não utilize a senha de acesso web para acessar a API, pois o acesso à API com ela será
desabilitado no futuro. Gere uma senha de API própria no módulo Cadastro do Usuário.
Para aqueles que fazem averbação via e-mail para [email protected], não enviar como
Cópia Oculta Cco (Bcc).
Sumário
Controle de Versões 2
Manual de Integração atualizado 2
Averbação via Interface Web 3
XML 3
ZIP 3
Averbação via API (Webservice tipo REST) 4
Averbação via E-mail 7
Consulta Número de Averbação ANTT 8
Acessando o API (Webservice REST) 8
Acessando a Página/URL de consulta 8
Parâmetros Adicionais de Averbação 10
Acesso via Postman 13
Exemplo em PHP (cURL) 14
Exemplo em Delphi (Indy) 18
Controle de Versões
Para mais informações sobre o sistema web, consulte a Ajuda no menu à esquerda.
Os arquivos XML e ZIP devem seguir o padrão de codificação para tipos de mídias
oficiais:
XML
● application/xml
● text/xml
ZIP
● application/zip
Averbação via API (Webservice tipo REST)
Resumo: Acessar a API (RPC) via método POST para Login (mesmo Usuário do Sistema Web -
que deve ser alterada caso tenha menos de 8 dígitos; Senha da API deve ser gerada no módulo
Cadastro do Usuário) e receber o json de resposta (também contendo “ses”) e o cookie de
sessão (portal[ses] - HEADER HTTP - deve ser utilizado em múltiplos envios), acessar
novamente para Enviar o arquivo e receber o json de resposta que irá conter o status e o
Número de Averbação ANTT. O Sistema Web é um programa em JavaScript acessando esta
mesma API. Ou seja, todas as requisições e respostas podem ser observadas via Ferramenta do
Desenvolvedor em seu Navegador Web.
*1 NÃO utilizar www. ou wws. ou nenhum outro subdomínio para acesso à API, será bloqueado.
*2 Pode ser necessário definir um user-agent como “Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0)
Gecko/20100101 Firefox/12.0” para acessar apis, isso impedirá que o CF bloqueie seu programa com o erro
403/1010
*3 Chamar o endereço da API no navegador irá gerar uma mensagem de erro (item 7) pela absoluta falta de
parâmetros na comunicação.
- dump: Pode ser utilizado em qualquer requisição à API para auxiliar na depuração.
Exibe um “dump” de como estão chegando as variáveis enviadas ao sistema pelo
usuário.
dump=1: Adiciona a tag “dump” no json de resposta, após todo o processamento normal
da requisição.
dump=2: Exibe o json de resposta apenas com a tag “dump”, antes de qualquer
processamento, e aborta o processamento normal.
- pass: Não utilize a senha comum para acesso web no acesso à API. Acessando o sistema Web, vá no
módulo Cadastro do Usuário e gere uma senha de API própria, clicando no X para iniciar o processo.
6. Json de retorno:
{
"success": 1,
"S": [
"P": 1, // Processado (xml guardado com sucesso)
"D": 0, // Duplicado (xml pré-existente)
"R": 0, // Rejeitado (xml não parece ser do tipo certo)
"N": 0 // Negado (Não é xml ou zip)
]
"prot": "1234567890123", // Protocolos do XML guardados P
"prot": ["1234567890123"], // Protocolos dos XMLs (ZIP) guardados P
"error": [ // Mensagens de erro para os resultados R ou N
"code": 00,
"msg": "Mensagem de erro"
]
}
7. Json de erro genérico, significa “Erro desconhecido” e, geralmente, é resultado
de uma requisição mal formada ou efetuada via um método diferente de POST:
{
"success": 0,
"error": {
"msg": "Ghs.loc.error"
}
}
● Exemplos CURL
Dicas: -i mostra o response header; -v mostra toda a comunicação; --tls-max 1.2 limita a versão do tls
Login:
curl 'https://apis.averbeporto.com.br/php/conn.php' --compressed -c cookie.txt
-X POST -H 'Content-Type: application/x-www-form-urlencoded;
charset=UTF-8' --data 'mod=login&comp=5&user=USUARIO&pass=SENHA'
Upload:
curl 'https://apis.averbeporto.com.br/php/conn.php' --compressed -X POST -H
'Cookie: portal[ses]=8c878b3ab2ba27bf7bc4d5d448b6489b' -H 'Content-Type:
multipart/form-data' -F mod=Upload -F comp=5 -F path=eguarda/php/ -F
[email protected]
ps:
USUARIO e SENHA devem ser substituídos pelo usuário (CNPJ) e senha do
Segurado (usuário e senha próprio para acesso à API do Sistema Web).
O Cookie deve ser substituído pelo cookie retornado no login.
O ARQUIVO.xml deve ser substituído por um documento XML (corretamente
formatado) do Segurado.
Averbação via E-mail
O envio via E-mail tem limitações técnicas inerentes, tanto na velocidade que é possível
enviar XMLs quanto na leitura deles pelo sistema AverbePorto. Se o seu sistema for
enviar centenas de XMLs por dia, ou tem necessidade de receber o protocolo ANTT
imediatamente após o envio, esse método não é recomendado e, nesse caso, o melhor é
realizar a integração via API.
2. Essa conta deve ser usada como destino apenas de mensagens com anexos de
documentos eletrônicos no formato XML.
3. Para que o sistema seja capaz de averbar esse arquivo XML, ele deve estar
anexo diretamente na mensagem ou anexo em formato ZIP (XML dentro do ZIP
- ZIP dentro de ZIP será rejeitado, assim como qualquer outro formato diferente
destes).
Obs. Caso já esteja utilizando a averbação via e-mail e integre seu sistema via API
posteriormente, solicitamos que os envios via e-mail sejam imediatamente
interrompidos, pois o envio dos XML em duplicidade pode causar inconvenientes em
suas averbações.
Consulta Número de Averbação ANTT
Resumo: Acessar a API via método POST (assim como no módulo Upload) ou acessar
a URL via método GET e receber a resposta da consulta.
3. Parâmetros opcionais:
out = "json", "xml" ou "csv" // Formato do retorno. Padrão é Json (Na forma
padrão da API)
download = 0 ou 1 // Cabeçalho do retorno como display ou download para
arquivo. Padrão é 0 (display)
delim = , // Parâmetro para out=csv. Indica o delimitador de campo do CSV.
Padrão é vírgula (,)
4. Json de retorno:
{
"success": 1,
"S": [{
"chave": "12345678901234567890123456789012345678901234",
"protocolo": "1234567890123456789012345678901234567890"
}, {
"chave": "22345678901234567890123456789012345678901234",
"protocolo": "2234567890123456789012345678901234567890"
}]
}
Parâmetros opcionais:
out = "json", "xml" ou "csv" // Formato do retorno. Padrão é Json (Na forma
padrão da API)
download = 0 ou 1 // Cabeçalho do retorno como display ou download para
arquivo. Padrão é 0 (display)
delim = , // Parâmetro para out=csv. Indica o delimitador de campo do CSV.
Padrão é vírgula (,)
Chave,Protocolo
12345678901234567890123456789012345678901234,12345678901234567890123456
78901234567890
<data>
<item0>
<chave>12345678901234567890123456789012345678901234</chave>
<protocolo>1234567890123456789012345678901234567890</protocolo>
</item0>
</data>
Parâmetros Adicionais de Averbação
Após gerar o código de informações, basta copiá-lo e colá-lo em seu sistema TMS, no
campo de observações do documento eletrônico.
{mudanca:"s",vcontainer:"1.23",viagem:"1",placa:"ABC1234",dtviagem:"2015-12-31"}
a. O JSON pode ou não ter aspas duplas nos nomes dos campos que podem ser
maiúsculos ou minúsculos. Já os valores precisam ter aspas duplas, podendo não
ter apenas em caso do valor ser número (int ou float).
b. Apenas 1 JSON por xObs, o primeiro. Outros serão ignorados.
c. Informações de parâmetros da obs.html no cabeçalho do código fonte da página
obs.html.
2. Tags do Grupo ObsCont
Caso o Segurado prefira integrar em seu sistema TMS a geração automática dos
Parâmetros Adicionais, estes devem ser inseridos no XML como tags adicionais do
grupo ObsCont (ou ObsFisco) em compl.
Os atributos xCampo do XML levam os mesmos nomes dos campos adicionais que vão
nas observações (acima), assim como as tags xTexto aceitam os valores no mesmo
formato.
<compl>
<ObsCont xCampo="dtviagem">
<xTexto>2015-12-31</xTexto>
</ObsCont>
<ObsCont xCampo="placa">
<xTexto>ABC1234</xTexto>
</ObsCont>
</compl>
3. Tabela de parâmetros
● URL
POST: https://apis.averbeporto.com.br/php/conn.php
● Mais sobre a URL em Manual de Integração - AverbePorto
● Login
Passar os parâmetros de login para efetuá-lo e receber o Cookie de Sessão. O
Postman utilizará o cookie automaticamente para a mesma URL.
○ Não utilize a senha comum para acesso web do usuário para acessar a API. Acessando o sistema
Web, vá no módulo Cadastro do Usuário e gere uma senha de API própria, clicando no X para
iniciar o processo.
Body (x-www-form-urlencoded):
mod: login
comp: 5
user: SEU_USUARIO
pass: SUA_SENHA
● Envio de arquivo
Upload do arquivo XML ou ZIP.
Body (form-data):
mod: Upload
comp: 5
path: eguarda/php/
file: “Selecionar arquivo xml ou zip”
Headers:
"Deixar completamente vazio" (inclusive remover o Content-type)
Exemplo em PHP (cURL)
<?php
/**
* Open an url on https using curl and return content
* @param string url The url to open
* @param string refer Referer (optional)
* @param mixed usecookie If true, cookie.txt will be used as default, or the usecookie value.
* @return string
*/
function open_https_url($url,$refer = "", $usecookie = false) {
if ($usecookie) {
if (file_exists($usecookie)) {
if (!is_writable($usecookie)) {
return "Can't write to $usecookie cookie file, change file permission to 777 or remove read
only for windows.";
}
} else {
$usecookie = ($usecookie === true)? "cookie.txt" : $usecookie;
if (!touch($usecookie)) {
return "Can't write to $usecookie cookie file, change file permission to 777 or remove read
only for windows.";
}
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT
5.0)");
if ($usecookie) {
curl_setopt($ch, CURLOPT_COOKIEJAR, $usecookie);
/**
* Limpeza ao terminar de executar
* Requer $ws
*/
function ws_shutdown(){
global $ws;
if (file_exists($ws['cookie'])) {
unlink($ws['cookie']);
}
}
register_shutdown_function('ws_shutdown');
/**
* Ajax Request
$res = curl_exec($ch);
curl_close($ch);
return $res;
}
?>
Exemplo de Uso:
<?php
require_once('func.php');
/**
* Envia arquivo
*
* @param {String} Conteudo do arquivo
* @param {Array} Usuario e senha. Ex.: array('user'=>'USUARIO', 'pass'=>'SENHA', 'path'=>'')
* @param {String} (optional) Remetente (em caso de email)
* @return {Array} Retorna resposta do webservice
*/
function sendFile($sFileContent, $aUser, $sRecipient = ''){
global $ws;
$file = tmpfile();
fwrite($file, $sFileContent);
rewind($file);
$meta = stream_get_meta_data($file);
$mime = mime_content_type($meta['uri']);
$post = array(
'file' => (version_compare(PHP_VERSION, '5.5') >= 0)? new CURLFile($meta['uri'], $mime) :
'@'.$meta['uri'].';type='.$mime
);
if ($sRecipient) {
$post['recipient'] = $sRecipient;
}
// Login
if ($ws['logged'] != $aUser['user']) {
$res = json_decode(websysRequest($aUser), true);
if (isset($res['logout']) && $res['logout']) {
//ws_log('MAIL2EG: ['.$aUser['user'].']: '.posix_getpid().': Falha do login. ');
}
} else {
$res['success'] = $res['C'] = true;
}
// Upload
if ($res['success'] && isset($res['C'])) {
$ws['logged'] = $aUser['user'];
$res = json_decode(websysRequest($post, 'Upload'), true);
}
fclose($file);
return $res;
}
$aUser = array(
'user' => 'USUARIO',
'pass' => 'SENHA',
'path' => ''
);
$sFileContent = file_get_contents('ARQUIVO.xml');
print_r($res);
?>
Exemplo em Delphi (Indy)
unit PortoIndy;
{
Créditos:
Francisco Caffagni
O2 Tecnologia - (30/08/2016)
URL:
https://apis.averbeporto.com.br/php/conn.php
}
interface
uses
System.SysUtils, System.Variants, System.Classes,
IdHTTP, IdMultipartFormData,
IdCookieManager, IdURI,
Data.DBXJSON;
type
TPortoSeguroIndy = class
private
FPostCookieStream: TIdMultiPartFormDataStream;
FPostFileStream: TIdMultiPartFormDataStream;
FRespCookieStream: TStringStream;
FRespFileStream: TStringStream;
FIdHTTP: TIdHTTP;
FCookie: string;
FCookieName: string;
FFileName: string;
FMensagemRetorno: string;
FPassword: string;
FResponse: string;
FResponseCookie: TJSONValue;
FResponseCookieStr: string;
FResponseFile: TJSONValue;
FResponseFileStr: string;
FSucesso: boolean;
FCookieText: string;
FURL: string;
FUsername: string;
const
AURI: string = 'https://apis.averbeporto.com.br';
implementation
{ TPortoSeguroIndy }
{$REGION 'Constructor / destructor methods'}
constructor TPortoSeguroIndy.Create;
begin
//FUsername := 'USUARIO';
//FPassword := 'SENHA';
FPostCookieStream := TIdMultiPartFormDataStream.Create;
FPostCookieStream.AddFormField('mod', 'login');
FPostCookieStream.AddFormField('comp', '5');
FPostFileStream := TIdMultiPartFormDataStream.Create;
FPostFileStream.AddFormField('mod', 'Upload');
FPostFileStream.AddFormField('comp', '5');
FPostFileStream.AddFormField('path', 'eguarda/php/');
FPostFileStream.AddFormField('recipient', 'T'); // Transportador
FRespCookieStream := TStringStream.Create('');
FRespFileStream := TStringStream.Create('');
FIdHTTP := TIdHTTP.Create(nil);
FIdHTTP.Request.ContentType := FPostCookieStream.RequestContentType;
FIdHTTP.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101
Firefox/12.0';
FCookie := '';
FCookieName := '';
FResponseFile := TJSONValue.Create;
FResponseCookie := TJSONValue.Create;
FCookieText := '';
FURL := AURI + '/php/conn.php';
FSucesso := false;
end;
destructor TPortoSeguroIndy.Destroy;
begin
FPostCookieStream.Free;
FPostFileStream.Free;
FRespCookieStream.Free;
FRespFileStream.Free;
FIdHTTP := nil;
inherited;
end;
{$ENDREGION}
FFileName := AFileName;
// Get Cookie
FPostCookieStream.AddFormField('user', FUsername);
FPostCookieStream.AddFormField('pass', FPassword);
FIdHTTP.Post(FURL, FPostCookieStream, FRespCookieStream);
FResponseCookieStr := FRespCookieStream.DataString;
FResponseCookie := TJSONString.Create(FResponseCookieStr);
FCookieName := FIdHTTP.CookieManager.CookieCollection.Cookies[0].CookieName;
FCookieText := FIdHTTP.CookieManager.CookieCollection.Cookies[0].CookieText;
FCookie := Copy(FCookieText, Pos('portal[ses]', FCookieText), Pos(';', FCookieText)-1);
// Upload file
FPostFileStream.AddFile('file', FFileName);
FIdHTTP.AllowCookies := true;
FIdHTTP.CookieManager := TIdCookieManager.Create;
URI := TIdURI.Create(AURI);
FIdHTTP.CookieManager.AddServerCookie(FCookie, URI);
FIdHTTP.Request.ContentType:= 'multipart/form-data';
FIdHTTP.Post(FURL, FPostFileStream, FRespFileStream);
FResponseFileStr := FRespFileStream.DataString;
FResponse := FRespFileStream.DataString;
FResponseFile := TJSONString.Create(FResponse);
{
1. Json de retorno:
(
[success] => 1
[S] => Array
(
[P] => 1 // Processado (xml guardado com sucesso)
[D] => 0 // Duplicado (xml préexistente)
[R] => 0 // Rejeitado (xml não parece ser do tipo certo)
[N] => 0 // Negado (Não é xml ou zip)
)
)
}
//{"success":1,"S":{"P":0,"D":0,"R":0,"N":1}}
FSucesso := ((Pos('"success":1', FResponse) > 0) and (Pos('"P":1', FResponse) > 0));
Result := FSucesso;
except
on e: Exception do
raise Exception.Create('[PortoIndy.TPortoSeguroIndy.Upload]: ' + e.Message);
end;
end;
{$ENDREGION}
end.