2009-08-19 11 views
8

He estado los últimos días tratando de probar mi primera aplicación de purchse iphone en la aplicación. Lamentablemente, no puedo encontrar la manera de hablar con el servidor de iTunes para verificar el transactionReceipt.Generar objeto JSON con transactionReceipt

Como es mi primer intento con esta tecnología, decidí verificar el recibo directamente desde el iPhone utilizando el soporte del servidor. Pero después de tratar de enviar la solicitud POST con un objeto JSON creado utilizando la API JSON del código de google, itunes siempre devuelve una respuesta extraña (en cambio, la cadena "estado = 0" que espero).

Aquí está el código que utilizo para verificar la recepción:

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

tal vez me estoy olvidando de algo en las cabeceras de la petición, pero creo que el problema está en el método que utilizo para crear el objeto JSON.

Así es como el objeto JSON se ve como antes de añadirlo a la HTTPBody:

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

     ........... 

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

Las respuestas que tengo:

respuesta completa { excepción = "java.lang. IllegalArgumentException: el análisis de la lista de propiedades falló al intentar leer cadenas sin comillas. No se encontraron caracteres permitidos. En el número de línea: 1, columna: 0. "; estado = 21002; }

Muchas gracias por su orientación.

+0

En ninguna parte de la documentación se dice que el 'transactionReceipt' se puede interpretar como una cadena codificada en UTF-8 – user102008

Respuesta

20

Lo acabo de arreglar después de 2 días de dificultades. Debe codificar el recibo utilizando Base64 antes de insertarlo en el objeto json. Al igual que (Rubí):

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

base 64 no se menciona en ninguna parte en los documentos oficiales (al menos para SDK 3.0), sólo en un par de blogs.

Por ejemplo, here el tipo codifica el recibo en Base64 antes de pasarlo al servidor PHP, pero no lo descifra en PHP, enviando así la cadena codificada en Base64 a iTunes.

+0

¡Muchas gracias por su respuesta! – Carlos

+0

¡Muchas gracias por señalar esto! –

+0

La Guía de programación de compra en aplicación actual menciona la codificación de base 64 en el paso 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 analiza un objeto, pero todavía hay más texto en la cadena .:"

que fija un problema similar en mi código envolviendo los datos de recibos en { } antes de la codificación.

El recibo resultante se parece a:

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

Aquí está el código que utilizo:

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) 

respuesta de Apple:

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

Buena suerte!