Alle Artikel
Deep dive9 Min. Lesezeit

Ein ausstehender Kauf sieht aus wie ein Verkauf, aber das Geld ist noch nicht da, und wer ihn zu früh freigibt, verschenkt das Produkt

Sowohl der App Store als auch Google Play haben einen Status für ausstehende Käufe, eine Bestellung, die der Store angenommen, aber noch nicht abgebucht hat. Wer sie freischaltet, bevor die Zahlung eingeht, trägt bei jeder geplatzten Zahlung reine Kosten. Hier erfahren Sie, wie ausstehende Käufe in den einzelnen Stores funktionieren, was ein zu Unrecht gewährter Kauf kostet und wie Sie damit umgehen, ohne etwas zu verlieren.

Ein Kassierer reicht ein kleines eingewickeltes Paket über einen Ladentisch in warmem Licht und veranschaulicht so einen ausstehenden Kauf, bei dem die Ware wandert, bevor die Zahlung eingeht

Wichtigste Erkenntnisse

  • Ein ausstehender Kauf ist eine echte Bestellung, die der Store angenommen, aber noch nicht abgebucht hat. Ihr Code sieht einen neuen Kauf, aber das Geld ist nicht angekommen, und es kommt vielleicht nie an.
  • Gewähren Sie die Berechtigung nur, wenn der Status bei Google Play PURCHASED lautet oder die Transaktion bei Apple abgeschlossen ist. Schalten Sie niemals bei einem PENDING-Status oder bei Apples ausstehendem Ergebnis frei.
  • Bei Google Play werden Barzahlungen im Geschäft, Banküberweisungen und einige Formen der Abrechnung über die Telefonrechnung außerhalb des regulären Ablaufs abgewickelt, daher kommt der Kauf im Status PENDING zurück, nicht PURCHASED, bis der Kunde tatsächlich zahlt.
  • Bei Apple ist ein ausstehender Kauf meist Ask to Buy, bei dem ein Familienorganisator ihn genehmigen muss. Die Genehmigung kann Stunden oder Tage dauern, und die abgeschlossene Transaktion trifft später über Transaction.updates ein.
  • Wenn Sie bei einer ausstehenden Bestellung freischalten, die dann storniert wird, haben Sie Rechenleistung, API-Aufrufe, Speicher oder die Auszahlung eines Verbrauchsartikels für eine Belastung ausgegeben, die nie eingegangen ist. Anders als bei einer Rückerstattung gibt es kein Geld zurückzuholen, weil nie welches eingezogen wurde.
  • Der Store teilt Ihnen mit, wenn eine ausstehende Bestellung platzt. Google sendet ONE_TIME_PRODUCT_CANCELED, Typ 2, oder SUBSCRIPTION_PENDING_PURCHASE_CANCELED, Typ 20. Apple liefert einfach nie eine abgeschlossene Transaktion.
  • Eine ausstehende Bestellung kann sich in einen echten Verkauf verwandeln, während Ihre App geschlossen ist, prüfen Sie also bei der Rückkehr erneut: Rufen Sie queryPurchasesAsync() in onResume() bei Google Play auf, und hören Sie bei Apple weiter auf Transaction.updates.

Jemand tippt in Ihrer App auf Kaufen. Ihre Logs zeigen eine neue Bestellung, Ihr Billing-Listener löst aus, und Sie händigen die Ware aus. Bei den meisten Käufen ist genau das richtig. Bei einem ausstehenden Kauf ist es ein Fehler, denn die Bestellung existiert, das Geld aber nicht. Der Kunde hat eine Zahlungsmethode gewählt, die später abgewickelt wird, der Store wartet noch auf sein Geld, und Sie haben soeben eine kostenpflichtige Funktion für eine Belastung geliefert, die vielleicht nie eingeht. Das ist der stille Verwandte einer Rückerstattung. Hier wird nichts rückgängig gemacht, weil nie etwas eingezogen wurde. Sie haben das Produkt einfach verschenkt.

Ein ausstehender Kauf ist eine echte Bestellung in einem noch-nicht-bezahlten Status, und sowohl der App Store als auch Google Play haben einen solchen. Beide Stores sagen Ihnen klar, dass Sie warten sollen. Die Falle: Eine ausstehende Bestellung sieht in Ihrem Code fast identisch aus wie eine abgeschlossene, sodass eine Integration, die jeden neuen Kauf als Verkauf behandelt, Waren für Bestellungen ausliefert, die der Store noch einzuziehen versucht. Behandeln Sie es richtig, verlieren Sie nichts. Behandeln Sie es falsch, ist jede langsame Zahlung, die platzt, reine Kosten, auf Ihre Rechnung geliefert.

Was ein ausstehender Kauf tatsächlich ist

Ein ausstehender Kauf ist eine Bestellung, die der Store erfasst, aber noch nicht abgebucht hat. Der Käufer hat den Ablauf gestartet, der Store hat ihn angenommen, und die Abwicklung findet irgendwo statt, wo Ihre App nichts sehen kann. Google Play nennt das den Status PENDING. Apple nennt es eine ausstehende oder aufgeschobene Transaktion. Unterschiedliche Namen, dieselbe Tatsache: Der Store hält eine Bestellung offen, während er auf seine Zahlung wartet, und er hat Ihnen gesagt, diese Bestellung nicht wie Geld zu behandeln.

Google Play: Die Zahlung passiert woanders

Manche Zahlungsmethoden werden außerhalb des regulären Ablaufs abgewickelt. Bargeld im Ladengeschäft, Banküberweisungen und einige Formen der Abrechnung über die Telefonrechnung erfordern alle zusätzliche Schritte zwischen dem Tippen und der Belastung. Wenn ein Kunde eine davon wählt, gibt Google den Kauf im Status PENDING statt PURCHASED zurück. Bei einer Barzahlung erhält der Kunde einen Code per Benachrichtigung und per E-Mail, bringt ihn zu einem teilnehmenden Geschäft und zahlt an der Kasse. Bis das geschieht, hat Google nichts eingezogen, und Sie ebenso wenig. Googles Regel ist ein Satz: Verwenden Sie getPurchaseState() und gewähren Sie die Berechtigung nur, wenn der Status PURCHASED lautet. Google weist Sie außerdem an, einen Kauf nicht zu bestätigen, solange er PENDING ist, denn eine Bestätigung gehört zu einer bezahlten Bestellung, nicht zu einer versprochenen.

Apple: Der Kauf wartet auf das Tippen einer anderen Person

Apples ausstehender Status bedeutet, dass die Transaktion vor ihrem Abschluss eine externe Aktion benötigt. Die häufigste ist Ask to Buy, bei der ein Kind einen Kauf startet und ein Familienorganisator ihn genehmigen muss. In StoreKit 2 gibt der Kaufaufruf Product.PurchaseResult.pending zurück. Im älteren StoreKit wird die Transaktion als aufgeschoben gemeldet. So oder so hat Apple niemanden belastet, und die abgeschlossene Transaktion trifft, falls sie kommt, asynchron über Transaction.updates ein. Zeigen Sie dem Kunden einen Wartestatus und schalten Sie nichts frei, bis die abgeschlossene Transaktion eintrifft.

Warum die Freigabe eines ausstehenden Kaufs Sie echtes Geld kostet

Der Verlust hier ist nicht die Art der Rückerstattung, bei der Geld, das Sie verbucht haben, zurückgezogen wird. Er ist auf eine ganz bestimmte Weise schlimmer: Es gibt kein Geld zurückzuziehen, weil nie welches eingezogen wurde.

Sie liefern, und der Store zieht nie etwas ein

Wenn Sie bei einer ausstehenden Bestellung freischalten, die später storniert wird, haben Sie bereits für die Bereitstellung ausgegeben. Die Rechenleistung, die die Funktion ausgeführt hat, die Drittanbieter-API-Aufrufe, für die Sie bezahlt haben, der Speicher, den Sie zugewiesen haben, und bei einem Verbrauchsartikel die tatsächliche Auszahlung der verkauften Sache. All das geht für eine Bestellung raus, die keinen Umsatz erzeugt hat. Eine Rückerstattung beginnt immerhin mit einer Belastung, die stattgefunden hat. Ein zu Unrecht gewährter ausstehender Kauf hatte nie eine Belastung, also taucht er nicht einmal als abfließendes Geld auf. Er taucht als nichts auf, und genau deshalb ist er leicht zu übersehen und leicht zu wiederholen.

Das Stornosignal und was es bedeutet

Der Store teilt Ihnen durchaus mit, wenn eine ausstehende Bestellung stirbt. Bei Google Play sendet ein Einmalprodukt, das platzt, eine ONE_TIME_PRODUCT_CANCELED-Benachrichtigung, Typ 2, und ein Abonnement, das ausstehend war, sendet SUBSCRIPTION_PENDING_PURCHASE_CANCELED, Typ 20. Wenn dieselben Bestellungen stattdessen durchgehen, erhalten Sie ONE_TIME_PRODUCT_PURCHASED, Typ 1, oder SUBSCRIPTION_PURCHASED, Typ 4. Bei Apple gibt es kein Storno-Ereignis abzufangen, denn eine aufgeschobene Transaktion, die abgelehnt wird, wird einfach nie zu einer abgeschlossenen Transaktion. Wenn Sie zu früh freigeschaltet haben, ist diese Stille die Rechnung.

FrageGoogle PlayApple
Was es auslöstBargeld, Banküberweisung, einige Abrechnungen über die TelefonrechnungAsk to Buy-Genehmigung oder andere erforderliche Aktion
Status, den Sie sehenPurchaseState PENDINGausstehendes Ergebnis oder eine aufgeschobene Transaktion
Zugriff gewähren, wennStatus PURCHASED istTransaktion abgeschlossen ist
Es ging durchONE_TIME_PRODUCT_PURCHASED (1), SUBSCRIPTION_PURCHASED (4)Abgeschlossene Transaktion über Transaction.updates
Es platzteONE_TIME_PRODUCT_CANCELED (2), SUBSCRIPTION_PENDING_PURCHASE_CANCELED (20)Es trifft nie eine abgeschlossene Transaktion ein
Wurde Geld eingezogenNein, nicht bis PURCHASEDNein, nicht bis die Transaktion abgeschlossen ist

Das Zeitfenster und wer auf wen wartet

Ein ausstehender Kauf ist keine Uhr, gegen die Sie rennen. Es ist eine Uhr, die von Ihrer Seite aus noch nicht gestartet ist.

Google Play gibt dem Kunden Tage, nicht Minuten

Eine Bar- oder Banküberweisungszahlung wird nach dem Zeitplan des Kunden abgewickelt, nicht nach Ihrem. Die Bestellung bleibt in PENDING, bis der Kunde zahlt oder das Zeitfenster abläuft und Google sie storniert. Ihr eigenes dreitägiges Bestätigungsfenster, jenes, das einen Kauf automatisch erstattet, den Sie nicht bestätigen, beginnt nicht einmal, bevor der Kauf von PENDING zu PURCHASED wechselt. Es gibt also keine Eile, eine ausstehende Bestellung zu bedienen. Es gibt nur die Disziplin, auf den Statuswechsel zu warten.

Apples Genehmigung liegt auf dem Handy des Familienorganisators

Eine Ask to Buy-Anfrage landet als Aufforderung auf dem Gerät des Organisators, die er genehmigt oder ablehnt, wann immer er dazu kommt. Das können Minuten, Stunden oder ein Tag später sein, und Ihre App kann es nicht beschleunigen. Das einzig richtige Verhalten ist, den Wartestatus abzubilden und StoreKit die abgeschlossene Transaktion übergeben zu lassen, falls und wann die Genehmigung kommt.

Ein versiegelter Pappkarton neben einer Sanduhr auf einem Schreibtisch, veranschaulicht einen ausstehenden Kauf, bei dem die Ware bereit ist, die Zahlung aber noch nicht eingegangen ist

Wie Sie ausstehende Käufe handhaben, ohne zu verlieren

Die ganze Aufgabe läuft auf vier Gewohnheiten hinaus. Keine davon ist schwer, und das Auslassen auch nur einer davon ist, wo das Geld verloren geht.

Gewähren Sie beim bezahlten Status, niemals beim ausstehenden

Bei Google Play prüfen Sie getPurchaseState() und gewähren nur bei PURCHASED, und bestätigen Sie einen Kauf nicht, solange er PENDING ist. Bei Apple schalten Sie nur bei einer abgeschlossenen Transaktion frei und niemals beim ausstehenden Ergebnis. Diese eine Regel schließt das gesamte Leck. Alles Übrige dreht sich darum, sicherzustellen, dass Sie tatsächlich bemerken, wenn der bezahlte Status eintrifft.

Prüfen Sie erneut, wenn die App zurückkommt

Der Übergang von ausstehend zu bezahlt geschieht oft, während Ihre App nicht läuft. Bei Google Play rufen Sie queryPurchasesAsync() in Ihrem onResume()-Handler auf, um Bestellungen aufzunehmen, die im Hintergrund zu PURCHASED geworden sind, und behalten Sie Ihren Real-time Developer Notifications-Listener als serverseitige Quelle der Wahrheit. Bei Apple hören Sie während der gesamten Lebensdauer der App auf Transaction.updates, denn eine genehmigte Transaktion kann lange nach der Rückkehr des ursprünglichen Kaufaufrufs eintreffen.

Aktivieren Sie die Unterstützung für ausstehende Käufe und testen Sie beide Ausgänge

Google verlangt, dass Sie enablePendingPurchases() aufrufen, wenn Sie den BillingClient erstellen, und die Unterstützung ausstehender Transaktionen für Einmalprodukte ist verpflichtend, nicht optional. Testen Sie es, bevor Sie ausliefern. Lizenztester erhalten zwei zusätzliche Testinstrumente für verzögerte Zahlungsformen, bei denen die Zahlung nach ein paar Minuten automatisch abgeschlossen oder automatisch storniert wird, sodass Sie sowohl den Zahlungspfad als auch den Fehlschlagpfad von Anfang bis Ende beobachten können.

Sagen Sie dem Kunden, dass die Bestellung nicht abgeschlossen ist

Ein ausstehender Käufer ist ein echter Kunde mitten in einem Kauf, kein Fehlschlag. Zeigen Sie ihm, dass die Bestellung auf seine Zahlung oder auf eine Genehmigung wartet, und geben Sie ihm einen klaren Weg zurück, um sie abzuschließen. Ein stiller ausstehender Status verliert Verkäufe, die ein gut beschrifteter zurückgewinnt, denn die meisten dieser Käufer wollen die Sache noch und haben nur einen Schritt vor sich.

Dieselben Feeds von Real-time Developer Notifications und App Store Server Notifications, die RefundHalt bereits für Rückerstattungen und Rückbuchungen liest, tragen auch diese Signale. Die Purchased-Benachrichtigung, die sagt, dass eine ausstehende Bestellung endlich eingegangen ist, und die Canceled-Benachrichtigung, die sagt, dass sie es nicht ist, landen in Ihrem Dashboard neben dem Rest Ihrer Umsatzereignisse, sodass eine ausstehende Bestellung, die geplatzt ist, etwas ist, das Sie sehen können, statt etwas, für das Sie versehentlich bezahlt haben.

Die Kurzfassung

Ein ausstehender Kauf ist eine Bestellung ohne Zahlung, und beide Stores sind sich einig, dass Sie warten sollten. Google Play gibt Bargeld-, Banküberweisungs- und einige Abrechnungen über die Telefonrechnung im Status PENDING zurück und weist Sie an, den Zugriff nur bei PURCHASED zu gewähren. Apple gibt für Ask to Buy und andere erforderliche Aktionen eine ausstehende oder aufgeschobene Transaktion zurück und liefert die abgeschlossene Transaktion später über Transaction.updates. Schalten Sie beim bezahlten Status frei, prüfen Sie erneut, wenn Ihre App fortgesetzt wird, aktivieren und testen Sie die Unterstützung für ausstehende Käufe, und beschriften Sie die wartende Bestellung für den Kunden. Tun Sie das, und ein ausstehender Kauf kostet Sie nichts. Lassen Sie es aus, und Sie liefern ein kostenpflichtiges Produkt für eine Belastung, die nie kam, was der eine Verlust ist, für den es keinen Beleg gibt, auf den man zeigen kann.

Häufig gestellte Fragen

Was ist ein ausstehender Kauf?
Ein ausstehender Kauf ist eine Bestellung, die der Store angenommen, aber noch nicht abgebucht hat. Bei Google Play ist es der Kaufstatus PENDING, der für Zahlungsmethoden verwendet wird, die später abgewickelt werden, etwa Bargeld, Banküberweisung und einige Abrechnungen über die Telefonrechnung. Bei Apple ist es eine ausstehende oder aufgeschobene Transaktion, meist ein Ask to Buy-Kauf, der auf die Genehmigung eines Familienorganisators wartet. In beiden Fällen wurde noch kein Geld eingezogen, daher sollten Sie keinen Zugriff gewähren.
Sollte ich Zugriff gewähren, während ein Kauf aussteht?
Nein. Gewähren Sie die Berechtigung nur, wenn der Status bei Google Play PURCHASED lautet oder die Transaktion bei Apple abgeschlossen ist. Wenn Sie eine Funktion freischalten, während die Bestellung noch aussteht, und die Zahlung nie eingeht, haben Sie das Produkt kostenlos geliefert, und es gibt keine Belastung rückgängig zu machen, weil nie eine erfolgt ist.
Welche Zahlungsmethoden verursachen bei Google Play einen ausstehenden Kauf?
Zahlungsmethoden, die außerhalb des regulären Ablaufs abgewickelt werden. Barzahlungen in einem Ladengeschäft, Banküberweisungen und einige Abrechnungen über die Telefonrechnung erfordern zusätzliche Schritte zwischen dem Tippen und der Belastung, daher gibt Google den Kauf im Status PENDING statt PURCHASED zurück. Bei einer Barzahlung erhält der Kunde einen Code per Benachrichtigung und E-Mail und zahlt dann in einem teilnehmenden Geschäft.
Was ist Ask to Buy, und wie hängt es mit ausstehenden Käufen zusammen?
Ask to Buy ist Apples Family Sharing-Funktion, mit der ein Kind einen Kauf anfragen kann, den ein Familienorganisator genehmigen muss. Solange die Anfrage wartet, befindet sich der Kauf in Apples ausstehendem Status, zurückgegeben als Product.PurchaseResult.pending in StoreKit 2 oder als aufgeschobene Transaktion im älteren StoreKit. Die abgeschlossene Transaktion trifft nur über Transaction.updates ein, falls und wann der Organisator sie genehmigt.
Was passiert, wenn ein ausstehender Kauf nie bezahlt wird?
Die Bestellung wird storniert und es wechselt kein Geld den Besitzer. Bei Google Play erhalten Sie eine ONE_TIME_PRODUCT_CANCELED-Benachrichtigung, Typ 2, für ein Einmalprodukt oder SUBSCRIPTION_PENDING_PURCHASE_CANCELED, Typ 20, für ein Abonnement. Bei Apple wird die aufgeschobene Transaktion einfach nie zu einer abgeschlossenen Transaktion. Wenn Sie bereits Zugriff gewährt hatten, ist das der Moment, in dem der Verlust real wird.
Ist ein ausstehender Kauf dasselbe wie eine Rückerstattung?
Nein. Eine Rückerstattung macht eine Zahlung rückgängig, die tatsächlich eingezogen wurde. Ein ausstehender Kauf, der platzt, wurde nie belastet, also gibt es nichts rückgängig zu machen und nichts taucht in einem Rückerstattungsbericht auf. Wenn Sie ihn zu früh freigeschaltet haben, sind die Kosten die Rechenleistung, API-Aufrufe, der Speicher oder der Verbrauchsartikel, die Sie für eine Bestellung ausgegeben haben, die keinen Umsatz erzeugt hat.

Quellen und weiterführende Informationen

RefundHalt

Der Rückerstattungs-Autopilot für App Store und Google Play

Weiterlesen

Die nächste Rückerstattungsanfrage ist bereits unterwegs.

Richten Sie RefundHalt in der Zeit ein, die Sie brauchen, um eine weitere Support-E-Mail über eine Rückerstattung zu lesen, die Sie nicht anfechten konnten.