Joinotify

Webhooks e requisições HTTP

Duas ações do construtor conversam com sistemas fora do WordPress:

AçãoDireçãoPara quê
Enviar webhooksite → outro sistemaAvisar o n8n, o Zapier, o Make, um fluxo do Joinotify Cloud ou o seu ERP
Requisição HTTPida e voltaConsultar uma API e usar a resposta nas próximas ações do mesmo fluxo

As duas só chamam endereços públicos: endereços locais e de rede privada (localhost, 127.0.0.1, 10.x, 192.168.x e afins) são recusados, inclusive quando aparecem num redirecionamento. Quem edita um fluxo não consegue, por elas, alcançar a rede interna do servidor.

Enviar webhook

Disponível desde a 2.5.0.

CampoO que faz
URLO endereço que recebe a chamada
MétodoO método HTTP da chamada
CorpoOs dados do gatilho (pedido, cliente, usuário, carrinho) ou JSON personalizado
JSONO JSON escrito por você, com variáveis — quando o corpo é personalizado
CabeçalhosCabeçalhos extras, como um token do sistema que recebe
Segredo de assinaturaOpcional. Assina cada chamada para o destino saber que ela veio do seu site

Com os dados do gatilho, o corpo é o mesmo que a sincronização com o Joinotify Cloud monta: o pedido com o histórico de compras do cliente e os links de pagar, ver e avaliar; o usuário; o carrinho; ou a entrada do formulário.

Verificando a assinatura

Com um segredo preenchido, cada chamada leva dois cabeçalhos:

X-Joinotify-Timestamp: 1730640000
X-Joinotify-Signature-256: sha256=<HMAC-SHA256 de "timestamp.corpo" com o segredo>

É o mesmo esquema dos webhooks do Joinotify Cloud, então o mesmo código de verificação serve — veja Verificar a assinatura.

Barras invertidas no JSON

Até a 2.7.0, salvar o fluxo apagava as barras invertidas digitadas nele, e uma aspa escapada (\") num corpo JSON virava JSON inválido — a ação nunca enviava. A 2.7.0 corrigiu: os fluxos guardam as barras como foram digitadas. Uma barra perdida num salvamento anterior precisa ser digitada de novo.

Requisição HTTP

Disponível desde a 2.7.0. Chama qualquer API pública e guarda a resposta com um nome, que as ações seguintes leem como variável.

CampoO que faz
Método e URLGET, POST, PUT, PATCH ou DELETE, e o endereço — que aceita variáveis
Parâmetros de consultaPares de chave e valor acrescentados à URL, já codificados
CabeçalhosCabeçalhos extras. Os seus vencem os padrões (Accept, User-Agent, Content-Type)
AutenticaçãoNenhuma, Token Bearer, Básica (usuário e senha) ou Chave de API em um cabeçalho
CorpoJSON, campos de formulário, texto puro, os dados do gatilho ou sem corpo
Nome da respostaO nome que as próximas ações usam para ler a resposta
Tempo limiteSegundos de espera pela resposta: 10 por padrão, de 1 a 30
Quando a requisição falharContinuar com as próximas ações (o padrão) ou Parar o fluxo

As variáveis dentro das strings de um corpo JSON são preenchidas sem quebrá-lo, quaisquer que sejam as aspas do valor. Se o corpo não for JSON válido depois de preenchido, a chamada não sai e o motivo fica no log.

Lendo a resposta

Com a resposta guardada como cep, por exemplo:

VariávelO que traz
{{ http:cep.status }}O código HTTP, como 200
{{ http:cep.ok }}true para um código 2xx, false para o resto
{{ http:cep.error }}O motivo, quando a chamada não completou
{{ http:cep }}O corpo inteiro (um objeto JSON sai como JSON)
{{ http:cep.body.logradouro }}Um campo do corpo JSON. Pontos para chaves aninhadas e posições de lista: body.itens.0.nome

Elas valem em qualquer ação depois da requisição — inclusive depois de um Tempo de espera — e aceitam modificadores. Para decidir o caminho pelo resultado, use uma Condição sobre {{ http:cep.ok }}.

Limites da resposta

A resposta é lida até 256 KB e segue no máximo 3 redirecionamentos. Um corpo acima de 4 KB, em JSON, não é guardado — o código HTTP é. O limite existe porque a resposta viaja com o fluxo quando há uma espera depois; desenvolvedores mudam com o filtro Joinotify/Builder/Http_Request_Action/Max_Stored_Bytes.

A credencial

O token, a senha ou a chave de API são criptografados quando o fluxo é salvo e nunca mais aparecem na tela — para trocar, digite de novo. Em outro site (um fluxo importado, um modelo) a credencial não vem junto e precisa ser digitada outra vez; até lá, a ação registra o erro e não chama a API.

O gerador de fluxos por IA nunca usa essa ação.

Para desenvolvedores

A Requisição HTTP é construída com o mesmo ponto de extensão que qualquer plugin pode usar: writes_payload em joinotify_register_action(), que deixa uma ação passar valores para as próximas, e o filtro Joinotify/Builder/Sealed_Action_Fields, que criptografa campos secretos ao salvar. Veja Recursos para desenvolvedores.