1
resposta

Problemas de Conexão com a API do DATASUS: Erro ao Acessar e Solicitação de Revisão de Código

Olá. Estou enfrentando problemas ao tentar conectar minha aplicação à API do DATASUS. Para iniciar a comunicação, preciso obter um token de acesso. Já consegui gerar esse token com sucesso, mas estou tendo dificuldades em acessar a API propriamente dita. Como esta é minha primeira experiência com APIs, desenvolvi um código para essa comunicação. Contudo, ao atualizar a página (que demora entre 1 a 3 minutos para carregar), recebo o seguinte erro: "Failed to connect to servicoshm.saude.gov.br port 443 after 127242 ms: Couldn't connect to server". Não consigo identificar onde posso estar errando ou se há algum problema no meu código. Poderia verificar para mim? Abaixo, compartilho o código que estou usando.

Primeiro o arquivo1.php responsável por gerar o token de acesso: (funcionando corretamente)

<?php 
ob_start();
session_start();

// Substitua 'caminho/do/seu/certificado.pfx' e 'sua_senha' pelos valores apropriados
$pfxPath = '../CAMINHA-DO-CERTIFICADO/certificado.pfx';
$password = 'MINHASENHACORRETA';

// URL da API para obter o token
$apiUrl = 'https://ehr-auth-hmg.saude.gov.br/api/osb/token';

// Carregar o conteúdo do arquivo PFX
$pfxContent = file_get_contents($pfxPath); 

// Configurar as opções para a requisição cURL
$options = [
    CURLOPT_URL => $apiUrl,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_SSLCERT => $pfxPath,
    CURLOPT_SSLCERTPASSWD => $password,
    CURLOPT_SSLCERTTYPE => 'P12',
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/x-www-form-urlencoded',
    ],
];

$ch = curl_init();
curl_setopt_array($ch, $options);

// Executar a requisição cURL
$response = curl_exec($ch);

// Verificar se ocorreu algum erro
if (curl_errno($ch)) {
    echo 'Erro na requisição cURL: ' . curl_error($ch);
} else {
    // Exibir a resposta da API
    echo 'Resposta da API (funcionando sim o token): ' . $response . '<br><hr><br>';

     // Decodificar a resposta JSON
     $data = json_decode($response, true);

      // Verificar se o 'access_token' está presente na resposta
    if(isset($data['access_token'])) {
        $token = $data['access_token'];
        echo "Token extraído com sucesso: " . $token;

        // Inicia a sessão
        session_start();

        // Armazena o token na sessão
        $_SESSION['token'] = $token;

        // Fecha a sessão cURL
        curl_close($ch); 

        // Redireciona para a próxima página
        header("Location: requisicao.php");
        exit;
     
    } else {
        echo "O token não foi encontrado na resposta.";
    }
}

// Fechar a sessão cURL (caso ocorra algum erro)
curl_close($ch); 

?>

Abaixo segue o arquivo2.php (Código que está dando erros e que deveria fazer a comunicação com a API propriamente dita):

<?php
session_start();

if(isset($_SESSION['token']) && !empty($_SESSION['token'])) {
   echo "Token ativo: " . $_SESSION['token'];
   $token = $_SESSION['token'];
} else {
   echo "Erro!";
}

// URL da API
$url = 'https://servicoshm.saude.gov.br/cadsus/v2/PDQSupplierJWT';

// XML a ser enviado
$xml = '
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:urn="urn:ihe:iti:xds-b:2007" xmlns:urn1="urn:oasis:names:tc:ebxml-regrep:xsd:lcm:3.0" xmlns:urn2="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0" xmlns:urn3="urn:ihe:iti:xds-b:2007">
   <soap:Body>
RESTANTE DO CÓDIGO
   </soap:Body>
</soap:Envelope>
';

// Inicializa a sessão cURL
$ch = curl_init($url);

// Define as opções da requisição
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    "Content-Type: application/xml", // Especifica o tipo de conteúdo como XML
    "Authorization: Bearer $token" // Adicione o cabeçalho de autorização com o token
));

// Executa a requisição e obtém a resposta
$response = curl_exec($ch);

// Verifica por erros
if(curl_errno($ch)){
    echo 'Erro ao enviar a requisição: ' . curl_error($ch);
} else {
    // Processa a resposta (se necessário)
    echo $response;
}

// Fecha a sessão cURL
curl_close($ch);

//Fim do programa
exit();
1 resposta

Beleza, então! O erro que você tá enfrentando ao conectar com a API do DATASUS parece ser um problema de conexão, já que tá dando um "Failed to connect to servicoshm.saude.gov.br port 443". O código pra gerar o token parece tá funcionando de boa, e você tá salvando esse token na sessão.

Agora, no arquivo que tenta fazer a requisição à API, pode ter algumas coisas rolando. Primeiro, confirma se a URL que você tá usando tá certinha. Outra coisa é esse certificado que você mencionou; garante que ele tá certo e sendo usado direitinho também.

Às vezes, pode ser algum bloqueio na rede ou até mesmo no servidor. E se der pra ativar logs ou adicionar uns prints pra debugar, seria uma boa pra entender melhor onde tá o problema.

Dá uma olhada nesses pontos !

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software