Question

Je suis les derniers jours en essayant de tester ma première en application l'application purchse iphone. Malheureusement, je ne peux pas trouver le moyen de parler au serveur iTunes pour vérifier la transactionReceipt.

Parce qu'il est mon premier essai avec cette technologie, j'ai choisi de vérifier la réception directement à partir du lieu iPhone en utilisant le support du serveur. Mais après avoir essayé d'envoyer la requête POST avec une JSON onbject créée en utilisant l'api JSON à partir du code Google, itunes renvoie toujours une réponse étrange (au lieu du « status = 0 » string J'attends).

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 oublie 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: parsing Liste des propriétés a échoué lors de la tentative de lecture chaîne unquoted caractères autorisés Pas trouvé À la ligne: 1, colonne:.. 0. »;       status = 21002;   }

Merci beaucoup pour vos conseils.

Était-ce utile?

La solution

Je viens fixe au bout de 2 jours de lutte. Vous devez encoder la réception en utilisant base64 avant d'insérer dans l'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, ici le gars code reçu en base64 avant de passer au serveur PHP, mais ne décode pas de retour en PHP, envoyant ainsi la chaîne Base64 à iTunes.

Autres conseils

Re: "21002: java.lang.IllegalArgumentException: propertyListFromString un objet analysé, mais il y a encore plus de texte dans la chaîne:".

Correction d'un problème similaire dans mon code en encapsulant les données de réception dans {} avant le codage.

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

Bonne chance!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top