3

アプリ内課金の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
4

1 に答える 1

3

私もこれとまったく同じ問題に遭遇しました。質問の回答によると、Android ブロードキャストは順番に受信されますか? 、インテントが送信された順序で受信されるという絶対的な保証はありません。通常はそうしますが、必ずしもそうとは限りません。そのため、Google Play が正しく注文したとしても、別の順序で到着する可能性があります。

私の意見では、唯一の解決策は、RESPONSE_CODE が到着する時間について何も想定しないことです。この点で、Android のドキュメントは私には明らかに間違っているように思えます。応答コードは、おそらくブロードキャストとしてではなく、コールバックを介して実装されているはずです。私は、Google が時々かなり不注意になることを認めなければなりません。

于 2012-04-07T17:06:43.590 に答える