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.

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.
| Ambiente | O que pode disparar | O que prova | O que não pode fazer |
|---|---|---|---|
| Teste de StoreKit do Xcode | Um reembolso pelo Transaction Manager ou pela folha do beginRefundRequest | Seu aplicativo reage a um reembolso localmente, em segundos | Nunca entra em contato com a Apple, então nenhuma notificação ao servidor é enviada |
| Sandbox | REFUND e CONSUMPTION_REQUEST reais para o seu servidor, mais uma notificação TEST sob demanda | Seu backend recebe, verifica e age sobre o payload assinado | Não tenta reenviar uma notificação que seu endpoint não conseguiu receber |
| Produção | Todo reembolso, com dinheiro de verdade | Nada que você queira aprender aqui primeiro | Você 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
TESTchega 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_REQUESTe 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
REFUNDchega 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.

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 teste | O que simula | Por que você o usaria |
|---|---|---|
| Test instrument, always approves | Uma compra bem-sucedida e limpa | Preparar um pedido que você pode depois reembolsar ou revogar |
| Test instrument, always declines | Um pagamento que falha | Confirmar que você não concede nada em uma recusa |
| Slow test card, approves after a few minutes | Uma compra pendente que depois tem sucesso | Exercitar seu tratamento de PENDING antes de conceder acesso |
| Slow test card, declines after a few minutes | Uma compra pendente que depois falha | Confirmar que uma recusa pendente nunca vaza o direito |
| Test card, approves then charges back | Um chargeback iniciado pelo usuário | Disparar 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
PendingRefundReviewNotificationchega ao seu tópico de Real-time Developer Notifications momentos depois. Responda a ela com uma única chamadaorders.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 testada | Como falha em produção | O que custa a você |
|---|---|---|
| Tratador de REFUND | Um usuário reembolsado mantém o acesso | O processamento, as chamadas à API, o armazenamento e os pagamentos que você continua gastando com ele |
| Resposta a CONSUMPTION_REQUEST | Malformada, ou enviada após 12 horas | A Apple concede o reembolso por padrão, então você perde a venda e o gasto |
| Resposta orders.reviewrefund | Perdida ou errada dentro de 24 horas | A 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
TESTe a verifica contra os certificados da Apple. - Um
REFUNDde sandbox revoga o acesso ou deduz o saldo, e uma entrega repetida não conta duas vezes. - Um
CONSUMPTION_REQUESTde sandbox produz uma resposta Send Consumption Information válida bem dentro de 12 horas. - Uma
PendingRefundReviewNotificationdo Google a partir do cartão de teste de chargeback produz exatamente uma chamadaorders.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
- Apple Developer: Testing refund requests
- Apple Developer: Testing App Store server notifications
- Apple Developer: Request a Test Notification (App Store Server API)
- Apple Developer: Testing In-App Purchases with the sandbox
- Android Developers: Test your Google Play Billing Library integration
- Android Developers: Help Google dispute chargebacks (orders.reviewrefund)
- Play Console Help: Updates to refund protection and chargeback cost responsibility
RefundHalt
O piloto automático de reembolsos para App Store e Google Play
Continue lendo
O que um reembolso custa ao seu app é mais do que o preço que você devolve
O preço reembolsado é a menor linha da conta. Um reembolso também reverte a comissão da loja, então você perde a sua parte, e a computação, as chamadas de API, o armazenamento e os repasses que você já gastou se foram. Um estorno no Google Play após 3 de agosto de 2026 acrescenta a taxa do banco por cima. Aqui está a conta completa.
Os reembolsos de assinaturas não funcionam como os reembolsos de compra única, e a loja em que você está decide quanta voz você tem
Um reembolso de assinatura reverte todo um período de cobrança, não uma única venda. Na App Store, a Apple decide e seu servidor apenas fica sabendo do resultado. No Google Play você mesmo escolhe um reembolso integral ou proporcional. Veja como cada loja lida com os reembolsos de assinaturas, e quanto um deles custa a você.