Encomendas duplicadas e cobrança a dobrar no PrestaShop: causas e como evitá-las
Um cliente paga uma vez e aparecem duas encomendas, duas faturas ou um estado de pagamento repetido. Explicamos de onde vem, como o detetar no seu histórico e como limpá-lo sem criar um problema maior.
O cliente pagou uma vez. No seu back-office há duas encomendas do mesmo carrinho, cada uma com a sua fatura e o seu stock descontado. Ou há uma só encomenda, mas com o estado «Pagamento aceite» duas vezes e duas faturas numeradas. Vistas em separado, as duas encomendas parecem corretas; por isso este problema passa despercebido até conferir o banco ou o cliente reclamar.
De onde vêm os duplicados
1. Duas notificações do gateway ao mesmo tempo
É a causa mais frequente e a menos visível. Muitos gateways avisam do pagamento por dois caminhos: a notificação de servidor para servidor (webhook, IPN, notificação online) e o regresso do cliente à loja. Se as duas chegarem quase ao mesmo tempo, cada uma pergunta «já existe uma encomenda para este carrinho?», as duas recebem «não» porque nenhuma a criou ainda, e cada uma cria a sua. É uma condição de corrida clássica.
2. Novas tentativas do webhook
Se o seu servidor demorar a responder ou devolver um erro, o gateway volta a enviar a notificação. Se o módulo de pagamento não verificar que já a processou, a encomenda ou o estado repetem-se.
3. Duplo clique ou recarregamento
O cliente carrega duas vezes em «Pagar» ou recarrega a página de confirmação. Em métodos sem redirecionamento (transferência, pagamento à cobrança) pode bastar para criar duas encomendas.
4. O back-office
Um funcionário muda o estado de uma encomenda, a página demora e carrega outra vez. O estado é aplicado duas vezes e, se esse estado gerar fatura, saem duas.
5. Módulos que reagem ao mesmo evento
Dois módulos que escutam a mudança de estado e um deles volta a mudá-lo, ou um ERP que reenvia um estado já aplicado.
Como o detetar no seu histórico
- Carrinhos com mais de uma encomenda. No PrestaShop um carrinho deveria dar uma só encomenda (salvo encomendas divididas por transportadora, que partilham referência). Uma consulta que agrupe encomendas por
id_carte conte as que têm mais de uma é o primeiro filtro. - Estados repetidos. Encomendas com o mesmo estado de pagamento duas vezes no histórico.
- Faturas duplicadas para a mesma encomenda.
- Cobranças face a encomendas. Compare os pagamentos registados em cada encomenda com o que diz o gateway. Duas encomendas e uma cobrança é um problema de stock e faturação; duas encomendas e duas cobranças é dinheiro a mais que é preciso devolver.
Como limpá-los sem piorar as coisas
- Não elimine encomendas. Perde-se a rastreabilidade e, se havia fatura, estraga a numeração. Cancele a que sobra.
- Uma fatura numerada não se retira: anula-se com uma fatura retificativa, como exige o regulamento de faturação espanhol (Real Decreto 1619/2012, artigo 15).
- Reponha o stock da encomenda que sobra, verificando que ainda não foi reposto.
- Se houve duas cobranças, a devolução é decidida por uma pessoa e faz-se a partir do gateway.
- Não mexa em encomendas já enviadas sem as rever uma a uma.
Como o prevenir
- Bloqueio por carrinho ao criar a encomenda. A segunda notificação deve esperar que a primeira termine e, ao entrar, ver que a encomenda já existe. É a solução de fundo para a condição de corrida.
- Idempotência nos webhooks: guardar o identificador de cada notificação processada e não repetir o que já foi feito.
- Responder depressa ao gateway: se o webhook demorar, o gateway tenta de novo. O que for lento (e-mails, ERP) é melhor depois.
- Desativar o botão de pagamento ao carregar nele e nos formulários de estado do back-office.
- Um único caminho que cria a encomenda por gateway, se o módulo o permitir.
- Vigilância: um aviso no momento em que aparece um duplicado vale mais do que encontrá-lo meses depois.
O que não se deve fazer
- Modificar o núcleo do PrestaShop ou o módulo de pagamento para «o corrigir»: a próxima atualização desfá-lo.
- Desativar a notificação de servidor e confiar tudo ao regresso do cliente: se ele fechar o separador, a encomenda não é criada.
- Limpar em lote sem um ensaio prévio.
Checklist
- Procure carrinhos com mais de uma encomenda em todo o histórico.
- Classifique: uma cobrança e duas encomendas, ou duas cobranças.
- Cancele as que sobram, reponha o stock e emita retificativas onde for preciso.
- Reveja como cada gateway notifica e se os seus webhooks fazem novas tentativas.
- Ponha um bloqueio na criação da encomenda e na mudança de estado.
- Ative avisos para saber no próprio dia.
Como resolvê-lo no PrestaShop
RKR Order Guard obtém um bloqueio do MySQL antes de o controlador do módulo de pagamento carregar o que quer que seja, de modo que a segunda notificação espera e encontra a encomenda já criada; também bloqueia a encomenda enquanto muda de estado, para que não nasçam duas faturas, e evita o duplo envio do formulário de estado no back-office. Sem overrides. Em Encomendas → Encomendas duplicadas revê todo o histórico e classifica cada carrinho: uma cobrança e duas encomendas (cancela a que sobra e repõe o stock), duas cobranças (a devolução é decidida por uma pessoa) ou indeterminado (só o lista). Permite simular antes de executar, nunca elimina encomendas, não emite devoluções nem mexe em encomendas com pacote enviado ou faturas já numeradas, e se o bloqueio esgotar o tempo de espera a venda continua. RKR Sentinel, que acompanha este artigo, avisa por Telegram de pagamentos sem encomenda, valores que não batem certo e encomendas paradas.