30 ago

Woocommerce – Verificando a assinatura no Webhook

Nos últimos tempos, tenho trabalhado bastante com PHP e em alguns projetos escolhi usar o WordPress, que já uso aqui no blog, estou habituado e é relativamente fácil conseguir material sobre ele na internet.

Desses projetos, um deles é uma loja virtual, e comecei a conhecer e utilizar o famoso plugin do WooCommerce, que transforma seu WordPress em uma loja virtual totalmente funcional.

Nesse projeto, surgiu a necessidade de quando ocorrer determinados eventos na loja, como a criação do pedido, comunicar o evento para um outro sistema. Foi aí que descobri a existência dos Webhooks do WooCommerce.

O que é Webhook

Segundo a Wikipedia, Webhooks são callbacks HTTP definidos pelo utilizador, e isso realmente resume muito bem.

Quem está acostumado já em trabalhar com eventos no Javascript por exemplo, entenderá fácil. No WooCommerce, algumas ações como criar ou atualizar um produto e criar um pedido, geram eventos. Nesses eventos, o motor do WooCommerce pode chamar páginas na Web passando algum conteúdo, semelhante no jQuery que quando algo acontece em determinado seletor você chama uma função definida por você. Assim, basta criar uma página que receberá este conteúdo e processar de alguma maneira.

Porém, como toda página, ela é aberta publicamente, e alguém com a URL pode tentar enviar dados falsos para ele, por exemplo para dar um desconto de 99% no próprio pedido. Para evitar isso, um dos cabeçalhos enviados para a página contém uma assinatura, que deve ser verificada para confirmar a identidade de quem enviou aquele conteúdo. E é para isso que estamos aqui!

Na rede, não consegui encontrar nenhum exemplo prático em PHP, além da documentação atual nessa parte não ajudar muito, e tive um pouco de dificuldade em entender como isso poderia ser feito, então vou compartilhar com vocês o meu método, que é extremamente simples e fácil.

Verificando o X-WC-Webhook-Signature

O cabeçalho que contém a assinatura se chama X-WC-Webhook-Signature. Para calcularmos o nosso valor para comparar com ele, vamos precisar dos dados do conteúdo e do valor do campo “Segredo” quando cadastramos o Webhook, em Woocommerce > Configurações > API dentro do painel do WordPress.

Webhook do WooCommerce

Webhook do WooCommerce

Com esse valor e o conteúdo, precisamos utilizar a função do PHP hash_hmac e codificar o retorno para base64. Para isso, criei esta função abaixo que faz tudo isso já:

Bem simples e direta, apenas uma linha pra fazer tudo que precisamos. Com isso, já sabemos se podemos confiar no conteúdo enviado ou não.

Abaixo, um exemplo bem simples de script, que apenas escreve as informações recebidas e a checagem de assinatura em arquivo:

 

03 jun

Enviar formulário de contato com anexo em PHP

Recentemente precisei montar um formulário de contato em PHP com a possibilidade de enviar um arquivo anexado, e percebi que o PHP não suporta isso nativamente pela função mail(). Como eu não quis usar nenhuma biblioteca de terceiros pronta, vi que seria necessário alterar o header do e-mail e acrescentar nele o anexo.

Para alcançar esse resultado, primeiramente precisei alterar o meu formulário. Este abaixo serve como exemplo, note o atributo enctype="multipart/form-data", sem ele não vai funcionar.

No script que vai receber os dados para envio, verifico a existência do anexo, já que ele é opcional, e codifico ele no header do e-mail. Aproveito e também dou uma limpada nos textos enviados, para evitar o chamado Email injection, já que não devemos confiar em textos enviados pelo usuário.

Pronto, com isso agora o formulário é capaz de enviar os anexos corretamente.

Fontes

02 jun

Servidor mostrando código PHP ao invés de processá-lo

Aqui no trabalho eu estava desenvolvendo a página para envio de formulário de contato através de e-mail e, ao copiar o site para a minha instalação do XAMPP, ao invés do site aparecer surgiu na verdade o meu código PHP na janela do Browser.

Pesquisei sobre o assunto e há uma resposta bem completa no Stack Overflow sobre esse assunto, e no meu caso era pelo código estar abrindo as tags php com <? ao invés de usar <?php e uma pesquisa rápida no meu código mostrou 785 ocorrências de todas as aberturas do PHP.

Por sorte, o Notepad++ conta com recursos bem interessantes na hora de localizar e substituir trechos em arquivos, e só precisei fazer uns testes usando o site regexpal para encontrar a expressão regular correta.

Inicialmente, busquei todas as tags que não tinham php, e a expressão regular usada foi <\?(?!php). Fiz um teste para ver se funcionava como esperado, e substitui por “<?php " como deveria ser. Sem as aspas, elas estão aí apenas para evidenciar o espaço extra adicionado ao final.

Lembre de marcar a opção “Expressão Regular”

Ao rodar o site, resolveu o problema.