I'm trying to validate an Apple IAP auto-renewing receipt (https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html), but the response payload seems to be (surprisingly) empty. I would greatly appreciate if you could point me in the right direction.
Here is the javascript implementation via Parse CloudCode:
Parse.Cloud.define('validateReceipt', function (request, response) {
// params:
// debugMode
// userObjectId
// receiptData
var storeURL = null;
if (request.params.debugMode) {
storeURL = 'https://sandbox.itunes.apple.com/verifyReceipt';
} else {
storeURL = 'http://buy.itunes.apple.com/verifyReceipt';
}
var receiptAsBase64EncodedString = request.params.receiptData;
var postData = {
method: 'POST',
url: storeURL,
headers: { 'Content-Type': 'application/json' },
body: { 'receipt-data': receiptAsBase64EncodedString,
'password': 'SHARED_SECRET' }
}
Parse.Cloud.httpRequest(postData).then(function (httpResponse) {
var expirationDate = httpResponse.data.latest_receipt.expiration_date;
var userQuery = new Parse.Query('_User');
userQuery.get(request.params.userObjectId, {
success: function(user) {
user.set('subscriptionExpirationDate', expirationDate);
user.save(null, {
success: function(thread) {
return response.success('Subscription Active');
},
error: function(user, error) {
console.error('Error saving subscriptionExpirationDate for User: ' + error.code + ' - ' + error.message);
return response.error('Error saving subscriptionExpirationDate for User: ' + error.code + ' - ' + error.message);
}
});
},
error: function(object, error) {
console.error('Error fetching User: ' + error.code + ' - ' + error.message);
return response.error('Error saving subscriptionExpirationDate for User: ' + error.code + ' - ' + error.message);
}
});
});
});
If I print httpResponse.data to the console, the output is:
No Message provided
However, if I implement the same logic from my client in obj-C, I have the expected result:
NSError *error;
NSDictionary *requestContents = @{
@"receipt-data": [receiptData base64EncodedStringWithOptions:0],
@"password": @"SHARED_SECRET"
};
NSData *requestData = [NSJSONSerialization dataWithJSONObject:requestContents
options:0
error:&error];
NSURL *storeURL = [NSURL URLWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"];
NSMutableURLRequest *storeRequest = [NSMutableURLRequest requestWithURL:storeURL];
[storeRequest setHTTPMethod:@"POST"];
[storeRequest setHTTPBody:requestData];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:storeRequest queue:queue
completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
if (!connectionError) {
NSError *error;
NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
}
}];
Printing jsonReponse:
{
environment = Sandbox;
"latest_receipt" = "...";
"latest_receipt_info" = (
{
"expires_date" = "2015-10-09 02:11:19 Etc/GMT";
[...]
},
status = 0;
}