Запрос платежа

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

  Этапы рисунка 3-1 процесса закупки — запрос платежа

Создание платежного требования

Когда пользователь выбирает продукт, чтобы купить, создать платежное требование с помощью объекта продукта и установить количество в случае необходимости, как показано в Перечислении 3-1. Объект продукта прибывает из массива продуктов, возвращенных запросом продуктов Вашего приложения, как обсуждено в Получении Информации о продукте.

Перечисление 3-1  , Создающее платежное требование

SKProduct *product = <# Product returned by a products request #>;
SKMutablePayment *payment = [SKMutablePayment paymentWithProduct:product];
payment.quantity = 2;

Обнаружение неправильного действия

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

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

Для предоставления этой информации заполните applicationUsername свойство платежа возражает с односторонним хэшем названия счета пользователя на Вашем сервере, такой как в примере, показанном в Перечислении 3-2.

Перечисление 3-2  , Вводящее имя пользователя приложения

#import <CommonCrypto/CommonCrypto.h>
 
// Custom method to calculate the SHA-256 hash using Common Crypto
- (NSString *)hashedValueForAccountName:(NSString*)userAccountName
{
    const int HASH_SIZE = 32;
    unsigned char hashedChars[HASH_SIZE];
    const char *accountName = [userAccountName UTF8String];
    size_t accountNameLen = strlen(accountName);
 
    // Confirm that the length of the user name is small enough
    // to be recast when calling the hash function.
    if (accountNameLen > UINT32_MAX) {
        NSLog(@"Account name too long to hash: %@", userAccountName);
        return nil;
    }
    CC_SHA256(accountName, (CC_LONG)accountNameLen, hashedChars);
 
    // Convert the array of bytes into a string showing its hex representation.
    NSMutableString *userAccountHash = [[NSMutableString alloc] init];
    for (int i = 0; i < HASH_SIZE; i++) {
        // Add a dash every four bytes, for readability.
        if (i != 0 && i%4 == 0) {
            [userAccountHash appendString:@"-"];
        }
        [userAccountHash appendFormat:@"%02x", hashedChars[i]];
    }
 
    return userAccountHash;
}

При использовании другого подхода, чтобы заполнить это свойство, гарантировать, что значение, которое Вы обеспечиваете, является непрозрачным идентификатором, уникально связанным с учетной записью пользователя на Вашем сервере. Не используйте Apple ID для Вашей учетной записи разработчика, Apple пользователя ID или нехешированное название счета пользователя на Вашем сервере.

Представление платежного требования

Добавление платежного требования очереди транзакции представляет его App Store. Если Вы добавляете объект платежа к очереди многократно, она представлена многократно — пользователь заряжен многократно, и Ваше приложение, как ожидают, поставит продукт многократно.

[[SKPaymentQueue defaultQueue] addPayment:payment];

Для каждого платежного требования подчиняется Ваше приложение, это возвращает соответствующую транзакцию, которую это должно обработать. Транзакции и очередь транзакции обсуждены в Ожидании App Store для Обработки Транзакций.