Erro ao consultar API CEP com o SDK PHP

Estou iniciando um teste com SDK PHP e logo de na primeira tentativa um erro:

Exception when calling CepApi->consultarCep: [401] Client error: GET https://api.nuvemfiscal.com.br/cep/86040370` resulted in a 401 Unauthorized response: Malformed Compact Serialization`

Criei as credenciais para Sandbox e Produção, testei com ambas e sempre recebo o mesmo erro.
Estou usando o exemplo disponível em: https://github.com/nuvem-fiscal/nuvemfiscal-sdk-php#installation--usage.

Aparentemente o problema não é na autenticação pois a mesma retorna o access-token :
após a linha: NuvemFiscal\Configuration::getDefaultConfiguration()->setAccessToken('...apFgcflfCNQMj...');

Este é o retorno desta chamada:

defaultConfiguration:NuvemFiscal\Configuration
apiKeys:array(1)
apiKeyPrefixes:array(1)
accessToken:"aKJ...cflfCNQMj5vlXRyj..."
booleanFormatForQueryString:"int"
username:""
password:""
host:"https://api.nuvemfiscal.com.br"
userAgent: "nuvemfiscal-sdk/{packageVersion}/{language}"
debug: false
debugFile: "php://output"
tempFolderPath: "/tmp"

Após a chamada $result = $apiInstance->consultarCep($cep); uma exception é disparada. Abaixo um resumo da captura no XDebug:

responseBody: "Malformed Compact Serialization"
responseHeaders: array(7)
Access-Control-Allow-Origin: array(1)
0: "*"
Content-Length: array(1)
0: "31"
Content-Type: array(1)
0: "text/plain"
Date: array(1)
0: "Tue, 13 Jun 2023 16:35:06 GMT"
Server: array(1)
0: "Microsoft-HTTPAPI/2.0"
Www-Authenticate: array(1)
0: "Bearer"
X-Robots-Tag: array(1)
0: "none, noarchive"
responseObject: null
message:"[401] Client error: `GET https://api.nuvemfiscal.com.br/cep/86040370` resulted in a `401 Unauthorized` response: Malformed Compact Serialization"
*Exception*string:""
code: 401
file: "../vendor/nuvem-fiscal/nuvemfiscal-sdk-php/lib/Api/CepApi.php" line:163

Olá @andre.corneta, seja bem-vindo à Nuvem Fiscal! Obrigado pelo tópico com informações detalhadas.

A mensagem de erro indica que o seu access token está incorreto. Não é um access token válido. Se esses dados são reais, está errado mesmo, visto que geralmente o access token começa com eyJ, e não com akJ.

Será que você não está colocando o client secret no lugar do access token. Observe com detalhes a documentação, principalmente nessa parte:

// Obter token a partir das credenciais
$token = get_oauth2_token(
    'https://auth.nuvemfiscal.com.br/oauth/token', 
    $_ENV['NUVEMFISCAL_CLIENTID'],
    $_ENV['NUVEMFISCAL_CLIENTSECRET'],
    'cep cnpj' // defina o scope a ser usado
);

Note que com o client id e o cliente secret você precisa fazer uma chamada para obter o access token (get_oauth2_token), e só então usá-lo no client.

Eu acho que não… eu recebo o seguinte access token como retorno:

"eyJ0eXAiOiJKV1QiLCJraWQiOiIwMWIwNDFkMWQ2MTU0NjA0NzNkMWI1NGFhOGRlNGQ1NyIsImFsZyI6IlJTMjU2In0.eyJzY29wZSI6ImNlcCIsImp0aSI6IjI2Yjg2OTA0LThmYTEtNDMwYy1hYTY2LTIzNG****
tTgeBppwaCczX_JHlElYC3y0Q1nUHSO7L1g3YqDsIc8kUXooE0lLeEOOsr6IDJDmPU6_YeucHu9pm8--N8li3jOqhg92A"

(omiti o meio do access token, mas foi pra vc ter uma idéia de que o retorno parece correto e inclusive inicia com eyJ como mencionou)

Quanto ao CLIENTID e CLIENTSECRET estou usando os que eu criei para Sandbox (mas tbm tentei com os de produção)

E o erro capturado na resposta continua este:

**responseBody:**
"JWT (claims: {"scope":"cep","jti":"be6087d0-****-****-b425-97c8cdf990b8","https:\/\/nuvemfiscal.com.br\/tenant_id":"3a0bcc29-**********-afba-43d7b2e7b159","iss":"https:\/\/auth.nuvemfiscal.com.br","aud":"https:\/\/api.sandbox.nuvemfiscal.com.br\/","exp":1689****528,"iat":168*****528,"client_id":"lhZB1L**********MFDo"}) rejected due to invalid claims.Validation errors:Audience [aud] claim  doesn't contain an acceptable identifier. Expected [https://api.nuvemfiscal.com.br/] as aud value."
**message:** 
"[401] Client error: `GET https://api.nuvemfiscal.com.br/cep/80030030` resulted in a `401 Unauthorized` response:JWT (claims: {"scope":"cep","jti":"be6087d0-****-****-b425-97c8cdf990b8","https:\/\/nuvemfiscal.com.br\/tenant_id":"3a0b (truncated...)"

Bom, o erro agora mudou. Ele está reclamando do claim aud (audience).

Isso porque você está tentando acessar a API de produção usando um access token gerado para a API de sandbox. São duas APIs completamente independentes, cada uma tem seu client id/client secret específico e cada uma vai gerar um access token válido somente para aquela API.

E não é que funcionou! rsss

troquei as credenciais pelas de produção e deu certo!
Eu achei que tinha tentado antes com elas, mas devo ter me confundido.

Mas ainda fiquei com uma dúvida. As apis tem endereços distintos conforme consta na documentação:

Porém na mesma documentação menciona que a obtenção do access token é feita no mesmo endereço, tanto para produção quanto para sandbox:

  • A URL para obtenção do token: https://auth.nuvemfiscal.com.br/oauth/token

O que não ficou claro pra mim é como direciono a chamada para API correta, ou seja, produção ou sandbox. Em outras palavras, onde defino (SDK) que vou usar produção (https://api.nuvemfiscal.com.br/) ou sandbox (https://api.sandbox.nuvemfiscal.com.br)?

Acho que já descobri!

Temos o setHost() em Configuration que por padrão está apontando para produção.
Caso alguém tenha a mesma dúvida iniciante que tive é só fazer o apontamento conforme a necessidade:

if ($ambiente == 'sandbox')
{
      $config->setHost('https://api.sandbox.nuvemfiscal.com.br');
}
else
{
      $config->setHost('https://api.nuvemfiscal.com.br');
}

Fica a sugestão para um complemento na documentação do SDK… uma linha que teria evitado tantas perguntas! rsss

<?php
require_once(__DIR__ . '/vendor/autoload.php');

// Obter token a partir das credenciais
$_ENV = [];
$_ENV['NUVEMFISCAL_CLIENTID'] = 'SEU_CLIENTID_SANDBOX';
$_ENV['NUVEMFISCAL_CLIENTSECRET'] = 'SEU_CLIENT_SECRET_SANDBOX';

$token = get_oauth2_token(
    'https://auth.nuvemfiscal.com.br/oauth/token', 
    $_ENV['NUVEMFISCAL_CLIENTID'],
    $_ENV['NUVEMFISCAL_CLIENTSECRET'],
    'cep cnpj' // defina o scope a ser usado
);

// Configurar access token OAuth2 para autorização: oauth2
$config = NuvemFiscal\Configuration::getDefaultConfiguration()->setAccessToken($token->access_token);

$config->setHost('https://api.sandbox.nuvemfiscal.com.br'); //Defina a api a ser usada de acordo com as credenciais informadas

$apiInstance = new NuvemFiscal\Api\CepApi(
    // Se quiser usar um client http customizado, passe um client que implemente `GuzzleHttp\ClientInterface`.
    // Isso é opcional, `GuzzleHttp\Client` será usado por padrão.
    new GuzzleHttp\Client(),
    $config
);
$cep = '80030030'; // string | CEP sem máscara.

try {
    $result = $apiInstance->consultarCep($cep);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling CepApi->consultarCep: ', $e->getMessage(), PHP_EOL;
}
2 curtidas

Este tópico foi fechado automaticamente 24 horas depois da última resposta. Novas respostas não são mais permitidas.