Проверка квитанции магазина приложений дает DrmInvalidArgumentException

Я следую документации здесь.

https://developer.apple.com/library/content/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html

У меня есть данные квитанции от моей команды, которые я пытаюсь проверить, они получают код ошибки 21002, который был искаженным JSON. Похоже, что к данным base64 были добавлены дополнительные параметры, поэтому я попытался удалить их и отправить:

- (void)viewDidLoad {
    [super viewDidLoad];

    NSData *receipt; // Sent to the server by the device



    // Create the JSON object that describes the request

    NSError *error;

    NSDictionary *requestContents = @{
                                      @"receipt-data": @"<<$mybase64data>>", @"password" : @"<<$thepassword>>"};

    NSData *requestData = [NSJSONSerialization dataWithJSONObject:requestContents options:0 error:&error];



    if (!requestData) { /* ... Handle error ... */ }



    // Create a POST request with the receipt data.

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

    NSMutableURLRequest *storeRequest = [NSMutableURLRequest requestWithURL:storeURL];

    [storeRequest setHTTPMethod:@"POST"];

    [storeRequest setHTTPBody:requestData];



    // Make a connection to the iTunes Store on a background queue.

    NSOperationQueue *queue = [[NSOperationQueue alloc] init];

    [NSURLConnection sendAsynchronousRequest:storeRequest queue:queue

                           completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {

                               if (connectionError) {

                                   /* ... Handle error ... */

                                   NSLog(@"conerror %@", connectionError);
                               } else {

                                   NSError *error;

                                   NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];

                                   NSLog(@"hello %@", jsonResponse);
                                   NSLog(@"error %@", error);

                                   if (!jsonResponse) {

                                   }

                               }

                           }];



}

результат:

2017-03-03 22:45:47.454 receipttest[89851:352604] hello {
    exception = "com.apple.jingle.mzfairplay.validators.DrmInvalidArgumentException";
    status = 21002;
}
2017-03-03 22:45:47.455 receipttest[89851:352604] error (null)

person quantumpotato    schedule 04.03.2017    source источник
comment
Вы когда-нибудь добирались до сути этого @quantumpotato?   -  person WickedW    schedule 19.07.2017
comment
@WickedW, он начал работать примерно через неделю после этого. Я думаю, что серверы Apple не работали; Примерно в то же время (всего через несколько дней) у них было 500 на страницах iTunesConnect, а затем они обновили сайт. Кажется, работает нормально. Кроме того, теперь Aple предлагает больше ресурсов для проверки подписок и уведомления сервера appleinsider.com/articles/17/07/18/   -  person quantumpotato    schedule 20.07.2017


Ответы (4)


Что нужно иметь в виду: в этом примере данные отправляются в Apple прямо из приложения, но вы можете сделать это и с сервера. Когда вы тестируете свое серверное приложение, не используйте NSLog() для печати ваших данных base64, NSLog усекает данные.

person Larcho    schedule 14.03.2017
comment
Прямо из приложения позволяет проводить атаки «человек посередине», поэтому всегда должна быть модель «сервер-сервер» для проверки квитанций. - person AppreciateIt; 19.07.2017

У меня была эта проблема при использовании квитанции от тестового пользователя, которому было пару дней, с годовой подпиской с автоматическим продлением.

Я проверил приведенные выше полезные ответы о дополнительных символах и т. Д. (Я также проверил, что предоставил секрет моего приложения для автоматического обновления) без радости.

In the end I tried creating A NEW SANDBOX user and it worked first time 
with no other changes other than the new Receipt!

Надеюсь, это поможет кому-то.

person WickedW    schedule 19.07.2017

Я также получил такой же ответ об ошибке для серверных квитанций. Решение для меня состояло в том, чтобы удалить все вхождения \r\n.

Возможно, у вас такая же проблема. Я до сих пор не понял, когда и почему вставляются эти символы.

person Timo    schedule 08.03.2017
comment
Я видел это до работы с двоичными данными на iOS. Однако, когда я вставляю данные квитанции в текстовый редактор, я не вижу \r или \n. Когда я удаляю эти символы в Xcode с помощью stringByReplacingOccurancesOfString, я не вижу никаких изменений. - person quantumpotato; 08.03.2017
comment
Загружаемые данные представляют собой исходную вставку из base64encodedString из среды Swifty, и Aplpe принимает ее. - person quantumpotato; 08.03.2017
comment
Я загрузил квитанцию ​​через скрипт Ruby и получил указанную здесь ошибку. Замена Base64.encode64 на Base64.strict_encode64 помогла. Первая версия создавала строку base64 с символами новой строки. - person silvansky; 16.11.2018

Обратите внимание на URLENCODE:

- (NSString *)URLEncodedString
{
    // CharactersToBeEscaped = @":/?&=;+!@#$()~',*";
    // CharactersToLeaveUnescaped = @"[].";

    NSString *unencodedString = self;
    NSString *encodedString = (NSString *)
    CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
                                                              (CFStringRef)unencodedString,
                                                              NULL,
                                                              (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                                                              kCFStringEncodingUTF8));

    return encodedString;
}
person starry    schedule 12.06.2018