Ok, This may be the smoking gun --
According to the official dataflow from the Store Kit apps, you are supposed to retrieve information about the available purchases (SKProductsRequest) before trying to make a purchase (SKPaymentQueue).
I added code to do just that, even though the localized data wasn't being used. I made the call, verified the item was present, and just dumped an NSLOG about it.
The purchase went through, with no errors!
I then removed the code that called SKProductsRequest, and re-ran it, and got the "Payment requests are restricted..." error message.
It almost seems like the store kit framework was changed in such a way as to REQUIRE you to make a call to SKProductsRequest, in order for purchases to behave correctly when tehy are added to SKPaymentQueue.
In computer science speak, they seem to have introduced a hard dependence between the two logically related, but separate modules. This is a REALLY bad practice.
Try adding this code into your app and see if it starts working -- be sure to update the embedded string literal with your actual product identifier.
-(void) dumpProductInfo
{
SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:@"com.company.domain.app.purchase"]];
request.delegate = self;
[request start];
}
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
NSArray *myProduct = response.products;
// populate UI
NSLog(@"Products:");
for (int i = 0; i < [myProduct count]; i++)
{
SKProduct *product = [myProduct objectAtIndex:i];
NSLog(@"Name: %@ - Price: %f ID: %@" ,
[product localizedTitle],
[[product price] doubleValue],
[product productIdentifier]);
}
}