iOS в статусе покупки приложения 21002, java.ленг.NumberFormatException

при проверке Apple IOS in-app purchase receipt with Apple server количество наших транзакций возвращается как:

{"status":21002,"exception":"java.lang.NumberFormatException"}

могу ли я узнать, в чем причина проблемы? Мы следуем руководству по покупке Apple In-App, i.e мы закодируем квитанцию возврата app store с базой 64 от клиента iOS, перед отправкой квитанции для проверки

Примечание: большая часть нашей транзакции прошла, есть около 10% транзакций с вышеуказанной ошибкой

3 ответов


несколько возможных причин:

  • кто-то пытается взломать вашу проверку квитанции IAP. Есть некоторые методы, которые вставляют фиктивные квитанции в надежде, что разработчик должным образом их не проверит. У взлома urus есть такое поведение.

  • ошибки во время тестирования приводят к тестовым квитанциям, идущим в верификатор производства.

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

Если ваш объем достаточно низкий (к сожалению, мой), перейдите в iTunes Connect и посмотрите, есть ли какие-либо продажи, которые соответствуют ошибкам. Вы также можете взглянуть на данные квитанции, чтобы увидеть, если он выглядит подозрительно.


существует еще одна возможность, вы отправляете только pucharse_info вместо всего расшифрованного JSON (с singature и т. д.)

var receipt = Ti.Utils.base64encode(evt.receipt).text;

когда вы проверяете получение,возможно, вы можете попробовать следующий код:

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

// Create the JSON object that describes the request
NSError *error;
NSDictionary *requestContents = @{
    @"receipt-data": [receipt base64EncodedStringWithOptions:0]
};
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 ... */
    } else {
        NSError *error;
        NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
        if (!jsonResponse) { /* ... Handle error ...*/ }
        /* ... Send a response back to the device ... */
    }
}];

Reference:https://developer.apple.com/library/content/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html#//apple_ref/doc/uid/TP40010573-CH104-SW1