Проверка получений с App Store

Используйте доверяемый сервер для передачи с App Store. Используя Ваш собственный сервер позволяет Вам разработать свое приложение, чтобы распознать и доверять только Вашему серверу, и позволяет Вам гарантировать, что Ваш сервер соединяется с сервером App Store. Не возможно создать доверительное соединение между устройством пользователя и App Store непосредственно, потому что Вы не управляете ни одним концом того соединения.

Связь с App Store структурирована как словари JSON, как определено в RFC 4627. Двоичные данные являются закодированным base64, как определено в RFC 4648.

Считайте данные получения

Для получения данных получения используйте appStoreReceiptURL метод NSBundle определять местоположение получения приложения, и затем читать весь файл. Если appStoreReceiptURL метод не доступен, можно отступить к значению транзакции transactionReceipt свойство для обратной совместимости. Тогда отправьте эти данные в свой сервер — как со всеми взаимодействиями с Вашим сервером, подробные данные являются Вашей ответственностью.

// Load the receipt from the app bundle.
NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
NSData *receipt = [NSData dataWithContentsOfURL:receiptURL];
if (!receipt) { /* No local receipt -- handle the error. */ }
 
/* ... Send the receipt data to your server ... */

Отправьте данные получения в App Store

На Вашем сервере создайте объект JSON со следующими ключами:

Ключ
Значение

данные получения

base64 закодировал данные получения.

пароль

Только используемый для получений, содержащих автовозобновляемые подписки. Совместно используемый секрет Вашего приложения (шестнадцатеричная строка).

Представьте этот объект JSON как полезную нагрузку HTTP запрос POST. В тестовой среде использовать https://sandbox.itunes.apple.com/verifyReceipt как URL. В производстве использовать https://buy.itunes.apple.com/verifyReceipt как URL.

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 ... */
    }
}];

Проанализируйте ответ

Полезная нагрузка ответа является объектом JSON, содержащим следующие ключи и значения:

Ключ
Значение

состояние

Также 0 если получение допустимо, или один из кодов ошибки, перечисленных в Таблице 2-1.

Для получений транзакции стиля iOS 6 код состояния отражает состояние получения определенной транзакции.

Для получений приложения стиля iOS 7 код состояния является отражениями состояние получения приложения в целом. Например, если Вы отправляете получение действительного приложения, содержащее подписку с истекшим сроком, ответ 0 потому что получение в целом допустимо.

получение

Представление JSON получения, отправленного за проверкой. Для получения информации о ключах, найденных в получении, посмотрите Поля Получения.

latest_receipt

Только возвращенный для iOS 6 разрабатывают получения транзакции для автовозобновляемых подписок. Основа 64 закодированных получения транзакции для нового возобновления.

latest_receipt_info

Только возвращенный для iOS 6 разрабатывают получения транзакции для автовозобновляемых подписок. Представление JSON получения для нового возобновления.

Табличные 2-1  Коды состояния

Код состояния

Описание

21000

App Store не мог считать объект JSON, который Вы обеспечили.

21002

Данные в receipt-data свойство было уродливым или недостающим.

21003

Получение не могло аутентифицироваться.

21004

Совместно используемый секрет, который Вы обеспечили, не соответствует совместно используемый секрет на файле для Вашей учетной записи.

Только возвращенный для iOS 6 разрабатывают получения транзакции для автовозобновляемых подписок.

21005

Сервер получения не в настоящее время доступен.

21006

Это получение допустимо, но истекла подписка. Когда этот код состояния возвращается к Вашему серверу, данные получения также декодируются и возвращаются как часть ответа.

Только возвращенный для iOS 6 разрабатывают получения транзакции для автовозобновляемых подписок.

21007

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

21008

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

Значения latest_receipt и latest_receipt_info ключи полезны при проверке, в настоящее время активна ли автовозобновляемая подписка. Путем обеспечения любой транзакции подтверждают получение для подписки и проверки этих значений, можно получить информацию о в настоящее время активном периоде подписки. Если проверяемое получение для последнего возобновления, значения для latest_receipt совпадает с receipt-data (в запросе) и значение для latest_receipt_info совпадает с receipt.