Categorias:

WordPress REST API personalizada

Estou trabalhando em um projeto onde irá ocorrer uma integração personalizada com uma API de pagamento.

A API de pagamento tem opção de configurar webhook, para enviar as notificações de alterações de pagamento, onde podemos pegar os eventos e de acordo com cada um executar uma função interna, como por exemplo, liberar um produto digital para download.

Estou usando a REST API do WordPress para criar uma URL personalizada para ser usada como webhook.

A ideia é que ao configurar o webhook no site de pagamento, insira essa URL que contem um access token.
Quando enviarem a notificação, o código verifica se o token está correto com o que está configurado e então verifica qual evento está sendo recebido, executa a função e retorna 200 para sinalizar que tudo ocorreu como deveria. Do contrário, retorna um erro para a API de pagamento.

if (!class_exists('Difluir_Custom_Webhook')) :
    class Difluir_Custom_Webhook
    {
        /**
         * iniciar
         */
        public function __construct()
        {
            add_action('rest_api_init', array($this, 'webhook_rest_route'));
        }

        /**
         * token
         */
        protected function get_token()
        {
            // gerar o token aqui
            // isso é só um exemplo
            return '123';
        }

        /**
         * webhook rest api url
         * https://seusite.com/wp-json/pagamentos/v1/webhook/?accessToken=123
         */
        public function webhook_rest_route()
        {
            register_rest_route('pagamentos/v1', '/webhook', [
                'methods'             => 'POST',
                'callback'            => array($this, 'webhook'),
                'permission_callback' => array($this, 'permission'),
            ]);
        }

        /**
         * webhook
         */
        public function webhook($request)
        {
            $params = $request->get_json_params();

            if (empty($params)) {
                return new WP_Error('no_data', 'Nenhum dado recebido.', array('status' => 400));
            }

            // executar a função interna aqui

            // retornar positivo
            return new WP_REST_Response([
                'status'  => 'success',
                'message' => 'Recebido com sucesso!'
            ], 200);
        }

        /**
         * verificar token
         */
        public function permission($request)
        {
            $token = $request->get_param('accessToken');

            if (empty($token)) {
                return new WP_Error('invalid_token', 'Token não fornecido.', array('status' => 401));
            }

            if ($token !== $this->get_token()) {
                return new WP_Error('forbidden', 'Token inválido.', array('status' => 403));
            }

            // permitir acesso
            return true;
        }
    }
endif;

return new Difluir_Custom_Webhook();

Então é só configurar o webhook no site de pagamento com a URL:
https://seusite.com/wp-json/pagamentos/v1/webhook/?accessToken=123.

Óbvio que isso é apenas um exemplo e muito básico, não vá usar token 123! rs

No meu caso fiz uma configuração interna, usando get_option() para registrar no banco de dados um código único. E então pego esse código e uso ele para criar a URL e deixar em um lugar no painel para o cliente copiar e colar nas configurações do sistema de pagamento que ele está usando.