I'm getting 2 kinds of receipt formats from Apple when i try to verify purchases on the server.
Any idea what's the difference ?
1)
content: { status: 0, receipt: { item_id: "662554154", original_purchase_date: "2012-10-12 08:32:12 Etc/GMT", purchase_date_pst: "2012-10-12 01:32:12 America/Los_Angeles", purchase_date: "2012-10-12 08:32:12 Etc/GMT", product_id: "com.example.mygame.tool1", bid: "com.example.mygame", version_external_identifier: "5647854", bvrs: "1.0", quantity: "1", transaction_id: "8844567822225544", app_item_id: "659563252", original_purchase_date_ms: "1350030732000", original_transaction_id: "8844567822225544", purchase_date_ms: "1350030732000", original_purchase_date_pst: "2012-10-12 01:32:12 America/Los_Angeles" } }
2)
content: { receipt: { in_app: [ { is_trial_period: "false", original_purchase_date_pst: "2013-10-09 20:55:27 America/Los_Angeles", original_purchase_date_ms: "1386571707000", original_purchase_date: "2013-10-09 04:55:27 Etc/GMT", purchase_date_pst: "2013-10-09 20:55:27 America/Los_Angeles", purchase_date_ms: "1386571707000", purchase_date: "2013-10-09 04:55:27 Etc/GMT", original_transaction_id: "654888452251325", transaction_id: "654888452251325", product_id: "com.example.mygame.tool1", quantity: "1" } ], original_application_version: "1.0", original_purchase_date_pst: "2013-10-09 20:55:27 America/Los_Angeles", original_purchase_date_ms: "1386569706000", original_purchase_date: "2013-10-09 04:55:27 Etc/GMT", request_date_pst: "2013-10-09 20:55:27 America/Los_Angeles", request_date_ms: "1386571710087", request_date: "2013-10-09 04:55:27 Etc/GMT", download_id: 215425636588954, application_version: "1.0", bundle_id: "com.example.mygame", adam_id: 654225311, receipt_type: "Sandbox" }, environment: "Sandbox", status: 0 }
Overview. An App Store receipt is a binary encrypted file signed with an Apple certificate. In order to read the contents of the encrypted file, you need to pass it through the verifyReceipt endpoint. The endpoint's response includes a readable JSON body.
Receipt validation is a way to protect against fraudulent in-app purchases made in the iOS and Android app stores, and is used to ensure transactions occurred as reported.
The receipt for an application or in-app purchase is a record of the sale of the application and of any in-app purchases made from within the application. You can add receipt validation code to your application to prevent unauthorized copies of your application from running.
In iOS 6 each IAP (in-app purchase) transaction would have its own receipt (SKPaymentTransaction.transactionReceipt
in the StoreKit API). When you send this receipt data over to their validation API, you get the former response.
In iOS 7, Apple has started using something they call the “Grand Unified Receipt”. This means that apps have one receipt that contains information about the purchase of the app itself, as well as IAPs. You use the -[NSBundle appStoreReceiptURL]
API to load this receipt data from disk (and possibly SKReceiptRefreshRequest
to get it if it doesn't seem to exist). When you send this receipt data over to their validation API, you get the latter response.
The main difference is that the former receipt format represents one IAP transaction, while the latter represents an array of them (as well as the purchase of the application itself).
See more info in the “Using Receipts to Protect Your Digital Sales” WWDC 2013 session.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With