Я видел несколько вопросов по этому вопросу, но ни один из них не помог мне решить проблему, где я получил ответ {«status»: 21002}
Мой код PHP:
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'https://sandbox.itunes.apple.com/verifyReceipt');
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLINFO_HEADER_OUT, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode(array('receipt-data' => $receipt)));
print curl_exec($curl);
print curl_getinfo($curl, CURLINFO_HEADER_OUT);
вот мои необработанные HTTP-заголовки, идущие к яблоку:
POST /verifyReceipt HTTP/1.1
Host: sandbox.itunes.apple.com
Accept: */*
Content-Type: application/json
Content-Length: 3382
Expect: 100-continue
Значение квитанции $:
{"receipt_type":"ProductionSandbox","app_item_id":0,"original_purchase_date": ....
Я не буду включать все это, но оно включает в себя поле в приложении.
Я также пытался base64_encode
или же json_decode
$ квитанция, но я получаю тот же ответ. Кроме этого base64_encode
также получает меня "exception":"java.lang.IllegalArgumentException"
Я уверен, что публикация верна, но отправляю ли я неправильное содержимое? $ квитанция должна быть обернута другими данными? или я должен просто отправить подмножество этих данных?
От стоимости вашего $receipt
Параметр, кажется, что вы смешиваете локальную и серверную квитанцию проверки. Согласно руководству по подтверждению получения, а именно Проверка квитанций в App Store В этом разделе параметром квитанции должны быть «данные квитанции в кодировке base64». Вместо того, чтобы декодировать данные квитанции на клиенте, просто base64 кодирует данные квитанции в виде строки и использует их для $receipt
,
Я бы посчитал, что проще base64 кодировать данные квитанции на стороне клиента, а затем отправить их в php. Вот сжатая версия из примеров документации, и, поскольку вы говорите о чеке iTunes store, я надеюсь, что вам нужен obj-c. Чтобы получить эту строку, извлеките URL-адрес данных квитанции, прочитайте из него данные, а затем закодируйте их с помощью base64:
NSURL *url = [[NSBundle mainBundle] appStoreReceiptURL];
NSData *data = [NSData dataWithContentsOfURL:url];
NSString *encoded = [data base64EncodedStringWithOptions:0];
POST выглядит правильно в противном случае.
Других решений пока нет …