English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Dopo ios7.0, il modo di ottenere il receipt di pagamento di ios tramite il pagamento interno dell'app ha avuto un nuovo modo:
Il modo di ottenere il receipt attraverso l'attributo transactionReceipt di SKPaymentTransaction è diventato obsoleto, anche se può essere utilizzato, Apple ufficialmente suggerisce di utilizzare il nuovo
Il modo di ottenere il receipt nella nuova versione è tramite il nuovo interfaccia come segue:
NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL]; NSData *receipt = [NSData dataWithContentsOfURL:receiptURL];
Certo, quelli inferiori a ios7.0 devono ancora utilizzare l'interfaccia versione precedente, ecco il codice di adattamento per entrambe le versioni:
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"]; se (rangeSandbox.location != NSNotFound){ record[kIAPEnvironment] = [NSNumber numberWithInt:1]; } } else { //ios 3.0~7.0 receipt = transaction.transactionReceipt; NSDictionary *dict = [NSDictionary dictionaryWithContentsOfData:receipt]; se (dict){ NSString *env = [dict objectForKey:@"environment"]; se ([env isEqualToString:@"Sandbox"]) { record[kIAPEnvironment] = [NSNumber numberWithInt:1]; } } }
Determinare se è un pagamento sandbox, nella versione nuova si può direttamente determinare se esiste "sandbox" nel receiptURL
La versione precedente del receipt può essere analizzata con NSData per vedere se environment è Sandbox
+ (NSDictionary *)dictionaryWithContentsOfData: (NSData *)data{ CFPropertyListRef plist = CFPropertyListCreateFromXMLData(kCFAllocatorDefault, (__bridge CFDataRef)data, kCFPropertyListImmutable, NULL); se (plist == nil) return nil; se ([(__bridge id)plist isKindOfClass:[NSDictionary class]]){ return (__bridge NSDictionary *)plist; } else { CFRelease(plist); return nil; } }
Metodo di verifica del receipt del client:
NSError *error; NSDictionary *requestContents = @{ @"receipt-data": [receipt base64EncodedString] }; NSData *requestData = [NSJSONSerialization dataWithJSONObject:requestContents options:0 error:&error]; if (!requestData) { return; } // Crea una richiesta POST con i dati del receipt. NSURL *storeURL = [NSURL URLWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"];//In base al tipo di pagamento sandbox, prendi l'indirizzo corretto NSMutableURLRequest *storeRequest = [NSMutableURLRequest requestWithURL:storeURL]; [storeRequest setHTTPMethod:@"POST"]; [storeRequest setHTTPBody:requestData]; // Effettua una connessione al negozio iTunes Store su una coda in background. NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [NSURLConnection sendAsynchronousRequest:storeRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { if (connectionError) { /* ... Gestisci errore ... */ else { NSError *error; NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; if (!jsonResponse) { /* ... Gestisci errore ...*/ } /* ... Invia una risposta indietro al dispositivo ... */ } };
Formato di restituzione della versione vecchia:
{ bid = "com.coodezhang.test"; bvrs = "1.0"; "item_id" = 892617314; "original_purchase_date" = "2017-12-14 07:43:14 Etc/GMT"; "original_purchase_date_ms" = 1626147394550; "original_purchase_date_pst" = "2017-12-14 12:43:14 America/Los_Angeles"; "original_transaction_id" = 1000001127239959; "product_id" = "com.coodezhang.test_coins99M_Tier1"; "purchase_date" = "2017-12-14 07:43:14 Etc/GMT"; "purchase_date_ms" = 1626147394550; "purchase_date_pst" = "2017-12-14 12:43:14 America/Los_Angeles"; quantità = 1; "transaction_id" = 1000001127239959; "unique_identifier" = 0000b0124819; "unique_vendor_identifier" = "ASDGF2DB-DSAD-5A21-9611-642A4B9CASDE7"; }; status = 0; }
Documentazione ufficiale del nuovo formato di restituzione:Documentazione ufficiale
Nuovo formato di restituzione della versione:
{ 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"; quantità = 1; "transaction_id" = 1000000359369424; } ...... Potrebbe esserci più di una ); "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; }
È utile notare che nel nuovo versione, il campo in_app della struttura dei dati può contenere più receipt di transaction. Dopo aver completato la transaction, se non è stato chiamato con successo l'interfaccia di lettura del receipt, la prossima lettura del receipt recupererà tutti i dati, il che può causare la presenza di più dati.
Di solito, gli sviluppatori di app hanno i loro propri sistemi di pagamento, potrebbero creare il loro numero di ordine prima di ogni ordine, che deve corrispondere a un receipt di pagamento ios, in questo caso, come gestirlo e cosa notare.
Questo è tutto il contenuto dell'articolo, spero che sia utile per la tua apprendimento, e ti prego di supportare e applaudire il tutorial.
Dichiarazione: il contenuto di questo articolo è stato tratto da Internet, il diritto d'autore spetta ai rispettivi proprietari, il contenuto è stato contribuito e caricato autonomamente dagli utenti di Internet, il sito web non detiene i diritti di proprietà, non è stato editato manualmente e non assume responsabilità per le relative responsabilità legali. Se trovi contenuti sospetti di violazione del copyright, invia un'e-mail a notice#oldtoolbag.com (sostituisci # con @ durante l'invio dell'e-mail) per segnalare il problema e fornire prove pertinenti. Una volta verificata, il sito web eliminerà immediatamente i contenuti sospetti di violazione del copyright.