Сгенерируйте объект JSON с помощью transactionReceipt
-
18-09-2019 - |
Вопрос
Последние дни я пытался протестировать свое первое встроенное приложение purchase для iPhone.К сожалению, я не могу найти способ связаться с сервером iTunes, чтобы подтвердить получение транзакции.
Поскольку это моя первая попытка использования этой технологии, я решил проверить получение непосредственно с iPhone, вместо этого воспользовавшись поддержкой сервера.Но после попытки отправить запрос POST с помощью JSON onbject, созданного с использованием JSON api из Google code, itunes всегда возвращает странный ответ (вместо ожидаемой строки "status = 0").
Вот код, который я использую для подтверждения квитанции:
- (void)recordTransaction:(SKPaymentTransaction *)transaction {
NSString *receiptStr = [[NSString alloc] initWithData:transaction.transactionReceipt encoding:NSUTF8StringEncoding];
NSDictionary *jsonDictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"algo mas",@"receipt-data",nil];
NSString *jsonString = [jsonDictionary JSONRepresentation];
NSLog(@"string to send: %@",jsonString);
NSLog(@"JSON Created");
urlData = [[NSMutableData data] retain];
//NSURL *sandboxStoreURL = [[NSURL alloc] initWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"]];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:[jsonString dataUsingEncoding:NSUTF8StringEncoding]];
NSLog(@"will create connection");
[[NSURLConnection alloc] initWithRequest:request delegate:self];
}
возможно, я что-то забываю в заголовках запроса, но я думаю, что проблема в методе, который я использую для создания объекта JSON.
Вот как выглядит объект JSON до того, как я добавлю его в HTTPBody :
string to send: {"receipt-data":"{\n\t\"signature\" = \"AUYMbhY
...........
D0gIjEuMCI7Cn0=\";\n\t\"pod\" = \"100\";\n\t\"signing-status\" = \"0\";\n}"}
Ответы, которые я получил:
завершите ответ { исключение = "java.lang.Исключение IllegalArgumentException:Ошибка синтаксического анализа списка свойств при попытке прочитать строку без кавычек.Допустимых символов найдено не было.По номеру строки:1, столбец:0.";статус = 21002;}
Большое спасибо за ваше руководство.
Решение
Я только что исправил это после 2 дней борьбы.Вы должны закодировать квитанцию с помощью Base64 перед вставкой в объект json.Вот так (Ruby):
dataForVerification = {"receipt-data" => Base64.encode64(receipt)}.to_json
Base64 нигде не упоминается в официальных документах (по крайней мере, для SDK 3.0), только в паре блогов.
Например, здесь парень кодирует квитанцию в Base64 перед передачей ее на PHP-сервер, но не декодирует ее обратно в PHP, отправляя таким образом строку в кодировке Base64 в iTunes.
Другие советы
Ре:"21002:java.lang.Исключение IllegalArgumentException:propertyListFromString проанализировал объект, но в строке все еще больше текста.:"
Я исправил аналогичную проблему в своем коде, обернув данные квитанции в {} перед кодированием.
Результирующая квитанция выглядит следующим образом:
{
"signature" = "A[...]OSzQ==";
"purchase-info" = "ew[...]fQ==";
"pod" = "100";
"signing-status" = "0";
}
Вот код, который я использую:
receipt = "{%s}" % receipt // This step was not specified - trial and error
encoded = base64.b64encode(receipt)
fullpost = '{ "receipt-data" : "%s" }' % encoded
req = urllib2.Request(url, fullpost)
response = urllib2.urlopen(req)
Ответ Apple:
{"receipt":{"item_id":"371235", "original_transaction_id":"1012307", "bvrs":"1.0", "product_id":"com.foo.cup", "purchase_date":"2010-05-25 21:05:36 Etc/GMT", "quantity":"1", "bid":"com.foo.messenger", "original_purchase_date":"2010-05-25 21:05:36 Etc/GMT", "transaction_id":"11237"}, "status":0}
Удачи вам!