English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
После 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 (во время отправки письма замените # на @) для подачи жалобы,并提供 соответствующие доказательства. В случае подтверждения, сайт немедленно удалят涉嫌侵权的内容.