Est-ce que Google Play In-App Billing Version 3 prend en charge les remboursements?
J'ai fait fonctionner IAB v3 et j'ai pu faire un achat pour un article géré. Cependant, pour continuer à développer et tester je voulais rembourser l'achat pour que je puisse essayer de faire le même achat à nouveau. Je me suis connecté à mon compte Google Checkout Merchant et j'ai remboursé avec succès l'achat. Cependant, l'application continue à penser que l'utilisateur a l'article acheté. Cela fait déjà plusieurs semaines que j'ai fait le remboursement donc ce n'est pas un problème de retard.
Fondamentalement, dans mon QueryInventoryFinishedListener
implémentation, inventory.hasPurchase(SKU_REMOVE_ADS)
retourne toujours vrai, même après le remboursement ( SKU_REMOVE_ADS
est le SKU pour l'article que je vends). Je m'attendais à retourner false après le remboursement a été traitée.
si vous regardez la section " gestion des remboursements "de la référence IAB , il est indiqué que votre application doit être à l'écoute des messages IN_APP_NOTIFY. Toutefois, la documentation pour IN_APP_NOTIFY est spécifique à v2 de facturation In-app. Il ne semble pas que ce soit quelque chose qui soit disponible en v3 puisque ce n'est mentionné nulle part dans la référence v3 et je ne peux pas trouver de référence pour cela dans le exemple D'application TrivialDrive qu'ils utilisent pour démontrer la v3 D'IAB.
est-ce que v3 de L'IAB soutient les remboursements/annulations d'achats? Est-ce quelqu'un l'a essayé et il a obtenu de travail?
3 réponses
il n'y a vraiment aucune différence entre un article consommable et un article non consommable en ce qui concerne Google Play; cette distinction est entièrement basée sur ce que vous implémentez dans votre application. Donc, même si le SKU que vous testez est conçu pour être non consommable (par exemple, une mise à niveau permanente premium), à des fins de test, vous pouvez le traiter comme un consommable et le consommer, de sorte qu'il peut être acheté à nouveau.
une approche commode est de mettre en place un tester le menu dans votre application (par exemple, en ajoutant un élément de menu pendant les tests sur le menu des options principales de votre application), et ensuite faire en sorte que le gestionnaire de cet élément invoque la méthode consumeAsync () de votre instance iabhelper pour le SKU que vous voulez tester à nouveau. Cela consommera l'article et ainsi le rendre immédiatement disponible pour rachat à partir de votre appareil.
vous aurez, bien sûr, toujours envie de rembourser l'achat à partir de Google Checkout, de sorte que vous ne serez pas dépenser votre propre de l'argent pour tester votre application.
j'ajouterais que consumeAsync() semble aussi fonctionner très bien pour la réinitialisation du test SKU android.test.acheté, si vous testez en utilisant de telles valeurs statiques.
en ce qui concerne la mise à jour de l'état d'achat pour refléter un remboursement, j'ai personnellement éprouvé (et il ya beaucoup de rapports similaires affichés par d'autres développeurs) qui lancer manuellement un remboursement via la caisse (par exemple, pour un achat test à partir de L'application TrivialDrive) il faut jours pour changer l'état d'achat du produit (INAPP_PURCHASE_STATE_REFUNDED).
(Sachant que la misère aime la compagnie, certains de ces rapports supplémentaires peuvent être trouvés sur ce fil de discussion: https://plus.google.com / +AndroidDevelopers/posts/R8DKwZDsz5m )
au moins une partie de cela est due à la mise en cache par Google Play des données d'achat sur l'appareil.
d'après mon expérience, redémarrer un appareil peut parfois amener Google Play à rafraîchir son cache à partir des serveurs GP. Ainsi, il se peut que les changements dus à l'annulation ou au remboursement d'une commande via la caisse puissent également être détectés après un redémarrage.
il pourrait sembler qu'un délai d'exécution aussi long ne vous servirait à rien, puisque vous ne pouvez pas savoir quand les utilisateurs vont redémarrer. Mais encore une fois, vous savez que chaque appareil, finalement, obtenir redémarré, et donc, si votre préoccupation est qu'un utilisateur qui reçoit un remboursement devrait éventuellement être empêché d'utiliser le produit IAB remboursé, quelques jours de retard peut ne pas compter beaucoup, tant que cela se produit éventuellement.
bien sûr, rappelez-vous que cette notion que cache va rafraîchir lors d'un redémarrage est non documentée et anecdotique (comme un certain nombre de comportements Iab3 et TrivialDrive, jusqu'à présent). Folklore, ils appellent ça.
une autre chose qui déclenche une mise à jour est quand l'utilisateur tente de acheter le produit. Dès que L'achat est lancé, le système doit être sûr que le produit n'est pas déjà propriétaire, et il met donc à jour la cache Google Play. Dans mon expérience personnelle, cela a toujours été le cas. Mais encore une fois, ce n'est pas une façon très pratique de vérifier un remboursement, parce que cela impliquerait d'afficher le dialogue d'achat non autorisé, et aussi un message d'erreur qui dit à l'utilisateur "vous possédez déjà ceci," (si ils do posséder).
Où ce ne venir dans maniable, c'est quand l'utilisateur paie pour un IAB article sur l'un de ses appareils, puis tente d'accéder à l'élément sur un autre périphérique qui est détenue par le même compte que celui utilisé pour l'acheter. Les informations d'achat dans ce cas n'ont très souvent pas encore été mises en cache. Mais vous pouvez juste mettre une petite note dans votre dialogue d'achat que si l'article a déjà été acheté, en essayant un ré-achat devrait le rendre disponible sur le présent appareil sans frais supplémentaires. Parfois, il faut deux tentatives d'achat (initiées par l'utilisateur) pour finalement obtenir le Helper IAB.BILLING_RESPONSE_RESULT_ITEM_ALREADY_OWNED réponse. Oui, un peu klugy, mais je pense qu'en termes humains cela fonctionnera avec une mise en évidence appropriée du message et une formulation apologétique de la boîte de dialogue de confirmation leur disant qu'ils possèdent l'article, etc. : -)).
comme une question pratique, vous pouvez voir comment Google pourrait ne pas vouloir chaque instance de chaque application IAB dans le monde d'accéder à ses serveurs chaque les données d'achat de l'application est consulté, surtout étant donné qu'ils conseillent aux développeurs de faire une vérification de ce qui a été acheté chaque fois que l'application est lancée. C'est aussi un problème de performance pour votre application - c'est ce que cache est tout au sujet. Vous devez donc être conscient des déclencheurs de mise à jour du cache, et je n'ai trouvé aucun endroit où cela soit officiellement documenté (sauf, nous présumons, dans le code). Donc obtenir prêt à mettre vos mains en face de vous et commencer à se sentir autour dans l'obscurité.
pour plus d'informations sur la mise en tampon de Google Play, voir la page:
je voudrais noter que dans le code de votre poste snippet vous appelez inventaire.hasPurchase (SKU_REMOVE_ADS), mais cela ne dira vous si l'achat figure dans la liste des achats retournés dans l'article d'inventaire; il ne vous indiquera pas le état de l'achat pour cette UGS. Je sais que C'est l'approche utilisée par L'application TrivialDrive, mais cette application ne traite pas des remboursements et des annulations. Pour détecter les remboursements et les commandes annulées, vous aurez besoin de quelque chose comme ceci:
Purchase removeAdsPurchase = inventory.getPurchase(SKU_REMOVE_ADS);
if(removeAdsPurchase != null) {
int purchaseStateForRemoveAds = removeAdsPurchase.getPurchaseState();
if(purchaseStateForRemoveAds == 1) {
//Do cancelled purchase stuff here
}
else if(purchaseStateForRemoveAds == 2) {
//Do refunded purchase stuff here
}
}
la bonne nouvelle sur les remboursements et les commandes annulées est que tous les deux sont, AFAIK, entièrement à la choix du développeur. Donc, si vous trouvez que les utilisateurs qui obtiennent ces sont en mesure de continuer à utiliser votre application pendant un long intervalle par la suite, et si vous trouvez que beaucoup d'utilisateurs en profitent, alors vous pouvez décider si vous voulez continuer à fournir les remboursements dans tous les cas. Ma meilleure supposition est que ce ne sera pas un problème; même si un utilisateur qui obtient un remboursement obtient d'utiliser votre application pendant un certain temps après cela, cela ne semble pas être une très grosse affaire.
C'est pour tester que vous ayez besoin de la capacité de ré-essayer un achat très rapidement, et utiliser consumeAsync() fonctionne certainement dans ce but.
je vous suggérerai d'utiliser des identifiants produits statiques pendant que votre application est en phase de développement.
maintenant assurez-vous que vous testez l'application avec le même ID Gmail pour lequel vous avez remboursement? Pour tester le scénario de remboursement je pense que vous pouvez utiliser android.test.refunded
comme identification du produit.
si cela ne fonctionne pas, vous pouvez d'abord vérifier total des articles achetés et article(s) disponible (s) dans google play à la première sortie de votre app et si vous obtenez le même id de produit dans les deux appels (ce qui ne devrait pas être le cas si c'est le cas, veuillez signaler ce bug à google), puis faire appel à l'api pour faire le même article que consommé.
depuis l'affichage de cette question, il a été porté à mon attention que je dois appeler getPurchase(...).getPurchaseState()
et de vérifier sa valeur. Les valeurs possibles sont 0 (acheté), 1 (annulé), ou 2 (remboursé).
cependant, dans mon cas, son retuning 0 (purhcased) même si l'article est remboursé. Je poste cette information au cas où ça aiderait quelqu'un d'autre.