Вопрос

Последние дни я пытался протестировать свое первое встроенное приложение 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}

Удачи вам!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top