Проверка сервера В квитанции о покупке приложения OSX

Я работаю над проверкой покупки в приложении в приложении OSX и получаю некоторые проблемы ~

Мой код запроса выглядит следующим образом:

    NSData* data = [NSData dataWithContentsOfURL:[[NSBundle mainBundle] appStoreReceiptURL]];
    NSString* base64Str = [data base64EncodedString];

    NSDictionary* dict = [NSDictionary dictionaryWithObject:base64Str forKey:@"receipt-data"];
    SBJSON *jsonParser = [[[SBJSON alloc] init] autorelease];
    NSString* jsonStr = [jsonParser stringWithObject:dict error:nil];
    postUrl = [NSURL URLWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"];

    _verifyRequest = [[NSMutableURLRequest alloc] init];
    [_verifyRequest setTimeoutInterval:_sTimeoutInterval];
    [_verifyRequest setURL:postUrl];
    [_verifyRequest setHTTPBody:[jsonStr dataUsingEncoding:NSUTF8StringEncoding]];
    [_verifyRequest setHTTPMethod:ASCommon_HttpMethodPost];
    _verifyConnection = [[NSURLConnection alloc] initWithRequest:_verifyRequest delegate:self];
    [_verifyConnection start];

Я получаю такой результат

{
    exception = "java.lang.IllegalArgumentException";
    status = 21002;
}

И я регистрирую переменную jsonStr, похоже, нет проблем:

{"receipt-data":"..........................................................."}

Apple doc здесь сказал: «Получите данные квитанции. ...... В OS X это все содержимое файла квитанции внутри пакета приложения. Закодируйте данные квитанции, используя кодировку base64».

Я неправильно понимаю, что данные квитанции - это все содержимое файла? Или что-то не так с моим кодом?


person Achilles Wang    schedule 28.08.2013    source источник
comment
Вы нашли решение этого? У меня такая же проблема.   -  person VBK    schedule 18.09.2013
comment
@VBK пока нет.... Я использую только проверку локальной квитанции....   -  person Achilles Wang    schedule 24.09.2013


Ответы (1)


Я думаю, что нашел решение. Класс строки в кодировке base64 по умолчанию не удаляет разрывы строк. Вам нужно изменить его, чтобы удалить разрывы строк. Измените эту функцию:

- (NSString *)base64EncodedString
{
    size_t outputLength;
    char *outputBuffer =
        NewBase64Encode([self bytes], [self length], true, &outputLength);

    NSString *result =
        [[[NSString alloc]
            initWithBytes:outputBuffer
            length:outputLength
            encoding:NSASCIIStringEncoding]
        autorelease];
    free(outputBuffer);
    return result;
}

to

- (NSString *)base64EncodedString : (BOOL)includeLineBreaks
{
    size_t outputLength;
    char *outputBuffer =
        NewBase64Encode([self bytes], [self length], includeLineBreaks, &outputLength);

    NSString *result =
        [[[NSString alloc]
            initWithBytes:outputBuffer
            length:outputLength
            encoding:NSASCIIStringEncoding]
        autorelease];
    free(outputBuffer);
    return result;
}

и передать NO в параметре.

person VBK    schedule 24.09.2013