Module: FocusNfe::Webhook

Defined in:
lib/focus_nfe/webhook.rb

Overview

Recebimento de webhooks inbound: quando a Focus NFe chama a URL da aplicação ao mudar o status de um documento. Fachada stateless (sem token, sem HTTP) — apenas transforma o corpo cru recebido e autentica a chamada.

Class Method Summary collapse

Class Method Details

.autenticado?(headers:, authorization:, authorization_header:) ⇒ Boolean

Verifica se a chamada é autêntica comparando o header recebido com o authorization configurado na criação do gatilho. A comparação é feita em tempo constante para não vazar o segredo por timing.

Parameters:

  • headers (#[])

    cabeçalhos da requisição recebida (ex.: request.headers do Rails)

  • authorization (String)

    valor esperado, igual ao informado em Recursos::Webhooks#criar

  • authorization_header (String)

    nome do header onde a Focus envia o valor

Returns:

  • (Boolean)

    true somente quando o header existe e bate com o esperado



36
37
38
39
# File 'lib/focus_nfe/webhook.rb', line 36

def autenticado?(headers:, authorization:, authorization_header:)
  recebido = valor_do_header(headers, authorization_header)
  !recebido.nil? && comparacao_segura?(recebido.to_s, authorization.to_s)
end

.parse(raw_body, ref: nil) ⇒ FocusNfe::Modelos::Documento

Converte o corpo cru de um webhook inbound em um Modelos::Documento, o mesmo objeto devolvido por emissão/consulta.

Parameters:

  • raw_body (String, Hash)

    corpo recebido (JSON cru ou já parseado)

  • ref (String, nil) (defaults to: nil)

    referência conhecida, injetada quando ausente do corpo

Returns:

Raises:



21
22
23
24
25
26
# File 'lib/focus_nfe/webhook.rb', line 21

def parse(raw_body, ref: nil)
  dados = raw_body.is_a?(String) ? JSON.parse(raw_body) : raw_body
  Modelos::Documento.from_payload(dados, ref: ref)
rescue JSON::ParserError => e
  raise Errors::WebhookError, "corpo do webhook não é JSON válido: #{e.message}"
end