Histórico de mensagens sobre webhook 400 em pix

EXIBINDO CONVERSAS RECENTES:

Texto: webhook 400
Canal: pix
Avatar discord do usuario _acb09

_acb09

Ver Respostas

Boa tarde!
Estou recebendo o seguinte erro ao criar um webhook de pix:

{
"code": 400,
"error": "json_invalido",
"errorDescription": "Parâmetro \".headers['x-skip-mtls-checking']\", deve ser igual a um dos valores predefinidos"
}

Estou usando o SDK, e todos endpoints funcionam (cartão, pix e boleto) porém não consigo gerar o webhook. Ou recebo o erro acima, ou recebo Curl 52 Error.

Avatar discord do usuario felipenunes0714

felipenunes0714

Ver Respostas

boa tarde, alguém poderia me ajudar ? eu já tentei de várias formas e não consigo fazer com que o código que gera o pix envie a notificação para url webhook, toda vez que eu coloco algo além do que já está na variavel $body apresenta o seguinte erro:
EfiException Code: 400 Error: json_invalido Error Description: Parâmetro ".body", não são permitidas propriedades adicionais

Avatar discord do usuario alexmenin

alexmenin

Estou com problema na criação dos webhooks de pix em produção, com o crt de homologação consegui criar normalmente a webhook para a chave pix, porém quando fui criar em produção me retorna o erro


400 No required SSL certificate was sent

400 Bad Request


No required SSL certificate was sent


nginx/1.24.0 (Ubuntu)




para a rota do webhook

Avatar discord do usuario guilherme_efi

guilherme_efi

Ver Respostas

Ok, no $body insira o ?ignorar=
$body = '{
"webhookUrl": "https://julioerp.agenciaweblab.com.br/webhook.php?ignorar="
}';

E no arquivo "/webhook.php" inseira o exemplo de código abaixo:

php

function resposta($status, $mensagem, $dados)
{
$resposta['status'] = $status;
$resposta['mensagem'] = $mensagem;
$resposta['dados'] = $dados;
$json_resposta = '
' . json_encode($resposta, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . '
';

header("HTTP/1.1 " . $status);
echo $json_resposta;
}

function salvar($dados)
{
// Crie um arquivo .;json para salvar as informações
$nomeArquivo = './dados.json';
$dadosGravados = json_decode(file_get_contents($nomeArquivo), true);
$arquivo = fopen($nomeArquivo, 'w');

// Incrementa as informações enviadas com o que já havia gravado
array_push($dadosGravados, $dados);

if (fwrite($arquivo, json_encode($dadosGravados))) {
resposta(200, "Requisição realizada com sucesso!", $dados);
} else {
resposta(300, "Falha ao salvar os dados da requisição.", $dados);
}

fclose($arquivo);
}

function requisicao($metodo, $body, $parametros)
{
switch ($metodo) {
case 'POST':
salvar($body);
break;
case 'GET':
resposta(200, "Requisição realizada com sucesso!", $body);
break;
}
}

// Obtém o método HTTP, body e parâmetros da requisição
$metodo = $_SERVER['REQUEST_METHOD'];
$parametros = explode('/', trim($_SERVER['REQUEST_URI'], '/'));
$body = json_decode(file_get_contents('php://input'), true);

try {
requisicao($metodo, $body, $parametros);
} catch (Exception $e) {
resposta(400, $e->getMessage(), $e);
}

A fim de teste, neste exemplo está salvando o json recebido em um arquivo dados.json. Então na mesma raiz crie-o com permissão de leitura e escrita. E escreva dentro do arquivo dados.json assim: [] para iniciar o json. Então simule um pagamento para receber a notificação.
Depois dos testes, pode manipular o json e gravar em um banco de dados.

Avatar discord do usuario .thomasjackson

.thomasjackson

Ver Respostas

resposta
"{\"nome\":\"webhook_invalido\",\"mensagem\":\"A URL informada respondeu com o código HTTP 400\"}"

Avatar discord do usuario walysonpatric

walysonpatric

Ver Respostas

Oi, pra confirmar se o pix foi pago seria algo assim? (não sei muito sobre isso, to aprendendo e usei o GPT pra criar o código.)

app.post('/webhook(/pix)?', async (req, res) => {

try {
// Consultar a cobrança usando o txid
const response = await axios.get(/v2/cob/:txid, {
headers: {
Authorization: 'Bearer' + process.env.GN_CLIENT_ID // Substitua pelo token de autorização correto
}
});

// Verificar o status da cobrança na resposta
if (response.status === 200 && response.data.status === 'CONCLUIDA') {

// Enviar o código de ativação para o Supabase
const { data: insertedData, error } = await supabaseClient
.from('dominios_permitidos')
.insert([{ code: generatedCode }]); // Acesse o código gerado na rota '/api/key'

// Enviar o código de ativação junto com a resposta
return res.status(200).json({ message: 'Webhook recebido com sucesso.', code: generatedCode });
} else {
// Se a cobrança não estiver concluída, retorne uma mensagem de erro
return res.status(400).json({ error: 'Cobrança não concluída.' });
}
} catch (error) {
console.error('Erro ao consultar a cobrança:', error.message);
return res.status(500).json({ error: 'Erro ao consultar a cobrança.' });
}

});

Avatar discord do usuario _alexandrehenrique

_alexandrehenrique

´´´
{
"message": "Erro interno do servidor",
"erro": {
"nome": "webhook_invalido",
"mensagem": "A URL informada respondeu com o código HTTP 400"
}
}
´´´

Avatar discord do usuario hspatz

hspatz

Ver Respostas

Eu estou utilizando o SDK-PHP de voces.
Cadastrei o webhook como "https://meudominio.com.br/pixefi"
Recebo os eventos da criação no endereço acima

( [{"evento":"teste_webhook","data_criacao":"2024-03-30T11:20:39.415Z"}] ).

O "index.php" nesta pasta é o mesmo do site.

Abaixo deste diretório existe uma pasta "pix" onde o mesmo "index.php"rdt's lá. ( "meusite.com.br/pixefi/pix" )
AO criar um pagamento PIX em produção e o mesmo pago, não recebo nenhuma informação de retorno da EFI.
Foi colocadouma função que salva qualquer acesso a pasta, como exemplo fiz um acesso pelo Chrome "https://meudominio.com.br/pixefi/pix" e o resultado salvo foi.


Metodo: GET
Parametros: a:2:{i:0;s:6:"pixefi";i:1;s:3:"pix";}
Body: null


Segue o parte do script "index.php" onde salva qualquer acesso a pasta

===============================================================
// Obtém o método HTTP, body e parâmetros da requisição
$metodo = $_SERVER['REQUEST_METHOD'];
$parametros = explode('/', trim($_SERVER['REQUEST_URI'], '/'));
$body = json_decode(file_get_contents('php://input'), true);


//
/
$nomeArquivo = 'dados/dados_recebidos.json';
$dadosJson = "\n Metodo: " .$metodo ."\n Parametros: " .serialize($parametros) ."\n" ."Body: " .json_encode($body) ."\n";
$arquivo = fopen($nomeArquivo, 'a');
fwrite($arquivo, $dadosJson);
fclose($arquivo);
//
/


try {
requisicao($metodo, $body, $parametros);
} catch (Exception $e) {
salvar ( $xdados);
resposta(400, $e->getMessage(), $e);
}
=================================================================

Estou tentando gerar cobranças no modo homologação de R$ 0,01 e não recebo notificação no modo de homologação também.

Avatar discord do usuario _alexandrehenrique

_alexandrehenrique

Ver Respostas

so temnho o log de acesso

34.193.116.226 - - [28/Mar/2024:17:00:01 -0300] "POST /webhook/pix HTTP/1.1" 400 224 "-" "API Pix Efi (homologacao)"

Avatar discord do usuario _alexandrehenrique

_alexandrehenrique

{
"message": "Erro interno do servidor",
"erro": {
"nome": "webhook_invalido",
"mensagem": "A URL informada respondeu com o código HTTP 400"
}
}

Avatar discord do usuario joaolucas_efi

joaolucas_efi

Ver Respostas

Bom dia @zekramfn é possível sim.

Você precisa consumir o endpoint PUT /v2/gn/config passando o atributo pix.chaves.suaChave.webhook.notificacao.pagador = true, segue um exemplo onde essa configuração é aplicada:

{
"pix": {
"receberSemChave": true,
"chaves": {
"355e4568-e89b-1243-a456-006655440001": {
"recebimento": {
"txidObrigatorio": false,
"recusarTipoPessoa": "PF",
"qrCodeEstatico": {
"recusarTodos": false
},
"webhook": {
"notificacao": {
"tarifa": true,
"pagador": true
},
"notificar": {
"pixSemTxid": true
}
}
},
"envio": {
"webhook": {
"notificacao": {
"tarifa": true,
"favorecido": true
}
}
}
}
}
}
}

Avatar discord do usuario martins.dev

martins.dev

Ver Respostas

Olá, estou de volta aqui, estou enfrentando um problema sobre a resposta que é enviado para o webhook. estou recendo esses seguinte status code

"POST /webhook//pix HTTP/1.1" 400 6595 "-" "Gerencianet"
"POST /webhook//pix HTTP/1.1" 300 6692 "-" "Gerencianet"
"POST /webhook//pix HTTP/1.1" 400 6594 "-" "Gerencianet"

assim que eu recebo os dados eu não sei como ele vem exatamente, eu fiz uma verificação isset($data["pix"]) tem o index pix para conseguir o txid para verificar quem pagou

Avatar discord do usuario loopbackk

loopbackk

Ver Respostas

Boa noite galera, fiz os testes do webhook (pix) em homolog, tudo funciona corretamente. Mas quando eu mudo o CRT para o de PRD (chain-pix-prod.crt) no servidor e troco as chaves do client e secret e tento fazer um cadastro de webhook recebo o erro: "A URL informada respondeu com o código HTTP 400"

Avatar discord do usuario arthursisprov

arthursisprov

Ver Respostas

{
"nome": "webhook_invalido",
"mensagem": "A URL informada respondeu com o código HTTP 400"
}

Avatar discord do usuario _josemax

_josemax

Ver Respostas

400
webhook_invalido
A URL informada respondeu com o código HTTP 400Efi\Exception\EfiException Object ( [message:protected] => A URL informada respondeu com o código HTTP 400 [string:Exception:private] => [code:protected] => 400 [file:protected] => /home/tract/htdocs/tract.digital/Controller/sdk-php-apis-efi/src/Efi/Request.php [line:protected] => 241 [trace:Exception:private] => Array ( [0] => Array ( [file] => /home/tract/htdocs/tract.digital/Controller/sdk-php-apis-efi/src/Efi/Request.php [line] => 166 [function] => handleClientException [class] => Efi\Request [type] => -> ) [1] => Array ( [file] => /home/tract/htdocs/tract.digital/Controller/sdk-php-apis-efi/src/Efi/ApiRequest.php [line] => 54 [function] => send [class] => Efi\Request [type] => -> ) [2] => Array ( [file] => /home/tract/htdocs/tract.digital/Controller/sdk-php-apis-efi/src/Efi/Endpoints.php [line] => 120 [function] => send [class] => Efi\ApiRequest [type] => -> ) [3] => Array ( [file] => /home/tract/htdocs/tract.digital/Controller/sdk-php-apis-efi/src/Efi/Endpoints.php [line] => 56 [function] => Efi\{closure} [class] => Efi\Endpoints [type] => -> ) [4] => Array ( [file] => /home/tract/htdocs/tract.digital/Controller/sdk-php-apis-efi/aplication/pix/webhooks/pixConfigWebhook.php [line] => 36 [function] => __call [class] => Efi\Endpoints [type] => -> ) ) [previous:Exception:private] => [error:Efi\Exception\EfiException:private] => webhook_invalido [errorDescription:Efi\Exception\EfiException:private] => A URL informada respondeu com o código HTTP 400 )

Avatar discord do usuario jlmendessilva

jlmendessilva

"code": 400,
"error": "webhook_invalido",
"description": "A URL informada respondeu com o código HTTP 400"

Avatar discord do usuario _josemax

_josemax

400
webhook_invalido Uma URL informada respondeu com o código HTTP 400Efi\Exception\EfiException Object ( [message:protected] => Uma URL informada respondeu com o código HTTP 400 [string:Exception:private] => [code:protected] => 400 [arquivo: protegido] => /home/tract/htdocs/tract.digital/Controller/sdk-php-apis-efi/src/Efi/Request.php [linha: protegido] => 241 [trace:Exception:private] => Array ( [0] => Array ( [arquivo] => /home/tract/htdocs/tract.digital/Controller/sdk-php-apis-efi/src/Efi/Request.php [line] => 166 [função] => handleClientException [classe] => Efi\Request [tipo] => -> ) [1] => Array ( [arquivo] => /home/tract/htdocs/tract.digital/Controller/sdk-php -apis-efi/src/Efi/ApiRequest.php [linha] => 54 [função] => enviar [classe] => Efi\Request [tipo] => -> ) [2] => Array ( [arquivo] => /home/tract/htdocs/tract.digital/Controller/sdk-php-apis-efi/src/Efi/Endpoints.php [linha] => 120 [função] => enviar [classe] => Efi\ApiRequest [type] => -> ) [3] => Array ( [file] => /home/tract/htdocs/tract.digital/Controller/sdk-php-apis-efi/src/Efi/Endpoints.php [linha ] => 56 [função] => Efi\{closure} [classe] => Efi\Endpoints [tipo] => -> ) [4] => Array ( [arquivo] => /home/tract/htdocs/tract .digital/Controller/sdk-php-apis-efi/aplication/pix/webhooks/pixConfigWebhook.php [linha] => 36 [função] => __call [classe] => Efi\Endpoints [tipo] => -> ) ) [anterior:Exception:private] => [error:Efi\Exception\EfiException:private] => webhook_invalido [errorDescription:Efi\Exception\EfiException:private] => A URL informada respondeu com o código HTTP 400 )