2011-05-08 10 views
13

quiero para verificar el recibo de transacción dentro de mi aplicación,En la verificación recibo de compra de aplicaciones dentro de la aplicación

Aquí está mi código,

- (void)recordTransaction:(SKPaymentTransaction *)transaction { 

    NSData *receiptData = [NSData dataWithData:transaction.transactionReceipt]; 

    NSString *encodedString = [Base64 encode:receiptData]; 

    NSURL *url = [NSURL URLWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"]; 

    ASIFormDataRequest *request = [[ASIFormDataRequest alloc] initWithURL:url]; 

    [request setPostValue:encodedString forKey:@"receipt-data"]; 

    [request setRequestMethod:@"POST"]; 

    [request setDelegate:self]; 

    [request startAsynchronous]; 

} 

que estoy recibiendo de salida:

{" estado ": 21002," excepción ":" java.lang.NullPointerException "}

¿Alguien puede ayudar para obtener la verificación de recibo adecuada?

Respuesta

10

Después de varios intentos, decidí hacer la verificación del recibo del lado del servidor. En realidad esta es la forma recomendada.

Aquí está mi código,

-(void)recordTransaction:(SKPaymentTransaction *)transaction { 

NSString* receiptString = [[[NSString alloc] initWithData:transaction.transactionReceipt encoding:NSUTF8StringEncoding] autorelease]; 

// POST this string to your server 

// I used ASIFormDataRequest 

} 

// server side 

$url = 'https://sandbox.itunes.apple.com/verifyReceipt'; 

// encode the receipt data received from application 

$purchase_encoded = base64_encode($purchase_receipt); 

//Create JSON 

    $encodedData = json_encode(Array( 
     'receipt-data' => $purchase_encoded 
    )); 


// POST data 

    //Open a Connection using POST method, as it is required to use POST method. 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_POST, true); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $encodedData); 
    $encodedResponse = curl_exec($ch); 
    curl_close($ch); 


    //Decode response data using json_decode method to get an object. 

     $response = json_decode($encodedResponse); 


// check response 

if ($response->{'status'} != 0) 

    // Invalid receipt 

else 

    // valid reciept 

encontré formulario de ayuda,

http://gamesfromwithin.com/in-app-purchases-part-3

+0

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

4

... no está activando su solicitud. ¡Entonces tu respuesta es nula, porque aún no has hecho la solicitud!

agregue una llamada [request startSynchronous] (que es generalmente una mala idea, siempre se debe ejecutar su red llama de forma asincrónica), o mejor aún reescribir su código para soportar una llamada de red asíncrona, y utilizar en su lugar [request startAsynchronous].

Yo sugeriría revisar la documentación ASI si necesita más información: http://allseeing-i.com/ASIHTTPRequest/How-to-use

+0

sigue recibiendo respuesta nula. – SST

+1

¿por qué obtendrían un error de Java del código Object-C si no ejecutara la solicitud? –

+2

La pregunta ha sido editada desde que publiqué esta respuesta. Originalmente no había ninguna llamada 'startAsynchronous', y no había ningún error de Java. Ahora que se ha agregado esto, hay algo más que está mal. – lxt

26

sólo para aquellos que pueden encontrar útil. Noté que Apple ha actualizado la Guía de compras en la aplicación con algunos códigos de estado que son para las compras de la suscripción renovable automáticamente, pero que parecen aplicarse aquí también.

  • 21000 El App Store no pudo leer el objeto JSON que proporcionó.
  • 21002 Los datos en la propiedad de datos de recibo estaban mal formados.
  • 21003 El recibo no se pudo autenticar.
  • 21004 El secreto compartido que proporcionó no coincide con el secreto compartido en el archivo de su cuenta.
  • 21005 El servidor de recibos no está actualmente disponible.
  • 21006 Este recibo es válido pero la suscripción ha expirado. Cuando este código de estado se devuelve a su servidor, los datos de recibo también se decodifican y devuelven como parte de la respuesta.
  • 21007 Este recibo es un recibo de espacio aislado, pero se envió al servicio de producción para su verificación.
  • 21008 Este recibo es un recibo de producción, pero se envió al servicio de recinto de seguridad para su verificación.

Importante: Los códigos distintos de cero estado aquí sólo se aplican cuando se recupera información sobre una suscripción auto-renovable. No use estos códigos de estado cuando pruebe respuestas para otros tipos de productos. (¿De Verdad?)

Espero que esto ayude como referencia. Me clavé con 21007.

Lista de códigos de estado en la página web de Apple: https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html

+0

¿Es posible vincular el origen de estos estados? Gracias. – Stunner

-2

De la siguiente referencia entiendo que su aplicación necesita utilizar el servidor separado para "Verificación de las tiendas de recibo". Creo que para la verificación de recibos necesitamos usar una solicitud de IP estática.

gracias,

Reference

Cuestiones relacionadas