Une notification d'achat annulé permet à votre serveur Google Play de révoquer l'accès dès qu'un remboursement est traité
Google Play peut envoyer à votre serveur une notification d'achat annulé dès qu'un achat est remboursé, contesté ou annulé. Elle transporte un purchaseToken, un orderId, un productType et un refundType, et elle veut dire une seule chose, révoquer l'accès. Voici comment la lire et la brancher.

Points clés
- Une notification d'achat annulé est une Real-time Developer Notification que Google Play envoie à votre topic Cloud Pub/Sub dès qu'un achat est remboursé, contesté ou annulé d'une autre manière. C'est un signal push, pas quelque chose que vous devez interroger par polling.
- La notification transporte exactement quatre champs : `purchaseToken`, `orderId`, `productType` et `refundType`. Cela suffit pour retrouver l'achat exact dans votre base de données et révoquer le droit d'accès qui y est rattaché.
- `productType` vaut `1` pour un abonnement annulé et `2` pour un achat unique annulé. `refundType` vaut `1` pour un remboursement total et `2` pour un remboursement partiel basé sur la quantité, qui ne s'applique qu'aux achats uniques à quantités multiples.
- Une notification d'achat annulé signifie que le client a déjà récupéré son argent. La propre consigne de Google est de révoquer l'accès au contenu associé, car l'acheteur ne doit plus détenir le droit d'accès.
- Les notifications d'achat annulé sont désactivées jusqu'à ce que vous les activiez. Dans Play Console, sous Monetization setup, vous choisissez soit les abonnements plus tous les achats annulés, soit cela plus les événements de produits uniques. Les deux options incluent les achats annulés.
- Une notification d'achat annulé n'est pas l'un des deux flux de remboursement qui vous demandent des preuves. C'est un avis a posteriori. Les seuls flux qui prennent en compte votre contribution sont le CONSUMPTION_REQUEST d'Apple, avec une fenêtre de 12 heures, et l'examen de rétrofacturation de Google Play via orders.reviewrefund, avec une fenêtre de 24 heures.
- À compter du August 3, 2026, Google répercute sur le développeur le prix d'achat plus les frais bancaires d'une rétrofacturation. Une notification d'achat annulé est souvent la façon dont votre serveur apprend pour la première fois qu'une annulation par rétrofacturation est survenue, donc la brancher est ce qui vous permet de cesser de servir un client pour lequel vous n'êtes plus payé.
Un remboursement sur Google Play n'a pas à être quelque chose que vous découvrez plus tard dans un rapport. Google Play peut envoyer à votre serveur une notification d'achat annulé dès l'instant où un achat est annulé, que l'acheteur ait effectué un remboursement en libre-service, qu'un agent d'assistance en ait accordé un, qu'une banque ait imposé une rétrofacturation, ou que vous ayez remboursé la commande vous-même avec l'indicateur de révocation activé. Le message est minuscule, il nomme l'achat exact, et il porte une seule instruction, rendre le droit d'accès, car l'argent est déjà parti.
Ce qu'est réellement une notification d'achat annulé
Une notification d'achat annulé est un type des Real-time Developer Notifications de Google Play, ou RTDN. La RTDN est un canal push. Google publie un message dans un topic Cloud Pub/Sub qui vous appartient, et votre backend le reçoit quelques instants après l'événement, au lieu de l'apprendre lors de votre prochaine interrogation planifiée. C'est tout l'intérêt de la notification d'achat annulé par rapport à l'ancienne voie de pull : vous apprenez le remboursement au moment où il se produit, pas des heures plus tard.
La voie de pull existe toujours et compte toujours. La Voided Purchases API permet à votre serveur de demander, selon votre propre calendrier, la liste des achats qui ont été annulés sur une plage de temps. Les deux sont complémentaires. La notification vous prévient dès l'instant où un achat bascule ; l'API vous permet de réconcilier en masse et de rattraper tout ce qu'un message manqué aurait laissé de côté.
Elle voyage à l'intérieur d'une Real-time Developer Notification
La notification d'achat annulé n'arrive jamais seule. Elle se trouve à l'intérieur d'un conteneur DeveloperNotification, et ce conteneur est livré sous la forme d'une unique chaîne encodée en base64 dans le champ data du message Pub/Sub. Votre gestionnaire décode cette chaîne en JSON avant de pouvoir lire quoi que ce soit. Le conteneur nomme toujours l'application et l'heure de l'événement, et il contient exactement un objet de notification parmi les cinq que Google définit. Ils sont mutuellement exclusifs, donc un message qui porte un voidedPurchaseNotification ne portera pas aussi un événement d'abonnement ou d'achat unique.
| Champ du conteneur | Ce qu'il contient |
|---|---|
version | La version du schéma de la notification, par exemple 1.0 |
packageName | L'application à laquelle l'événement appartient, par exemple com.acme.app |
eventTimeMillis | Quand l'événement s'est produit, en millisecondes depuis l'epoch |
| L'un des cinq objets de notification | oneTimeProductNotification, subscriptionNotification, voidedPurchaseNotification, pendingRefundReviewNotification ou testNotification. Un seul est présent par message |
Les quatre champs qu'elle transporte
Retirez le conteneur et la notification d'achat annulé elle-même se réduit à quatre champs. C'est délibérément minimal. La position de Google est que si tout ce dont vous avez besoin est de retrouver le bon achat et d'ajuster le droit d'accès, ces quatre suffisent, et vous n'avez pas à rappeler une quelconque API pour agir.
| Champ | Ce que c'est | Comment vous l'utilisez |
|---|---|---|
purchaseToken | Le token remis à l'appareil au moment de l'achat de l'article | Votre clé primaire. Faites-le correspondre à l'enregistrement d'achat que vous avez stocké au moment de l'octroi |
orderId | L'identifiant de commande affiché à l'acheteur, par exemple GS.0000-0000-0000 | Une seconde clé lisible par un humain, pour l'assistance et la réconciliation |
productType | Si l'article annulé était un abonnement ou un achat unique | Aiguillez vers la bonne voie de révocation |
refundType | Si l'annulation était un remboursement total ou un remboursement partiel basé sur la quantité | Décidez s'il faut tout révoquer ou seulement la quantité remboursée |
productType vous indique ce qui a été annulé
productType est un petit entier, et il détermine laquelle de vos voies de révocation emprunter. L'annulation d'un abonnement doit défaire un accès continu ; l'annulation d'un achat unique retire simplement un seul droit d'accès.
| Valeur de `productType` | Constante | Signification |
|---|---|---|
1 | PRODUCT_TYPE_SUBSCRIPTION | Un achat d'abonnement a été annulé |
2 | PRODUCT_TYPE_ONE_TIME | Un achat unique a été annulé |
refundType vous indique combien a été rendu
refundType distingue une annulation totale et nette d'une annulation partielle. Le cas partiel est étroit. Il n'apparaît que lorsqu'un achat unique à quantités multiples a vu une partie, mais pas la totalité, de sa quantité remboursée.
| Valeur de `refundType` | Constante | Signification |
|---|---|---|
1 | REFUND_TYPE_FULL_REFUND | L'achat a été entièrement annulé |
2 | REFUND_TYPE_QUANTITY_BASED_PARTIAL_REFUND | Une partie d'un achat à quantités multiples a été annulée |
Activez-la d'abord, sinon elle n'arrive jamais
Les notifications d'achat annulé ne circulent pas par défaut. Vous activez la RTDN une fois, dans Play Console, et vous la pointez vers un topic Pub/Sub que vous contrôlez. L'option se trouve sous Monetize, puis Monetization setup, dans la section Real-time developer notifications en haut de la page. Cochez Enable real-time notifications, puis collez le nom complet de votre topic sous la forme projects/{project_id}/topics/{topic_name}, et utilisez Send Test Message pour confirmer que le canal fonctionne avant de vous y fier.
Le sélecteur de contenu est l'endroit où les gens ratent les achats annulés. Les deux choix les incluent, vous ne pouvez donc pas vous désinscrire accidentellement des remboursements tout en conservant les abonnements.
- Get notifications for subscriptions and all voided purchases. Vous recevez les événements d'abonnement et chaque achat annulé, mais pas les événements d'achat de produits uniques.
- Get all notifications for subscriptions and one-time products. Vous recevez ce qui précède plus les événements de produits uniques tels que
ONE_TIME_PRODUCT_PURCHASEDetONE_TIME_PRODUCT_CANCELED.

Ce que cela vous coûte, en argent
Une annulation est une perte déjà comptabilisée au moment où la notification vous parvient. Le prix de la vente est parti, tout comme ce que vous avez dépensé pour servir ce client. S'il a généré des images, lancé des appels vers vos modèles, sollicité du stockage ou déclenché un versement à un tiers, ces coûts ont été payés en argent réel et ne reviennent pas avec le remboursement. La notification ne peut rien récupérer de tout cela. Ce qu'elle peut faire, c'est arrêter l'hémorragie à partir de maintenant, ce qui est toute la raison d'agir vite.
L'hémorragie est pire sur les abonnements et pire sur les rétrofacturations. Un abonnement que vous ne parvenez pas à révoquer continue de vous coûter à servir, mois après mois, pour un client qui ne paie plus. Et une rétrofacturation est le type d'annulation le plus coûteux. À compter du August 3, 2026, la documentation de Google indique qu'une rétrofacturation répercute sur le développeur le prix d'achat plus les frais de la banque. La notification d'achat annulé est fréquemment le premier endroit où vos propres systèmes apprennent qu'une rétrofacturation s'est conclue, donc un gestionnaire qui révoque sur-le-champ est ce qui empêche une vente perdue de se transformer en une vente perdue plus des semaines de service gratuit.
Comment traiter une notification d'achat annulé, étape par étape
Vérifiez et dédupliquez le message
- Confirmez que le message Pub/Sub provient de Google et vise le topic que vous avez configuré, puis décodez le champ
dataen base64 pour obtenir le JSONDeveloperNotification. - Utilisez le
messageIdPub/Sub pour écarter les doublons. Google avertit que la même notification peut être livrée plus d'une fois, alors traitez la re-livraison comme normale et rendez votre gestionnaire idempotent. - N'accusez réception du message qu'après l'avoir enregistré en toute sécurité, afin qu'un plantage en cours de traitement ne perde pas l'événement.
Retrouvez l'achat
- Faites correspondre le
purchaseTokenavec l'achat que vous avez stocké lorsque vous avez octroyé le droit d'accès pour la première fois. Repliez-vous sur l'orderIdpour les recherches d'assistance et la réconciliation manuelle. - Lisez
productTypepour choisir la voie de révocation d'abonnement ou d'achat unique, et lisezrefundTypepour choisir entre une révocation totale et une révocation partielle.
Révoquez et enregistrez
- Retirez le droit d'accès. Pour un remboursement total, coupez l'accès à l'article. Pour un remboursement partiel basé sur la quantité, réduisez la quantité octroyée du montant remboursé et laissez le reste intact.
- Notez ce que vous avez fait et quand, indexé par
purchaseTokenetorderId. Cet enregistrement est ce qui vous permet de répondre à un ticket d'assistance plus tard, et ce qui permet à la Voided Purchases API de se réconcilier proprement avec votre propre état.
Où elle se situe parmi les autres signaux de remboursement
Une notification d'achat annulé est un avis, pas une négociation. Elle vous indique un résultat déjà décidé. Il vaut la peine de la voir aux côtés des signaux avec lesquels il est facile de la confondre, car seuls certains d'entre eux demandent un jour votre version de l'histoire.
| Signal | Direction | Prend-il votre contribution |
|---|---|---|
| Notification d'achat annulé (RTDN) | Google envoie à votre serveur | Non. Elle rapporte une annulation déjà survenue |
| Voided Purchases API | Votre serveur interroge Google | Non. C'est une liste en lecture seule des annulations passées |
pendingRefundReviewNotification (RTDN) | Google envoie à votre serveur | Oui, indirectement. Elle signale une rétrofacturation que vous contestez ensuite via orders.reviewrefund sous 24 heures |
| Apple CONSUMPTION_REQUEST | Apple interroge votre serveur | Oui. Vous répondez avec Send Consumption Information sous 12 heures |
La ligne à retenir est simple. Sur les deux boutiques, il existe exactement deux flux de remboursement où le développeur a voix au chapitre, le CONSUMPTION_REQUEST d'Apple et l'examen de rétrofacturation de Google Play. Une notification d'achat annulé n'est ni l'un ni l'autre. Au moment où elle vous parvient, la décision est derrière vous et la seule chose qui reste entre vos mains est la rapidité avec laquelle vous révoquez.
Questions fréquentes
- Que signifie une notification d'achat annulé sur Google Play ?
- Cela signifie qu'un achat a été remboursé, contesté ou annulé d'une autre manière, et que le client a récupéré son argent. La consigne de Google est de révoquer l'accès au contenu associé, car l'acheteur ne doit plus détenir le droit d'accès. La notification nomme l'achat exact au moyen de son `purchaseToken` et de son `orderId`.
- Quels champs contient une notification d'achat annulé Google Play ?
- Quatre : `purchaseToken`, `orderId`, `productType` et `refundType`. `productType` vaut `1` pour un abonnement et `2` pour un achat unique. `refundType` vaut `1` pour un remboursement total et `2` pour un remboursement partiel basé sur la quantité sur un achat à quantités multiples.
- Comment activer les notifications d'achat annulé ?
- Dans Play Console, ouvrez Monetize puis Monetization setup, et dans la section Real-time developer notifications cochez Enable real-time notifications, puis saisissez le nom de votre topic Cloud Pub/Sub. Les deux options de contenu, les abonnements plus tous les achats annulés, et cela plus les événements de produits uniques, incluent les achats annulés.
- Quelle est la différence entre la notification d'achat annulé et la Voided Purchases API ?
- La notification est un signal push livré en temps réel via Cloud Pub/Sub dès qu'un achat est annulé. La Voided Purchases API est une voie de pull que votre serveur interroge selon son propre calendrier pour lister les annulations sur une plage de temps. Utilisez la notification pour réagir instantanément et l'API pour réconcilier et rattraper.
- Une notification d'achat annulé me permet-elle de contester le remboursement ?
- Non. C'est un avis a posteriori d'une décision déjà prise. Le seul flux Google Play qui prend en compte votre contribution est l'examen de rétrofacturation via `orders.reviewrefund`, auquel vous avez 24 heures pour répondre, et sur Apple c'est le CONSUMPTION_REQUEST avec une fenêtre de 12 heures.
Sources et lectures complémentaires
- Android Developers: Real-time developer notifications reference guide
- Google Play Developer API: Voided Purchases API
- Google Play Developer API: REST Resource purchases.voidedpurchases
- Android Developers: Purchase lifecycle and RTDNs
- Google Play Console Help: refund protection and chargeback cost responsibility
- Google Play Developer API: Method orders.reviewrefund
RefundHalt
Le pilote automatique des remboursements pour l'App Store et Google Play
Poursuivre la lecture
Vous pouvez rembourser vous-même une commande Google Play, et le faire avant un rejet de débit vous évite les frais bancaires
Vous pouvez rembourser n'importe quelle commande Google Play de moins de trois ans avec un seul appel d'API, avec ou sans révocation de l'accès. Le faire vous-même avant qu'un litige ne devienne un rejet de débit vous évite les frais bancaires qui pèsent sur les développeurs à partir du 3 août 2026. Voici comment orders.refund fonctionne.
L'envoi des informations de consommation d'Apple demande maintenant cinq champs, pas douze, et voici chacun d'eux
Quand un client demande un remboursement à Apple, la charge Send Consumption Information est votre réponse. Apple l'a réduite de douze champs à cinq, trois obligatoires et deux facultatifs. Voici chaque champ, les valeurs que chacun accepte et la fenêtre de 12 heures dans laquelle vous l'envoyez.