Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iOS Server Side Validation - receipt types

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 } 
like image 290
refaelos Avatar asked Dec 09 '13 08:12

refaelos


People also ask

What is an IAP receipt?

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.

What is receipt validation?

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.

What is in-app purchase receipt?

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.


1 Answers

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.

like image 103
hasseg Avatar answered Sep 21 '22 12:09

hasseg