アプリ内課金のAndroidドキュメントは、次の点でかなり明確になっているようです。保留中のインテントでチェックアウトを表示した後REQUEST_PURCHASE
(問題ありません)、ユーザーはチェックアウトを操作して購入ボタンを押します(この場合は静的な製品IDを使用していますandroid.test.purchased
)。
これで、私の放送受信機はを受信し、次にを受信RESPONSE_CODE
するはずですIN_APP_NOTIFY
。まあそれは起こっていません。最初に応答を受け取ることもありますが、通知の後に応答を受け取ることがよくあります。
以下に引用されているAndroidDocセクションの2番目に強調されているセクションは、これが問題である理由です。購入リクエストへの非同期応答を受け取ったときにアプリのステータスを保留に更新すると、ドキュメントに示されているように見えますが、通知の後にその応答が来ると、アプリは保留状態になります。「即時同期応答からresult_okを受け取ったとき」と表示されるはずですか?
それはGoolePlayのバグですか(私の電話のGoogle Playバージョンは3.5.15で、Android OSバージョンは2.2です)?ドキュメントを誤解していますか?ドキュメントはまったく間違っていますか?静的テスト製品の問題ですか?他に何か問題が発生している可能性がありますか?私の側では、すべてがUIスレッドで実行されているため、スレッドの問題ではないことに注意してください。
動作していない典型的な実行からのログ出力は、ボタンに表示されます。
Androidドキュメントの関連セクション(私の強調):
ブロードキャストインテントの処理
REQUEST_PURCHASE要求は、2つの非同期応答(ブロードキャストインテント)もトリガーします。まず、Google PlayアプリケーションはRESPONSE_CODEブロードキャストインテントを送信します。これは、リクエストに関するエラー情報を提供します。リクエストでエラーが発生しない場合、RESPONSE_CODEブロードキャストインテントはRESULT_OKを返します。これは、リクエストが正常に送信されたことを示します。(明確にするために、RESULT_OK応答は、要求された購入が成功したことを示すものではなく、要求がGoogle Playに正常に送信されたことを示します。)
次に、リクエストされたトランザクションの状態が変化すると(たとえば、購入がクレジットカードに正常に請求された場合、またはユーザーが購入をキャンセルした場合)、GooglePlayアプリケーションはIN_APP_NOTIFYブロードキャストインテントを送信します。このメッセージには通知IDが含まれており、これを使用してREQUEST_PURCHASE要求のトランザクションの詳細を取得できます。
注:Google Playアプリケーションは、払い戻しのためにIN_APP_NOTIFYも送信します。詳細については、IN_APP_NOTIFYメッセージの処理を参照してください。
購入プロセスは瞬時ではなく、数秒(またはそれ以上)かかる可能性があるため、RESULT_OKメッセージを受信してからトランザクションのIN_APP_NOTIFYメッセージを受信するまで、購入要求は保留中であると想定する必要があります。トランザクションが保留中の間、GooglePlayのチェックアウトUIに「購入を承認しています...」という通知が表示されます。ただし、この通知は60秒後に閉じられるため、トランザクションステータスをユーザーに伝える主要な手段としてこの通知に依存しないでください。代わりに、次のことを行うことをお勧めします。
期待どおりに進まないことのログからの例:
MAKING REQUEST: PurchaseRequest
EXECUTING REQUEST: PurchaseRequest
IMEDIATE RESPONSE IN: PurchaseRequest, IS RESULT_OK
REQUEST ID: 1814990809059790249, PurchaseRequest
Receiver: Notify
Notify String in IN_APP_NOTIFY intent: android.test.purchased
PROCESSING NOTIFICATION
MAKING REQUEST: PurchaseInformationRequest
EXECUTING REQUEST: PurchaseInformationRequest
IMEDIATE RESPONSE IN: PurchaseInformationRequest, IS RESULT_OK
REQUEST ID: 602248989635492868, PurchaseInformationRequest
Receiver: purchase state changed
PROCESSING PURCHASE_STATE_CHANGE
newestMarketPurchaseState = PURCHASED
SetState on product 'Enterprise'. Message: PURCHASED
MAKING REQUEST: ConfirmNotificationsRequest
EXECUTING REQUEST: ConfirmNotificationsRequest
IMEDIATE RESPONSE IN: ConfirmNotificationsRequest, IS RESULT_OK
REQUEST ID: 693394902887436727, ConfirmNotificationsRequest
Receiver: Response Code = RESULT_OK
Receiver: Response Code requestId = 602248989635492868
PROCESSING RESPONSE
ASYNCH RESPONSE IN: PurchaseInformationRequest, IS RESULT_OK
Receiver: Response Code = RESULT_OK
Receiver: Response Code requestId = 1814990809059790249
PROCESSING RESPONSE
ASYNCH RESPONSE IN: PurchaseRequest, IS RESULT_OK
SetState on product 'Enterprise'. Message: PURCHASE PENDING
Receiver: Response Code = RESULT_OK
Receiver: Response Code requestId = 693394902887436727
PROCESSING RESPONSE
ASYNCH RESPONSE IN: ConfirmNotificationsRequest, IS RESULT_OK
Confirm Notifications Request returned asynch OK