記事

App Storeを使用したレシートの検証

安全なサーバ上で、App Storeを使用してトランザクションを検証します。

概要

App Storeのレシートは、Apple証明書で署名されたバイナリ形式の暗号化ファイルです。この暗号化ファイルの内容を読むには、このファイルをAppleの/verifyReceiptエンドポイントで処理する必要があります。エンドポイントからの応答には、人が読めるJSON形式の本文が含まれます。App Storeとの通信は、RFC 4627で定義されているJSON辞書によって構造化されています。バイナリデータにはRFC 4648で定義されているbase64エンコードを施します。安全なサーバからApp Storeでレシートを検証します。

レシートデータを取得する

レシートデータを取得するには、NSBundle(英語)appStoreReceiptURL(英語)メソッドでアプリケーションのレシートがある場所を特定した後、データをbase64でエンコードします。このbase64エンコードしたデータをサーバに送信します。

// Get receipt if available
	if let appStoreReceiptURL = Bundle.main.appStoreReceiptURL,
    FileManager.default.fileExists(atPath: appStoreReceiptURL.path) {

    do {
        let receiptData = try Data(contentsOf: appStoreReceiptURL, options: .alwaysMapped)
        print(receiptData)

        let receiptString = receiptData.base64EncodedString(options: [])

        // Read ReceiptData
    }
    catch { print("Couldn't read receipt data with error: " + error.localizedDescription) }
}

App Storeにレシートデータを送信する

サーバ上で、receipt-datapassword(レシートに自動更新サブスクリプションが含まれる場合)、exclude-old-transactionsの各鍵を使ってJSONオブジェクトを作成します。

このJSONオブジェクトを、HTTP POSTリクエストのペイロードとして送信します。SandboxでAppをテストする際やアプリケーションの審査中は、テスト環境URL https://sandbox.itunes.apple.com/verifyReceiptを使います。App StoreでAppが有効になっている場合は、プロダクションURL https://buy.itunes.apple.com/verifyReceiptを使います。

応答のパース

App Storeの応答ペイロードは、応答本文に鍵と値の詳細を含むJSONオブジェクトです。

in_app配列に、以前にユーザーが購入した非消費型、非更新サブスクリプション、および自動更新サブスクリプションのアイテムが含まれます。応答に含まれる値でApp内課金のタイプを確認し、必要に応じてトランザクションを検証します。

自動更新サブスクリプションのアイテムでは、応答をパースして、現在有効なサブスクリプション期間に関する情報を取得します。直近の更新に関するレシートを検証すると、latest_receiptの値は(リクエストにおける)receipt-dataと同じ、latest_receipt_infoの値はreceiptと同じになります。

これらの値を使って、自動更新サブスクリプションの期限が切れているかどうかを確認できます。これらの値とexpiration_intentサブスクリプションフィールドを使って、期限切れの理由を取得します。

関連項目

購入の検証

レシート検証技術の選択(英語)

Appに適したレシート検証のタイプを選択します。