2012-12-18 10 views
6

アイデアは、雨が降っていても、濡れているか、晴れていても、すべての費用を支払う必要があります。アップルからアプリ内購買取引の復元

 
Store Kit provides built-in functionality to restore transactions for non-consumable products, auto-renewable subscriptions and free subscriptions 

これらの取引のためにApple Storeのキットは、優れたビルドツールを持っています。私は他のタイプ(特に消耗品)に焦点を当てたい。 唯一の取引情報は、購入が成功した後にStore Kitが受け取った識別子とレシートデータです。 私たちのアプリケーションはサーバーサイドモデルを使用して製品を配信します。しかし、ユーザーがApp Store経由で購入している間にサーバーが横たわっているなど、購入データを失うケースはまだ多いので、サーバーに領収書を送信して検証プロセスを完了することはできません。

現在の回避策は次のとおりです。

  1. Serverは
  2. ユーザーがいずれかを選択し、製品識別子のリストを返します。 appは、その識別子をデバイスに保存します(SQLiteまたはCore Dataを介して)。 Standart Apple Storeのトランザクション処理は、その直後に行われます。
  3. 成功した場合は、領収書データをデバイス上の識別子とともに保存し、サーバーに送信します。障害または取り消しがあった場合、識別子は即座に装置から除去される。
  4. サーバの応答がOKの場合、アプリはデバイスから受信データを含む識別子を削除します。それ以外の場合、正常な応答が動作するまで定期的にサーバーに要求を送信します。

しかし、このアプローチにはまだ漏れがあります。例えば、ユーザは、サーバへのトランザクションの配信を待たずにデバイスからアプリケーションを削除することができるので、購入に関する何らの証拠もない。

あなたの提案はありますか?

答えて

3

基本的なルールは、コンテンツを正常に配信するまで支払いキューでfinishTransaction:を呼び出さないことです。つまり、検証サーバーとコンテンツサーバーにリクエストを行い、有効な応答が返されます。これらの適切な応答の後でのみ、finishTransaction:を呼び出します。悪い購買領収書が有効でないことに注意してください。あなたは商品を盗み取ろうとする人々を得るでしょう - それ以上の睡眠を失うことはありませんが、適切な領収書のチェックを入れてください。

私が理解しているように(私の非消耗品から)、あなたがfinishTransactionを呼び出さない限り、ストアはあなたのアプリのインストール時にそれを再試行します。そのため、デバイスに領収書を保存する必要はないと思います。ただし、消耗品の場合、後で復元できるようにするには、サーバーがデータを保管する必要があります。重要ではない問題は、それを保存するための鍵です。

ご参考までに、あなたの最初の行は絶対に正しいですし、睡眠を失う価値があります。

+0

「購入した領収書は有効ではありません」とはどういう意味ですか? – Danik

+0

私はちょうどあなたがまだfinishTransaction:領収書が悪いが、あなたは製品を提供していないと言うつもりだった。また、サーバーに何かを記録し、ユーザーに通知する必要があります。領収書の検証に問題があることを確かめるまで、私は実際に製品を提供して、可能な限り製品を提供していました。私はそれがAmazonやAppleやGoogleではうまくいかないと思う。 Amazonでは、少なくとも自分のバグから私を救った。 – DrC

+0

とにかく、上記の鍵をリストに保存して、コンテンツのripoffを防ぐ必要があります。応答が受信されず、ユーザーが端末をオフにしているとします。アプリが起動すると、Store Kitはリクエストを再度送信しますが、アプリはその時間のトランザクションに関する情報を持っていません。鍵とその識別子でトランザクションを識別し、それをサーバに送信することができます。サーバーの検証が完了すると、アプリケーションはfinishTransaction:を呼び出します。 改ざんが検出された場合、サーバーはアプリにこのトランザクションの要求を停止するよう通知することができます。また、要求を制限することは、サスペンドされたトランザクションによるサーバーの負荷を防ぐために有効です。 – Lion

関連する問題