r-martins/PagSeguro-Magento-Transparente-M2

Google ReCaptcha

Closed this issue · 8 comments

Quando qualquer versão do Google ReCaptcha está habilitada no checkout, as tentativas de pagamento via o módulo do pagseguro (qualquer meio de pagamento ativado) apresentam erro e pagamento é abortado.

Pagamentos através do PayPal não apresentam erro.

Erro na interface: "RECAPTCHA VALIDATION FAILED, PLEASE TRY AGAIN"

Post cURL

curl 'https://exemplo.com.br/rest/default/V1/carts/mine/payment-information' \
  -H 'authority: organicoecia.com.br' \
  -H 'sec-ch-ua: "Chromium";v="94", "Google Chrome";v="94", ";Not A Brand";v="99"' \
  -H 'dnt: 1' \
  -H 'sec-ch-ua-mobile: ?0' \
  -H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36' \
  -H 'content-type: application/json' \
  -H 'accept: */*' \
  -H 'x-requested-with: XMLHttpRequest' \
  -H 'sec-ch-ua-platform: "Linux"' \
  -H 'origin: https://exemplo.com.br' \
  -H 'sec-fetch-site: same-origin' \
  -H 'sec-fetch-mode: cors' \
  -H 'sec-fetch-dest: empty' \
  -H 'referer: https://exemplo.com.br/checkout/' \
  -H 'accept-language: pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7' \
  -H 'cookie: easybanner=%7B%22banner-argento-home-newsletter%22%3A%7B%22display_count_per_day%22%3A1%2C%22display_count%22%3A1%2C%22display_count_per_day_time%22%3A1631711891415%2C%22display_count_per_week_time%22%3A1631711891416%2C%22display_count_per_week%22%3A1%2C%22display_count_per_month_time%22%3A1631711891416%2C%22display_count_per_month%22%3A1%7D%7D; form_key=B6xiABJmbdqhB26l; mage-cache-storage=%7B%7D; mage-cache-storage-section-invalidation=%7B%7D; recently_viewed_product=%7B%7D; recently_viewed_product_previous=%7B%7D; recently_compared_product=%7B%7D; recently_compared_product_previous=%7B%7D; product_data_storage=%7B%7D; mage-messages=; persistent_shopping_cart=5b86rXcABEAuB5cvepyxpl22vejeDmAFuGKSG3vk5iXyxo2Npr; PHPSESSID=ucrlcg7osfl8pip83e7mmsbruc; form_key=B6xiABJmbdqhB26l; mage-cache-sessid=true; X-Magento-Vary=87af0bb5aa15bddccd0caa9403c4212e395b72a2; private_content_version=2c4317a9007d72ff6e9cefa81919cedb; section_data_ids=%7B%22cart%22%3A1636118870%2C%22customer%22%3A1636118869%2C%22captcha%22%3A1636118869%2C%22directory-data%22%3A1636118869%2C%22last-ordered-items%22%3A1636118869%2C%22instant-purchase%22%3A1636118869%2C%22compare-products%22%3A1636118869%2C%22loggedAsCustomer%22%3A1636118869%2C%22persistent%22%3A1636118869%2C%22review%22%3A1636118869%2C%22wishlist%22%3A1636118869%2C%22recently_viewed_product%22%3A1636118869%2C%22recently_compared_product%22%3A1636118869%2C%22product_data_storage%22%3A1636118869%2C%22paypal-billing-agreement%22%3A1636118869%2C%22messages%22%3A1636118916%7D' \
  --data-raw 'excluído' \
  --compressed

Response Status 400

{"message":"ReCaptcha validation failed, please try again"}

Se desabilitar o ReCaptcha do checkou, o pagamento é processado sem erros.

Oi, @rodzappa. Tudo bom?
Poderia dar mais detalhes sobre como estão suas configurações de recaptcha no Magento?
Estamos falando do checkout nativo do magento com recaptcha nativo, certo?

Oi @r-martins, tudo bem!
Estou usando o Google reCaptcha nativo do magento.
E também estou usando o checkout nativo do magento.
Seguem os links para os prints das configurações do reCaptcha:

IMG-01

IMG-02

Não importa qual versão do reCaptcha eu configure, o erro permanece o mesmo.

O reCaptcha padrão do magento foi desativado, deixando somente o do Google ativo.

Obrigado pelas informações e por reportar, @rodzappa.
Conseguimos reproduzir o problema e adicionaremos a correção em versões futuras de acordo com os próximos backlogs.

Por favor nos avise se vc contornou a solução de outra forma.

Oi @r-martins, por enquanto eu contornei o problema desativando o reCaptcha na página do checkout.

Existem correções pra compatibilização do recaptcha no checkout, por meio do Pull Request #107.

Todavia, existem limitações: quando o cliente clica em Finalizar Pedido uma primeira vez e a compra não é concluída (por algum erro na transação ou algo do tipo) e ele precisa clicar novamente e fazer uma retentativa, há um bug - o qual creio ser na lógica do Magento.

Há no módulo Magento_ReCaptchaCheckout um mixin para o modelo JS Magento_Checkout/js/model/place-order que envelopa a função original. Se o captcha estiver ativado, é utilizado modelo Magento_ReCaptchaWebapiUi/js/webapiReCaptchaRegistry para guardar a referência da chamada da função de placeOrder e utilizá-la após a atualização do captcha.

print-1

Mas, quando o placeOrder roda por uma segunda vez, ocorrem dois fatores indesejados:

  1. ao ser executada a linha 22 com o código recaptchaRegistry.addListener novamente, a referência da função não é atualizada no registry (apenas executada). Isto faz com que a requisição seja realizada com o token do recaptcha utilizado anteriormente e, portanto, expirado.

print-2

  1. na linha 32 o listener é disparado manualmente, o que provoca a atualização do token e a execução da requisição uma outra vez: agora com o token do recaptcha atualizado, mas o payload da requisição ainda é o antigo, uma vez que a referência não foi atualizada no passo anterior.

Ainda não temos uma solução paliativa, mas pudemos ver este comportamento em um teste prático.

@rodzappa , o @lawsann investiu boas horas nesta análise e também acompanhei os testes no final numa call que fizemos.
Tudo indica ser um bug do próprio Magento. Seguiremos acompanhando e torcendo por uma correção por lá.
Não achamos prudente ou razoável bolarmos a correção de um recurso da plataforma dentro do meio de pagamento.
Se isso se mostrar mais interessante no futuro, talvez possamos montar um módulo ou patch específico pra este fim.

Em tempo: robots geralmente não forjam campos como CPF, e não conseguirão passar pelas validações do Magento e do PagSeguro. Receio que não terá problemas em desativar o recaptcha ao menos no checkout.

@r-martins, @lawsann, obrigado pelo tempo investido. De fato, já estou há mais de um mês com o recaptcha desligado no checkout e não tive problemas quanto a isso. Vou manter desse jeito até ser disponibilizada uma correção pela plataforma.