10

iOS 購入領収書サーバーの検証は通常、次のように機能します。

  1. iPhoneでのユーザー購入

  2. アプリが購入レシートをサーバーに送信しました

  3. サーバーはレシートを受け取り、Apple に送信して確認します

  4. サーバーは Apple から検証結果を取得します。

  5. サーバーは検証結果をアプリに送信します

しかし、ステップ 1 だけが成功した場合はどうなるでしょうか。たとえば、ステップ 2 でアプリがサーバーにリクエストを送信できない場合や、ステップ 5 でアプリがサーバーから応答を取得できない場合などです。問題は、ユーザーが既に支払いを済ませていることです。この問題を処理する最善の方法は何ですか?

4

1 に答える 1

7

SKPaymentQueueを使用している場合は簡単です。サーバーから成功/失敗の検証結果を取得する「ステップ 5 」まで、トランザクションを SKPaymentQueueに保持するだけです。

ステップ 1 から 5 の間に問題が発生した場合でも、アプリは SKPaymentQueue 内のトランザクションにアクセスでき、「再処理」できます。
未完了のトランザクションの再処理は、アプリの開始時(または任意の時間間隔) に開始される可能性があります。
SKPaymentQueue をチェックして、保留中/未完了のトランザクションを取得し、サーバーに送信します (「ステップ 2」と同様)。サーバーにまだアクセスできない場合は、明らかにステップ 5 に到達しないため、キューからトランザクションを削除しません。この再処理は、次のアプリの起動時 (または次のキュー チェック時間間隔) に毎回何度も発生します。まで_満たされている。

実装

実装も簡単で、SKPaymentTransactionObserverの「トランザクション オブザーバー クラス」が必要です。 アプリの開始時に「トランザクション オブザーバー クラス」のインスタンスを作成し、次の呼び出しによって自身を登録する必要があります。

[[SKPaymentQueue defaultQueue] addTransactionObserver:self]

次に、「トランザクション オブザーバー クラス」はメソッドでトランザクションを取得します。

(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions

このメソッドでは、すべての未完了のトランザクションを処理および再処理できます。

サーバーはべき等である必要があることに注意してください(つまり、既に処理されている場合は繰り返しトランザクションを処理できます) 。サーバーがステップ 2 から 4 を
処理して完了すると、アプリに成功/失敗の結果が表示されます以下を呼び出して、そのトランザクションをキューから削除します。

[[SKPaymentQueue defaultQueue] finishTransaction: transaction]

最後に、この時点で購入したプレミアム機能をユーザーに提供します。

于 2014-04-24T02:10:03.970 に答える