Tous les articles
Deep dive7 min de lecture

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.

Un espace de travail de développeur au crépuscule avec un téléphone affichant un paiement annulé, illustrant une notification d'achat annulé Google Play qui atteint un serveur

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 conteneurCe qu'il contient
versionLa version du schéma de la notification, par exemple 1.0
packageNameL'application à laquelle l'événement appartient, par exemple com.acme.app
eventTimeMillisQuand l'événement s'est produit, en millisecondes depuis l'epoch
L'un des cinq objets de notificationoneTimeProductNotification, 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.

ChampCe que c'estComment vous l'utilisez
purchaseTokenLe token remis à l'appareil au moment de l'achat de l'articleVotre clé primaire. Faites-le correspondre à l'enregistrement d'achat que vous avez stocké au moment de l'octroi
orderIdL'identifiant de commande affiché à l'acheteur, par exemple GS.0000-0000-0000Une seconde clé lisible par un humain, pour l'assistance et la réconciliation
productTypeSi l'article annulé était un abonnement ou un achat uniqueAiguillez vers la bonne voie de révocation
refundTypeSi 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`ConstanteSignification
1PRODUCT_TYPE_SUBSCRIPTIONUn achat d'abonnement a été annulé
2PRODUCT_TYPE_ONE_TIMEUn 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`ConstanteSignification
1REFUND_TYPE_FULL_REFUNDL'achat a été entièrement annulé
2REFUND_TYPE_QUANTITY_BASED_PARTIAL_REFUNDUne 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_PURCHASED et ONE_TIME_PRODUCT_CANCELED.
Une carte de crédit retournée face contre table à côté d'un reçu papier, représentant un achat Google Play annulé

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 data en base64 pour obtenir le JSON DeveloperNotification.
  • Utilisez le messageId Pub/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 purchaseToken avec l'achat que vous avez stocké lorsque vous avez octroyé le droit d'accès pour la première fois. Repliez-vous sur l'orderId pour les recherches d'assistance et la réconciliation manuelle.
  • Lisez productType pour choisir la voie de révocation d'abonnement ou d'achat unique, et lisez refundType pour 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 purchaseToken et orderId. 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.

SignalDirectionPrend-il votre contribution
Notification d'achat annulé (RTDN)Google envoie à votre serveurNon. Elle rapporte une annulation déjà survenue
Voided Purchases APIVotre serveur interroge GoogleNon. C'est une liste en lecture seule des annulations passées
pendingRefundReviewNotification (RTDN)Google envoie à votre serveurOui, indirectement. Elle signale une rétrofacturation que vous contestez ensuite via orders.reviewrefund sous 24 heures
Apple CONSUMPTION_REQUESTApple interroge votre serveurOui. 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

RefundHalt

Le pilote automatique des remboursements pour l'App Store et Google Play

Poursuivre la lecture

La prochaine demande de remboursement est déjà en route.

Configurez RefundHalt dans le temps qu'il vous faudrait pour lire un nouvel e-mail d'assistance au sujet d'un remboursement que vous n'avez pas pu contester.