2009-08-19 5 views
8

Ich habe die letzten Tage versucht, meine erste In-App-iPhone-Anwendung zu testen. Leider kann ich den Weg nicht finden, mit iTunes Server zu sprechen, um das transactionReceipt zu überprüfen.Erzeuge JSON-Objekt mit transactionReceipt

Da es mein erster Versuch mit dieser Technologie ist, entschied ich mich, den Empfang direkt vom iPhone zu überprüfen, anstatt Server-Unterstützung zu verwenden. Aber nachdem ich versucht habe, die POST-Anfrage mit einem JSON-Objekt zu senden, das mit der JSON-API aus dem Google-Code erstellt wurde, gibt itunes immer eine seltsame Antwort zurück (stattdessen die "status = 0" -Zeichenkette, auf die ich warte).

Hier ist der Code, den ich die Quittung überprüfen verwenden:

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

vielleicht etwas in der Anfrage des Header Ich vergesse aber ich denke, dass das Problem bei dem Verfahren, das ich das JSON-Objekt erstellen verwenden.

Hier sind, wie das JSON-Objekt aussieht, bevor ich es den HTTPBody hinzufügen:

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

     ........... 

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

Die Antworten, die ich habe:

vollständige Antwort { Ausnahme = „java.lang. IllegalArgumentException: Das Parsen der Eigenschaftenliste ist fehlgeschlagen, als versucht wurde, eine nicht angeführte Zeichenfolge zu lesen. Es wurden keine zulässigen Zeichen gefunden. Bei Zeilennummer: 1, Spalte: 0. "; Status = 21002; }

Vielen Dank für Ihre Führung.

+0

Nirgendwo in der Dokumentation heißt es, dass das 'transactionReceipt' als UTF-8-codierte Zeichenfolge interpretiert werden kann – user102008

Antwort

20

Ich habe gerade das nach 2 Tagen des Kämpfens behoben. Sie müssen den Beleg mit Base64 codieren, bevor Sie ihn in das json-Objekt einfügen. Wie der (Rubin):

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

Base64 ist nicht überall in den offiziellen Dokumenten erwähnt (zumindest für SDK 3.0), nur auf ein paar Blogs. Zum Beispiel here der Typ verschlüsselt die Quittung in Base64, bevor sie an den PHP-Server übergeben wird, entschlüsselt sie aber nicht in PHP und sendet Base64-codierte Zeichenketten an iTunes.

+0

Vielen Dank für Ihre Antwort !! – Carlos

+0

Vielen Dank für das Aufzeigen! –

+0

Der aktuelle In App Purchase Programming Guide erwähnt die Codierung von Base 64 in Schritt 1. http://developer.apple.com/library/mac/documentation/NetworkingInternet/Conceptual/StoreKitGuide/VerifyingStoreReceips/VerifyingStoreReceipts.html#//apple_ref/doc/ UID/TP40008267-CH104-SW1 –

2

Re: "21002: java.lang.IllegalArgumentException: propertyListFromString analysierte ein Objekt, aber es gibt noch mehr Text in der Zeichenfolge .:"

ich ein ähnliches Problem in meinem Code festgelegt, indem die Eingangsdaten in Einwickeln { } vor der Codierung.

Der resultierende Empfang wie folgt aussieht:

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

Hier ist der Code, das ich verwenden:

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) 

Apples Antwort:

{"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} 

Viel Glück!