Создать объект JSON с транзакциейReceipt - PullRequest
8 голосов
/ 19 августа 2009

В последние дни я пытался протестировать свое первое приложение iphone для покупок в приложении. К сожалению, я не могу найти способ поговорить с сервером iTunes, чтобы проверить транзакцию Receipt.

Поскольку это моя первая попытка использования этой технологии, я решил проверить квитанцию ​​непосредственно с iPhone, а не с помощью поддержки сервера. Но после попытки отправить запрос POST с объектом JSON, созданным с использованием API-интерфейса JSON из кода Google, 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}"}

Ответы, которые я получил:

полный ответ { exception = "java.lang.IllegalArgumentException: не удалось выполнить синтаксический анализ списка свойств при попытке прочитать строку без кавычек. Допустимые символы не найдены. В строке номер: 1, столбец: 0."; статус = 21002; }

Большое спасибо за ваше руководство.

Ответы [ 2 ]

20 голосов
/ 02 сентября 2009

Я только что исправил это после 2 дней борьбы. Вы должны закодировать квитанцию ​​с использованием Base64 перед вставкой в ​​объект json. Вот так (Рубин): ​​

dataForVerification = {"receipt-data" => Base64.encode64(receipt)}.to_json

Base64 нигде не упоминается в официальных документах (по крайней мере, для SDK 3.0), только в нескольких блогах.

Например, здесь парень кодирует квитанцию ​​в Base64, прежде чем передать ее на сервер PHP, но не декодирует ее обратно в PHP, отправляя, таким образом, строку в кодировке Base64 в iTunes.

2 голосов
/ 27 мая 2010

Re: "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}

Удачи!

...