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();