Domanda

Sono stato nei giorni scorsi che provano a testare la mia prima applicazione purchse iphone in-app. Purtroppo non riesco a trovare il modo di parlare con server iTunes per verificare la transactionReceipt.

Perché è il mio primo tentativo con questa tecnologia ho scelto di verificare la ricevuta direttamente da iPhone, invece utilizzando il supporto di server. Ma dopo aver tentato di inviare la richiesta POST con un JSON onbject creata usando l'API JSON da Google Code, iTunes restituisce sempre una risposta strano (invece che la stringa "status = 0" Aspetto).

Ecco il codice che uso per verificare la ricezione:

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

forse sto dimenticando qualcosa nelle intestazioni della richiesta, ma penso che il problema è nel metodo che uso per creare l'oggetto JSON.

Ecco come l'oggetto JSON appare come prima lo aggiungo alla HTTPBody:

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

       ...........

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

Le risposte che ho ricevuto:

  

risposta completa {       eccezione = "java.lang.IllegalArgumentException: lista proprietà di analisi non è riuscita durante il tentativo di leggere stringa non quotate Non caratteri consentiti sono state trovate al numero della linea: 1, colonna:.. 0";       status = 21002;   }

Grazie mille per la vostra guida.

È stato utile?

Soluzione

Ho appena fisso che dopo 2 giorni di lotta. È necessario codificare il ricevimento usando Base64 prima di inserire in oggetto JSON. Come quella (Ruby):

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

Base64 non è menzionato da nessuna parte nei documenti ufficiali (almeno per SDK 3.0), solo su un paio di blog.

Per esempio, qui il ragazzo codifica la ricevuta in Base64 prima di passare al server PHP, ma non decodifica di nuovo in PHP, inviando così stringa con codifica Base64 a iTunes.

Altri suggerimenti

Re: "21002: java.lang.IllegalArgumentException: propertyListFromString analizzato un oggetto, ma c'è ancora più testo nella stringa:".

Ho risolto un problema simile nel mio codice avvolgendo i dati ricevuta in {} prima della codifica.

La ricevuta risultante appare come:

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

Ecco il codice che uso:

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)

la risposta di 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}

In bocca al lupo!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top