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()を使用することがその目的のためにはっきりと機能することをテストするためです。
購入国が払い戻されなかった理由の元の謎を解決しませんが、テストと開発を続けることができます。私はこの答えを受け入れるつもりです。 – Alinium
ありがとうございます。上記の回答を更新して、払い戻しのプロセスやその他のいくつかのことを発見できました。 – Carl
編集していただきありがとうございます。明らかに3人の批評家があなたの編集を承認し、1人がそれを拒否したので、私は自分自身を回答の著者として承認し、この編集が私の投稿を荒らし、私がSO検定に失敗したために馬鹿だと言われましたあなたが注意を払っているかどうかを確認してください。私はSOが完璧だとは思わない!とにかく、何とか私はページ上であなたの編集を見ているので、うまく終わります(私はSOのダンジョンに石炭と鋭い爪を含む行動矯正のためにドラッグされています)。 – Carl