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.