21

IAB v3が動作し、管理対象アイテムの購入ができました。しかし、開発とテストを続けるために、私は購入を払い戻したいので、同じ購入をもう一度やり直すことができました。 Google Checkout販売アカウントにログインして、購入を払い戻しました。しかし、アプリはまだユーザーが購入したアイテムを持っていると考えています。私は払い戻しを遅れの問題ではなくしてから数週間を要しています。Google Playアプリ内課金バージョン3は払い戻しをサポートしていますか?

基本的に、私のQueryInventoryFinishedListenerの実装では、払い戻し(SKU_REMOVE_ADSが販売中の商品のSKU)でも、常にinventory.hasPurchase(SKU_REMOVE_ADS)がtrueを返します。私は払い戻しが処理された後に偽に戻ることを期待していました。

'Handling Refunds' section of the IAB referenceを見ると、アプリがIN_APP_NOTIFYメッセージをリッスンする必要があると表示されます。ただし、documentation for IN_APP_NOTIFYはアプリ内課金のv2に固有のものです。それは、v3のリファレンスのどこにも言及されていないので、v3で利用可能なものではないようであり、また、sample TrivialDrive appでIAB v3のデモンストレーションに参照を見つけることはできません。

IABのv3では、払い戻しやキャンセルをサポートしていますか?誰もそれを試して、それを働かせたのですか?

答えて

32

Google Playに関する限り、消耗品と消耗品の違いはありません。この区別は、アプリ内で実装するものに完全に基づいています。したがって、テストしているSKUがテスト目的で非消耗品(例:永続的なプレミアムアップグレード)であっても、消耗品として扱い、消費することができるため、再度購入することができます。

便利なアプローチは、アプリケーション内に一時的なテストメニューを設定することです(たとえば、テスト中にアプリケーションのメインオプションメニューにメニュー項目を追加してから)、その項目のハンドラにconsumeAsyncもう一度購入をテストするSKUのIabHelperインスタンス。これによりアイテムが消費され、すぐにデバイスからの再購入が可能になります。

Google Checkoutからの購入を払い戻したいので、あなたのアプリをテストするために自分のお金を費やすことはありません。

このような静的な値を使用してテストしている場合、consumeAsync()はテストSKUをリセットするためにはうまくいくようです。アンドロイド.test.purchasedを追加します。

払い戻しを反映するための購入状態の更新に関して、私は個人的に経験したことがあります(他の開発者が投稿した類似のレポートが多数あります)、手動で払い戻しを開始した場合(TrivialDriveアプリからのテスト購入の場合) となり、製品の購入状態が(INAPP_PURCHASE_STATE_REFUNDEDに)変更されます。(不幸は、これらの追加レポートのいくつかは、このディスカッションスレッドで見つけることができ、会社を愛していることを知っ: https://plus.google.com/+AndroidDevelopers/posts/R8DKwZDsz5m

本の少なくとも一部は、デバイス上の購入データのGoogle Playでのキャッシングによるものです。

私の経験では、デバイスを再起動すると、Google PlayがGPサーバーからキャッシュを更新することがあります。したがって、Checkoutによる注文の取り消しまたは払い戻しによる変更は、再起動後に検出される可能性があります。

ユーザーがいつ再起動するかわからないので、このような長いターンアラウンド期間が悪いと思われるかもしれません。しかし、再び、すべてのデバイスが最終的に再起動されることを知っているので、払い戻しを受け取ったユーザーが最終的に払い戻されたIAB製品の使用をブロックされることが懸念される場合は、最終的に起こる限り。

もちろん、再起動時にキャッシュがリフレッシュされるというこの概念は、文書化されておらず、逸話的である(これまでのIAB3やTrivialDriveの動作のように)。フォークロア、彼らはそれを呼ぶ。

更新をトリガーするもう1つの要因は、ユーザーが製品を購入しようとするときです。購入が開始されるとすぐに、システムは商品がまだ所有されていないことを確認し、Google Playキャッシュを更新します。私の個人的な経験では、これは常に発生しています。しかし、これは払い戻しを確認するための非常に現実的な方法ではありません。購入ダイアログを表示しないことと、ユーザーに「あなたは既にこれを所有しています」というエラーメッセージが表示されます(の場合) )。

ここでとなります。ユーザーが自分のデバイスの1つにIABアイテムを支払った後、購入に使用したのと同じアカウントで所有されている別のデバイスでそのアイテムにアクセスしようとするとそれ。その場合の購入情報は、しばしばまだキャッシュされていない。しかし、あなたが購入した商品がすでに購入されている場合は、再購入を試みると、現行のデバイスで追加料金なしで利用できるようにするために、購買ダイアログに小さなメモを記入することができます。場合によっては、IabHelper.BILLING_RESPONSE_RESULT_ITEM_ALREADY_OWNEDレスポンスを最終的に取得するために、2回(ユーザー開始)の購入試行が必要になることがあります。はい、少しklugy、しかし私は人間の言葉では、メッセージの適切な強調表示と、彼らがアイテムなどを所有していることを伝える確認ダイアログの謝罪の言葉遣いで動作すると思います:-)))。

実際には、世界のすべてのIABアプリのすべてのインスタンスが、サーバーのにアクセスするたびに、にアクセスしたくない場合があります。特に、開発者にアドバイスしているアプリを起動するたびに何が購入されたかを確認してください。それはまた、あなたのアプリの性能上の問題です。それが、キャッシングのすべてです。したがって、キャッシュを更新するためのトリガーを認識する必要があります。コードが公式に文書化されている場所は1つもありません(ただし、コード内では推測しません)。だから、あなたの前に手を置いて、暗闇の中で感じ始める準備をしてください。

Googleはこのページを参照してください、バッファリングを再生に関するいくつかの追加情報については

:私はあなたのポストのコードでインベントリを呼び出していることに注意してスニペットう

Under What Conditions are In-App Billing Version 3 Server Changes Made Available on Client Devices?

。hasPurchase(SKU_REMOVE_ADS)、それはインベントリオブジェクトに返された購入のリストに購入が含まれているかどうかだけを示します。そのSKUの購入の状態を教えてくれません。私はこれがTrivialDriveアプリで使用されているアプローチだと知っていますが、そのアプリは払い戻しやキャンセルを扱っていません。払い戻しを検出し、注文をキャンセルするには、あなたがこのようなものが必要です:

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 
    } 
} 

を払い戻しとキャンセルされた注文についての良いニュースは、両方が完全に開発者のオプションで、私の知る限り、ということです。したがって、これらを取得したユーザーがその後も長時間アプリを使用し続けることができ、多くのユーザーがこれを利用しているとわかった場合は、引き続き払い戻しを提供するかどうかを決めることができますすべての場合。私の最高の推測は、それが問題ではないということです。その後、払い戻しを受けたユーザーがしばらくあなたのアプリを使用しても、それは非常に大きな問題のようには見えません。

購入を再試行する能力が必要であり、consumeAsync()を使用することがその目的のためにはっきりと機能することをテストするためです。

+0

購入国が払い戻されなかった理由の元の謎を解決しませんが、テストと開発を続けることができます。私はこの答えを受け入れるつもりです。 – Alinium

+3

ありがとうございます。上記の回答を更新して、払い戻しのプロセスやその他のいくつかのことを発見できました。 – Carl

+1

編集していただきありがとうございます。明らかに3人の批評家があなたの編集を承認し、1人がそれを拒否したので、私は自分自身を回答の著者として承認し、この編集が私の投稿を荒らし、私がSO検定に失敗したために馬鹿だと言われましたあなたが注意を払っているかどうかを確認してください。私はSOが完璧だとは思わない!とにかく、何とか私はページ上であなたの編集を見ているので、うまく終わります(私はSOのダンジョンに石炭と鋭い爪を含む行動矯正のためにドラッグされています)。 – Carl

0

あなたのアプリが開発段階にある間は静的な製品IDを使用することをお勧めします。

払い戻しを行った同じGmail IDでアプリをテストしていることを確認しますか?払い戻しのシナリオをテストするには、android.test.refundedを商品IDとして使用できると思います。

これが機能していないなら、あなたは最初にあなたのアプリケーションの最初の起動時にはGoogle Play内の項目(複数可)と利用可能な項目を(s)を購入し合計を確認することができますし、両方で同じ製品IDを取得している場合コール(これは、この場合は、Googleにこのバグを報告してくださいする必要はありません)し、消費と同じ項目を作るためにAPI呼び出しを行います。

0

この質問を投稿して以来、私はgetPurchase(...).getPurchaseState()に電話してその値を確認する必要があることに私の注意を喚起しました。可能な値は0(購入済み)、1(キャンセル済み)、または2(払い戻し済み)です。

ただし、私の場合、アイテムは払い戻されていてもまだ復帰していません。他の人を助ける場合に備えて、私はこの情報をここに掲載しています。

関連する問題