2

I need help with parsing the Apple receipt verification response (sandbox). So user makes the in-app purchase with the iPhone app, and sends me the receipt, which I validate using Apple Services () by PHP. The validation is okay, I get a response, so now I need to pull out a transaction ID so I can store it in the DB, but I don't know which receipt I should pull from the in_app key. There simply isn't a single receipt in there, but an array containing all of the previous receipts also. This response is gotten after a "Consumable" and "Non-Renewing Subscription" was made in the app.

I found a few articles covering this, but EACH were refering to the receipt directly, as it was a single property, which contains all the data, but not here.

Eg. https://github.com/chrismaddern/iOS-Receipt-Validator-PHP looks promising, but in the end he's opening the receipt in this way:

return $decoded_response->receipt;

Doesn't work for my response. I guess this is the old response or something.

This one also https://gist.github.com/jamesstout/5073237.

I'm dealing with this for the first time, any help would be appreciated, please tell me if you need additional information, I'll be glad to point it out.

Apple Response after receipt validation UPDATE:

Note about items in in_app array, those are the receipts, but not sorted in any way, so for example, original_purchase_date_pst is for the first 4 items:

[0] 2015-01-12 10:33:13 Etc/GMT
[1] 2015-01-12 11:35:53 Etc/GMT
[2] 2015-01-12 11:12:36 Etc/GMT
[3] 2015-01-12 11:15:57 Etc/GMT

I mean I could iterate through the whole array, but it seems a bit weird that there isn't an easier way to fetch the latest receipt. And can I be sure that there will be the latest receipt in the list ? I'll need to fetch the transaction ID from it so I must be sure!

Thanks!

Adrian
  • 1,499
  • 3
  • 19
  • 26
  • Well is the item at index 0 within the `in_app` array the most recent purchase? Are those items date sorted by default? If not you would need to sort that array of objects based on date and take the id from the most recent one. – Mike Brant Jan 14 '15 at 19:23
  • updated the question, below image. – Adrian Jan 14 '15 at 19:35
  • I would guess that you would need to iterate through the array of objects to find the most recent one. I am not sure what difference is between `purchase_date_*` and `original_purchase_date_*` might be. Is there any difference in default sorting between the two? – Mike Brant Jan 14 '15 at 19:49
  • the thing is that purchase date is always the same , it's always 2015-01-13 19:33:45 Etc/GMT. Weird. – Adrian Jan 14 '15 at 20:05
  • That is probably initial app "purchase" date then. – Mike Brant Jan 14 '15 at 20:41

1 Answers1

1

So I want to answer this coz it might help somebody outthere, especially if the one is dealing with this for the first time.

The thing that caused this structure of response wasn't on the PHP side, but on the iPhone code side. I'm not sure what happened there, but I asked the dev to send me his description of the problem so here it is (quoting):

The problem was in receipt encoding, it was Apple documentation fail:

enter image description here

Apple say to use standard method of base64encoding - after that we receiveD that strange response with that in_app receipts array.

I found on github a class which makes verifications which makes many tests:

1) sends receipt to Apple 2) checks if transactionID is unique 3) checks if receipt or transaction objects are valid

And I saw that they didn't use standard encoding method before sending, but they use custom category NSData+Base64. I added this category to project and encoded the receipt with method from this category. After that I started to receive responses with new structure - the one we need - with no receipts in array but single receipt with all needed data.

Adrian
  • 1,499
  • 3
  • 19
  • 26
  • 1
    When you answer your own question and say you "found a github class" that solved your problem, it would be great for all if you shared your solution. Just saying the solution used a custom category doesn't help much. What was the class you found? – mbeaty Jul 19 '15 at 03:42