Я видел несколько вопросов об этом, но никто не исправляет мою проблему, когда я получаю ответ {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
, кажется, что вы смешиваете проверку валидации на местном и сервере. В соответствии с руководством по проверке квитанции и, в частности, с подтверждением поступлений в разделе " Магазин приложений ", параметр "данные приема" должен быть "базовыми данными для получения кодированных данных". Вместо того, чтобы декодировать данные квитанции на клиенте, просто base64 кодирует данные квитанции в виде строки и использует это для $receipt
.
Я бы упростил base64 кодировать данные квитанции на стороне клиента, а затем отправить их на php. Здесь сжатая версия из примеров doc, и поскольку вы говорите о покупке магазина iTunes, я надеюсь, что obj-c - это то, что вам нужно. Чтобы получить эту строку, извлеките URL-адрес квитанции, прочитайте данные из него, затем base64 закодируйте его:
NSURL *url = [[NSBundle mainBundle] appStoreReceiptURL];
NSData *data = [NSData dataWithContentsOfURL:url];
NSString *encoded = [data base64EncodedStringWithOptions:0];
POST выглядит корректно иначе.