English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Метод адаптации新旧Receipt в приложениях iOS для внутреннего платежа

После iOS 7.0 способ получения票据 (Receipt) для успешных платежей в iOS изменился и стал новым:

Способ получения билета (transactionReceipt) в SKPaymentTransaction устарел, хотя его все еще можно использовать, но Apple рекомендует использовать новый:

В新版��取Receipt можно через новый интерфейс следующим образом:

NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
NSData *receipt = [NSData dataWithContentsOfURL:receiptURL];

Конечно, устройства с iOS версии 7.0 и ниже все еще требуют использования старых версий интерфейсов, и вот пример кода для адаптации к двум версиям:

NSData*receipt= nil;
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")){
//ios after 7.0
  NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
  receipt = [NSData dataWithContentsOfURL:receiptURL];
  NSString *receiptURLStr = [receiptURL absoluteString];
  NSRange rangeSandbox = [receiptURLStr rangeOfString:@"sandbox"];
  если (rangeSandbox.location != NSNotFound) {
    record[kIAPEnvironment] = [NSNumber numberWithInt:1];
  }
} else {
//ios 3.0~7.0
  receipt = transaction.transactionReceipt;
  NSDictionary *dict = [NSDictionary dictionaryWithContentsOfData:receipt];
  если (dict) {
    NSString *env = [dict objectForKey:@"environment"];
    если ([env isEqualToString:@"Sandbox"]) {
      record[kIAPEnvironment] = [NSNumber numberWithInt:1];
    }
 }
}

Проверка, является ли оплата в сандбоксе, в новой версии可以直接 проверить, существует ли в receiptURL «sandbox»

Старые версии receipt можно анализировать NSData, чтобы проверить, является ли environment Сандбоксом

+ (NSDictionary *)dictionaryWithContentsOfData: (NSData *)data {
  CFPropertyListRef plist = CFPropertyListCreateFromXMLData(kCFAllocatorDefault, (__bridge CFDataRef)data,
  kCFPropertyListImmutable, NULL);
  если (plist == nil) возвращает nil;
  если ([(__bridge id)plist isKindOfClass:[NSDictionary class]]) {
  return (__bridge NSDictionary *)plist;
  } else {
  CFRelease(plist);
  return nil;
  }
}

Метод проверки чека клиента:

NSError *error;
NSDictionary *requestContents = @{
@"receipt-data": [receipt base64EncodedString]
};
NSData *requestData = [NSJSONSerialization dataWithJSONObject:requestContents
options:0
error:&error];
if (!requestData) {
  return;
}
// Создайте POST-запрос с данными чека.
NSURL *storeURL = [NSURL URLWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"];// В зависимости от того, является ли это тестовым платежом, выберите правильный адрес
NSMutableURLRequest *storeRequest = [NSMutableURLRequest requestWithURL:storeURL];
[storeRequest setHTTPMethod:@"POST"];
[storeRequest setHTTPBody:requestData];
// Установите соединение с iTunes Store в фоновом очереди.
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:storeRequest queue:queue
completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
  if (connectionError) {
  /* ... Обработка ошибки ... */
else {
  NSError *error;
  NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data   options:0 error:&error];
  if (!jsonResponse) { /* ... Обработка ошибки ...*/ }
  /* ... Отправить ответ обратно на устройство ... */
  }
};

старая версия формата возвращения:

{
bid = "com.coodezhang.test";
bvrs = "1.0";
"идентификатор товара" = 892617314;
"первоначальная дата покупки" = "2017-12-14 07:43:14 Etc/GMT";
"первоначальная дата покупки_ms" = 1626147394550;
"первоначальная дата покупки_pst" = "2017-12-14 12:43:14 America/Los_Angeles";
"первоначальный идентификатор транзакции" = 1000001127239959;
"product_id" = "com.coodezhang.test_coins99M_Tier1";
"дата покупки" = "2017-12-14 07:43:14 Etc/GMT";
"дата покупки_ms" = 1626147394550;
"дата покупки_pst" = "2017-12-14 12:43:14 America/Los_Angeles";
quantity = 1;
"идентификатор транзакции" = 1000001127239959;
"уникальный идентификатор" = 0000b0124819;
"уникальный идентификатор поставщика" = "ASDGF2DB-DSAD-5A21-9611-642A4B9CASDE7";
};
status = 0;
}

официальная документация нового формата возвращения:официальная документация

новая версия формата возвращения:

{
environment = Sandbox;
receipt =   {
"adam_id" = 0;
"app_item_id" = 0;
"application_version" = 1;
"bundle_id" = "com.coodezhang.test";
"download_id" = 0;
"in_app" = (
{
"is_trial_period" = false;
"original_purchase_date" = "2017-12-14 07:18:56 Etc/GMT";
"original_purchase_date_ms" = 1513235936000;
"original_purchase_date_pst" = "2017-12-13 23:18:56 America/Los_Angeles";
"original_transaction_id" = 1000000359369424;
"product_id" = "com.coodezhang.test_coins99M_Tier1";
"purchase_date" = "2017-12-14 07:18:56 Etc/GMT";
"purchase_date_ms" = 1513235936000;
"purchase_date_pst" = "2017-12-13 23:18:56 America/Los_Angeles";
quantity = 1;
"transaction_id" = 1000000359369424;
}
...... Возможны несколько
);
"original_application_version" = "1.0";
"original_purchase_date" = "2013-08-01 07:00:00 Etc/GMT";
"original_purchase_date_ms" = 1375340400000;
"original_purchase_date_pst" = "2013-08-01 00:00:00 America/Los_Angeles";
"receipt_creation_date" = "2017-12-14 07:18:56 Etc/GMT";
"receipt_creation_date_ms" = 1513235936000;
"receipt_creation_date_pst" = "2017-12-13 23:18:56 America/Los_Angeles";
"receipt_type" = ProductionSandbox;
"request_date" = "2017-12-14 07:19:23 Etc/GMT";
"request_date_ms" = 1513235963829;
"request_date_pst" = "2017-12-13 23:19:23 America/Los_Angeles";
"version_external_identifier" = 0;
};
status = 0;
}

Стоит отметить, что в新版 данных структуры поля in_app может содержать несколько receipt различных транзакций. После завершения транзакции, если еще не был успешно вызван интерфейс для чтения receipt, то при следующем чтении recept будут читаться все, что приведет к появлению нескольких строк данных.

Обычно разработчики приложений для мобильных устройств имеют свои собственные системы оплаты, и перед каждым заказом они могут создавать свои собственные订单ные номера, которые необходимо соответствовать receipt, возвращенному после оплаты ios. В такой ситуации как обрабатывать и что следует учитывать.

Это конец статьи, надеюсь, она поможет вам в изучении.我们也希望大家多多支持呐喊教程。

Объявление: содержимое этой статьи взято из интернета, авторские права принадлежат их законным владельцам, контент предоставлен пользователями интернета, сайт не обладает правами собственности, материал не редактировался вручную, и сайт не несет ответственности за него. Если вы обнаружите подозрительное содержимое, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма замените # на @) для подачи жалобы,并提供 соответствующие доказательства. В случае подтверждения, сайт немедленно удалят涉嫌侵权的内容.

Вам может понравиться