2009-08-19 19 views
8

Od dawna próbuję przetestować moją pierwszą aplikację iPhone na zakupy w aplikacji. Niestety nie mogę znaleźć sposobu, aby porozmawiać z serwerem iTunes, aby zweryfikować transactionReceipt.Wygeneruj obiekt JSON z transakcjąReceipt

Ponieważ jest to moja pierwsza próba z tą technologią, zdecydowałem się zweryfikować potwierdzenie bezpośrednio z iPhone'a, zamiast korzystać z obsługi serwera. Ale po próbie wysłania żądania POST z onsystemem JSON utworzonym za pomocą api JSON z kodu google, itunes zawsze zwraca dziwną odpowiedź (zamiast tego oczekuję na ciąg "status = 0").

Oto kod, który używam do sprawdzenia otrzymania:

- (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]; 
} 

może jestem zapominając coś w nagłówkach wniosek, ale myślę, że problem jest w metodzie używać do utworzenia obiektu JSON.

Oto jak wygląda obiekt JSON, zanim go dodać do HTTPBody:

string to send: {"receipt-data":"{\n\t\"signature\" = \"AUYMbhY 

     ........... 

D0gIjEuMCI7Cn0=\";\n\t\"pod\" = \"100\";\n\t\"signing-status\" = \"0\";\n}"} 

Odpowiedzi ja mam:

pełna odpowiedź { wyjątek = „java.lang. IllegalArgumentException: Parsowanie listy właściwości nie powiodło się podczas próby odczytania niecytowanego ciągu znaków Nie znaleziono dozwolonych znaków W wierszu numer: 1, kolumna: 0. "; status = 21002; }

Wielkie dzięki za wskazówki.

+0

Nigdzie w dokumentacji nie jest napisane, że 'transactionReceipt' może być interpretowane jako kodowany w UTF-8 – user102008

Odpowiedz

20

Właśnie naprawiłem to po 2 dniach zmagań. Musisz zakodować potwierdzenie przy użyciu Base64 przed wstawieniem do obiektu json. Jak ten (Ruby):

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

Base64 nie wspomina nigdzie w oficjalnych docs (przynajmniej dla SDK 3.0), tylko na kilku blogach.

Na przykład here facet koduje paragon w Base64 przed przekazaniem go do serwera PHP, ale nie dekoduje go z powrotem w PHP, wysyłając w ten sposób ciąg znaków Base64 do iTunes.

+0

Dziękuję za odpowiedź !! – Carlos

+0

Dziękuję bardzo za wskazanie tego! –

+0

W bieżącym podręczniku programowania zakupu aplikacji wspomniano kodowanie podstawowe 64 w kroku 1. http://developer.apple.com/library/mac/documentation/NetworkingInternet/Conceptual/StoreKitGuide/VerifyingStoreReceipts/VerifyingStoreReceipts.html#//apple_ref/doc/ uid/TP40008267-CH104-SW1 –

2

Re: „21002: java.lang.IllegalArgumentException: propertyListFromString analizowany obiekt, ale nie ma jeszcze artykułu ciąg .:”

Naprawiłem podobny problem w moim kodzie owijając dane potwierdzenia jako { } przed kodowaniem.

Powstały paragon wygląda następująco:

{ 
    "signature" = "A[...]OSzQ=="; 
    "purchase-info" = "ew[...]fQ=="; 
    "pod" = "100"; 
    "signing-status" = "0"; 
} 

Oto kod używam:

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 Response:

{"receipt":{"item_id":"371235", "original_transaction_id":"1", "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} 

Powodzenia!