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

IOS应用内支付返回新旧Receipt适配的方法

ios7Nach der Version .0 hat sich der neue Weg zur Erteilung von Receipts für den erfolgreichen Zahlungsvorgang von iOS geändert

Der alte Weg zur Erteilung von Receipts über das Attribut transactionReceipt in SKPaymentTransaction ist abgelaufen, obwohl er noch verwendet werden kann, wird jedoch von Apple offiziell empfohlen, den neuen Weg zu verwenden

Der neue Weg zur Erteilung von Receipts erfolgt über den neuen Interface, wie folgt

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

Natürlich, unter ios7.0 noch das alte Interface verwenden muss, das Code für die Anpassung an beide Versionen ist wie folgt:

NSData*receipt= nil;
Wenn (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"];
  Wenn (rangeSandbox.location != NSNotFound){
    record[kIAPEnvironment] = [NSNumber numberWithInt:1];
  }
}
//ios 3.0~7.0
  receipt = transaction.transactionReceipt;
  NSDictionary *dict = [NSDictionary dictionaryWithContentsOfData:receipt];
  Wenn (dict){
    NSString *env = [dict objectForKey:@"environment"];
    Wenn ([env isEqualToString:@"Sandbox"]) {
      record[kIAPEnvironment] = [NSNumber numberWithInt:1];
    }
 }
}

Um zu überprüfen, ob es sich um eine Sandbox-Zahlung handelt, kann die neue Version direkt überprüfen, ob "sandbox" im receiptURL existiert

Die alten Versionen des Receipts können NSData analysieren, um zu überprüfen, ob environment im Sandbox ist

+ (NSDictionary *)dictionaryWithContentsOfData: (NSData *)data{
  CFPropertyListRef plist = CFPropertyListCreateFromXMLData(kCFAllocatorDefault, (__bridge CFDataRef)data,
  kCFPropertyListImmutable, NULL);
  Wenn(plist == nil) return nil;
  if ([(__bridge id)plist isKindOfClass:[NSDictionary class]]){
  return (__bridge NSDictionary *)plist;
  }
  CFRelease(plist);
  return nil;
  }
}

Client receipt verification method:

NSError *error;
NSDictionary *requestContents = @{
@"receipt-data": [receipt base64EncodedString]
};
NSData *requestData = [NSJSONSerialization dataWithJSONObject:requestContents
options:0
error:&error];
if (!requestData) {
  return;
}
// Create a POST request with the receipt data.
NSURL *storeURL = [NSURL URLWithString:@"https://sandbox.itunes.apple.com/verifyReceipt];//Select the correct address based on whether it is a sandbox payment verification.
NSMutableURLRequest *storeRequest = [NSMutableURLRequest requestWithURL:storeURL];
[storeRequest setHTTPMethod:@"POST"];
[storeRequest setHTTPBody:requestData];
// Establish a connection to the iTunes Store on a background queue.
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:storeRequest queue:queue
completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
  if (connectionError) {
  /* ... Fehler behandeln ... */
} else {}}
  NSError *error;
  NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data   options:0 error:&error];
  if (!jsonResponse) { /* ... Fehler behandeln ...*/ }
  /* ... Eine Antwort an das Gerät senden ... */
  }
};

Altes Version Rückgabeformat:

{
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 Amerika/Los_Angeles";
"original_transaction_id" = 1000001127239959;
"product_id" = "com.coodezhang.test_coins"99M_Tier1";
"purchase_date" = "2017-12-14 07:43:14 Etc/GMT";
"purchase_date_ms" = 1626147394550;
"purchase_date_pst" = "2017-12-14 12:43:14 Amerika/Los_Angeles";
quantity = 1;
"transaction_id" = 1000001127239959;
"unique_identifier" = 0000b0124819;
"unique_vendor_identifier" = "ASDGF"2DB-DSAD-5A21-9611-642A4B9CASDE7";
};
status = 0;
}

Offizielle Dokumentation des neuen Rückgabeformats:Offizielle Dokumentation

Neue Version Rückgabeformat:

{
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 Amerika/Los_Angeles";
"original_transaction_id" = 1000000359369424;
"product_id" = "com.coodezhang.test_coins"99M_Tier1";
"purchase_date" = "2017-12-14 07:18:56 Etc/GMT";
"purchase_date_ms" = 1513235936000;
"purchase_date_pst" = "2017-12-13 23:18:56 Amerika/Los_Angeles";
quantity = 1;
"transaction_id" = 1000000359369424;
}
...... Möglicherweise gibt es mehrere
);
"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 Amerika/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 Amerika/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 Amerika/Los_Angeles";
"version_external_identifier" = 0;
};
status = 0;
}

Es ist zu beachten, dass das Feld in_app in der neuen Version möglicherweise mehrere Receipts von mehreren Transaktionen enthält. Wenn der Interface zum Lesen des Receipts noch nicht erfolgreich aufgerufen wurde, werden beim nächsten Lesen alle Receipts ausgelesen, was zu mehreren Daten führt.

Générallement, les développeurs d'applications ont leur propre système de paiement pour les paiements via App, und sie erstellen möglicherweise einen eigenen Bestellnummer vor jeder Bestellung, die mit dem Receipt zurückgegebenen von ios genau übereinstimmt. In diesem Fall müssen Sie darauf achten, wie Sie damit umgehen.

Das ist der gesamte Inhalt dieses Artikels. Wir hoffen, dass er Ihnen bei Ihrem Lernen hilft und wir hoffen, dass Sie die Anleitung von Rufen weiter unterstützen.

Erklärung: Der Inhalt dieses Artikels wurde aus dem Internet übernommen und gehört dem Urheberrechtlichem Eigentümer. Der Inhalt wurde von Internetbenutzern freiwillig beigesteuert und hochgeladen. Diese Website besitzt keine Eigentumsrechte und hat den Inhalt nicht von Hand bearbeitet. Sie übernimmt auch keine rechtlichen Verantwortlichkeiten. Wenn Sie verdächtige urheberrechtliche Inhalte finden, sind Sie herzlich eingeladen, eine E-Mail an notice#w zu senden:3codebox.com (Bitte ersetzen Sie # durch @ beim Senden von E-Mails zur Meldung von Verstößen und bieten Sie relevante Beweise an. Sobald nachgewiesen, wird diese Website die beanstandeten Inhalte sofort löschen.)