2016-08-16 6 views
26

Ich habe ein Problem mit meiner Android App. Ich versuche ein monatliches Abonnement zu implementieren. Ich habe das IAP erstellt, die App ist in der Beta und ich bin als Tester registriert.Android In App-Abonnement gibt immer den ersten Empfang zurück, ich bekomme nie die Erneuerung

Beim Kauf des Abonnements funktioniert alles wie erwartet. Ich kann es als Tester kaufen, was bedeutet, dass das Abonnement nicht wirklich belastet wird, und es wird jeden Tag erneuert.

Aber hier ist, wo mein Problem beginnt. Ich bekomme immer den Originalbeleg mit dem Original purchaseTime und purchaseToken. Wann immer die App startet, rufe ich queryInventoryAsync an und erwarte, dass ich den letzten Erneuerungsbeleg bekomme. Aber ich bekomme immer den ORIGINAL-Beleg.

Ist mein Denken falsch? Sollte ich nicht den neuen Beleg bekommen, mit dem neuen orderID? (Wie Google Docs sagen, ich sollte eine orderID wie GPA.blabla..0|1|2 bekommen. Ich weiß, es gibt einige Caching-Mechanismen, aber ich habe drei Tage gewartet, und ich bekomme immer noch die ursprüngliche Reihenfolge, während ich die neueste erhalten sollte.

Ich benutze immer cordova mit crosswalk, und ich benutze das folgende Plugin für Käufe: https://github.com/j3k0/cordova-plugin-purchase.Ich weiß nicht, ob es wichtig ist, sollte es nicht, da es die gleiche IABHelper-Klasse von jedem anderen Plugin verwendet, aber vielleicht ist es etwas falsch mit ihrem Code?

ich loggte die genaue Antwort von dem Anruf zu mService.getPurchases(3, mContext.getPackageName(), itemType, continueToken); und es enthält die falschen Daten (Originalrechnung). Warum? :(

Hat jemand anderes ein ähnliches Problem? Liegt es daran, das Abonnement zu testen? Wird es funktionieren, wenn Sie tatsächlich kaufen? Ich habe bereits mit echtem Geld getestet, aber es wird noch eine Woche dauern, bis das Abonnement erneuert wird.

Vielen Dank.

Bearbeiten: Löschen des Cache von Google Play Store App ist keine Option. Ich kann meine Benutzer nicht darum bitten. Außerdem habe ich das getestet und es funktioniert nicht!

Bearbeiten 2 Produktion Abonnement (echtes Geld, keine Tests) funktioniert auch nicht !. Immer noch den Originalbeleg erhalten!

Edit 3 Ich habe dieses Problem noch nicht gelöst. Was wäre der richtige Weg, um die Erneuerungen zu erkennen? Sollte ich einfach einen Cronjob auf dem Backend ausführen und jedes Abonnement gegen Google's Purchase Status API abfragen?

Bearbeiten 4 Vielen Dank für die Antworten. Ich verwende bereits die Kaufstatus-API im Backend, um festzustellen, ob das Abonnement erneuert wurde oder nicht. Aber es ist irgendwie scheiße, was passiert, wenn ich 100.000 Abonnements bekomme? Das Skript, das durch alle von ihnen geht und die API von Google abfragt, wird eine sehr lange Zeit brauchen ... und das Skript sollte wahrscheinlich täglich laufen!

Aber lassen Sie die Dinge klären.

Bedeutet dies, dass die offizielle Dokumentation veraltet ist?.

Sind die GPA.blabla..0 GPA.blabla..1 Stil Erneuerungen tot?

bearbeiten 5. Dezember 2016 aktualisieren: Ich habe Abonnements in der Produktion für ein paar Monate laufen jetzt, und ich immer noch nicht Erneuerungen mit ..0, ..1. Ich habe einen Cronjob eingerichtet, der täglich läuft. Es durchläuft meine aktiven Abonnements und fragt sie gegen die Google Purchase API ab. Wenn die API ein anderes Ablaufdatum zurückgibt als das in meiner Datenbank gespeicherte, bedeutet dies, dass das Abonnement erneuert wurde.

bearbeiten 6. Juli 2017 aktualisieren ich auf meinem täglichen Skript noch verlassen, die alle Abonnements analysiert und aktualisiert den Status von Google Abfrage der Käufe API https://developers.google.com/android-publisher/api-ref/purchases/subscriptions verwenden. Es hat bisher sehr gut funktioniert.

Kurzer Tipp: Abonnements in Batches abfragen! Ich habe einige Tests durchgeführt und konnte in derselben Anfrage bis zu 1.000 Abonnements bündeln. Das Limit wird durch die maximale Antwortgröße der API festgelegt.

+0

Können Sie versuchen, Google Play App-Cache aus den Geräteeinstellungen> Anwendungen zu löschen und dann zu testen? – random

+1

Vielen Dank für Ihre Antwort, aber ich kann meine Benutzer nicht darum bitten. Ich habe es selbst getestet, ohne Ergebnisse. – tehmaestro

+0

Rufen Sie 'getStringArrayList (" INAPP_PURCHASE_DATA_LIST ")' auf das Ergebnis von 'getPurchases'? Gibt es nur ein einzelnes Element im Array? –

Antwort

0

Die Originalquittung von Google Play wird verwendet, um die Google Play-API für Abonnementinformationen abzufragen. Apples IAP funktioniert sehr ähnlich. Für diese In-App-Kauf-Mechanismen verwenden Sie die Abonnement-ID aus der Quittung, um die Google/Apple-API abzufragen, um die Gültigkeit des Abonnements zu bestimmen.

Diese In-App-Kaufmechanismen funktionieren aufgrund von Betrugsprävention wie folgt und Benutzer können Abonnementinformationen ohne die Einbeziehung Ihrer App ändern.

Dies ist die API Sie interessieren sollte:

GET /{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token} 
     Checks whether a user's subscription purchase is valid and returns its expiry time. 

Der allgemeine Ablauf für In-App-Kauf Validierung ist:

für
  • Validate Empfang mit Google/Apple-
  • Abfrage Kauf von Daten von Google/Apple basierend auf der Abonnement-ID

Sie sho Sie sollten nicht den Daten vertrauen, die in einer Quittung auf dem Gerät zurückgegeben werden, sondern nur die Daten, die von einer Apple/Google Remote-API zurückgegeben werden.

Ein andere Stackoverflow Diskussion zu diesem Thema: Android : inApp purchase receipt validation google play

0

Sie Kauf Token anfänglichen payment.From erhalten, die kauft Token Sie Google Play-API fro Abonnement Token abzufragen haben als Abonnement in App-Kauf wird automatisch immer renewed.So Das Anfordern der Google Play-API ist die einzige Möglichkeit, den Status "Abonnement" in der App zu erhalten.

Verwandte Themen