1
resposta

Criar endpoint no wordpress

Tô com um plugin do wordpress que eu criei e que preciso de um endpoint pra receber um POST externo. A parte da criação dele tá assim:

class RenovaBoletoOmie
{

    public function __construct()
    {
        add_action('rest_api_init', [$this, 'registerWebhookEndpoint']);
    }

    public function registerWebhookEndpoint()
    {
        register_rest_route('omie/v1', '/webhook', array(
            'methods' => 'POST',
            'callback' => [$this, 'handleWebhook'],
            'permission_callback' => '__return_true'
        ));
    }

    public function handleWebhook(WP_REST_Request $request)
    {
        $data = $request->get_json_params();

        error_log('Webhook received: ' . print_r($data, true));

        if (!isset($data['event']) || empty($data['event'])) {
            return new WP_REST_Response(['error' => 'Dados do evento ausentes ou inválidos'], 400);
        }

        global $wpdb;

        $codigo_cliente = $data['event'][0]['codigo_cliente_fornecedor'];

        $result = $wpdb->update(
            'DADOS_FORNECEDOR',
            ['plano' => 'QUIOSQUE'],
            ['cod_cliente_omie' => $codigo_cliente],
            ['%s'],
            ['%d']
        );

        if ($result !== false) {
            return new WP_REST_Response(['success' => true, 'message' => 'Plano atualizado com sucesso'], 200);
        } else {
            return new WP_REST_Response(['error' => 'Erro ao atualizar o banco de dados'], 500);
        }
    }

}

O problema é que ele não reconhece. A url do meu site é http://devel.publicando.com.br. Tô fazendo as requisições no Postman tanto na url devel.publicando.com/wp-json/omie/v1/webhook quanto na devel.publicando.com/omie/v1/webhook, mas ambas (e em qualquer url dentro do meu site) eles retornam isso:

<!doctype html>
<html
    data-adblockkey="MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANDrp2lz7AOmADaN8tA50LsWcjLFyQFcb/P2Txc58oYOeILb3vBw7J6f4pamkAQVSQuqYsKx3YzdUHCvbVZvFUsCAwEAAQ==_g15P7hFP4ukEcRgDrbZ5V/0U3fZL+MTwTKAwvwPTWNCzynys+to2RkIHunhyYrV9HCeiVxY0spVNUomw9bPgAQ=="
    lang="en" style="background: #2B2B2B;">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="icon"
        href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAADElEQVQI12P4//8/AAX+Av7czFnnAAAAAElFTkSuQmCC">
    <link rel="preconnect" href="https://www.google.com" crossorigin>
</head>

<body>
    <div id="target" style="opacity: 0"></div>
    <script>
        window.park = "eyJ1dWlkIjoiZWJhODE2ZjYtMmQzNy00NDMxLWFkZjUtZmVkZDM3YzdlYmZhIiwicGFnZV90aW1lIjoxNzMzMzM0MzI5LCJwYWdlX3VybCI6Imh0dHA6Ly9kZXZlbC5wdWJsaWNhbmRvLmNvbS93cC1qc29uL29taWUvdjEvd2ViaG9vayIsInBhZ2VfbWV0aG9kIjoiUE9TVCIsInBhZ2VfcmVxdWVzdCI6e30sInBhZ2VfaGVhZGVycyI6e30sImhvc3QiOiJkZXZlbC5wdWJsaWNhbmRvLmNvbSIsImlwIjoiMTg2LjE5Mi4xNjQuNjAifQo=";
    </script>
    <script src="/buBpITqah.js"></script>
</body>

</html>

O body da requisição tá assim:

{
    "messageId": "cd4bb518-617e-42a3-8027-beeb0008fe16",
    "topic": "Financas.ContaReceber.BaixaRealizada",
    "event": [{
        "codigo_cliente_fornecedor": 7458980325,
        "codigo_baixa": 7459535108

}           ]}
1 resposta

Bom dia. Pelo que parece, o problema pode tar relacionado a redirecionamentos, bloqueios de acesso ou algum conflito no seu WordPress.

Primeiro, tenha certeza de que o seu plugin está ativo. Isso pode parecer básico, mas se ele não estiver ativado, o hook rest_api_init não será executado e o endpoint não será registrado. Dê uma olhada na lista de plugins ativos no painel do WordPress ou use o comando wp plugin list se tiver acesso ao terminal.

Outro ponto importante é garantir que a URL do seu endpoint está correta. O formato esperado seria algo como:http://devel.publicando.com.br/wp-json/omie/v1/webhook.Se você tentar acessar esse link no navegador e não ver a mensagem de "No route was found matching the URL and request method", é sinal de que o endpoint não está sendo registrado corretamente. Isso pode ser causado por erros de lógica no código ou por algum bloqueio no servidor.

Falando em bloqueios, vale a pena verificar se o Cloudflare, o firewall ou o WAF (Web Application Firewall) do seu provedor de hospedagem está interferindo. Muitas vezes, essas ferramentas interpretam requisições para /wp-json/ como ameaças e as bloqueiam. Nesse caso, você pode criar uma regra de bypass no Cloudflare para liberar o acesso à API.

Se não for isso, olhe o arquivo .htaccess e veja se as regras de reescrita de URL estão corretas. O trecho padrão do WordPress precisa estar presente para que as rotas REST funcionem. Outro detalhe é garantir que não existam plugins de segurança (como Wordfence) bloqueando o acesso à REST API.

Para entender se o endpoint está sendo registrado, adicione um error_log no método registerWebhookEndpoint. Isso permite ver, no log de erros do WordPress, se o código realmente está sendo executado. Se não aparecer nada no log, o problema está na ativação ou no carregamento do seu plugin.

Se quiser uma abordagem mais direta, tente listar todas as rotas REST registradas no WordPress com o comando wp rest route list. Assim, você pode ver se sua rota realmente está ativa no servidor. Se não estiver, o problema pode estar no namespace ou na forma como a função register_rest_route está sendo chamada.

Por último, confira as permissões de acesso à API. Algumas hospedagens bloqueiam /wp-json/ por padrão, e você precisa desbloquear esse caminho ou criar regras específicas no servidor.