Reputation: 301
I'm trying to verify a sandbox transactionReceipt at https://sandbox.itunes.apple.com/verifyReceipt using php and cURL.
The original receipt when it arrives at my server looks like:
{ "signature" = "AksOP5dmXwg 9WjlcE7PwBEFZgcqBnIb0Uv2lSKebWJJpcOZQRL6ejYyv20MzPFDSgAj3GRGoJXWZpyJLAU8qZSQFYQeGljWKZd3XTJN4j1E7fqOQRBdIXSDRJr1phB/11xp smk6m ... dgcxRHuOMZ2tm8npLUm7argOSzQ=="; "purchase-info" = "ewoJIml0ZW0taWQiID0gIj ... jAiOwp9"; "pod" = "100"; "signing-status" = "0"; }
1. Should it have the equals and semicolons?
Wrapping this up for transmission in the cURL I use:
$receipt = json_encode(array("receipt-data" => base64_encode($transactionReceipt)));
which gives:
{"receipt-data":"ewoJInNpZ25hdHVyZSIgPSAiQ ... <lots more of the same> ... XR1cyIgPSAiMCI7Cn0="}
This results in: {"status":-42023} from Apple
If I use:
$receipt = json_encode(array("receipt-data" => $transactionReceipt));
which gives:
{"receipt-data":"{\n\t\"signature\" = \"AksOP5dmXwg 9WjlcE7PwBEFZgcqBnIb0Uv2lSKebWJJpcOZQRL6ejYyv20MzPFDSgAj3GRGoJXWZpyJLAU8qZSQFYQeGljWKZd3XTJN4j1E7fqOQRBdIXSDRJr1phB\/11xp smk6m ... dgcxRHuOMZ2tm8npLUm7argOSzQ==\";\n\t\"purchase-info\" = \"ewoJIml0ZW0taWQiID0gIjM3NTgyNzIyOCI7Cgkib3JpZ2luYWwtdHJhbnNhY3Rpb24taWQiID0gIjEwMDAwMDAwMDA1ODQyNDIiOwoJInB1cmNoYXNlLWRhdGUiID0gIj ... jAiOwp9\";\n\t\"pod\" = \"100\";\n\t\"signing-status\" = \"0\";\n}"}
I get: {"status":21002, "exception":"java.lang.IllegalArgumentException: Property list parsing failed while attempting to read unquoted string. No allowable characters were found. At line number: 1, column: 0."}
2. Can anyone please tell me what the receipt-data json is supposed to look like?
Thanks!
Upvotes: 3
Views: 6151
Reputation: 7574
This is now working for me! My final bug was that I had, in series of tests and changes, actually modified the receipt data file. Ooops :(. I had indented the receipt by 4 bytes, in preparation for submitting a post to stackoverflow of all things. Indenting the receipt made it invalid, perhaps not surprisingly.
Upvotes: 0
Reputation: 530
I was banging with my head against the walls with the same problem... check this:
$dataToPost = json_encode(array("receipt-data" => $receivedData));
where $receivedData is the receipt base64 encoded.
Then:
$opts = array('http' =>
array(
'method' => 'POST',
'header' => 'Content-type: application/x-www-form-urlencoded',
'content' => $dataToPost
)
);
$context = stream_context_create($opts);
$result = file_get_contents('https://sandbox.itunes.apple.com/verifyReceipt', false, $context);
It worked for me... give it a try and let me know!
Upvotes: 5