2009-08-19 9 views
8

J'ai passé ces derniers jours à essayer de tester ma première application pour l'iPhone. Malheureusement, je ne trouve pas le moyen de parler au serveur iTunes pour vérifier la transactionReceipt. Parce que c'est mon premier essai avec cette technologie, j'ai choisi de vérifier le reçu directement à partir de l'iPhone à la place en utilisant le support du serveur. Mais après avoir essayé d'envoyer la requête POST avec un onbject JSON créé à l'aide de l'API JSON de google code, itunes renvoie toujours une réponse étrange (à la place de la chaîne "status = 0" que j'attends).Générer un objet JSON avec transactionReceipt

Voici le code que j'utiliser pour vérifier la réception:

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

peut-être que je suis oublier quelque chose dans les en-têtes de la demande, mais je pense que le problème est dans la méthode que je l'utilise pour créer l'objet JSON.

VOICI comment l'objet JSON ressemble avant de l'ajouter à la HTTPBody:

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

     ........... 

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

Les réponses que j'ai:

réponse complète { exception = « java.lang. IllegalArgumentException: l'analyse de la liste des propriétés a échoué lors de la tentative de lecture de la chaîne sans guillemets Aucun caractère autorisé n'a été trouvé Au numéro de ligne: 1, colonne: 0. "; statut = 21002; }

Merci beaucoup pour votre aide.

+0

Nulle part dans la documentation ne dit que le 'transactionReceipt' peut être interprété comme une chaîne encodée en UTF-8 – user102008

Répondre

20

Je viens de le fixer après 2 jours de difficultés. Vous devez encoder la réception en utilisant Base64 avant de l'insérer dans un objet json. Comme ça (Ruby):

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

base64 est mentionné nulle part dans les documents officiels (au moins pour SDK 3.0), seulement sur deux blogs. Par exemple, here le type encode le reçu dans Base64 avant de le transmettre au serveur PHP, mais ne le décode pas en PHP, envoyant ainsi une chaîne encodée en Base64 à iTunes.

+0

Merci beaucoup pour votre réponse !! – Carlos

+0

Merci beaucoup d'avoir signalé cela! –

+0

Le Guide de programmation d'achat d'applications actuel mentionne l'encodage en base 64 à l'étape 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 un objet analysé, mais il y a encore plus de texte dans la chaîne .: »

Je fixe un problème similaire dans mon code en encapsulant les données de réception dans { } avant l'encodage.

La réception résultant ressemble:

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

Voici le code que j'utilise:

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) 

Réponse d'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} 

Bonne chance!

Questions connexes