var appStoreReceiptURL : URL?
class SKReceiptRefreshRequest
重要
verifyReceiptエンドポイントは非推奨になっています。サーバ上でレシートを検証するには、サーバ上でデバイスのレシートを検証する手順に従います。レシートを使わずにサーバ上のアプリ内課金を検証するには、App Store Server APIを呼び出して、Appleが署名したトランザクション情報とカスタマーのサブスクリプション情報を取得するか、アプリが取得したApp
と、Transaction
署名済みデータを検証します。同じ署名済みトランザクション情報とサブスクリプション情報は、App Store Server Notifications V2からも取得できます。
App Storeのレシートは、Apple証明書で署名されたバイナリ形式の暗号化ファイルです。この暗号化ファイルの内容を読み取るには、このファイルをverifyReceiptエンドポイントで処理する必要があります。エンドポイントからの応答には、読み取り可能なJSON形式の本文が含まれます。App Storeとの通信は、RFC 4627で定義されているJSON辞書によって構造化されています。バイナリデータは、RFC 4648で定義されているように、Base64でエンコードされています。安全なサーバを通じて、App Storeでレシートを検証します。App Storeとの安全なネットワーク接続を確立する方法については、「安全でないネットワーク接続の回避」をご参照ください。
警告
アプリからApp StoreサーバのverifyReceiptエンドポイントを呼び出さないでください。接続のどちらの終端も制御することができず、中間者による攻撃を受けやすくなるため、ユーザーのデバイスとApp Storeとの間で信頼できる接続を確立することはできません。
macOS、iOS、iPadOSを実行しているデバイスのプロダクション環境では、アプリのレシートは常に存在します。また、macOSを実行しているデバイスのTestFlightでは、アプリのレシートは常に存在します。Sandbox環境およびXcodeのStoreKitテストでは、テスターが最初にアプリ内課金を利用した後のみ、アプリのレシートが存在します。アプリがSKReceipt
またはrestore
を呼び出した際、アプリに少なくとも1つのアプリ内課金がある場合のみ、アプリのレシートが存在します。
デバイス上のアプリからレシートデータを取得するには、Bundle
のapp
メソッドでアプリのレシートがある場所を特定した後、データをBase64でエンコードします。このBase64エンコードしたデータをサーバに送信します。
サーバ上で、receipt-data
、password
、exclude-old-transactions
の各キーを使ってJSONオブジェクトを作成します。詳しくは、request
をご参照ください。
このJSONオブジェクトを、HTTP POSTリクエストのペイロードとして送信します。Sandboxでアプリをテストする際やアプリの審査中は、テスト環境URL(https://sandbox
)を使います。App Storeでアプリが公開されている場合は、プロダクションURL(https://buy
)を使います。これらのエンドポイントについて詳しくは、verifyReceiptをご参照ください。
重要
ステータスコード21007
が表示される場合は、まずプロダクションURLでレシートを検証してから、SandboxのURLで検証してください。この方法に従うと、アプリのテスト中、App Reviewによる審査中、App Storeでの公開中にURLを切り替える必要がなくなります。
App Storeの応答ペイロードは、response
に詳細が示されるキーと値を含むJSONオブジェクトです。
in
配列に、非消耗型、非更新サブスクリプション、および以前にユーザーが購入した自動更新サブスクリプションのアイテムが含まれます。応答に含まれる値でアプリ内課金のタイプを確認し、必要に応じてトランザクションを検証します。
自動更新サブスクリプションのアイテムでは、応答を解析して、現在有効なサブスクリプションの期間に関する情報を取得します。サブスクリプションのレシートの検証時、latest
には最新のエンコードしたレシートが含まれ、これはリクエストのreceipt-data
と同じ値になります。また、latest
には、サブスクリプションのすべてのトランザクション(初回の購入とその後の更新を含むが、復元は含まない)が含まれます。
これらの値を使って、自動更新サブスクリプションの期限が切れているかどうかを確認できます。これらの値とexpiration
サブスクリプションフィールドを使って、期限切れの理由を取得します。
var appStoreReceiptURL : URL?
class SKReceiptRefreshRequest