Todos os artigos
Playbook8 min de leitura

O tratamento de reembolsos falha de formas silenciosas, então teste os reembolsos de compras no aplicativo no sandbox antes que um cliente real faça isso

Seu tratamento de reembolsos só é executado depois que o cliente já foi embora, então um erro nele permanece invisível até custar dinheiro de verdade. As duas lojas permitem disparar um reembolso primeiro em um ambiente de teste. Veja como testar os reembolsos de compras no aplicativo na App Store e no Google Play antes que um seja real.

Um iPhone e um telefone Android sob uma lupa em uma mesa escura, representando o teste de reembolsos de compras no aplicativo antes que sejam reais

Principais conclusões

  • O teste de StoreKit do Xcode permite reembolsar uma compra localmente clicando na seta de reembolso no Transaction Manager, o que dispara o listener Transaction.updates do seu aplicativo, mas nunca entra em contato com a Apple, então nenhuma App Store Server Notification é enviada.
  • Para testar o lado do servidor na Apple, aponte uma URL de App Store Server Notifications V2 de sandbox para o seu backend: um reembolso no sandbox entrega então um REFUND real, e uma solicitação de reembolso entrega um CONSUMPTION_REQUEST, ao seu servidor.
  • O endpoint Request a Test Notification da Apple envia uma notificação do tipo TEST para a URL que você configurou e retorna um testNotificationToken, então você pode confirmar que seu webhook está acessível antes que qualquer evento real dispare.
  • O sandbox da Apple nunca tenta reenviar uma notificação que falhou, então um webhook que está fora do ar quando o sandbox dispara perde o evento sem uma segunda tentativa, o mesmo tipo de falha que mais tarde custa uma janela de reembolso real.
  • O Google Play dá aos license testers um método de pagamento chamado Test card, approves then charges back, que dispara uma PendingRefundReviewNotification momentos após a compra para que você possa ensaiar sua resposta orders.reviewrefund de 24 horas.
  • Para um license tester no Google Play, uma compra não confirmada é reembolsada automaticamente após 3 minutos em vez dos 3 dias que a produção espera, então um caminho de confirmação quebrado falha rápido e de forma visível nos testes.
  • Um tratador de reembolsos que você nunca testou é aquele que mantém ativo o acesso pago de um cliente reembolsado, e a partir de 3 de agosto de 2026 uma resposta a um chargeback do Google Play não testada pode custar o preço da compra menos a taxa de serviço do Play mais a taxa do banco.

Seu tratamento de reembolsos é o único caminho de código que só é executado depois que o cliente já foi embora. Nada no seu QA normal o toca, porque para chegar a ele você tem que realmente ser reembolsado. Então ele vai para produção sem teste, fica em silêncio por meses e depois falha em um reembolso real, onde a falha custa dinheiro em vez de um teste em vermelho. A solução é parar de tratar um reembolso como algo que acontece com você e começar a disparar um de propósito. Tanto a Apple quanto o Google permitem disparar um reembolso em um ambiente de teste e observar seu servidor reagir. Veja como testar os reembolsos de compras no aplicativo na App Store e no Google Play antes que um cliente pagante prove que seu tratador estava quebrado.

Os três ambientes em que um reembolso pode disparar, e apenas um é produção

Há três lugares separados onde um reembolso da Apple ou do Google pode ser disparado enquanto você desenvolve, e eles não são intercambiáveis. Dois deles são seus para disparar quando quiser. O terceiro é produção, onde você nunca quer encontrar um erro de reembolso pela primeira vez. A armadilha é supor que o fácil, o teste local no Xcode, prova todo o seu pipeline. Ele prova o seu aplicativo. Não diz nada sobre o seu servidor.

O teste de StoreKit do Xcode é local, então ele exercita seu aplicativo e nada mais

O teste de StoreKit integrado do Xcode roda contra um arquivo de configuração no seu Mac, sem ida e volta à Apple. Abra o StoreKit Transaction Manager na barra de depuração, selecione uma transação comprada e clique na seta curva de reembolso. A transação muda para reembolsada e o listener Transaction.updates do seu aplicativo dispara, exatamente como faria no mundo real. Você também pode chamar beginRefundRequest para apresentar a folha de reembolso real, e no ambiente do Xcode o problema que você escolhe corresponde um para um a um RevocationReason, com o reembolso aplicado imediatamente. Esta é a forma mais rápida de provar que seu cliente corta o acesso no momento em que revocationDate deixa de ser nulo. É também tudo o que o teste local pode lhe dizer, porque nada aqui chega aos servidores da Apple, então nenhuma App Store Server Notification é enviada. Seu backend não fica sabendo de nada.

O sandbox é onde seu servidor finalmente fica sabendo de um reembolso

Para testar a metade da sua integração que decide dinheiro, o seu servidor, você precisa do sandbox da Apple. Configure uma URL de App Store Server Notifications V2 de sandbox no App Store Connect, faça login com um tester de sandbox em um dispositivo e compre. Agora um reembolso no sandbox entrega uma notificação REFUND real ao seu backend, e uma solicitação de reembolso em um consumível ou renovável automaticamente entrega um CONSUMPTION_REQUEST, o mesmo payload assinado que seu servidor de produção receberá. Antes de disparar qualquer coisa, chame o endpoint Request a Test Notification. Ele diz ao servidor da App Store para enviar uma notificação do tipo TEST para a URL que você configurou e lhe entrega um testNotificationToken, que você passa para Get Test Notification Status para confirmar a entrega. Se essa ida e volta não funcionar, nenhuma notificação real vai funcionar também.

AmbienteO que pode dispararO que provaO que não pode fazer
Teste de StoreKit do XcodeUm reembolso pelo Transaction Manager ou pela folha do beginRefundRequestSeu aplicativo reage a um reembolso localmente, em segundosNunca entra em contato com a Apple, então nenhuma notificação ao servidor é enviada
SandboxREFUND e CONSUMPTION_REQUEST reais para o seu servidor, mais uma notificação TEST sob demandaSeu backend recebe, verifica e age sobre o payload assinadoNão tenta reenviar uma notificação que seu endpoint não conseguiu receber
ProduçãoTodo reembolso, com dinheiro de verdadeNada que você queira aprender aqui primeiroVocê não pode desfazer o custo de um erro

Como testar os reembolsos de compras no aplicativo na App Store

Execute nesta ordem, da verificação barata do cliente até a ida e volta completa do servidor. Cada etapa exercita uma peça diferente, e as posteriores são as que a produção realmente cobra de você.

  • Crie uma chave de In-App Purchase em Users and Access, Integrations, In-App Purchase no App Store Connect, e use-a para assinar suas chamadas à App Store Server API.
  • Aponte sua URL de App Store Server Notifications V2 de sandbox para o seu backend, depois chame Request a Test Notification e confirme que o payload TEST chega e é verificado contra a cadeia de certificados da Apple.
  • No Transaction Manager do Xcode, reembolse uma compra e confirme que seu aplicativo remove o direito no instante em que revocationDate é definido.
  • Faça login com um tester de sandbox, compre um consumível, solicite um reembolso e confirme que seu servidor recebe o CONSUMPTION_REQUEST e consegue montar e enviar uma resposta Send Consumption Information bem dentro da janela de 12 horas.
  • Reembolse uma compra de sandbox e confirme que a notificação REFUND chega ao seu servidor, que você revoga o acesso ou deduz o saldo do consumível, e que uma entrega repetida da mesma notificação não é aplicada duas vezes.
Um smartphone preso em uma pequena morsa de bancada sob uma luminária de trabalho com uma pinça ao lado, um dispositivo em teste representando o ensaio de um reembolso antes que ele seja real

Como ensaiar um reembolso e um chargeback no Google Play

O Google Play não tem um modo local como o do Xcode. Tudo roda contra os servidores do Google, mas os license testers o mantêm gratuito e seguro. Adicione suas contas Google de teste como license testers no Play Console e elas recebem um conjunto de métodos de pagamento de teste que nunca cobram dinheiro de verdade. O Google marca cada compra de teste com um aviso no meio da caixa de diálogo de compra, e os impostos não são calculados. O que importa para testar reembolsos é qual instrumento de teste você escolhe, porque cada um leva a um resultado diferente.

Método de pagamento de testeO que simulaPor que você o usaria
Test instrument, always approvesUma compra bem-sucedida e limpaPreparar um pedido que você pode depois reembolsar ou revogar
Test instrument, always declinesUm pagamento que falhaConfirmar que você não concede nada em uma recusa
Slow test card, approves after a few minutesUma compra pendente que depois tem sucessoExercitar seu tratamento de PENDING antes de conceder acesso
Slow test card, declines after a few minutesUma compra pendente que depois falhaConfirmar que uma recusa pendente nunca vaza o direito
Test card, approves then charges backUm chargeback iniciado pelo usuárioDisparar uma PendingRefundReviewNotification e ensaiar sua resposta de 24 horas

Dispare um reembolso, um chargeback e o reembolso automático por falta de confirmação

  • Compre com o cartão de teste approve-then-charge-back, e uma PendingRefundReviewNotification chega ao seu tópico de Real-time Developer Notifications momentos depois. Responda a ela com uma única chamada orders.reviewrefund, porque o Google mantém apenas a sua primeira resposta.
  • Reembolse e revogue um pedido de teste na aba Orders no Play Console para disparar uma VoidedPurchaseNotification, e confirme que seu servidor remove o direito.
  • Deixe de propósito a compra de um license tester sem confirmação. O Google a reembolsa automaticamente após 3 minutos em vez dos 3 dias que a produção permite, e envia a você por e-mail o cancelamento, então um caminho de confirmação quebrado aparece em minutos, não no quarto dia em produção.

O que uma rota de reembolso não testada realmente custa

Um tratador de reembolsos não é decoração. É o código que impede você de pagar para atender alguém que não paga mais você. Quando ele falha em silêncio, o reembolso ainda acontece, mas o acesso, o saldo e o gasto por trás deles não param.

Siga o dinheiro. Quando a Apple ou o Google reembolsa uma compra, você devolve o preço de venda e a loja devolve a comissão dela, até aqui o balanço fica equilibrado. O que não volta é tudo o que você já gastou entregando o produto: o processamento por trás de um resultado gerado, as chamadas à API do modelo, o armazenamento do que o usuário salvou, o pagamento que você já enviou a um criador. Um tratador de reembolsos que nunca revoga o acesso deixa um usuário reembolsado continuar gastando isso à custa do seu orçamento, sem nada no sistema para detê-lo.

As duas janelas de evidência tornam isso mais nítido. Um CONSUMPTION_REQUEST que você nunca exercitou no sandbox é uma resposta que você envia malformada ou atrasada, e a Apple muitas vezes concede o reembolso por padrão quando sua resposta não chega dentro de 12 horas. Uma resposta a um chargeback do Google Play que você nunca disparou com o cartão de teste é uma janela de 24 horas que você erra ao vivo, e a partir de 3 de agosto de 2026 um chargeback perdido no Play custa a você o preço da compra menos a taxa de serviço do Play mais a taxa de chargeback do banco. Cada uma dessas falhas é reproduzível de graça em um ambiente de teste primeiro. Nenhuma delas é barata em produção.

Rota não testadaComo falha em produçãoO que custa a você
Tratador de REFUNDUm usuário reembolsado mantém o acessoO processamento, as chamadas à API, o armazenamento e os pagamentos que você continua gastando com ele
Resposta a CONSUMPTION_REQUESTMalformada, ou enviada após 12 horasA Apple concede o reembolso por padrão, então você perde a venda e o gasto
Resposta orders.reviewrefundPerdida ou errada dentro de 24 horasA partir de 3 de agosto de 2026, o preço da compra menos a taxa de serviço do Play, mais a taxa de chargeback do banco

Uma lista curta antes de lançar o tratamento de reembolsos

Você não precisa de um laboratório. Você precisa ter visto cada evento chegar ao seu código uma vez.

  • Seu aplicativo remove o acesso no momento em que uma transação do StoreKit mostra um revocationDate, confirmado no Transaction Manager do Xcode.
  • A URL do seu servidor de sandbox recebe uma notificação TEST e a verifica contra os certificados da Apple.
  • Um REFUND de sandbox revoga o acesso ou deduz o saldo, e uma entrega repetida não conta duas vezes.
  • Um CONSUMPTION_REQUEST de sandbox produz uma resposta Send Consumption Information válida bem dentro de 12 horas.
  • Uma PendingRefundReviewNotification do Google a partir do cartão de teste de chargeback produz exatamente uma chamada orders.reviewrefund.
  • Uma compra de teste do Google Play não confirmada é reembolsada automaticamente em 3 minutos e sua reconciliação percebe.

Execute essa lista uma vez e o tratamento de reembolsos deixa de ser o código que você torce para funcionar. Ele se torna o código que você viu funcionar.

Perguntas frequentes

Posso testar um reembolso da App Store sem uma compra real?
Sim. O teste de StoreKit do Xcode permite reembolsar uma compra localmente pelo Transaction Manager, sem dinheiro de verdade e sem uma conta da App Store, o que dispara o listener Transaction.updates do seu aplicativo. Ele não envia uma notificação ao servidor, então testa apenas o seu aplicativo, não o seu backend.
O teste local de StoreKit envia App Store Server Notifications?
Não. O teste de StoreKit do Xcode roda inteiramente no seu Mac contra uma configuração local e nunca entra em contato com os servidores da Apple, então nenhuma App Store Server Notification, incluindo REFUND ou CONSUMPTION_REQUEST, é enviada. Use o sandbox para testar seu servidor.
Como testo uma resposta a um chargeback do Google Play?
Use o método de pagamento de license tester chamado Test card, approves then charges back. Ele dispara uma PendingRefundReviewNotification momentos após a compra, a mesma notificação que um chargeback bancário real envia, então você pode ensaiar sua resposta orders.reviewrefund de 24 horas.
Por que minha compra de teste do Google Play é reembolsada após alguns minutos?
Para license testers, o Google reembolsa automaticamente uma compra após 3 minutos se seu aplicativo não a confirmou, e envia a você por e-mail o cancelamento. A produção espera 3 dias, mas os testers recebem a versão acelerada para que um caminho de confirmação quebrado apareça rápido.
O sandbox da Apple tenta reenviar uma notificação de reembolso que falhou?
Não. O sandbox não tenta reenviar App Store Server Notifications, então se seu endpoint estiver fora do ar quando um reembolso de sandbox dispara, a notificação é descartada sem uma segunda tentativa. Confirme primeiro que sua URL está acessível com Request a Test Notification.

Fontes e leituras adicionais

RefundHalt

O piloto automático de reembolsos para App Store e Google Play

Continue lendo

A próxima solicitação de reembolso já está a caminho.

Configure a RefundHalt no tempo que você levaria para ler mais um e-mail de suporte sobre um reembolso que não conseguiu contestar.