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

Metodo di adattamento Receipt新旧 per il pagamento interno dell'app IOS

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.

Ti potrebbe interessare