3

Apples IAP と StoreKit フレームワークを使用してサブスクリプションを購入するクライアント/サーバー アプリケーションに取り組んでいます。

私たちが望むのは、クライアント (iPhone または iPad) が StoreKit フレームワークを使用して iTunes アカウントを介して Apple で最初のサブスクリプションを購入し、レシートをサーバーに渡すことです。サーバーはレシートを検証し、ユーザー アカウントのステータスを更新します。また、サーバーがサブスクリプションのステータスの管理 (自動更新、キャンセルなどのチェック) を担当することも望んでいます。これはすべて、現在廃止されている iOS 6 スタイルのトランザクション レシートではなく、iOS 7 スタイルの appleReceipts を使用しています。

Apple のドキュメントでは、次の URL に POST して、サンドボックス内のレシートとシークレット コードを検証するように指示されています。

https://sandbox.itunes.apple.com/verifyReceipt

この時点まで..すべてが正常に機能します。

私が混乱するのは、応答です。Apple のドキュメントによると、応答には最大 4 つのフィールドが必要です。iOS 7 スタイルのアプリの領収書を検証している場合は、最初の 2 つだけを期待する必要があります。iOS 6 スタイルのサブスクリプション トランザクションの領収書である場合は、4 つすべてを見る必要があります。

1) ステータス (有効な場合は 0、それ以外の場合は何らかのエラー コード)

2) レシート (送信されたレシートの JSON 表現)

3) latest_receipt (自動更新サブスクリプションの iOS 6 スタイルのトランザクション領収書に対してのみ返されます。最新の更新の base-64 でエンコードされたトランザクション領収書。)

4) latest_receipt_info (JSON形式で上記と同じ)

問題 1: iOS 7 スタイルのアプリ レシートを検証しているにもかかわらず、4 つすべてが表示されます。ドキュメントは、それが起こってはならないと言います。

https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html#//apple_ref/doc/uid/TP40010573-CH104-SW1

問題 2: 最初の購入後にクライアントが渡した元のアプリの領収書を使用してこの API をポーリングすることにより、サーバーがユーザーのサブスクリプション ステータスを維持できるようにしたいと考えています。このlatest_receipt_infoフィールドには継続的に更新されたトランザクションのリストが含まれているように見えますが、receiptフィールドは元のコピーであり、更新されたトランザクション情報はありません。

私の質問: サーバーが更新されたトランザクションに関する情報を取得できる唯一の方法は、latest_receipt_infoまたはlatest_receiptフィールドを見ることですが、ドキュメントによると、これらのフィールドは応答に存在することは想定されていないようです。

これは Apple のドキュメントの誤りですか? または、トランザクションの最新のセットを取得する唯一の方法は、クライアントから通知を受けたときに更新された AppReceipts をクライアントに送信させることSKPayementTransactionObserverですか?

編集-以下のコメントに従って、実行した手順といくつかのコードを追加します。

1) SKPaymentQueue を使用して autoRenewSubscription 製品を購入する:

 SKMutablePayment *payment = [SKMutablePayment paymentWithProduct:product];
    payment.applicationUsername = [self hashedValueForAccountName:[UserAccount sharedInstance].subscriberKey];
    [[SKPaymentQueue defaultQueue] addPayment:payment];

2) 支払いが完了すると、SKPaymentTransactionObserver からコールバックがあり、次の URL にファイルを送信します。

NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];

私のリモートサーバーに。

3) 次の python コードを使用して領収書を検証しています

import itunesiap
import base64

file = "/path/to/receipt/sandboxReceipt"
f = open(file)
encoded = base64.b64encode(f.read())

with itunesiap.env.current().clone(use_sandbox=True):  # additional change for current environment.
    response = itunesiap.verify(encoded,"mysecretkey")

応答には辞書が含まれています。ディクショナリには次のフィールドがあります

"latest_receipt" = base64 encoded receipt here
"latest_receipt_info" = a JSON representation of the latest receipt
"receipt" = a JSON representation fo the receipt I sent for verification

ドキュメントによると、最初の2つのフィールドは

「自動更新サブスクリプションの iOS 6 スタイルのトランザクション レシートに対してのみ返されます。」

  1. iOS 7 スタイルのアプリの領収書を検証していたのに、なぜここに表示されるのですか?
  2. これらのフィールドが存在しない場合、最新の取引情報を取得するにはどうすればよいですか?
4

2 に答える 2

5

Apple のドキュメントの文言はあいまいです。自動更新サブスクリプションの iOS 6 スタイルのトランザクション レシートに対してのみ返されます。これは、iOS 7 の領収書を使用する場合はフィールドが常に存在することを意味しますがappStoreReceiptURL、自動更新サブスクリプション用の非推奨のトランザクション スタイルの領収書にのみ存在します。つまり、購入がサブスクリプションではない場合、iOS 6 トランザクションの領収書には表示されません。

于 2016-03-10T09:35:08.980 に答える