Pregunta

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

Porque es mi primer intento con esta tecnología que elegí para verificar la recepción directamente desde el iPhone en lugar de utilizar el soporte de servidor. Pero después de intentar enviar la solicitud POST con un JSON onbject creado usando el API JSON de Google Code, itunes siempre devuelve una respuesta extraña (en lugar de la cadena "estado = 0" espero).

Este es 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 estoy olvidando 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: Lista de propiedades de análisis falló al intentar leer cadena sin comillas se encontraron caracteres permitidos en la línea número 1, columna:.. 0.";       estado = 21002;   }

Muchas gracias por su orientación.

¿Fue útil?

Solución

acabo de fijo que después de 2 días de lucha. Usted tiene que codificar la recepción utilizando Base64 antes de insertarlo en 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, aquí el tipo codifica el recibo en base 64 antes de pasar al servidor PHP, pero no decodifica de nuevo en PHP, enviando así cadena codificada en Base64 a iTunes.

Otros consejos

Re: "21002: java.lang.IllegalArgumentException: propertyListFromString analiza un objeto, pero todavía hay más texto de la cadena:".

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

El recibo resultante será similar 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":"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}

Buena suerte!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top