Pergunta

Eu estive nos últimos dias tentando testar minha primeira aplicação purchse iphone in-app. Infelizmente eu não posso encontrar o caminho para falar com servidor iTunes para verificar a transactionReceipt.

Porque é a minha primeira tentativa com esta tecnologia que eu escolhi para verificar o recebimento diretamente do iPhone em vez de usar o suporte do servidor. Mas depois de tentar enviar o pedido POST com um JSON onbject criado usando a API JSON do Google Code, o iTunes sempre retorna uma resposta estranha (em vez do "status = 0" string Eu espero por).

Aqui está o código que eu uso para verificar o recibo:

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

talvez eu estou esquecendo alguma coisa nos cabeçalhos do pedido, mas eu acho que o problema está no método que eu uso para criar o objeto JSON.

Veja como os JSON objeto se parece antes de eu adicioná-lo à HTTPBody:

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

       ...........

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

As respostas que eu tenho:

resposta completa { exceção = "java.lang.IllegalArgumentException: lista Propriedade de análise falhou ao tentar ler string não delimitada Não caracteres permitidos foram encontrados em número de linha: 1, coluna:.. 0."; estado = 21002; }

Muito obrigado pela sua orientação.

Foi útil?

Solução

acabo fixa, que após 2 dias de luta. Você tem que receber codificar usando Base64 antes de inserir objeto JSON. Assim (Rubi):

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

Base64 não é mencionado em qualquer lugar na documentação oficial (pelo menos para SDK 3.0), apenas em um par de blogs.

Por exemplo, aqui o cara codifica o recibo em Base64 antes de passar -lo para o servidor PHP, mas não decodificá-lo de volta em PHP, enviando, assim, corda codificado em Base64 para o iTunes.

Outras dicas

Re: "21002: java.lang.IllegalArgumentException: propertyListFromString analisado um objeto, mas ainda há mais texto na seqüência:."

Eu fixo um problema semelhante no meu código envolvendo os dados da entrada em {} antes de codificar.

O recibo resultantes parece com:

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

Aqui está o uso de código I:

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)

Resposta da 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}

Boa sorte!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top